Update from https://crrev.com/306655
Includes updates to ui/ and mojo/services for cc and gpu changes and
a minor update to a unit test in sky/ for skia interface changes.
Review URL: https://codereview.chromium.org/761903003
diff --git a/.clang-format b/.clang-format
index 53f0da3..6fdf1dc 100644
--- a/.clang-format
+++ b/.clang-format
@@ -6,17 +6,3 @@
# 'vector<vector<int>>'. ('Auto' means that clang-format will only use
# 'int>>' if the file already contains at least one such instance.)
Standard: Cpp11
-
----
-Language: Java
-# See http://crbug.com/429372 for information about this section.
-IndentWidth: 4
-ContinuationIndentWidth: 8
-ColumnLimit: 100
-AllowShortBlocksOnASingleLine: false
-AllowShortFunctionsOnASingleLine: None
-AllowShortIfStatementsOnASingleLine: true
-BinPackArguments: true
-BinPackParameters: true
-BreakBeforeBinaryOperators: NonAssignment
-Cpp11BracedListStyle: false # but see http://llvm.org/PR21457
diff --git a/DEPS b/DEPS
index 879dac9..26d4a5a 100644
--- a/DEPS
+++ b/DEPS
@@ -22,11 +22,11 @@
'libcxx_revision': '48198f9110397fff47fe7c37cbfa296be7d44d3d',
'libcxxabi_revision': '4ad1009ab3a59fa7a6896d74d5e4de5885697f95',
'sfntly_revision': '1bdaae8fc788a5ac8936d68bf24f37d977a13dac',
- 'skia_revision': '947556f6583e62b1ae19dcda94e0dea78babda2b',
+ 'skia_revision': '2dd1ae016d7f297b433c3ea3a771ef8e01657c1f',
# Three lines of non-changing comments so that
# the commit queue can handle CLs rolling Skia
# and V8 without interference from each other.
- 'v8_revision': '43c0584a4b83eefc27c519f577b62f3960a1772d',
+ 'v8_revision': 'dfec52e2f3e073cfe28d0041f6d7c657d9b9486f',
# Three lines of non-changing comments so that
# the commit queue can handle CLs rolling ANGLE
# and whatever else without interference from each other.
@@ -34,15 +34,15 @@
# Three lines of non-changing comments so that
# the commit queue can handle CLs rolling build tools
# and whatever else without interference from each other.
- 'buildtools_revision': '6ea835db27479b9a5742e48b5e4466af7c2534ff',
+ 'buildtools_revision': 'ded32942a1ebfddff0ba1231898fc4f6c7faacec',
# Three lines of non-changing comments so that
# the commit queue can handle CLs rolling PDFium
# and whatever else without interference from each other.
- 'pdfium_revision': '1dc4f4112d72c63e465d6f09695ebea1119d39a6',
+ 'pdfium_revision': 'ef619d0562b39f30943cfdc4985a0df233d00e42',
# Three lines of non-changing comments so that
# the commit queue can handle CLs rolling BoringSSL
# and whatever else without interference from each other.
- 'boringssl_revision': '69a01608f33ab6fe2c3485d94aef1fe9eacf5364',
+ 'boringssl_revision': '00505ec2e1e4c3047b4f61a306f2ac1372fa7640',
# Three lines of non-changing comments so that
# the commit queue can handle CLs rolling lss
# and whatever else without interference from each other.
@@ -50,7 +50,7 @@
# Three lines of non-changing comments so that
# the commit queue can handle CLs rolling nss
# and whatever else without interference from each other.
- 'nss_revision': '258342ecf9c65105189092ef6339dc4e7779a7ae',
+ 'nss_revision': 'bb4e75a43d007518ae7d618665ea2f25b0c60b63',
}
# Only these hosts are allowed for dependencies in this DEPS file.
@@ -78,7 +78,7 @@
Var('chromium_git') + '/angle/angle.git' + '@' + Var('angle_revision'),
'src/third_party/icu':
- Var('chromium_git') + '/chromium/deps/icu52.git' + '@' + 'dd727641e190d60e4593bcb3a35c7f51eb4925c5', # from svn revision 292996
+ Var('chromium_git') + '/chromium/deps/icu52.git' + '@' + '866ff696e9022a6000afbab516fba62cfa306075', # from svn revision 293126
'src/third_party/libc++/trunk':
Var('chromium_git') + '/chromium/llvm-project/libcxx.git' + '@' + Var('libcxx_revision'),
@@ -102,10 +102,10 @@
Var('chromium_git') + '/external/ots.git' + '@' + '98897009f3ea8a5fa3e20a4a74977da7aaa8e61a',
'src/third_party/brotli/src':
- Var('chromium_git') + '/external/font-compression-reference.git' + '@' + '65cb3326e30ef8a67eb1d4411ec563e91be6e9ae',
+ Var('chromium_git') + '/external/font-compression-reference.git' + '@' + '8c9c83426beb4a58da34be76ea1fccb4054c4703',
'src/third_party/yasm/source/patched-yasm':
- Var('chromium_git') + '/chromium/deps/yasm/patched-yasm.git' + '@' + 'c960eb11ccda80b10ed50be39df4f0663b371d1d',
+ Var('chromium_git') + '/chromium/deps/yasm/patched-yasm.git' + '@' + '4671120cd8558ce62ee8672ebf3eb6f5216f909b',
'src/third_party/libjpeg_turbo':
Var('chromium_git') + '/chromium/deps/libjpeg_turbo.git' + '@' + '034e9a9747e0983bc19808ea70e469bc8342081f',
@@ -126,7 +126,7 @@
'https://boringssl.googlesource.com/boringssl.git' + '@' + Var('boringssl_revision'),
'src/tools/gyp':
- Var('chromium_git') + '/external/gyp.git' + '@' + 'b13d8f243da15ded051e87e663c4f2c2fcc5804c', # from svn revision 1994
+ Var('chromium_git') + '/external/gyp.git' + '@' + 'fe00999dfaee449d3465a9316778434884da4fa7', # from svn revision 2010
}
@@ -152,7 +152,7 @@
Var('chromium_git') + '/external/jsr-305.git' + '@' + '642c508235471f7220af6d5df2d3210e3bfc0919',
'src/third_party/android_tools':
- Var('chromium_git') + '/android_tools.git' + '@' + 'ea50cccc11657404ce22cf928062ed1a3927eb39',
+ Var('chromium_git') + '/android_tools.git' + '@' + '4f723e2a5fa5b7b8a198072ac19b92344be2b271',
'src/third_party/freetype':
Var('chromium_git') + '/chromium/src/third_party/freetype.git' + '@' + 'a2b9955b49034a51dfbc8bf9f4e9d312149cecac',
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 2cce16c..9128488 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -146,6 +146,7 @@
"debug/dump_without_crashing.h",
"debug/gdi_debug_util_win.cc",
"debug/gdi_debug_util_win.h",
+
# This file depends on files from the "allocator" target,
# but this target does not depend on "allocator" (see
# allocator.gyp for details).
@@ -760,9 +761,7 @@
"sys_info_openbsd.cc",
]
- defines = [
- "BASE_IMPLEMENTATION",
- ]
+ defines = [ "BASE_IMPLEMENTATION" ]
deps = [
":base_static",
@@ -774,10 +773,10 @@
if (is_android) {
sources += [
- "memory/discardable_memory_ashmem_allocator.cc",
- "memory/discardable_memory_ashmem_allocator.h",
- "memory/discardable_memory_ashmem.cc",
- "memory/discardable_memory_ashmem.h",
+ "memory/discardable_memory_ashmem_allocator.cc",
+ "memory/discardable_memory_ashmem_allocator.h",
+ "memory/discardable_memory_ashmem.cc",
+ "memory/discardable_memory_ashmem.h",
]
sources -= [
"base_paths_posix.cc",
@@ -802,21 +801,17 @@
deps += [
":base_jni_headers",
"//third_party/ashmem",
- "//third_party/android_tools:cpu_features"
+ "//third_party/android_tools:cpu_features",
]
# logging.cc uses the Android logging library.
libs = [ "log" ]
- sources -= [
- "debug/stack_trace_posix.cc",
- ]
+ sources -= [ "debug/stack_trace_posix.cc" ]
}
if (is_chromeos) {
- sources -= [
- "power_monitor/power_monitor_device_source_posix.cc",
- ]
+ sources -= [ "power_monitor/power_monitor_device_source_posix.cc" ]
}
if (is_nacl) {
@@ -853,6 +848,7 @@
"event_recorder_stubs.cc",
"message_loop/message_pump_libevent.cc",
"strings/string16.cc",
+
# Not using sha1_win.cc because it may have caused a
# regression to page cycler moz.
"sha1_win.cc",
@@ -880,8 +876,8 @@
# Mac.
if (is_mac) {
sources += [
- "memory/discardable_memory_mach.cc",
- "memory/discardable_memory_mach.h",
+ "memory/discardable_memory_mach.cc",
+ "memory/discardable_memory_mach.h",
]
sources -= [
"base_paths_posix.cc",
@@ -902,9 +898,7 @@
# Linux.
if (is_linux) {
# TODO(brettw) this will need to be parameterized at some point.
- linux_configs = [
- "//build/config/linux:glib",
- ]
+ linux_configs = [ "//build/config/linux:glib" ]
configs += linux_configs
all_dependent_configs = linux_configs
@@ -1066,7 +1060,9 @@
defines = [ "BASE_PREFS_IMPLEMENTATION" ]
- deps = [ ":base" ]
+ deps = [
+ ":base",
+ ]
if (is_android && !is_debug) {
configs -= [ "//build/config/compiler:optimize" ]
@@ -1087,9 +1083,11 @@
"prefs/testing_pref_store.h",
]
+ public_deps = [
+ ":prefs",
+ ]
deps = [
":base",
- ":prefs",
"//testing/gmock",
"//testing/gtest",
]
@@ -1118,6 +1116,7 @@
test("base_unittests") {
sources = [
"android/application_status_listener_unittest.cc",
+ "android/content_uri_utils_unittest.cc",
"android/jni_android_unittest.cc",
"android/jni_array_unittest.cc",
"android/jni_string_unittest.cc",
@@ -1403,9 +1402,7 @@
}
if (is_android) {
- deps += [
- "//testing/android:native_test_native_code",
- ]
+ deps += [ "//testing/android:native_test_native_code" ]
set_sources_assignment_filter([])
sources += [ "debug/proc_maps_linux_unittest.cc" ]
set_sources_assignment_filter(sources_assignment_filter)
@@ -1453,7 +1450,7 @@
]
deps = [
- "//third_party/jsr-305:jsr_305_javalib"
+ "//third_party/jsr-305:jsr_305_javalib",
]
DEPRECATED_java_in_dir = "android/java/src"
@@ -1509,10 +1506,11 @@
# GYP: //base.gyp:base_java_unittest_support
android_library("base_java_unittest_support") {
- deps = [":base_java"]
- java_files = [
- "test/android/java/src/org/chromium/base/ContentUriTestUtils.java"
+ deps = [
+ ":base_java",
]
+ java_files =
+ [ "test/android/java/src/org/chromium/base/ContentUriTestUtils.java" ]
}
# GYP: //base.gyp:base_unittests_apk
diff --git a/base/allocator/BUILD.gn b/base/allocator/BUILD.gn
index d9ff4c5..09d4f85 100644
--- a/base/allocator/BUILD.gn
+++ b/base/allocator/BUILD.gn
@@ -10,7 +10,9 @@
# to the build settings.
group("allocator") {
if (use_allocator == "tcmalloc") {
- deps = [ ":tcmalloc" ]
+ deps = [
+ ":tcmalloc",
+ ]
}
}
@@ -54,6 +56,7 @@
"$tcmalloc_dir/src/base/abort.cc",
"$tcmalloc_dir/src/base/abort.h",
"$tcmalloc_dir/src/base/arm_instruction_set_select.h",
+
# We don't list dynamic_annotations.c since its copy is already
# present in the dynamic_annotations target.
"$tcmalloc_dir/src/base/elf_mem_image.cc",
@@ -79,6 +82,7 @@
"$tcmalloc_dir/src/central_freelist.h",
"$tcmalloc_dir/src/common.cc",
"$tcmalloc_dir/src/common.h",
+
# #included by debugallocation_shim.cc
#"$tcmalloc_dir/src/debugallocation.cc",
"$tcmalloc_dir/src/deep-heap-profile.cc",
@@ -120,13 +124,13 @@
"$tcmalloc_dir/src/symbolize.h",
"$tcmalloc_dir/src/system-alloc.cc",
"$tcmalloc_dir/src/system-alloc.h",
+
# #included by debugallocation_shim.cc
#"$tcmalloc_dir/src/tcmalloc.cc",
"$tcmalloc_dir/src/thread_cache.cc",
"$tcmalloc_dir/src/thread_cache.h",
"$tcmalloc_dir/src/windows/port.cc",
"$tcmalloc_dir/src/windows/port.h",
-
"allocator_shim.cc",
"allocator_shim.h",
"debugallocation_shim.cc",
@@ -186,9 +190,7 @@
public_configs = [ ":nocmt" ]
- deps += [
- ":prep_libc",
- ]
+ deps += [ ":prep_libc" ]
}
if (is_linux || is_android) {
@@ -215,6 +217,7 @@
# Don't let linker rip this symbol out, otherwise the heap&cpu
# profilers will not initialize properly on startup.
"-Wl,-uIsHeapProfilerRunning,-uProfilerStart",
+
# Do the same for heap leak checker.
"-Wl,-u_Z21InitialMallocHook_NewPKvj,-u_Z22InitialMallocHook_MMapPKvS0_jiiix,-u_Z22InitialMallocHook_SbrkPKvi",
"-Wl,-u_Z21InitialMallocHook_NewPKvm,-u_Z22InitialMallocHook_MMapPKvS0_miiil,-u_Z22InitialMallocHook_SbrkPKvl",
@@ -229,9 +232,7 @@
configs += [ "//build/config/compiler:optimize_max" ]
}
- deps += [
- "//base/third_party/dynamic_annotations",
- ]
+ deps += [ "//base/third_party/dynamic_annotations" ]
if (is_win) {
ldflags = [ "/ignore:4006:4221" ]
diff --git a/base/android/content_uri_utils.cc b/base/android/content_uri_utils.cc
index 0e0c0ea..0482fee 100644
--- a/base/android/content_uri_utils.cc
+++ b/base/android/content_uri_utils.cc
@@ -35,4 +35,14 @@
return File(fd);
}
+std::string GetContentUriMimeType(const FilePath& content_uri) {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ ScopedJavaLocalRef<jstring> j_uri =
+ ConvertUTF8ToJavaString(env, content_uri.value());
+ ScopedJavaLocalRef<jstring> j_mime =
+ Java_ContentUriUtils_getMimeType(
+ env, base::android::GetApplicationContext(), j_uri.obj());
+ return base::android::ConvertJavaStringToUTF8(env, j_mime.obj());
+}
+
} // namespace base
diff --git a/base/android/content_uri_utils.h b/base/android/content_uri_utils.h
index 827ec92..e66b770 100644
--- a/base/android/content_uri_utils.h
+++ b/base/android/content_uri_utils.h
@@ -16,13 +16,17 @@
bool RegisterContentUriUtils(JNIEnv* env);
-// Opens a content uri for read and returns the file descriptor to the caller.
-// Returns -1 if the uri is invalid.
+// Opens a content URI for read and returns the file descriptor to the caller.
+// Returns -1 if the URI is invalid.
BASE_EXPORT File OpenContentUriForRead(const FilePath& content_uri);
-// Check whether a content uri exists.
+// Check whether a content URI exists.
BASE_EXPORT bool ContentUriExists(const FilePath& content_uri);
+// Gets MIME type from a content URI. Returns an empty string if the URI is
+// invalid.
+BASE_EXPORT std::string GetContentUriMimeType(const FilePath& content_uri);
+
} // namespace base
#endif // BASE_ANDROID_CONTENT_URI_UTILS_H_
diff --git a/base/android/content_uri_utils_unittest.cc b/base/android/content_uri_utils_unittest.cc
new file mode 100644
index 0000000..c762035
--- /dev/null
+++ b/base/android/content_uri_utils_unittest.cc
@@ -0,0 +1,37 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/content_uri_utils.h"
+#include "base/files/file_util.h"
+#include "base/path_service.h"
+#include "base/test/test_file_util.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace base {
+namespace android {
+
+TEST(ContentUriUtilsTest, ContentUriMimeTest) {
+ // Get the test image path.
+ FilePath data_dir;
+ ASSERT_TRUE(PathService::Get(DIR_TEST_DATA, &data_dir));
+ data_dir = data_dir.AppendASCII("file_util");
+ ASSERT_TRUE(PathExists(data_dir));
+ FilePath image_file = data_dir.Append(FILE_PATH_LITERAL("red.png"));
+
+ // Insert the image into MediaStore. MediaStore will do some conversions, and
+ // return the content URI.
+ FilePath path = base::InsertImageIntoMediaStore(image_file);
+ EXPECT_TRUE(path.IsContentUri());
+ EXPECT_TRUE(PathExists(path));
+
+ std::string mime = GetContentUriMimeType(path);
+ EXPECT_EQ(mime, std::string("image/png"));
+
+ FilePath invalid_path("content://foo.bar");
+ mime = GetContentUriMimeType(invalid_path);
+ EXPECT_TRUE(mime.empty());
+}
+
+} // namespace android
+} // namespace base
diff --git a/base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java b/base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java
index 8b2438c..c03cad2 100644
--- a/base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java
+++ b/base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java
@@ -6,18 +6,26 @@
import android.animation.ValueAnimator;
import android.annotation.TargetApi;
+import android.app.Activity;
+import android.app.ActivityManager;
import android.app.ActivityOptions;
import android.app.PendingIntent;
+import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
+import android.graphics.Bitmap;
+import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
+import android.os.PowerManager;
import android.provider.Settings;
import android.view.View;
import android.view.ViewGroup.MarginLayoutParams;
import android.view.ViewTreeObserver;
+import android.view.Window;
+import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.RemoteViews;
import android.widget.TextView;
@@ -25,6 +33,7 @@
/**
* Utility class to use new APIs that were added after ICS (API level 14).
*/
+@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public class ApiCompatibilityUtils {
private ApiCompatibilityUtils() {
}
@@ -375,4 +384,107 @@
return Settings.Global.getInt(
context.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 0) != 0;
}
+
+ /**
+ * @see android.app.Activity#finishAndRemoveTask()
+ */
+ public static void finishAndRemoveTask(Activity activity) {
+ if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
+ activity.finishAndRemoveTask();
+ } else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) {
+ // crbug.com/395772 : Fallback for Activity.finishAndRemoveTask() failing.
+ new FinishAndRemoveTaskWithRetry(activity).run();
+ } else {
+ activity.finish();
+ }
+ }
+
+ private static class FinishAndRemoveTaskWithRetry implements Runnable {
+ private static final long RETRY_DELAY_MS = 500;
+ private static final long MAX_TRY_COUNT = 3;
+ private final Activity mActivity;
+ private int mTryCount;
+
+ FinishAndRemoveTaskWithRetry(Activity activity) {
+ mActivity = activity;
+ }
+
+ @Override
+ public void run() {
+ mActivity.finishAndRemoveTask();
+ mTryCount++;
+ if (!mActivity.isFinishing()) {
+ if (mTryCount < MAX_TRY_COUNT) {
+ ThreadUtils.postOnUiThreadDelayed(this, RETRY_DELAY_MS);
+ } else {
+ mActivity.finish();
+ }
+ }
+ }
+ }
+
+ /**
+ * @return Whether the screen of the device is interactive.
+ */
+ @SuppressWarnings("deprecation")
+ public static boolean isInteractive(Context context) {
+ PowerManager manager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
+ return manager.isInteractive();
+ } else {
+ return manager.isScreenOn();
+ }
+ }
+
+ @SuppressWarnings("deprecation")
+ public static int getActivityNewDocumentFlag() {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ return Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
+ } else {
+ return Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET;
+ }
+ }
+
+ /**
+ * @see android.provider.Settings.Secure#SKIP_FIRST_USE_HINTS
+ */
+ public static boolean shouldSkipFirstUseHints(ContentResolver contentResolver) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ return Settings.Secure.getInt(
+ contentResolver, Settings.Secure.SKIP_FIRST_USE_HINTS, 0) != 0;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * @param activity Activity that should get the task description update.
+ * @param title Title of the activity.
+ * @param icon Icon of the activity.
+ * @param color Color of the activity.
+ */
+ public static void setTaskDescription(Activity activity, String title, Bitmap icon, int color) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ ActivityManager.TaskDescription description =
+ new ActivityManager.TaskDescription(title, icon, color);
+ activity.setTaskDescription(description);
+ }
+ }
+
+ /**
+ * @see android.view.Window#setStatusBarColor(int color).
+ */
+ public static void setStatusBarColor(Activity activity, int statusBarColor) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ // If both system bars are black, we can remove these from our layout,
+ // removing or shrinking the SurfaceFlinger overlay required for our views.
+ Window window = activity.getWindow();
+ if (statusBarColor == Color.BLACK && window.getNavigationBarColor() == Color.BLACK) {
+ window.clearFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
+ } else {
+ window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
+ }
+ window.setStatusBarColor(statusBarColor);
+ }
+ }
}
diff --git a/base/android/java/src/org/chromium/base/ContentUriUtils.java b/base/android/java/src/org/chromium/base/ContentUriUtils.java
index 70c27ed..ef527e1 100644
--- a/base/android/java/src/org/chromium/base/ContentUriUtils.java
+++ b/base/android/java/src/org/chromium/base/ContentUriUtils.java
@@ -12,6 +12,7 @@
import android.util.Log;
import java.io.File;
+import java.io.FileNotFoundException;
/**
* This class provides methods to access content URI schemes.
@@ -26,11 +27,11 @@
*/
public interface FileProviderUtil {
/**
- * Generate a content uri from the given file.
+ * Generate a content URI from the given file.
* @param context Application context.
* @param file The file to be translated.
*/
- public Uri getContentUriFromFile(Context context, File file);
+ Uri getContentUriFromFile(Context context, File file);
}
// Prevent instantiation.
@@ -54,7 +55,7 @@
*
* @param context {@link Context} in interest
* @param uriString the content URI to open
- * @returns file desciptor upon sucess, or -1 otherwise.
+ * @return file desciptor upon sucess, or -1 otherwise.
*/
@CalledByNative
public static int openContentUriForRead(Context context, String uriString) {
@@ -70,23 +71,34 @@
*
* @param context {@link Context} in interest.
* @param uriString the content URI to query.
- * @returns true if the uri exists, or false otherwise.
+ * @return true if the URI exists, or false otherwise.
*/
@CalledByNative
public static boolean contentUriExists(Context context, String uriString) {
- ParcelFileDescriptor pfd = getParcelFileDescriptor(context, uriString);
- if (pfd == null) {
- return false;
- }
- return true;
+ return getParcelFileDescriptor(context, uriString) != null;
}
/**
- * Helper method to open a content URI and return the ParcelFileDescriptor.
+ * Retrieve the MIME type for the content URI.
+ *
+ * @param context {@link Context} in interest.
+ * @param uriString the content URI to look up.
+ * @return MIME type or null if the input params are empty or invalid.
+ */
+ @CalledByNative
+ public static String getMimeType(Context context, String uriString) {
+ ContentResolver resolver = context.getContentResolver();
+ if (resolver == null) return null;
+ Uri uri = Uri.parse(uriString);
+ return resolver.getType(uri);
+ }
+
+ /**
+ * Helper method to open a content URI and returns the ParcelFileDescriptor.
*
* @param context {@link Context} in interest.
* @param uriString the content URI to open.
- * @returns ParcelFileDescriptor of the content URI, or NULL if the file does not exist.
+ * @return ParcelFileDescriptor of the content URI, or NULL if the file does not exist.
*/
private static ParcelFileDescriptor getParcelFileDescriptor(Context context, String uriString) {
ContentResolver resolver = context.getContentResolver();
@@ -95,8 +107,12 @@
ParcelFileDescriptor pfd = null;
try {
pfd = resolver.openFileDescriptor(uri, "r");
- } catch (java.io.FileNotFoundException e) {
+ } catch (FileNotFoundException e) {
Log.w(TAG, "Cannot find content uri: " + uriString, e);
+ } catch (SecurityException e) {
+ Log.w(TAG, "Cannot open content uri: " + uriString, e);
+ } catch (IllegalArgumentException e) {
+ Log.w(TAG, "Unknown content uri: " + uriString, e);
}
return pfd;
}
@@ -107,7 +123,7 @@
* @param uri the content URI to be resolved.
* @param contentResolver the content resolver to query.
* @param columnField the column field to query.
- * @returns the display name of the @code uri if present in the database
+ * @return the display name of the @code uri if present in the database
* or an empty string otherwise.
*/
public static String getDisplayName(
diff --git a/base/android/java/src/org/chromium/base/SysUtils.java b/base/android/java/src/org/chromium/base/SysUtils.java
index 1c8378c..0d04204 100644
--- a/base/android/java/src/org/chromium/base/SysUtils.java
+++ b/base/android/java/src/org/chromium/base/SysUtils.java
@@ -4,6 +4,8 @@
package org.chromium.base;
+import android.app.ActivityManager;
+import android.content.Context;
import android.os.Build;
import android.os.StrictMode;
import android.util.Log;
@@ -22,7 +24,10 @@
Build.VERSION_CODES.JELLY_BEAN_MR2;
// A device reporting strictly more total memory in megabytes cannot be considered 'low-end'.
- private static final long ANDROID_LOW_MEMORY_DEVICE_THRESHOLD_MB = 512;
+ private static final int ANDROID_LOW_MEMORY_DEVICE_THRESHOLD_MB = 512;
+
+ // Number of kilobytes in a megabyte.
+ private static final int KBS_IN_MB = 1024;
private static final String TAG = "SysUtils";
@@ -35,7 +40,7 @@
* @return Amount of physical memory in kilobytes, or 0 if there was
* an error trying to access the information.
*/
- private static int amountOfPhysicalMemoryKB() {
+ private static int amountOfPhysicalMemoryMB() {
// Extract total memory RAM size by parsing /proc/meminfo, note that
// this is exactly what the implementation of sysconf(_SC_PHYS_PAGES)
// does. However, it can't be called because this method must be
@@ -68,12 +73,12 @@
int totalMemoryKB = Integer.parseInt(m.group(1));
// Sanity check.
- if (totalMemoryKB <= 1024) {
+ if (totalMemoryKB <= KBS_IN_MB) {
Log.w(TAG, "Invalid /proc/meminfo total size in kB: " + m.group(1));
break;
}
- return totalMemoryKB;
+ return totalMemoryKB / KBS_IN_MB;
}
} finally {
@@ -115,7 +120,22 @@
return false;
}
- int ramSizeKB = amountOfPhysicalMemoryKB();
- return (ramSizeKB > 0 && ramSizeKB / 1024 < ANDROID_LOW_MEMORY_DEVICE_THRESHOLD_MB);
+ Context context = ApplicationStatus.getApplicationContext();
+ if (context != null) {
+ ActivityManager activityManager = (ActivityManager)
+ context.getSystemService(Context.ACTIVITY_SERVICE);
+ if (activityManager.isLowRamDevice()) {
+ return true;
+ }
+ } else {
+ Log.e(TAG, "ApplicationContext is null in ApplicationStatus");
+ }
+
+ int ramSizeMB = amountOfPhysicalMemoryMB();
+ if (ramSizeMB <= 0) {
+ return false;
+ }
+
+ return ramSizeMB < ANDROID_LOW_MEMORY_DEVICE_THRESHOLD_MB;
}
}
diff --git a/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java b/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java
index 28c688d..89cb5bb 100644
--- a/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java
+++ b/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java
@@ -67,11 +67,6 @@
// directly from the APK file but it was compressed or not aligned.
private static boolean sLibraryIsMappableInApk = true;
- // One-way switch becomes true if the system library loading failed,
- // and the right native library was found and loaded by the hack.
- // The flag is used to report UMA stats later.
- private static boolean sNativeLibraryHackWasUsed = false;
-
/**
* The same as ensureInitialized(null, false), should only be called
* by non-browser processes.
@@ -87,27 +82,20 @@
*
* @param context The context in which the method is called, the caller
* may pass in a null context if it doesn't know in which context it
- * is running, or it doesn't need to work around the issue
- * http://b/13216167.
+ * is running.
*
- * When the context is not null and native library was not extracted
- * by Android package manager, the LibraryLoader class
- * will extract the native libraries from APK. This is a hack used to
- * work around some Sony devices with the following platform bug:
- * http://b/13216167.
- *
- * @param shouldDeleteOldWorkaroundLibraries The flag tells whether the method
- * should delete the old workaround and fallback libraries or not.
+ * @param shouldDeleteFallbackLibraries The flag tells whether the method
+ * should delete the fallback libraries or not.
*/
public static void ensureInitialized(
- Context context, boolean shouldDeleteOldWorkaroundLibraries)
+ Context context, boolean shouldDeleteFallbackLibraries)
throws ProcessInitException {
synchronized (sLock) {
if (sInitialized) {
// Already initialized, nothing to do.
return;
}
- loadAlreadyLocked(context, shouldDeleteOldWorkaroundLibraries);
+ loadAlreadyLocked(context, shouldDeleteFallbackLibraries);
initializeAlreadyLocked();
}
}
@@ -139,15 +127,15 @@
* See the comment in doInBackground() for more considerations on this.
*
* @param context The context the code is running, or null if it doesn't have one.
- * @param shouldDeleteOldWorkaroundLibraries The flag tells whether the method
- * should delete the old workaround and fallback libraries or not.
+ * @param shouldDeleteFallbackLibraries The flag tells whether the method
+ * should delete the old fallback libraries or not.
*
* @throws ProcessInitException if the native library failed to load.
*/
- public static void loadNow(Context context, boolean shouldDeleteOldWorkaroundLibraries)
+ public static void loadNow(Context context, boolean shouldDeleteFallbackLibraries)
throws ProcessInitException {
synchronized (sLock) {
- loadAlreadyLocked(context, shouldDeleteOldWorkaroundLibraries);
+ loadAlreadyLocked(context, shouldDeleteFallbackLibraries);
}
}
@@ -164,7 +152,7 @@
// Invoke System.loadLibrary(...), triggering JNI_OnLoad in native code
private static void loadAlreadyLocked(
- Context context, boolean shouldDeleteOldWorkaroundLibraries)
+ Context context, boolean shouldDeleteFallbackLibraries)
throws ProcessInitException {
try {
if (!sLoaded) {
@@ -261,29 +249,14 @@
} else {
// Load libraries using the system linker.
for (String library : NativeLibraries.LIBRARIES) {
- try {
- System.loadLibrary(library);
- } catch (UnsatisfiedLinkError e) {
- if (context != null
- && LibraryLoaderHelper.tryLoadLibraryUsingWorkaround(context,
- library)) {
- sNativeLibraryHackWasUsed = true;
- } else {
- throw e;
- }
- }
+ System.loadLibrary(library);
}
}
- if (context != null && shouldDeleteOldWorkaroundLibraries) {
- if (!sNativeLibraryHackWasUsed) {
- LibraryLoaderHelper.deleteLibrariesAsynchronously(
- context, LibraryLoaderHelper.PACKAGE_MANAGER_WORKAROUND_DIR);
- }
- if (!fallbackWasUsed) {
- LibraryLoaderHelper.deleteLibrariesAsynchronously(
- context, LibraryLoaderHelper.LOAD_FROM_APK_FALLBACK_DIR);
- }
+ if (!fallbackWasUsed && context != null
+ && shouldDeleteFallbackLibraries) {
+ LibraryLoaderHelper.deleteLibrariesAsynchronously(
+ context, LibraryLoaderHelper.LOAD_FROM_APK_FALLBACK_DIR);
}
long stopTime = SystemClock.uptimeMillis();
@@ -373,7 +346,6 @@
// Called after all native initializations are complete.
public static void onNativeInitializationComplete(Context context) {
recordBrowserProcessHistogram(context);
- nativeRecordNativeLibraryHack(sNativeLibraryHackWasUsed);
}
// Record Chromium linker histogram state for the main browser process. Called from
@@ -452,6 +424,4 @@
// Get the version of the native library. This is needed so that we can check we
// have the right version before initializing the (rest of the) JNI.
private static native String nativeGetVersionNumber();
-
- private static native void nativeRecordNativeLibraryHack(boolean usedHack);
}
diff --git a/base/android/java/src/org/chromium/base/library_loader/LibraryLoaderHelper.java b/base/android/java/src/org/chromium/base/library_loader/LibraryLoaderHelper.java
index c185fad..7dd1a29 100644
--- a/base/android/java/src/org/chromium/base/library_loader/LibraryLoaderHelper.java
+++ b/base/android/java/src/org/chromium/base/library_loader/LibraryLoaderHelper.java
@@ -6,7 +6,6 @@
package org.chromium.base.library_loader;
import android.content.Context;
-import android.os.Build;
import android.util.Log;
import java.io.BufferedOutputStream;
@@ -19,7 +18,6 @@
import java.io.OutputStream;
import java.util.Collection;
import java.util.Collections;
-import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;
@@ -44,94 +42,16 @@
/**
* The class provides helper functions to extract native libraries from APK,
* and load libraries from there.
- *
- * The class should be package-visible only, but made public for testing
- * purpose.
*/
-public class LibraryLoaderHelper {
+class LibraryLoaderHelper {
private static final String TAG = "LibraryLoaderHelper";
- // Workaround and fallback directories.
- // TODO(petrcermak): Merge the directories once refactored.
- public static final String PACKAGE_MANAGER_WORKAROUND_DIR = "lib";
- public static final String LOAD_FROM_APK_FALLBACK_DIR = "fallback";
+ // Fallback directories.
+ static final String LOAD_FROM_APK_FALLBACK_DIR = "fallback";
private static final int BUFFER_SIZE = 16384;
/**
- * One-way switch becomes true if native libraries were unpacked
- * from APK.
- */
- private static boolean sLibrariesWereUnpacked = false;
-
- /**
- * Loads native libraries using workaround only, skip the library in system
- * lib path. The method exists only for testing purpose.
- * Caller must ensure thread safety of this method.
- * @param context
- */
- public static boolean loadNativeLibrariesUsingWorkaroundForTesting(Context context) {
- // Although tryLoadLibraryUsingWorkaround might be called multiple times,
- // libraries should only be unpacked once, this is guaranteed by
- // sLibrariesWereUnpacked.
- for (String library : NativeLibraries.LIBRARIES) {
- if (!tryLoadLibraryUsingWorkaround(context, library)) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Try to load a native library using a workaround of
- * http://b/13216167.
- *
- * Workaround for b/13216167 was adapted from code in
- * https://googleplex-android-review.git.corp.google.com/#/c/433061
- *
- * More details about http://b/13216167:
- * PackageManager may fail to update shared library.
- *
- * Native library directory in an updated package is a symbolic link
- * to a directory in /data/app-lib/<package name>, for example:
- * /data/data/com.android.chrome/lib -> /data/app-lib/com.android.chrome[-1].
- * When updating the application, the PackageManager create a new directory,
- * e.g., /data/app-lib/com.android.chrome-2, and remove the old symlink and
- * recreate one to the new directory. However, on some devices (e.g. Sony Xperia),
- * the symlink was updated, but fails to extract new native libraries from
- * the new apk.
- *
- * We make the following changes to alleviate the issue:
- * 1) name the native library with apk version code, e.g.,
- * libchrome.1750.136.so, 1750.136 is Chrome version number;
- * 2) first try to load the library using System.loadLibrary,
- * if that failed due to the library file was not found,
- * search the named library in a /data/data/com.android.chrome/app_lib
- * directory. Because of change 1), each version has a different native
- * library name, so avoid mistakenly using the old native library.
- *
- * If named library is not in /data/data/com.android.chrome/app_lib directory,
- * extract native libraries from apk and cache in the directory.
- *
- * This function doesn't throw UnsatisfiedLinkError, the caller needs to
- * check the return value.
- */
- static boolean tryLoadLibraryUsingWorkaround(Context context, String library) {
- assert context != null;
- String libName = System.mapLibraryName(library);
- File libFile = new File(getLibDir(context, PACKAGE_MANAGER_WORKAROUND_DIR), libName);
- if (!libFile.exists() && !unpackWorkaroundLibrariesOnce(context)) {
- return false;
- }
- try {
- System.load(libFile.getAbsolutePath());
- return true;
- } catch (UnsatisfiedLinkError e) {
- return false;
- }
- }
-
- /**
* Returns the directory for holding extracted native libraries.
* It may create the directory if it doesn't exist.
*
@@ -139,57 +59,14 @@
* @param dirName The name of the directory containing the libraries.
* @return The directory file object.
*/
- public static File getLibDir(Context context, String dirName) {
+ static File getLibDir(Context context, String dirName) {
return context.getDir(dirName, Context.MODE_PRIVATE);
}
- @SuppressWarnings("deprecation")
- private static String getJniNameInApk(String libName) {
- // TODO(aurimas): Build.CPU_ABI has been deprecated. Replace it when final L SDK is public.
- return "lib/" + Build.CPU_ABI + "/" + libName;
- }
-
- /**
- * Unpack native libraries from the APK file. The method is supposed to
- * be called only once. It deletes existing files in unpacked directory
- * before unpacking.
- *
- * @param context
- * @return true when unpacking was successful, false when failed or called
- * more than once.
- */
- private static boolean unpackWorkaroundLibrariesOnce(Context context) {
- if (sLibrariesWereUnpacked) {
- return false;
- }
- sLibrariesWereUnpacked = true;
-
- deleteLibrariesSynchronously(context, PACKAGE_MANAGER_WORKAROUND_DIR);
- File libDir = getLibDir(context, PACKAGE_MANAGER_WORKAROUND_DIR);
-
- try {
- Map<String, File> dstFiles = new HashMap<String, File>();
- for (String library : NativeLibraries.LIBRARIES) {
- String libName = System.mapLibraryName(library);
- String pathInZipFile = getJniNameInApk(libName);
- dstFiles.put(pathInZipFile, new File(libDir, libName));
- }
- unpackLibraries(context, dstFiles);
- return true;
- } catch (UnpackingException e) {
- Log.e(TAG, "Failed to unpack native libraries", e);
- deleteLibrariesSynchronously(context, PACKAGE_MANAGER_WORKAROUND_DIR);
- return false;
- }
- }
-
/**
* Delete libraries and their directory synchronously.
- * For testing purpose only.
- *
- * @param context
*/
- public static void deleteLibrariesSynchronously(Context context, String dirName) {
+ private static void deleteLibrariesSynchronously(Context context, String dirName) {
File libDir = getLibDir(context, dirName);
deleteObsoleteLibraries(libDir, Collections.<File>emptyList());
}
@@ -197,8 +74,6 @@
/**
* Delete libraries and their directory asynchronously.
* The actual deletion is done in a background thread.
- *
- * @param context
*/
static void deleteLibrariesAsynchronously(
final Context context, final String dirName) {
@@ -220,7 +95,7 @@
* @param library Library name.
* @return name of the fallback copy of the library.
*/
- public static String buildFallbackLibrary(Context context, String library) {
+ static String buildFallbackLibrary(Context context, String library) {
try {
String libName = System.mapLibraryName(library);
File fallbackLibDir = getLibDir(context, LOAD_FROM_APK_FALLBACK_DIR);
diff --git a/base/android/javatests/src/org/chromium/base/LibraryLoaderHelperTest.java b/base/android/javatests/src/org/chromium/base/LibraryLoaderHelperTest.java
deleted file mode 100644
index 6abdb89..0000000
--- a/base/android/javatests/src/org/chromium/base/LibraryLoaderHelperTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base;
-
-import android.content.Context;
-import android.test.InstrumentationTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-
-import org.chromium.base.library_loader.LibraryLoaderHelper;
-
-import java.io.File;
-
-/**
- * Test class for the native library hack.
- */
-public class LibraryLoaderHelperTest extends InstrumentationTestCase {
- private static final String TAG = "LibraryLoaderHelperTest";
-
- @Override
- public void setUp() throws Exception {
- Context context = getInstrumentation().getTargetContext();
- LibraryLoaderHelper.deleteLibrariesSynchronously(
- context, LibraryLoaderHelper.PACKAGE_MANAGER_WORKAROUND_DIR);
- }
-
- @MediumTest
- public void testLoadNativeLibraries() {
- getInstrumentation().runOnMainSync(new Runnable() {
- @Override
- public void run() {
- Context context = getInstrumentation().getTargetContext();
- File libDir = LibraryLoaderHelper.getLibDir(context,
- LibraryLoaderHelper.PACKAGE_MANAGER_WORKAROUND_DIR);
- assertTrue(libDir.exists());
- assertTrue(libDir.isDirectory());
- assertEquals(libDir.list().length, 0);
-
- assertTrue(LibraryLoaderHelper.loadNativeLibrariesUsingWorkaroundForTesting(
- context));
-
- assertTrue(libDir.list().length > 0);
- }
- });
- }
-
- @Override
- public void tearDown() throws Exception {
- Context context = getInstrumentation().getTargetContext();
- LibraryLoaderHelper.deleteLibrariesSynchronously(
- context, LibraryLoaderHelper.PACKAGE_MANAGER_WORKAROUND_DIR);
- super.tearDown();
- }
-}
diff --git a/base/android/library_loader/library_loader_hooks.cc b/base/android/library_loader/library_loader_hooks.cc
index 809275d..965d030 100644
--- a/base/android/library_loader/library_loader_hooks.cc
+++ b/base/android/library_loader/library_loader_hooks.cc
@@ -136,9 +136,5 @@
return ConvertUTF8ToJavaString(env, g_library_version_number).Release();
}
-static void RecordNativeLibraryHack(JNIEnv*, jclass, jboolean usedHack) {
- UMA_HISTOGRAM_BOOLEAN("LibraryLoader.NativeLibraryHack", usedHack);
-}
-
} // namespace android
} // namespace base
diff --git a/base/android/linker/BUILD.gn b/base/android/linker/BUILD.gn
index b26e3b0..4817d88 100644
--- a/base/android/linker/BUILD.gn
+++ b/base/android/linker/BUILD.gn
@@ -9,11 +9,16 @@
# GYP: //base/base.gyp:chromium_android_linker
shared_library("chromium_android_linker") {
- sources = [ "linker_jni.cc" ]
+ sources = [
+ "linker_jni.cc",
+ ]
+
# The NDK contains the crazy_linker here:
# '<(android_ndk_root)/crazy_linker.gyp:crazy_linker'
# However, we use our own fork. See bug 384700.
- deps = [ "//third_party/android_crazy_linker" ]
+ deps = [
+ "//third_party/android_crazy_linker",
+ ]
# TODO(GYP):
# The crazy linker is never instrumented.
diff --git a/base/base.gyp b/base/base.gyp
index e31cf18..64f88db 100644
--- a/base/base.gyp
+++ b/base/base.gyp
@@ -447,6 +447,7 @@
'type': '<(gtest_target_type)',
'sources': [
'android/application_status_listener_unittest.cc',
+ 'android/content_uri_utils_unittest.cc',
'android/jni_android_unittest.cc',
'android/jni_array_unittest.cc',
'android/jni_string_unittest.cc',
@@ -911,6 +912,8 @@
'test/expectations/expectation.h',
'test/expectations/parser.cc',
'test/expectations/parser.h',
+ 'test/gtest_util.cc',
+ 'test/gtest_util.h',
'test/gtest_xml_util.cc',
'test/gtest_xml_util.h',
'test/launcher/test_launcher.cc',
diff --git a/base/base.gypi b/base/base.gypi
index 39bb08b..f945166 100644
--- a/base/base.gypi
+++ b/base/base.gypi
@@ -244,6 +244,7 @@
'hash.cc',
'hash.h',
'id_map.h',
+ 'ios/block_types.h',
'ios/device_util.h',
'ios/device_util.mm',
'ios/ios_util.h',
diff --git a/base/bind.h b/base/bind.h
index b14f70c..7874656 100644
--- a/base/bind.h
+++ b/base/bind.h
@@ -1,8 +1,3 @@
-// This file was GENERATED by command:
-// pump.py bind.h.pump
-// DO NOT EDIT BY HAND!!!
-
-
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -46,10 +41,9 @@
//
// TODO(ajwong): We might be able to avoid this now, but need to test.
//
-// It is possible to move most of the COMPILE_ASSERT asserts into BindState<>,
-// but it feels a little nicer to have the asserts here so people do not
-// need to crack open bind_internal.h. On the other hand, it makes Bind()
-// harder to read.
+// It is possible to move most of the static_assert into BindState<>, but it
+// feels a little nicer to have the asserts here so people do not need to crack
+// open bind_internal.h. On the other hand, it makes Bind() harder to read.
namespace base {
@@ -58,8 +52,7 @@
typename internal::BindState<
typename internal::FunctorTraits<Functor>::RunnableType,
typename internal::FunctorTraits<Functor>::RunType,
- void()>
- ::UnboundRunType>
+ void()>::UnboundRunType>
Bind(Functor functor) {
// Typedefs for how to store and run the functor.
typedef typename internal::FunctorTraits<Functor>::RunnableType RunnableType;
@@ -67,19 +60,18 @@
typedef internal::BindState<RunnableType, RunType, void()> BindState;
-
return Callback<typename BindState::UnboundRunType>(
new BindState(internal::MakeRunnable(functor)));
}
-template <typename Functor, typename P1>
+template <typename Functor, typename... Args>
base::Callback<
typename internal::BindState<
typename internal::FunctorTraits<Functor>::RunnableType,
typename internal::FunctorTraits<Functor>::RunType,
- void(typename internal::CallbackParamTraits<P1>::StorageType)>
+ void(typename internal::CallbackParamTraits<Args>::StorageType...)>
::UnboundRunType>
-Bind(Functor functor, const P1& p1) {
+Bind(Functor functor, const Args&... args) {
// Typedefs for how to store and run the functor.
typedef typename internal::FunctorTraits<Functor>::RunnableType RunnableType;
typedef typename internal::FunctorTraits<Functor>::RunType RunType;
@@ -87,423 +79,34 @@
// Use RunnableType::RunType instead of RunType above because our
// checks should below for bound references need to know what the actual
// functor is going to interpret the argument as.
- typedef internal::FunctionTraits<typename RunnableType::RunType>
- BoundFunctorTraits;
+ typedef typename RunnableType::RunType BoundRunType;
// Do not allow binding a non-const reference parameter. Non-const reference
// parameters are disallowed by the Google style guide. Also, binding a
// non-const reference parameter can make for subtle bugs because the
// invoked function will receive a reference to the stored copy of the
// argument and not the original.
- COMPILE_ASSERT(
- !(is_non_const_reference<typename BoundFunctorTraits::A1Type>::value ),
- do_not_bind_functions_with_nonconst_ref);
+ static_assert(!internal::HasNonConstReferenceParam<BoundRunType>::value,
+ "do_not_bind_functions_with_nonconst_ref");
+
+ const bool is_method = internal::HasIsMethodTag<RunnableType>::value;
// For methods, we need to be careful for parameter 1. We do not require
// a scoped_refptr because BindState<> itself takes care of AddRef() for
// methods. We also disallow binding of an array as the method's target
// object.
- COMPILE_ASSERT(
- internal::HasIsMethodTag<RunnableType>::value ||
- !internal::NeedsScopedRefptrButGetsRawPtr<P1>::value,
- p1_is_refcounted_type_and_needs_scoped_refptr);
- COMPILE_ASSERT(!internal::HasIsMethodTag<RunnableType>::value ||
- !is_array<P1>::value,
- first_bound_argument_to_method_cannot_be_array);
- typedef internal::BindState<RunnableType, RunType,
- void(typename internal::CallbackParamTraits<P1>::StorageType)> BindState;
+ static_assert(!internal::BindsArrayToFirstArg<is_method, Args...>::value,
+ "first_bound_argument_to_method_cannot_be_array");
+ static_assert(
+ !internal::HasRefCountedParamAsRawPtr<is_method, Args...>::value,
+ "a_parameter_is_refcounted_type_and_needs_scoped_refptr");
+ typedef internal::BindState<RunnableType, RunType,
+ void(typename internal::CallbackParamTraits<Args>::StorageType...)>
+ BindState;
return Callback<typename BindState::UnboundRunType>(
- new BindState(internal::MakeRunnable(functor), p1));
-}
-
-template <typename Functor, typename P1, typename P2>
-base::Callback<
- typename internal::BindState<
- typename internal::FunctorTraits<Functor>::RunnableType,
- typename internal::FunctorTraits<Functor>::RunType,
- void(typename internal::CallbackParamTraits<P1>::StorageType,
- typename internal::CallbackParamTraits<P2>::StorageType)>
- ::UnboundRunType>
-Bind(Functor functor, const P1& p1, const P2& p2) {
- // Typedefs for how to store and run the functor.
- typedef typename internal::FunctorTraits<Functor>::RunnableType RunnableType;
- typedef typename internal::FunctorTraits<Functor>::RunType RunType;
-
- // Use RunnableType::RunType instead of RunType above because our
- // checks should below for bound references need to know what the actual
- // functor is going to interpret the argument as.
- typedef internal::FunctionTraits<typename RunnableType::RunType>
- BoundFunctorTraits;
-
- // Do not allow binding a non-const reference parameter. Non-const reference
- // parameters are disallowed by the Google style guide. Also, binding a
- // non-const reference parameter can make for subtle bugs because the
- // invoked function will receive a reference to the stored copy of the
- // argument and not the original.
- COMPILE_ASSERT(
- !(is_non_const_reference<typename BoundFunctorTraits::A1Type>::value ||
- is_non_const_reference<typename BoundFunctorTraits::A2Type>::value ),
- do_not_bind_functions_with_nonconst_ref);
-
- // For methods, we need to be careful for parameter 1. We do not require
- // a scoped_refptr because BindState<> itself takes care of AddRef() for
- // methods. We also disallow binding of an array as the method's target
- // object.
- COMPILE_ASSERT(
- internal::HasIsMethodTag<RunnableType>::value ||
- !internal::NeedsScopedRefptrButGetsRawPtr<P1>::value,
- p1_is_refcounted_type_and_needs_scoped_refptr);
- COMPILE_ASSERT(!internal::HasIsMethodTag<RunnableType>::value ||
- !is_array<P1>::value,
- first_bound_argument_to_method_cannot_be_array);
- COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P2>::value,
- p2_is_refcounted_type_and_needs_scoped_refptr);
- typedef internal::BindState<RunnableType, RunType,
- void(typename internal::CallbackParamTraits<P1>::StorageType,
- typename internal::CallbackParamTraits<P2>::StorageType)> BindState;
-
-
- return Callback<typename BindState::UnboundRunType>(
- new BindState(internal::MakeRunnable(functor), p1, p2));
-}
-
-template <typename Functor, typename P1, typename P2, typename P3>
-base::Callback<
- typename internal::BindState<
- typename internal::FunctorTraits<Functor>::RunnableType,
- typename internal::FunctorTraits<Functor>::RunType,
- void(typename internal::CallbackParamTraits<P1>::StorageType,
- typename internal::CallbackParamTraits<P2>::StorageType,
- typename internal::CallbackParamTraits<P3>::StorageType)>
- ::UnboundRunType>
-Bind(Functor functor, const P1& p1, const P2& p2, const P3& p3) {
- // Typedefs for how to store and run the functor.
- typedef typename internal::FunctorTraits<Functor>::RunnableType RunnableType;
- typedef typename internal::FunctorTraits<Functor>::RunType RunType;
-
- // Use RunnableType::RunType instead of RunType above because our
- // checks should below for bound references need to know what the actual
- // functor is going to interpret the argument as.
- typedef internal::FunctionTraits<typename RunnableType::RunType>
- BoundFunctorTraits;
-
- // Do not allow binding a non-const reference parameter. Non-const reference
- // parameters are disallowed by the Google style guide. Also, binding a
- // non-const reference parameter can make for subtle bugs because the
- // invoked function will receive a reference to the stored copy of the
- // argument and not the original.
- COMPILE_ASSERT(
- !(is_non_const_reference<typename BoundFunctorTraits::A1Type>::value ||
- is_non_const_reference<typename BoundFunctorTraits::A2Type>::value ||
- is_non_const_reference<typename BoundFunctorTraits::A3Type>::value ),
- do_not_bind_functions_with_nonconst_ref);
-
- // For methods, we need to be careful for parameter 1. We do not require
- // a scoped_refptr because BindState<> itself takes care of AddRef() for
- // methods. We also disallow binding of an array as the method's target
- // object.
- COMPILE_ASSERT(
- internal::HasIsMethodTag<RunnableType>::value ||
- !internal::NeedsScopedRefptrButGetsRawPtr<P1>::value,
- p1_is_refcounted_type_and_needs_scoped_refptr);
- COMPILE_ASSERT(!internal::HasIsMethodTag<RunnableType>::value ||
- !is_array<P1>::value,
- first_bound_argument_to_method_cannot_be_array);
- COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P2>::value,
- p2_is_refcounted_type_and_needs_scoped_refptr);
- COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P3>::value,
- p3_is_refcounted_type_and_needs_scoped_refptr);
- typedef internal::BindState<RunnableType, RunType,
- void(typename internal::CallbackParamTraits<P1>::StorageType,
- typename internal::CallbackParamTraits<P2>::StorageType,
- typename internal::CallbackParamTraits<P3>::StorageType)> BindState;
-
-
- return Callback<typename BindState::UnboundRunType>(
- new BindState(internal::MakeRunnable(functor), p1, p2, p3));
-}
-
-template <typename Functor, typename P1, typename P2, typename P3, typename P4>
-base::Callback<
- typename internal::BindState<
- typename internal::FunctorTraits<Functor>::RunnableType,
- typename internal::FunctorTraits<Functor>::RunType,
- void(typename internal::CallbackParamTraits<P1>::StorageType,
- typename internal::CallbackParamTraits<P2>::StorageType,
- typename internal::CallbackParamTraits<P3>::StorageType,
- typename internal::CallbackParamTraits<P4>::StorageType)>
- ::UnboundRunType>
-Bind(Functor functor, const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
- // Typedefs for how to store and run the functor.
- typedef typename internal::FunctorTraits<Functor>::RunnableType RunnableType;
- typedef typename internal::FunctorTraits<Functor>::RunType RunType;
-
- // Use RunnableType::RunType instead of RunType above because our
- // checks should below for bound references need to know what the actual
- // functor is going to interpret the argument as.
- typedef internal::FunctionTraits<typename RunnableType::RunType>
- BoundFunctorTraits;
-
- // Do not allow binding a non-const reference parameter. Non-const reference
- // parameters are disallowed by the Google style guide. Also, binding a
- // non-const reference parameter can make for subtle bugs because the
- // invoked function will receive a reference to the stored copy of the
- // argument and not the original.
- COMPILE_ASSERT(
- !(is_non_const_reference<typename BoundFunctorTraits::A1Type>::value ||
- is_non_const_reference<typename BoundFunctorTraits::A2Type>::value ||
- is_non_const_reference<typename BoundFunctorTraits::A3Type>::value ||
- is_non_const_reference<typename BoundFunctorTraits::A4Type>::value ),
- do_not_bind_functions_with_nonconst_ref);
-
- // For methods, we need to be careful for parameter 1. We do not require
- // a scoped_refptr because BindState<> itself takes care of AddRef() for
- // methods. We also disallow binding of an array as the method's target
- // object.
- COMPILE_ASSERT(
- internal::HasIsMethodTag<RunnableType>::value ||
- !internal::NeedsScopedRefptrButGetsRawPtr<P1>::value,
- p1_is_refcounted_type_and_needs_scoped_refptr);
- COMPILE_ASSERT(!internal::HasIsMethodTag<RunnableType>::value ||
- !is_array<P1>::value,
- first_bound_argument_to_method_cannot_be_array);
- COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P2>::value,
- p2_is_refcounted_type_and_needs_scoped_refptr);
- COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P3>::value,
- p3_is_refcounted_type_and_needs_scoped_refptr);
- COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P4>::value,
- p4_is_refcounted_type_and_needs_scoped_refptr);
- typedef internal::BindState<RunnableType, RunType,
- void(typename internal::CallbackParamTraits<P1>::StorageType,
- typename internal::CallbackParamTraits<P2>::StorageType,
- typename internal::CallbackParamTraits<P3>::StorageType,
- typename internal::CallbackParamTraits<P4>::StorageType)> BindState;
-
-
- return Callback<typename BindState::UnboundRunType>(
- new BindState(internal::MakeRunnable(functor), p1, p2, p3, p4));
-}
-
-template <typename Functor, typename P1, typename P2, typename P3, typename P4,
- typename P5>
-base::Callback<
- typename internal::BindState<
- typename internal::FunctorTraits<Functor>::RunnableType,
- typename internal::FunctorTraits<Functor>::RunType,
- void(typename internal::CallbackParamTraits<P1>::StorageType,
- typename internal::CallbackParamTraits<P2>::StorageType,
- typename internal::CallbackParamTraits<P3>::StorageType,
- typename internal::CallbackParamTraits<P4>::StorageType,
- typename internal::CallbackParamTraits<P5>::StorageType)>
- ::UnboundRunType>
-Bind(Functor functor, const P1& p1, const P2& p2, const P3& p3, const P4& p4,
- const P5& p5) {
- // Typedefs for how to store and run the functor.
- typedef typename internal::FunctorTraits<Functor>::RunnableType RunnableType;
- typedef typename internal::FunctorTraits<Functor>::RunType RunType;
-
- // Use RunnableType::RunType instead of RunType above because our
- // checks should below for bound references need to know what the actual
- // functor is going to interpret the argument as.
- typedef internal::FunctionTraits<typename RunnableType::RunType>
- BoundFunctorTraits;
-
- // Do not allow binding a non-const reference parameter. Non-const reference
- // parameters are disallowed by the Google style guide. Also, binding a
- // non-const reference parameter can make for subtle bugs because the
- // invoked function will receive a reference to the stored copy of the
- // argument and not the original.
- COMPILE_ASSERT(
- !(is_non_const_reference<typename BoundFunctorTraits::A1Type>::value ||
- is_non_const_reference<typename BoundFunctorTraits::A2Type>::value ||
- is_non_const_reference<typename BoundFunctorTraits::A3Type>::value ||
- is_non_const_reference<typename BoundFunctorTraits::A4Type>::value ||
- is_non_const_reference<typename BoundFunctorTraits::A5Type>::value ),
- do_not_bind_functions_with_nonconst_ref);
-
- // For methods, we need to be careful for parameter 1. We do not require
- // a scoped_refptr because BindState<> itself takes care of AddRef() for
- // methods. We also disallow binding of an array as the method's target
- // object.
- COMPILE_ASSERT(
- internal::HasIsMethodTag<RunnableType>::value ||
- !internal::NeedsScopedRefptrButGetsRawPtr<P1>::value,
- p1_is_refcounted_type_and_needs_scoped_refptr);
- COMPILE_ASSERT(!internal::HasIsMethodTag<RunnableType>::value ||
- !is_array<P1>::value,
- first_bound_argument_to_method_cannot_be_array);
- COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P2>::value,
- p2_is_refcounted_type_and_needs_scoped_refptr);
- COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P3>::value,
- p3_is_refcounted_type_and_needs_scoped_refptr);
- COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P4>::value,
- p4_is_refcounted_type_and_needs_scoped_refptr);
- COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P5>::value,
- p5_is_refcounted_type_and_needs_scoped_refptr);
- typedef internal::BindState<RunnableType, RunType,
- void(typename internal::CallbackParamTraits<P1>::StorageType,
- typename internal::CallbackParamTraits<P2>::StorageType,
- typename internal::CallbackParamTraits<P3>::StorageType,
- typename internal::CallbackParamTraits<P4>::StorageType,
- typename internal::CallbackParamTraits<P5>::StorageType)> BindState;
-
-
- return Callback<typename BindState::UnboundRunType>(
- new BindState(internal::MakeRunnable(functor), p1, p2, p3, p4, p5));
-}
-
-template <typename Functor, typename P1, typename P2, typename P3, typename P4,
- typename P5, typename P6>
-base::Callback<
- typename internal::BindState<
- typename internal::FunctorTraits<Functor>::RunnableType,
- typename internal::FunctorTraits<Functor>::RunType,
- void(typename internal::CallbackParamTraits<P1>::StorageType,
- typename internal::CallbackParamTraits<P2>::StorageType,
- typename internal::CallbackParamTraits<P3>::StorageType,
- typename internal::CallbackParamTraits<P4>::StorageType,
- typename internal::CallbackParamTraits<P5>::StorageType,
- typename internal::CallbackParamTraits<P6>::StorageType)>
- ::UnboundRunType>
-Bind(Functor functor, const P1& p1, const P2& p2, const P3& p3, const P4& p4,
- const P5& p5, const P6& p6) {
- // Typedefs for how to store and run the functor.
- typedef typename internal::FunctorTraits<Functor>::RunnableType RunnableType;
- typedef typename internal::FunctorTraits<Functor>::RunType RunType;
-
- // Use RunnableType::RunType instead of RunType above because our
- // checks should below for bound references need to know what the actual
- // functor is going to interpret the argument as.
- typedef internal::FunctionTraits<typename RunnableType::RunType>
- BoundFunctorTraits;
-
- // Do not allow binding a non-const reference parameter. Non-const reference
- // parameters are disallowed by the Google style guide. Also, binding a
- // non-const reference parameter can make for subtle bugs because the
- // invoked function will receive a reference to the stored copy of the
- // argument and not the original.
- COMPILE_ASSERT(
- !(is_non_const_reference<typename BoundFunctorTraits::A1Type>::value ||
- is_non_const_reference<typename BoundFunctorTraits::A2Type>::value ||
- is_non_const_reference<typename BoundFunctorTraits::A3Type>::value ||
- is_non_const_reference<typename BoundFunctorTraits::A4Type>::value ||
- is_non_const_reference<typename BoundFunctorTraits::A5Type>::value ||
- is_non_const_reference<typename BoundFunctorTraits::A6Type>::value ),
- do_not_bind_functions_with_nonconst_ref);
-
- // For methods, we need to be careful for parameter 1. We do not require
- // a scoped_refptr because BindState<> itself takes care of AddRef() for
- // methods. We also disallow binding of an array as the method's target
- // object.
- COMPILE_ASSERT(
- internal::HasIsMethodTag<RunnableType>::value ||
- !internal::NeedsScopedRefptrButGetsRawPtr<P1>::value,
- p1_is_refcounted_type_and_needs_scoped_refptr);
- COMPILE_ASSERT(!internal::HasIsMethodTag<RunnableType>::value ||
- !is_array<P1>::value,
- first_bound_argument_to_method_cannot_be_array);
- COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P2>::value,
- p2_is_refcounted_type_and_needs_scoped_refptr);
- COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P3>::value,
- p3_is_refcounted_type_and_needs_scoped_refptr);
- COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P4>::value,
- p4_is_refcounted_type_and_needs_scoped_refptr);
- COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P5>::value,
- p5_is_refcounted_type_and_needs_scoped_refptr);
- COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P6>::value,
- p6_is_refcounted_type_and_needs_scoped_refptr);
- typedef internal::BindState<RunnableType, RunType,
- void(typename internal::CallbackParamTraits<P1>::StorageType,
- typename internal::CallbackParamTraits<P2>::StorageType,
- typename internal::CallbackParamTraits<P3>::StorageType,
- typename internal::CallbackParamTraits<P4>::StorageType,
- typename internal::CallbackParamTraits<P5>::StorageType,
- typename internal::CallbackParamTraits<P6>::StorageType)> BindState;
-
-
- return Callback<typename BindState::UnboundRunType>(
- new BindState(internal::MakeRunnable(functor), p1, p2, p3, p4, p5, p6));
-}
-
-template <typename Functor, typename P1, typename P2, typename P3, typename P4,
- typename P5, typename P6, typename P7>
-base::Callback<
- typename internal::BindState<
- typename internal::FunctorTraits<Functor>::RunnableType,
- typename internal::FunctorTraits<Functor>::RunType,
- void(typename internal::CallbackParamTraits<P1>::StorageType,
- typename internal::CallbackParamTraits<P2>::StorageType,
- typename internal::CallbackParamTraits<P3>::StorageType,
- typename internal::CallbackParamTraits<P4>::StorageType,
- typename internal::CallbackParamTraits<P5>::StorageType,
- typename internal::CallbackParamTraits<P6>::StorageType,
- typename internal::CallbackParamTraits<P7>::StorageType)>
- ::UnboundRunType>
-Bind(Functor functor, const P1& p1, const P2& p2, const P3& p3, const P4& p4,
- const P5& p5, const P6& p6, const P7& p7) {
- // Typedefs for how to store and run the functor.
- typedef typename internal::FunctorTraits<Functor>::RunnableType RunnableType;
- typedef typename internal::FunctorTraits<Functor>::RunType RunType;
-
- // Use RunnableType::RunType instead of RunType above because our
- // checks should below for bound references need to know what the actual
- // functor is going to interpret the argument as.
- typedef internal::FunctionTraits<typename RunnableType::RunType>
- BoundFunctorTraits;
-
- // Do not allow binding a non-const reference parameter. Non-const reference
- // parameters are disallowed by the Google style guide. Also, binding a
- // non-const reference parameter can make for subtle bugs because the
- // invoked function will receive a reference to the stored copy of the
- // argument and not the original.
- COMPILE_ASSERT(
- !(is_non_const_reference<typename BoundFunctorTraits::A1Type>::value ||
- is_non_const_reference<typename BoundFunctorTraits::A2Type>::value ||
- is_non_const_reference<typename BoundFunctorTraits::A3Type>::value ||
- is_non_const_reference<typename BoundFunctorTraits::A4Type>::value ||
- is_non_const_reference<typename BoundFunctorTraits::A5Type>::value ||
- is_non_const_reference<typename BoundFunctorTraits::A6Type>::value ||
- is_non_const_reference<typename BoundFunctorTraits::A7Type>::value ),
- do_not_bind_functions_with_nonconst_ref);
-
- // For methods, we need to be careful for parameter 1. We do not require
- // a scoped_refptr because BindState<> itself takes care of AddRef() for
- // methods. We also disallow binding of an array as the method's target
- // object.
- COMPILE_ASSERT(
- internal::HasIsMethodTag<RunnableType>::value ||
- !internal::NeedsScopedRefptrButGetsRawPtr<P1>::value,
- p1_is_refcounted_type_and_needs_scoped_refptr);
- COMPILE_ASSERT(!internal::HasIsMethodTag<RunnableType>::value ||
- !is_array<P1>::value,
- first_bound_argument_to_method_cannot_be_array);
- COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P2>::value,
- p2_is_refcounted_type_and_needs_scoped_refptr);
- COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P3>::value,
- p3_is_refcounted_type_and_needs_scoped_refptr);
- COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P4>::value,
- p4_is_refcounted_type_and_needs_scoped_refptr);
- COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P5>::value,
- p5_is_refcounted_type_and_needs_scoped_refptr);
- COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P6>::value,
- p6_is_refcounted_type_and_needs_scoped_refptr);
- COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P7>::value,
- p7_is_refcounted_type_and_needs_scoped_refptr);
- typedef internal::BindState<RunnableType, RunType,
- void(typename internal::CallbackParamTraits<P1>::StorageType,
- typename internal::CallbackParamTraits<P2>::StorageType,
- typename internal::CallbackParamTraits<P3>::StorageType,
- typename internal::CallbackParamTraits<P4>::StorageType,
- typename internal::CallbackParamTraits<P5>::StorageType,
- typename internal::CallbackParamTraits<P6>::StorageType,
- typename internal::CallbackParamTraits<P7>::StorageType)> BindState;
-
-
- return Callback<typename BindState::UnboundRunType>(
- new BindState(internal::MakeRunnable(functor), p1, p2, p3, p4, p5, p6,
- p7));
+ new BindState(internal::MakeRunnable(functor), args...));
}
} // namespace base
diff --git a/base/bind.h.pump b/base/bind.h.pump
deleted file mode 100644
index 2cdd7d5..0000000
--- a/base/bind.h.pump
+++ /dev/null
@@ -1,153 +0,0 @@
-$$ This is a pump file for generating file templates. Pump is a python
-$$ script that is part of the Google Test suite of utilities. Description
-$$ can be found here:
-$$
-$$ http://code.google.com/p/googletest/wiki/PumpManual
-$$
-
-$$
-$$ MAX_ARITY controls the number of arguments that Bind() supports.
-$$ The amount of code, and more importantly, the number of template types
-$$ generated by pump grows at O(MAX_ARITY^2).
-$$
-$$ We tried going to 11 and found it imposed an extra 10 penalty on windows
-$$ cycle times compared to our original baseline of 6.
-$$
-$$ Currently 7 is chosen as a compromise between supporting a convenient
-$$ number of arguments and keeping compile times low. At 7, we have 115
-$$ templates being generated by pump.
-$$
-$$ Be careful when adjusting this number. If people find a need to bind
-$$ a larger number of arguments, consider refactoring the function to use
-$$ a param struct instead of raising the MAX_ARITY.
-$$
-$$ See http://crbug.com/98542 for more context.
-$$
-$var MAX_ARITY = 7
-
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_BIND_H_
-#define BASE_BIND_H_
-
-#include "base/bind_internal.h"
-#include "base/callback_internal.h"
-
-// -----------------------------------------------------------------------------
-// Usage documentation
-// -----------------------------------------------------------------------------
-//
-// See base/callback.h for documentation.
-//
-//
-// -----------------------------------------------------------------------------
-// Implementation notes
-// -----------------------------------------------------------------------------
-//
-// If you're reading the implementation, before proceeding further, you should
-// read the top comment of base/bind_internal.h for a definition of common
-// terms and concepts.
-//
-// RETURN TYPES
-//
-// Though Bind()'s result is meant to be stored in a Callback<> type, it
-// cannot actually return the exact type without requiring a large amount
-// of extra template specializations. The problem is that in order to
-// discern the correct specialization of Callback<>, Bind would need to
-// unwrap the function signature to determine the signature's arity, and
-// whether or not it is a method.
-//
-// Each unique combination of (arity, function_type, num_prebound) where
-// function_type is one of {function, method, const_method} would require
-// one specialization. We eventually have to do a similar number of
-// specializations anyways in the implementation (see the Invoker<>,
-// classes). However, it is avoidable in Bind if we return the result
-// via an indirection like we do below.
-//
-// TODO(ajwong): We might be able to avoid this now, but need to test.
-//
-// It is possible to move most of the COMPILE_ASSERT asserts into BindState<>,
-// but it feels a little nicer to have the asserts here so people do not
-// need to crack open bind_internal.h. On the other hand, it makes Bind()
-// harder to read.
-
-namespace base {
-
-$range ARITY 0..MAX_ARITY
-$for ARITY [[
-$range ARG 1..ARITY
-
-template <typename Functor[[]]
-$if ARITY > 0 [[, ]] $for ARG , [[typename P$(ARG)]]>
-base::Callback<
- typename internal::BindState<
- typename internal::FunctorTraits<Functor>::RunnableType,
- typename internal::FunctorTraits<Functor>::RunType,
- void($for ARG , [[typename internal::CallbackParamTraits<P$(ARG)>::StorageType]])>
- ::UnboundRunType>
-Bind(Functor functor
-$if ARITY > 0 [[, ]] $for ARG , [[const P$(ARG)& p$(ARG)]]) {
- // Typedefs for how to store and run the functor.
- typedef typename internal::FunctorTraits<Functor>::RunnableType RunnableType;
- typedef typename internal::FunctorTraits<Functor>::RunType RunType;
-
-$if ARITY > 0 [[
-
- // Use RunnableType::RunType instead of RunType above because our
- // checks should below for bound references need to know what the actual
- // functor is going to interpret the argument as.
- typedef internal::FunctionTraits<typename RunnableType::RunType>
- BoundFunctorTraits;
-
- // Do not allow binding a non-const reference parameter. Non-const reference
- // parameters are disallowed by the Google style guide. Also, binding a
- // non-const reference parameter can make for subtle bugs because the
- // invoked function will receive a reference to the stored copy of the
- // argument and not the original.
- COMPILE_ASSERT(
- !($for ARG || [[
-is_non_const_reference<typename BoundFunctorTraits::A$(ARG)Type>::value ]]),
- do_not_bind_functions_with_nonconst_ref);
-
-]]
-
-
-$for ARG [[
-
-
-$if ARG == 1 [[
- // For methods, we need to be careful for parameter 1. We do not require
- // a scoped_refptr because BindState<> itself takes care of AddRef() for
- // methods. We also disallow binding of an array as the method's target
- // object.
- COMPILE_ASSERT(
- internal::HasIsMethodTag<RunnableType>::value ||
- !internal::NeedsScopedRefptrButGetsRawPtr<P$(ARG)>::value,
- p$(ARG)_is_refcounted_type_and_needs_scoped_refptr);
- COMPILE_ASSERT(!internal::HasIsMethodTag<RunnableType>::value ||
- !is_array<P$(ARG)>::value,
- first_bound_argument_to_method_cannot_be_array);
-]] $else [[
- COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P$(ARG)>::value,
- p$(ARG)_is_refcounted_type_and_needs_scoped_refptr);
-]] $$ $if ARG
-
-]] $$ $for ARG
-
- typedef internal::BindState<RunnableType, RunType, [[]]
-void($for ARG , [[typename internal::CallbackParamTraits<P$(ARG)>::StorageType]])> [[]]
-BindState;
-
-
- return Callback<typename BindState::UnboundRunType>(
- new BindState(internal::MakeRunnable(functor)[[]]
-$if ARITY > 0 [[, ]] $for ARG , [[p$(ARG)]]));
-}
-
-]] $$ for ARITY
-
-} // namespace base
-
-#endif // BASE_BIND_H_
diff --git a/base/bind_internal.h b/base/bind_internal.h
index 2142797..1d8efec 100644
--- a/base/bind_internal.h
+++ b/base/bind_internal.h
@@ -74,6 +74,61 @@
// into the Bind() system, doing most of the type resolution.
// There are ARITY BindState types.
+// HasNonConstReferenceParam selects true_type when any of the parameters in
+// |Sig| is a non-const reference.
+// Implementation note: This non-specialized case handles zero-arity case only.
+// Non-zero-arity cases should be handled by the specialization below.
+template <typename Sig>
+struct HasNonConstReferenceParam : false_type {};
+
+// Implementation note: Select true_type if the first parameter is a non-const
+// reference. Otherwise, skip the first parameter and check rest of parameters
+// recursively.
+template <typename R, typename T, typename... Args>
+struct HasNonConstReferenceParam<R(T, Args...)>
+ : SelectType<is_non_const_reference<T>::value,
+ true_type,
+ HasNonConstReferenceParam<R(Args...)>>::Type {};
+
+// HasRefCountedTypeAsRawPtr selects true_type when any of the |Args| is a raw
+// pointer to a RefCounted type.
+// Implementation note: This non-specialized case handles zero-arity case only.
+// Non-zero-arity cases should be handled by the specialization below.
+template <typename... Args>
+struct HasRefCountedTypeAsRawPtr : false_type {};
+
+// Implementation note: Select true_type if the first parameter is a raw pointer
+// to a RefCounted type. Otherwise, skip the first parameter and check rest of
+// parameters recursively.
+template <typename T, typename... Args>
+struct HasRefCountedTypeAsRawPtr<T, Args...>
+ : SelectType<NeedsScopedRefptrButGetsRawPtr<T>::value,
+ true_type,
+ HasRefCountedTypeAsRawPtr<Args...>>::Type {};
+
+// BindsArrayToFirstArg selects true_type when |is_method| is true and the first
+// item of |Args| is an array type.
+// Implementation note: This non-specialized case handles !is_method case and
+// zero-arity case only. Other cases should be handled by the specialization
+// below.
+template <bool is_method, typename... Args>
+struct BindsArrayToFirstArg : false_type {};
+
+template <typename T, typename... Args>
+struct BindsArrayToFirstArg<true, T, Args...> : is_array<T> {};
+
+// HasRefCountedParamAsRawPtr is the same to HasRefCountedTypeAsRawPtr except
+// when |is_method| is true HasRefCountedParamAsRawPtr skips the first argument.
+// Implementation note: This non-specialized case handles !is_method case and
+// zero-arity case only. Other cases should be handled by the specialization
+// below.
+template <bool is_method, typename... Args>
+struct HasRefCountedParamAsRawPtr : HasRefCountedTypeAsRawPtr<Args...> {};
+
+template <typename T, typename... Args>
+struct HasRefCountedParamAsRawPtr<true, T, Args...>
+ : HasRefCountedTypeAsRawPtr<Args...> {};
+
// RunnableAdapter<>
//
// The RunnableAdapter<> templates provide a uniform interface for invoking
diff --git a/base/bind_internal.h.pump b/base/bind_internal.h.pump
index 9ddca47..559c184 100644
--- a/base/bind_internal.h.pump
+++ b/base/bind_internal.h.pump
@@ -80,6 +80,61 @@
// into the Bind() system, doing most of the type resolution.
// There are ARITY BindState types.
+// HasNonConstReferenceParam selects true_type when any of the parameters in
+// |Sig| is a non-const reference.
+// Implementation note: This non-specialized case handles zero-arity case only.
+// Non-zero-arity cases should be handled by the specialization below.
+template <typename Sig>
+struct HasNonConstReferenceParam : false_type {};
+
+// Implementation note: Select true_type if the first parameter is a non-const
+// reference. Otherwise, skip the first parameter and check rest of parameters
+// recursively.
+template <typename R, typename T, typename... Args>
+struct HasNonConstReferenceParam<R(T, Args...)>
+ : SelectType<is_non_const_reference<T>::value,
+ true_type,
+ HasNonConstReferenceParam<R(Args...)>>::Type {};
+
+// HasRefCountedTypeAsRawPtr selects true_type when any of the |Args| is a raw
+// pointer to a RefCounted type.
+// Implementation note: This non-specialized case handles zero-arity case only.
+// Non-zero-arity cases should be handled by the specialization below.
+template <typename... Args>
+struct HasRefCountedTypeAsRawPtr : false_type {};
+
+// Implementation note: Select true_type if the first parameter is a raw pointer
+// to a RefCounted type. Otherwise, skip the first parameter and check rest of
+// parameters recursively.
+template <typename T, typename... Args>
+struct HasRefCountedTypeAsRawPtr<T, Args...>
+ : SelectType<NeedsScopedRefptrButGetsRawPtr<T>::value,
+ true_type,
+ HasRefCountedTypeAsRawPtr<Args...>>::Type {};
+
+// BindsArrayToFirstArg selects true_type when |is_method| is true and the first
+// item of |Args| is an array type.
+// Implementation note: This non-specialized case handles !is_method case and
+// zero-arity case only. Other cases should be handled by the specialization
+// below.
+template <bool is_method, typename... Args>
+struct BindsArrayToFirstArg : false_type {};
+
+template <typename T, typename... Args>
+struct BindsArrayToFirstArg<true, T, Args...> : is_array<T> {};
+
+// HasRefCountedParamAsRawPtr is the same to HasRefCountedTypeAsRawPtr except
+// when |is_method| is true HasRefCountedParamAsRawPtr skips the first argument.
+// Implementation note: This non-specialized case handles !is_method case and
+// zero-arity case only. Other cases should be handled by the specialization
+// below.
+template <bool is_method, typename... Args>
+struct HasRefCountedParamAsRawPtr : HasRefCountedTypeAsRawPtr<Args...> {};
+
+template <typename T, typename... Args>
+struct HasRefCountedParamAsRawPtr<true, T, Args...>
+ : HasRefCountedTypeAsRawPtr<Args...> {};
+
// RunnableAdapter<>
//
// The RunnableAdapter<> templates provide a uniform interface for invoking
diff --git a/base/bind_unittest.nc b/base/bind_unittest.nc
index 4732097..33b5f5c 100644
--- a/base/bind_unittest.nc
+++ b/base/bind_unittest.nc
@@ -167,7 +167,7 @@
method_bound_to_array_cb.Run();
}
-#elif defined(NCTEST_NO_RAW_PTR_FOR_REFCOUNTED_TYPES) // [r"fatal error: static_assert failed \"p1_is_refcounted_type_and_needs_scoped_refptr\""]
+#elif defined(NCTEST_NO_RAW_PTR_FOR_REFCOUNTED_TYPES) // [r"fatal error: static_assert failed \"a_parameter_is_refcounted_type_and_needs_scoped_refptr\""]
// Refcounted types should not be bound as a raw pointer.
void WontCompile() {
diff --git a/base/callback_internal.cc b/base/callback_internal.cc
index ed0fb0d..f360388 100644
--- a/base/callback_internal.cc
+++ b/base/callback_internal.cc
@@ -9,6 +9,9 @@
namespace base {
namespace internal {
+CallbackBase::CallbackBase(const CallbackBase& c) = default;
+CallbackBase& CallbackBase::operator=(const CallbackBase& c) = default;
+
void CallbackBase::Reset() {
polymorphic_invoke_ = NULL;
// NULL the bind_state_ last, since it may be holding the last ref to whatever
diff --git a/base/callback_internal.h b/base/callback_internal.h
index 9dca023..8a5c437 100644
--- a/base/callback_internal.h
+++ b/base/callback_internal.h
@@ -36,6 +36,9 @@
// template bloat.
class BASE_EXPORT CallbackBase {
public:
+ CallbackBase(const CallbackBase& c);
+ CallbackBase& operator=(const CallbackBase& c);
+
// Returns true if Callback is null (doesn't refer to anything).
bool is_null() const { return bind_state_.get() == NULL; }
diff --git a/base/command_line_unittest.cc b/base/command_line_unittest.cc
index 8fdd605..e395c85 100644
--- a/base/command_line_unittest.cc
+++ b/base/command_line_unittest.cc
@@ -11,7 +11,7 @@
#include "base/strings/utf_string_conversions.h"
#include "testing/gtest/include/gtest/gtest.h"
-using base::FilePath;
+namespace base {
// To test Windows quoting behavior, we use a string that has some backslashes
// and quotes.
@@ -200,15 +200,11 @@
cl.AppendArg(kFifthArgName);
#if defined(OS_WIN)
- CommandLine::StringType expected_first_arg(
- base::UTF8ToUTF16(kFirstArgName));
- CommandLine::StringType expected_second_arg(
- base::UTF8ToUTF16(kSecondArgName));
- CommandLine::StringType expected_third_arg(
- base::UTF8ToUTF16(kThirdArgName));
- CommandLine::StringType expected_fourth_arg(
- base::UTF8ToUTF16(kFourthArgName));
- CommandLine::StringType expected_fifth_arg(base::UTF8ToUTF16(kFifthArgName));
+ CommandLine::StringType expected_first_arg(UTF8ToUTF16(kFirstArgName));
+ CommandLine::StringType expected_second_arg(UTF8ToUTF16(kSecondArgName));
+ CommandLine::StringType expected_third_arg(UTF8ToUTF16(kThirdArgName));
+ CommandLine::StringType expected_fourth_arg(UTF8ToUTF16(kFourthArgName));
+ CommandLine::StringType expected_fifth_arg(UTF8ToUTF16(kFifthArgName));
#elif defined(OS_POSIX)
CommandLine::StringType expected_first_arg(kFirstArgName);
CommandLine::StringType expected_second_arg(kSecondArgName);
@@ -368,7 +364,7 @@
EXPECT_EQ(L"\"Program Path\"", cmd_string);
// Check the optional quoting of placeholders in programs.
- CommandLine cl_quote_placeholder(base::FilePath(L"%1"));
+ CommandLine cl_quote_placeholder(FilePath(L"%1"));
EXPECT_EQ(L"%1", cl_quote_placeholder.GetCommandLineString());
EXPECT_EQ(L"\"%1\"",
cl_quote_placeholder.GetCommandLineStringWithPlaceholders());
@@ -382,3 +378,5 @@
CommandLine* current = CommandLine::ForCurrentProcess();
EXPECT_EQ(initial, current);
}
+
+} // namespace base
diff --git a/base/debug/proc_maps_linux_unittest.cc b/base/debug/proc_maps_linux_unittest.cc
index 142f891..c9f2267 100644
--- a/base/debug/proc_maps_linux_unittest.cc
+++ b/base/debug/proc_maps_linux_unittest.cc
@@ -199,13 +199,6 @@
bool found_stack = false;
bool found_address = false;
- // Valgrind uses its own allocated stacks instead of the kernel-provided stack
- // without letting the kernel know via prctl(PR_SET_MM_START_STACK). This
- // causes the kernel to use [stack:TID] format. See http://crbug.com/431702
- // for details.
- std::string stack_with_tid =
- StringPrintf("[stack:%d]", PlatformThread::CurrentId());
-
for (size_t i = 0; i < regions.size(); ++i) {
if (regions[i].path == exe_path.value()) {
// It's OK to find the executable mapped multiple times as there'll be
@@ -213,23 +206,28 @@
found_exe = true;
}
- bool is_correct_stack = false;
- if (regions[i].path == "[stack]") {
- is_correct_stack = true;
- EXPECT_FALSE(RunningOnValgrind());
+ // Valgrind uses its own allocated stacks instead of the kernel-provided
+ // stack without letting the kernel know via prctl(PR_SET_MM_START_STACK).
+ // Depending on which kernel you're running it'll impact the output of
+ // /proc/self/maps.
+ //
+ // Prior to version 3.4, the kernel completely ignores other stacks and
+ // always prints out the vma lying within mm->start_stack as [stack] even
+ // if the program was currently executing on a different stack.
+ //
+ // Starting in 3.4, the kernel will print out the vma containing the current
+ // stack pointer as [stack:TID] as long as that vma does not lie within
+ // mm->start_stack.
+ //
+ // Because this has gotten too complicated and brittle of a test, completely
+ // ignore checking for the stack and address when running under Valgrind.
+ // See http://crbug.com/431702 for more details.
+ if (!RunningOnValgrind() && regions[i].path == "[stack]") {
EXPECT_GE(address, regions[i].start);
EXPECT_LT(address, regions[i].end);
- } else if (regions[i].path == stack_with_tid) {
- is_correct_stack = true;
- EXPECT_TRUE(RunningOnValgrind());
- }
-
- if (is_correct_stack) {
- // Note that the stack is executable when it is created by Valgrind.
EXPECT_TRUE(regions[i].permissions & MappedMemoryRegion::READ);
EXPECT_TRUE(regions[i].permissions & MappedMemoryRegion::WRITE);
- EXPECT_EQ(RunningOnValgrind(),
- (regions[i].permissions & MappedMemoryRegion::EXECUTE) != 0);
+ EXPECT_FALSE(regions[i].permissions & MappedMemoryRegion::EXECUTE);
EXPECT_TRUE(regions[i].permissions & MappedMemoryRegion::PRIVATE);
EXPECT_FALSE(found_stack) << "Found duplicate stacks";
found_stack = true;
@@ -242,8 +240,10 @@
}
EXPECT_TRUE(found_exe);
- EXPECT_TRUE(found_stack);
- EXPECT_TRUE(found_address);
+ if (!RunningOnValgrind()) {
+ EXPECT_TRUE(found_stack);
+ EXPECT_TRUE(found_address);
+ }
}
TEST(ProcMapsTest, ReadProcMapsNonEmptyString) {
diff --git a/base/i18n/build_utf8_validator_tables.cc b/base/i18n/build_utf8_validator_tables.cc
index 45fc6cb..647c8d6 100644
--- a/base/i18n/build_utf8_validator_tables.cc
+++ b/base/i18n/build_utf8_validator_tables.cc
@@ -425,16 +425,16 @@
} // namespace
int main(int argc, char* argv[]) {
- CommandLine::Init(argc, argv);
+ base::CommandLine::Init(argc, argv);
logging::LoggingSettings settings;
settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG;
logging::InitLogging(settings);
- if (CommandLine::ForCurrentProcess()->HasSwitch("help")) {
+ if (base::CommandLine::ForCurrentProcess()->HasSwitch("help")) {
fwrite(kHelpText, 1, arraysize(kHelpText), stdout);
exit(EXIT_SUCCESS);
}
base::FilePath filename =
- CommandLine::ForCurrentProcess()->GetSwitchValuePath("output");
+ base::CommandLine::ForCurrentProcess()->GetSwitchValuePath("output");
FILE* output = stdout;
if (!filename.empty()) {
diff --git a/base/ios/block_types.h b/base/ios/block_types.h
new file mode 100644
index 0000000..e4dde79
--- /dev/null
+++ b/base/ios/block_types.h
@@ -0,0 +1,14 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_IOS_BLOCK_TYPES_H_
+#define BASE_IOS_BLOCK_TYPES_H_
+
+// A generic procedural block type that takes no arguments and returns nothing.
+typedef void (^ProceduralBlock)(void);
+
+// A block that takes no arguments and returns a bool.
+typedef bool (^ConditionBlock)(void);
+
+#endif // BASE_IOS_BLOCK_TYPES_H_
diff --git a/base/logging.cc b/base/logging.cc
index 150a408..f3601ee 100644
--- a/base/logging.cc
+++ b/base/logging.cc
@@ -359,7 +359,7 @@
// Can log only to the system debug log.
CHECK_EQ(settings.logging_dest & ~LOG_TO_SYSTEM_DEBUG_LOG, 0);
#endif
- CommandLine* command_line = CommandLine::ForCurrentProcess();
+ base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
// Don't bother initializing g_vlog_info unless we use one of the
// vlog switches.
if (command_line->HasSwitch(switches::kV) ||
diff --git a/base/memory/ref_counted.h b/base/memory/ref_counted.h
index 7869e72..219437e 100644
--- a/base/memory/ref_counted.h
+++ b/base/memory/ref_counted.h
@@ -17,10 +17,6 @@
#include "base/threading/thread_collision_warner.h"
#include "build/build_config.h"
-#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_IOS) || defined(OS_ANDROID)
-#define DISABLE_SCOPED_REFPTR_CONVERSION_OPERATOR
-#endif
-
namespace base {
namespace subtle {
@@ -297,12 +293,6 @@
T* get() const { return ptr_; }
-#if !defined(DISABLE_SCOPED_REFPTR_CONVERSION_OPERATOR)
- // Allow scoped_refptr<C> to be used in boolean expression
- // and comparison operations.
- operator T*() const { return ptr_; }
-#endif
-
T& operator*() const {
assert(ptr_ != NULL);
return *ptr_;
@@ -343,7 +333,19 @@
swap(&r.ptr_);
}
-#if defined(DISABLE_SCOPED_REFPTR_CONVERSION_OPERATOR)
+ private:
+ // Allow scoped_refptr<T> to be used in boolean expressions, but not
+ // implicitly convertible to a real bool (which is dangerous).
+ //
+ // Note that this trick is only safe when the == and != operators
+ // are declared explicitly, as otherwise "refptr1 == refptr2"
+ // will compile but do the wrong thing (i.e., convert to Testable
+ // and then do the comparison).
+ typedef T* scoped_refptr::*Testable;
+
+ public:
+ operator Testable() const { return ptr_ ? &scoped_refptr::ptr_ : nullptr; }
+
template <typename U>
bool operator==(const scoped_refptr<U>& rhs) const {
return ptr_ == rhs.get();
@@ -358,7 +360,6 @@
bool operator<(const scoped_refptr<U>& rhs) const {
return ptr_ < rhs.get();
}
-#endif
protected:
T* ptr_;
@@ -389,8 +390,8 @@
return scoped_refptr<T>(t);
}
-#if defined(DISABLE_SCOPED_REFPTR_CONVERSION_OPERATOR)
-// Temporary operator overloads to facilitate the transition...
+// Temporary operator overloads to facilitate the transition. See
+// https://crbug.com/110610.
template <typename T, typename U>
bool operator==(const scoped_refptr<T>& lhs, const U* rhs) {
return lhs.get() == rhs;
@@ -415,6 +416,5 @@
std::ostream& operator<<(std::ostream& out, const scoped_refptr<T>& p) {
return out << p.get();
}
-#endif // defined(DISABLE_SCOPED_REFPTR_CONVERSION_OPERATOR)
#endif // BASE_MEMORY_REF_COUNTED_H_
diff --git a/base/memory/ref_counted_unittest.cc b/base/memory/ref_counted_unittest.cc
index 7e73bde..f75cd38 100644
--- a/base/memory/ref_counted_unittest.cc
+++ b/base/memory/ref_counted_unittest.cc
@@ -10,9 +10,19 @@
namespace {
class SelfAssign : public base::RefCounted<SelfAssign> {
- friend class base::RefCounted<SelfAssign>;
+ protected:
+ virtual ~SelfAssign() {}
- ~SelfAssign() {}
+ private:
+ friend class base::RefCounted<SelfAssign>;
+};
+
+class Derived : public SelfAssign {
+ protected:
+ ~Derived() override {}
+
+ private:
+ friend class base::RefCounted<Derived>;
};
class CheckDerivedMemberAccess : public scoped_refptr<SelfAssign> {
@@ -72,3 +82,34 @@
base::TestOpaqueRefCounted(p);
base::TestOpaqueRefCounted(q);
}
+
+TEST(RefCountedUnitTest, BooleanTesting) {
+ scoped_refptr<SelfAssign> p;
+ EXPECT_FALSE(p);
+ p = new SelfAssign;
+ EXPECT_TRUE(p);
+}
+
+TEST(RefCountedUnitTest, Equality) {
+ scoped_refptr<SelfAssign> p1(new SelfAssign);
+ scoped_refptr<SelfAssign> p2(new SelfAssign);
+
+ EXPECT_EQ(p1, p1);
+ EXPECT_EQ(p2, p2);
+
+ EXPECT_NE(p1, p2);
+ EXPECT_NE(p2, p1);
+}
+
+TEST(RefCountedUnitTest, ConvertibleEquality) {
+ scoped_refptr<Derived> p1(new Derived);
+ scoped_refptr<SelfAssign> p2;
+
+ EXPECT_NE(p1, p2);
+ EXPECT_NE(p2, p1);
+
+ p2 = p1;
+
+ EXPECT_EQ(p1, p2);
+ EXPECT_EQ(p2, p1);
+}
diff --git a/base/prefs/mock_pref_change_callback.h b/base/prefs/mock_pref_change_callback.h
index 422754a..3030fab 100644
--- a/base/prefs/mock_pref_change_callback.h
+++ b/base/prefs/mock_pref_change_callback.h
@@ -19,8 +19,7 @@
// |pref_name| in |prefs| matches |value|. If |value| is NULL, the matcher
// checks that the value is not set.
MATCHER_P3(PrefValueMatches, prefs, pref_name, value, "") {
- const PrefService::Preference* pref =
- prefs->FindPreference(pref_name.c_str());
+ const PrefService::Preference* pref = prefs->FindPreference(pref_name);
if (!pref)
return false;
diff --git a/base/prefs/pref_change_registrar.cc b/base/prefs/pref_change_registrar.cc
index 28ac374..1319348 100644
--- a/base/prefs/pref_change_registrar.cc
+++ b/base/prefs/pref_change_registrar.cc
@@ -23,12 +23,12 @@
service_ = service;
}
-void PrefChangeRegistrar::Add(const char* path,
+void PrefChangeRegistrar::Add(const std::string& path,
const base::Closure& obs) {
Add(path, base::Bind(&PrefChangeRegistrar::InvokeUnnamedCallback, obs));
}
-void PrefChangeRegistrar::Add(const char* path,
+void PrefChangeRegistrar::Add(const std::string& path,
const NamedChangeCallback& obs) {
if (!service_) {
NOTREACHED();
@@ -40,7 +40,7 @@
observers_[path] = obs;
}
-void PrefChangeRegistrar::Remove(const char* path) {
+void PrefChangeRegistrar::Remove(const std::string& path) {
DCHECK(IsObserved(path));
observers_.erase(path);
@@ -50,7 +50,7 @@
void PrefChangeRegistrar::RemoveAll() {
for (ObserverMap::const_iterator it = observers_.begin();
it != observers_.end(); ++it) {
- service_->RemovePrefObserver(it->first.c_str(), this);
+ service_->RemovePrefObserver(it->first, this);
}
observers_.clear();
@@ -67,8 +67,7 @@
bool PrefChangeRegistrar::IsManaged() {
for (ObserverMap::const_iterator it = observers_.begin();
it != observers_.end(); ++it) {
- const PrefService::Preference* pref =
- service_->FindPreference(it->first.c_str());
+ const PrefService::Preference* pref = service_->FindPreference(it->first);
if (pref && pref->IsManaged())
return true;
}
diff --git a/base/prefs/pref_change_registrar.h b/base/prefs/pref_change_registrar.h
index 70c22fe..acf0a68 100644
--- a/base/prefs/pref_change_registrar.h
+++ b/base/prefs/pref_change_registrar.h
@@ -40,11 +40,11 @@
// the preference that is changing as its parameter.
//
// Only one observer may be registered per path.
- void Add(const char* path, const base::Closure& obs);
- void Add(const char* path, const NamedChangeCallback& obs);
+ void Add(const std::string& path, const base::Closure& obs);
+ void Add(const std::string& path, const NamedChangeCallback& obs);
// Removes the pref observer registered for |path|.
- void Remove(const char* path);
+ void Remove(const std::string& path);
// Removes all observers that have been previously added with a call to Add.
void RemoveAll();
diff --git a/base/prefs/pref_change_registrar_unittest.cc b/base/prefs/pref_change_registrar_unittest.cc
index e9255a0..e449084 100644
--- a/base/prefs/pref_change_registrar_unittest.cc
+++ b/base/prefs/pref_change_registrar_unittest.cc
@@ -27,10 +27,8 @@
MockPrefService() {}
virtual ~MockPrefService() {}
- MOCK_METHOD2(AddPrefObserver,
- void(const char*, PrefObserver*));
- MOCK_METHOD2(RemovePrefObserver,
- void(const char*, PrefObserver*));
+ MOCK_METHOD2(AddPrefObserver, void(const std::string&, PrefObserver*));
+ MOCK_METHOD2(RemovePrefObserver, void(const std::string&, PrefObserver*));
};
} // namespace
diff --git a/base/prefs/pref_member.cc b/base/prefs/pref_member.cc
index 4fa616f..8d80dd0 100644
--- a/base/prefs/pref_member.cc
+++ b/base/prefs/pref_member.cc
@@ -25,23 +25,20 @@
Destroy();
}
-void PrefMemberBase::Init(const char* pref_name,
+void PrefMemberBase::Init(const std::string& pref_name,
PrefService* prefs,
const NamedChangeCallback& observer) {
observer_ = observer;
Init(pref_name, prefs);
}
-void PrefMemberBase::Init(const char* pref_name,
- PrefService* prefs) {
- DCHECK(pref_name);
+void PrefMemberBase::Init(const std::string& pref_name, PrefService* prefs) {
DCHECK(prefs);
DCHECK(pref_name_.empty()); // Check that Init is only called once.
prefs_ = prefs;
pref_name_ = pref_name;
// Check that the preference is registered.
- DCHECK(prefs_->FindPreference(pref_name_.c_str()))
- << pref_name << " not registered.";
+ DCHECK(prefs_->FindPreference(pref_name_)) << pref_name << " not registered.";
// Add ourselves as a pref observer so we can keep our local value in sync.
prefs_->AddPrefObserver(pref_name, this);
@@ -49,7 +46,7 @@
void PrefMemberBase::Destroy() {
if (prefs_ && !pref_name_.empty()) {
- prefs_->RemovePrefObserver(pref_name_.c_str(), this);
+ prefs_->RemovePrefObserver(pref_name_, this);
prefs_ = NULL;
}
}
@@ -72,8 +69,7 @@
void PrefMemberBase::UpdateValueFromPref(const base::Closure& callback) const {
VerifyValuePrefName();
- const PrefService::Preference* pref =
- prefs_->FindPreference(pref_name_.c_str());
+ const PrefService::Preference* pref = prefs_->FindPreference(pref_name_);
DCHECK(pref);
if (!internal())
CreateInternal();
@@ -158,7 +154,7 @@
template <>
void PrefMember<bool>::UpdatePref(const bool& value) {
- prefs()->SetBoolean(pref_name().c_str(), value);
+ prefs()->SetBoolean(pref_name(), value);
}
template <>
@@ -169,7 +165,7 @@
template <>
void PrefMember<int>::UpdatePref(const int& value) {
- prefs()->SetInteger(pref_name().c_str(), value);
+ prefs()->SetInteger(pref_name(), value);
}
template <>
@@ -180,7 +176,7 @@
template <>
void PrefMember<double>::UpdatePref(const double& value) {
- prefs()->SetDouble(pref_name().c_str(), value);
+ prefs()->SetDouble(pref_name(), value);
}
template <>
@@ -191,7 +187,7 @@
template <>
void PrefMember<std::string>::UpdatePref(const std::string& value) {
- prefs()->SetString(pref_name().c_str(), value);
+ prefs()->SetString(pref_name(), value);
}
template <>
@@ -203,7 +199,7 @@
template <>
void PrefMember<base::FilePath>::UpdatePref(const base::FilePath& value) {
- prefs()->SetFilePath(pref_name().c_str(), value);
+ prefs()->SetFilePath(pref_name(), value);
}
template <>
@@ -218,7 +214,7 @@
const std::vector<std::string>& value) {
base::ListValue list_value;
list_value.AppendStrings(value);
- prefs()->Set(pref_name().c_str(), list_value);
+ prefs()->Set(pref_name(), list_value);
}
template <>
diff --git a/base/prefs/pref_member.h b/base/prefs/pref_member.h
index a05d60e..b47cae2 100644
--- a/base/prefs/pref_member.h
+++ b/base/prefs/pref_member.h
@@ -103,9 +103,10 @@
virtual ~PrefMemberBase();
// See PrefMember<> for description.
- void Init(const char* pref_name, PrefService* prefs,
+ void Init(const std::string& pref_name,
+ PrefService* prefs,
const NamedChangeCallback& observer);
- void Init(const char* pref_name, PrefService* prefs);
+ void Init(const std::string& pref_name, PrefService* prefs);
virtual void CreateInternal() const = 0;
@@ -169,17 +170,19 @@
// Do the actual initialization of the class. Use the two-parameter
// version if you don't want any notifications of changes. This
// method should only be called on the UI thread.
- void Init(const char* pref_name, PrefService* prefs,
+ void Init(const std::string& pref_name,
+ PrefService* prefs,
const NamedChangeCallback& observer) {
subtle::PrefMemberBase::Init(pref_name, prefs, observer);
}
- void Init(const char* pref_name, PrefService* prefs,
+ void Init(const std::string& pref_name,
+ PrefService* prefs,
const base::Closure& observer) {
subtle::PrefMemberBase::Init(
pref_name, prefs,
base::Bind(&PrefMemberBase::InvokeUnnamedCallback, observer));
}
- void Init(const char* pref_name, PrefService* prefs) {
+ void Init(const std::string& pref_name, PrefService* prefs) {
subtle::PrefMemberBase::Init(pref_name, prefs);
}
diff --git a/base/prefs/pref_member_unittest.cc b/base/prefs/pref_member_unittest.cc
index d4d7e02..435122b 100644
--- a/base/prefs/pref_member_unittest.cc
+++ b/base/prefs/pref_member_unittest.cc
@@ -35,7 +35,7 @@
pref_thread_.Start();
}
- void Init(const char* pref_name, PrefService* prefs) {
+ void Init(const std::string& pref_name, PrefService* prefs) {
pref_.Init(pref_name, prefs);
pref_.MoveToThread(pref_thread_.message_loop_proxy());
}
diff --git a/base/prefs/pref_notifier_impl.cc b/base/prefs/pref_notifier_impl.cc
index c02a7b3..6bf9603 100644
--- a/base/prefs/pref_notifier_impl.cc
+++ b/base/prefs/pref_notifier_impl.cc
@@ -38,7 +38,7 @@
init_observers_.clear();
}
-void PrefNotifierImpl::AddPrefObserver(const char* path,
+void PrefNotifierImpl::AddPrefObserver(const std::string& path,
PrefObserver* obs) {
// Get the pref observer list associated with the path.
PrefObserverList* observer_list = NULL;
@@ -56,7 +56,7 @@
observer_list->AddObserver(obs);
}
-void PrefNotifierImpl::RemovePrefObserver(const char* path,
+void PrefNotifierImpl::RemovePrefObserver(const std::string& path,
PrefObserver* obs) {
DCHECK(thread_checker_.CalledOnValidThread());
@@ -98,7 +98,7 @@
DCHECK(thread_checker_.CalledOnValidThread());
// Only send notifications for registered preferences.
- if (!pref_service_->FindPreference(path.c_str()))
+ if (!pref_service_->FindPreference(path))
return;
const PrefObserverMap::iterator observer_iterator =
diff --git a/base/prefs/pref_notifier_impl.h b/base/prefs/pref_notifier_impl.h
index 3f4c254..cfd46ff 100644
--- a/base/prefs/pref_notifier_impl.h
+++ b/base/prefs/pref_notifier_impl.h
@@ -29,8 +29,8 @@
// If the pref at the given path changes, we call the observer's
// OnPreferenceChanged method.
- void AddPrefObserver(const char* path, PrefObserver* observer);
- void RemovePrefObserver(const char* path, PrefObserver* observer);
+ void AddPrefObserver(const std::string& path, PrefObserver* observer);
+ void RemovePrefObserver(const std::string& path, PrefObserver* observer);
// We run the callback once, when initialization completes. The bool
// parameter will be set to true for successful initialization,
diff --git a/base/prefs/pref_notifier_impl_unittest.cc b/base/prefs/pref_notifier_impl_unittest.cc
index 8482c02..04564c8 100644
--- a/base/prefs/pref_notifier_impl_unittest.cc
+++ b/base/prefs/pref_notifier_impl_unittest.cc
@@ -51,7 +51,7 @@
MOCK_METHOD1(FireObservers, void(const std::string& path));
- size_t CountObserver(const char* path, PrefObserver* obs) {
+ size_t CountObserver(const std::string& path, PrefObserver* obs) {
PrefObserverMap::const_iterator observer_iterator =
pref_observers()->find(path);
if (observer_iterator == pref_observers()->end())
diff --git a/base/prefs/pref_registry.cc b/base/prefs/pref_registry.cc
index 1349961..69f0494 100644
--- a/base/prefs/pref_registry.cc
+++ b/base/prefs/pref_registry.cc
@@ -28,7 +28,7 @@
return defaults_->end();
}
-void PrefRegistry::SetDefaultPrefValue(const char* pref_name,
+void PrefRegistry::SetDefaultPrefValue(const std::string& pref_name,
base::Value* value) {
DCHECK(value);
const base::Value* current_value = NULL;
@@ -40,7 +40,7 @@
defaults_->ReplaceDefaultValue(pref_name, make_scoped_ptr(value));
}
-void PrefRegistry::RegisterPreference(const char* path,
+void PrefRegistry::RegisterPreference(const std::string& path,
base::Value* default_value) {
base::Value::Type orig_type = default_value->GetType();
DCHECK(orig_type != base::Value::TYPE_NULL &&
diff --git a/base/prefs/pref_registry.h b/base/prefs/pref_registry.h
index 896db3f..a500b6e 100644
--- a/base/prefs/pref_registry.h
+++ b/base/prefs/pref_registry.h
@@ -41,14 +41,14 @@
// Changes the default value for a preference. Takes ownership of |value|.
//
// |pref_name| must be a previously registered preference.
- void SetDefaultPrefValue(const char* pref_name, base::Value* value);
+ void SetDefaultPrefValue(const std::string& pref_name, base::Value* value);
protected:
friend class base::RefCounted<PrefRegistry>;
virtual ~PrefRegistry();
// Used by subclasses to register a default value for a preference.
- void RegisterPreference(const char* path, base::Value* default_value);
+ void RegisterPreference(const std::string& path, base::Value* default_value);
scoped_refptr<DefaultPrefStore> defaults_;
diff --git a/base/prefs/pref_registry_simple.cc b/base/prefs/pref_registry_simple.cc
index 7453016..fa679dc 100644
--- a/base/prefs/pref_registry_simple.cc
+++ b/base/prefs/pref_registry_simple.cc
@@ -14,52 +14,52 @@
PrefRegistrySimple::~PrefRegistrySimple() {
}
-void PrefRegistrySimple::RegisterBooleanPref(const char* path,
+void PrefRegistrySimple::RegisterBooleanPref(const std::string& path,
bool default_value) {
RegisterPreference(path, new base::FundamentalValue(default_value));
}
-void PrefRegistrySimple::RegisterIntegerPref(const char* path,
+void PrefRegistrySimple::RegisterIntegerPref(const std::string& path,
int default_value) {
RegisterPreference(path, new base::FundamentalValue(default_value));
}
-void PrefRegistrySimple::RegisterDoublePref(const char* path,
+void PrefRegistrySimple::RegisterDoublePref(const std::string& path,
double default_value) {
RegisterPreference(path, new base::FundamentalValue(default_value));
}
-void PrefRegistrySimple::RegisterStringPref(const char* path,
+void PrefRegistrySimple::RegisterStringPref(const std::string& path,
const std::string& default_value) {
RegisterPreference(path, new base::StringValue(default_value));
}
void PrefRegistrySimple::RegisterFilePathPref(
- const char* path,
+ const std::string& path,
const base::FilePath& default_value) {
RegisterPreference(path, new base::StringValue(default_value.value()));
}
-void PrefRegistrySimple::RegisterListPref(const char* path) {
+void PrefRegistrySimple::RegisterListPref(const std::string& path) {
RegisterPreference(path, new base::ListValue());
}
-void PrefRegistrySimple::RegisterListPref(const char* path,
+void PrefRegistrySimple::RegisterListPref(const std::string& path,
base::ListValue* default_value) {
RegisterPreference(path, default_value);
}
-void PrefRegistrySimple::RegisterDictionaryPref(const char* path) {
+void PrefRegistrySimple::RegisterDictionaryPref(const std::string& path) {
RegisterPreference(path, new base::DictionaryValue());
}
void PrefRegistrySimple::RegisterDictionaryPref(
- const char* path,
+ const std::string& path,
base::DictionaryValue* default_value) {
RegisterPreference(path, default_value);
}
-void PrefRegistrySimple::RegisterInt64Pref(const char* path,
+void PrefRegistrySimple::RegisterInt64Pref(const std::string& path,
int64 default_value) {
RegisterPreference(
path, new base::StringValue(base::Int64ToString(default_value)));
diff --git a/base/prefs/pref_registry_simple.h b/base/prefs/pref_registry_simple.h
index 41fe590..73ae216 100644
--- a/base/prefs/pref_registry_simple.h
+++ b/base/prefs/pref_registry_simple.h
@@ -21,19 +21,20 @@
public:
PrefRegistrySimple();
- void RegisterBooleanPref(const char* path, bool default_value);
- void RegisterIntegerPref(const char* path, int default_value);
- void RegisterDoublePref(const char* path, double default_value);
- void RegisterStringPref(const char* path, const std::string& default_value);
- void RegisterFilePathPref(const char* path,
+ void RegisterBooleanPref(const std::string& path, bool default_value);
+ void RegisterIntegerPref(const std::string& path, int default_value);
+ void RegisterDoublePref(const std::string& path, double default_value);
+ void RegisterStringPref(const std::string& path,
+ const std::string& default_value);
+ void RegisterFilePathPref(const std::string& path,
const base::FilePath& default_value);
- void RegisterListPref(const char* path);
- void RegisterDictionaryPref(const char* path);
- void RegisterListPref(const char* path, base::ListValue* default_value);
- void RegisterDictionaryPref(const char* path,
+ void RegisterListPref(const std::string& path);
+ void RegisterDictionaryPref(const std::string& path);
+ void RegisterListPref(const std::string& path,
+ base::ListValue* default_value);
+ void RegisterDictionaryPref(const std::string& path,
base::DictionaryValue* default_value);
- void RegisterInt64Pref(const char* path,
- int64 default_value);
+ void RegisterInt64Pref(const std::string& path, int64 default_value);
private:
~PrefRegistrySimple() override;
diff --git a/base/prefs/pref_service.cc b/base/prefs/pref_service.cc
index 433f814..66323a1 100644
--- a/base/prefs/pref_service.cc
+++ b/base/prefs/pref_service.cc
@@ -86,7 +86,7 @@
user_pref_store_->CommitPendingWrite();
}
-bool PrefService::GetBoolean(const char* path) const {
+bool PrefService::GetBoolean(const std::string& path) const {
DCHECK(CalledOnValidThread());
bool result = false;
@@ -101,7 +101,7 @@
return result;
}
-int PrefService::GetInteger(const char* path) const {
+int PrefService::GetInteger(const std::string& path) const {
DCHECK(CalledOnValidThread());
int result = 0;
@@ -116,7 +116,7 @@
return result;
}
-double PrefService::GetDouble(const char* path) const {
+double PrefService::GetDouble(const std::string& path) const {
DCHECK(CalledOnValidThread());
double result = 0.0;
@@ -131,7 +131,7 @@
return result;
}
-std::string PrefService::GetString(const char* path) const {
+std::string PrefService::GetString(const std::string& path) const {
DCHECK(CalledOnValidThread());
std::string result;
@@ -146,7 +146,7 @@
return result;
}
-base::FilePath PrefService::GetFilePath(const char* path) const {
+base::FilePath PrefService::GetFilePath(const std::string& path) const {
DCHECK(CalledOnValidThread());
base::FilePath result;
@@ -161,7 +161,7 @@
return result;
}
-bool PrefService::HasPrefPath(const char* path) const {
+bool PrefService::HasPrefPath(const std::string& path) const {
const Preference* pref = FindPreference(path);
return pref && !pref->IsDefaultValue();
}
@@ -169,11 +169,22 @@
scoped_ptr<base::DictionaryValue> PrefService::GetPreferenceValues() const {
DCHECK(CalledOnValidThread());
scoped_ptr<base::DictionaryValue> out(new base::DictionaryValue);
- PrefRegistry::const_iterator i = pref_registry_->begin();
- for (; i != pref_registry_->end(); ++i) {
- const base::Value* value = GetPreferenceValue(i->first);
- DCHECK(value);
- out->Set(i->first, value->DeepCopy());
+ for (const auto& it : *pref_registry_) {
+ const base::Value* value = GetPreferenceValue(it.first);
+ out->Set(it.first, value->DeepCopy());
+ }
+ return out.Pass();
+}
+
+scoped_ptr<base::DictionaryValue> PrefService::GetPreferenceValuesOmitDefaults()
+ const {
+ DCHECK(CalledOnValidThread());
+ scoped_ptr<base::DictionaryValue> out(new base::DictionaryValue);
+ for (const auto& it : *pref_registry_) {
+ const Preference* pref = FindPreference(it.first);
+ if (pref->IsDefaultValue())
+ continue;
+ out->Set(it.first, pref->GetValue()->DeepCopy());
}
return out.Pass();
}
@@ -182,17 +193,16 @@
PrefService::GetPreferenceValuesWithoutPathExpansion() const {
DCHECK(CalledOnValidThread());
scoped_ptr<base::DictionaryValue> out(new base::DictionaryValue);
- PrefRegistry::const_iterator i = pref_registry_->begin();
- for (; i != pref_registry_->end(); ++i) {
- const base::Value* value = GetPreferenceValue(i->first);
+ for (const auto& it : *pref_registry_) {
+ const base::Value* value = GetPreferenceValue(it.first);
DCHECK(value);
- out->SetWithoutPathExpansion(i->first, value->DeepCopy());
+ out->SetWithoutPathExpansion(it.first, value->DeepCopy());
}
return out.Pass();
}
const PrefService::Preference* PrefService::FindPreference(
- const char* pref_name) const {
+ const std::string& pref_name) const {
DCHECK(CalledOnValidThread());
PreferenceMap::iterator it = prefs_map_.find(pref_name);
if (it != prefs_map_.end())
@@ -225,18 +235,19 @@
}
}
-bool PrefService::IsManagedPreference(const char* pref_name) const {
+bool PrefService::IsManagedPreference(const std::string& pref_name) const {
const Preference* pref = FindPreference(pref_name);
return pref && pref->IsManaged();
}
-bool PrefService::IsUserModifiablePreference(const char* pref_name) const {
+bool PrefService::IsUserModifiablePreference(
+ const std::string& pref_name) const {
const Preference* pref = FindPreference(pref_name);
return pref && pref->IsUserModifiable();
}
const base::DictionaryValue* PrefService::GetDictionary(
- const char* path) const {
+ const std::string& path) const {
DCHECK(CalledOnValidThread());
const base::Value* value = GetPreferenceValue(path);
@@ -251,7 +262,8 @@
return static_cast<const base::DictionaryValue*>(value);
}
-const base::Value* PrefService::GetUserPrefValue(const char* path) const {
+const base::Value* PrefService::GetUserPrefValue(
+ const std::string& path) const {
DCHECK(CalledOnValidThread());
const Preference* pref = FindPreference(path);
@@ -274,13 +286,14 @@
return value;
}
-void PrefService::SetDefaultPrefValue(const char* path,
+void PrefService::SetDefaultPrefValue(const std::string& path,
base::Value* value) {
DCHECK(CalledOnValidThread());
pref_registry_->SetDefaultPrefValue(path, value);
}
-const base::Value* PrefService::GetDefaultPrefValue(const char* path) const {
+const base::Value* PrefService::GetDefaultPrefValue(
+ const std::string& path) const {
DCHECK(CalledOnValidThread());
// Lookup the preference in the default store.
const base::Value* value = NULL;
@@ -291,7 +304,7 @@
return value;
}
-const base::ListValue* PrefService::GetList(const char* path) const {
+const base::ListValue* PrefService::GetList(const std::string& path) const {
DCHECK(CalledOnValidThread());
const base::Value* value = GetPreferenceValue(path);
@@ -306,11 +319,12 @@
return static_cast<const base::ListValue*>(value);
}
-void PrefService::AddPrefObserver(const char* path, PrefObserver* obs) {
+void PrefService::AddPrefObserver(const std::string& path, PrefObserver* obs) {
pref_notifier_->AddPrefObserver(path, obs);
}
-void PrefService::RemovePrefObserver(const char* path, PrefObserver* obs) {
+void PrefService::RemovePrefObserver(const std::string& path,
+ PrefObserver* obs) {
pref_notifier_->RemovePrefObserver(path, obs);
}
@@ -322,7 +336,7 @@
return pref_registry_.get();
}
-void PrefService::ClearPref(const char* path) {
+void PrefService::ClearPref(const std::string& path) {
DCHECK(CalledOnValidThread());
const Preference* pref = FindPreference(path);
@@ -333,35 +347,36 @@
user_pref_store_->RemoveValue(path);
}
-void PrefService::Set(const char* path, const base::Value& value) {
+void PrefService::Set(const std::string& path, const base::Value& value) {
SetUserPrefValue(path, value.DeepCopy());
}
-void PrefService::SetBoolean(const char* path, bool value) {
+void PrefService::SetBoolean(const std::string& path, bool value) {
SetUserPrefValue(path, new base::FundamentalValue(value));
}
-void PrefService::SetInteger(const char* path, int value) {
+void PrefService::SetInteger(const std::string& path, int value) {
SetUserPrefValue(path, new base::FundamentalValue(value));
}
-void PrefService::SetDouble(const char* path, double value) {
+void PrefService::SetDouble(const std::string& path, double value) {
SetUserPrefValue(path, new base::FundamentalValue(value));
}
-void PrefService::SetString(const char* path, const std::string& value) {
+void PrefService::SetString(const std::string& path, const std::string& value) {
SetUserPrefValue(path, new base::StringValue(value));
}
-void PrefService::SetFilePath(const char* path, const base::FilePath& value) {
+void PrefService::SetFilePath(const std::string& path,
+ const base::FilePath& value) {
SetUserPrefValue(path, base::CreateFilePathValue(value));
}
-void PrefService::SetInt64(const char* path, int64 value) {
+void PrefService::SetInt64(const std::string& path, int64 value) {
SetUserPrefValue(path, new base::StringValue(base::Int64ToString(value)));
}
-int64 PrefService::GetInt64(const char* path) const {
+int64 PrefService::GetInt64(const std::string& path) const {
DCHECK(CalledOnValidThread());
const base::Value* value = GetPreferenceValue(path);
@@ -378,11 +393,11 @@
return val;
}
-void PrefService::SetUint64(const char* path, uint64 value) {
+void PrefService::SetUint64(const std::string& path, uint64 value) {
SetUserPrefValue(path, new base::StringValue(base::Uint64ToString(value)));
}
-uint64 PrefService::GetUint64(const char* path) const {
+uint64 PrefService::GetUint64(const std::string& path) const {
DCHECK(CalledOnValidThread());
const base::Value* value = GetPreferenceValue(path);
@@ -399,7 +414,7 @@
return val;
}
-base::Value* PrefService::GetMutableUserPref(const char* path,
+base::Value* PrefService::GetMutableUserPref(const std::string& path,
base::Value::Type type) {
CHECK(type == base::Value::TYPE_DICTIONARY || type == base::Value::TYPE_LIST);
DCHECK(CalledOnValidThread());
@@ -436,7 +451,8 @@
user_pref_store_->ReportValueChanged(key);
}
-void PrefService::SetUserPrefValue(const char* path, base::Value* new_value) {
+void PrefService::SetUserPrefValue(const std::string& path,
+ base::Value* new_value) {
scoped_ptr<base::Value> owned_value(new_value);
DCHECK(CalledOnValidThread());
@@ -463,12 +479,9 @@
// PrefService::Preference
PrefService::Preference::Preference(const PrefService* service,
- const char* name,
+ const std::string& name,
base::Value::Type type)
- : name_(name),
- type_(type),
- pref_service_(service) {
- DCHECK(name);
+ : name_(name), type_(type), pref_service_(service) {
DCHECK(service);
}
@@ -487,8 +500,8 @@
}
const base::Value* PrefService::Preference::GetRecommendedValue() const {
- DCHECK(pref_service_->FindPreference(name_.c_str())) <<
- "Must register pref before getting its value";
+ DCHECK(pref_service_->FindPreference(name_))
+ << "Must register pref before getting its value";
const base::Value* found_value = NULL;
if (pref_value_store()->GetRecommendedValue(name_, type_, &found_value)) {
@@ -501,39 +514,39 @@
}
bool PrefService::Preference::IsManaged() const {
- return pref_value_store()->PrefValueInManagedStore(name_.c_str());
+ return pref_value_store()->PrefValueInManagedStore(name_);
}
bool PrefService::Preference::IsRecommended() const {
- return pref_value_store()->PrefValueFromRecommendedStore(name_.c_str());
+ return pref_value_store()->PrefValueFromRecommendedStore(name_);
}
bool PrefService::Preference::HasExtensionSetting() const {
- return pref_value_store()->PrefValueInExtensionStore(name_.c_str());
+ return pref_value_store()->PrefValueInExtensionStore(name_);
}
bool PrefService::Preference::HasUserSetting() const {
- return pref_value_store()->PrefValueInUserStore(name_.c_str());
+ return pref_value_store()->PrefValueInUserStore(name_);
}
bool PrefService::Preference::IsExtensionControlled() const {
- return pref_value_store()->PrefValueFromExtensionStore(name_.c_str());
+ return pref_value_store()->PrefValueFromExtensionStore(name_);
}
bool PrefService::Preference::IsUserControlled() const {
- return pref_value_store()->PrefValueFromUserStore(name_.c_str());
+ return pref_value_store()->PrefValueFromUserStore(name_);
}
bool PrefService::Preference::IsDefaultValue() const {
- return pref_value_store()->PrefValueFromDefaultStore(name_.c_str());
+ return pref_value_store()->PrefValueFromDefaultStore(name_);
}
bool PrefService::Preference::IsUserModifiable() const {
- return pref_value_store()->PrefValueUserModifiable(name_.c_str());
+ return pref_value_store()->PrefValueUserModifiable(name_);
}
bool PrefService::Preference::IsExtensionModifiable() const {
- return pref_value_store()->PrefValueExtensionModifiable(name_.c_str());
+ return pref_value_store()->PrefValueExtensionModifiable(name_);
}
const base::Value* PrefService::GetPreferenceValue(
diff --git a/base/prefs/pref_service.h b/base/prefs/pref_service.h
index 186433c..734cc2b 100644
--- a/base/prefs/pref_service.h
+++ b/base/prefs/pref_service.h
@@ -65,7 +65,7 @@
// dictionary (a branch), or list. You shouldn't need to construct this on
// your own; use the PrefService::Register*Pref methods instead.
Preference(const PrefService* service,
- const char* name,
+ const std::string& name,
base::Value::Type type);
~Preference() {}
@@ -156,81 +156,83 @@
// Returns true if the preference for the given preference name is available
// and is managed.
- bool IsManagedPreference(const char* pref_name) const;
+ bool IsManagedPreference(const std::string& pref_name) const;
// Returns |true| if a preference with the given name is available and its
// value can be changed by the user.
- bool IsUserModifiablePreference(const char* pref_name) const;
+ bool IsUserModifiablePreference(const std::string& pref_name) const;
// Look up a preference. Returns NULL if the preference is not
// registered.
- const PrefService::Preference* FindPreference(const char* path) const;
+ const PrefService::Preference* FindPreference(const std::string& path) const;
// If the path is valid and the value at the end of the path matches the type
// specified, it will return the specified value. Otherwise, the default
// value (set when the pref was registered) will be returned.
- bool GetBoolean(const char* path) const;
- int GetInteger(const char* path) const;
- double GetDouble(const char* path) const;
- std::string GetString(const char* path) const;
- base::FilePath GetFilePath(const char* path) const;
+ bool GetBoolean(const std::string& path) const;
+ int GetInteger(const std::string& path) const;
+ double GetDouble(const std::string& path) const;
+ std::string GetString(const std::string& path) const;
+ base::FilePath GetFilePath(const std::string& path) const;
// Returns the branch if it exists, or the registered default value otherwise.
// Note that |path| must point to a registered preference. In that case, these
// functions will never return NULL.
- const base::DictionaryValue* GetDictionary(
- const char* path) const;
- const base::ListValue* GetList(const char* path) const;
+ const base::DictionaryValue* GetDictionary(const std::string& path) const;
+ const base::ListValue* GetList(const std::string& path) const;
// Removes a user pref and restores the pref to its default value.
- void ClearPref(const char* path);
+ void ClearPref(const std::string& path);
// If the path is valid (i.e., registered), update the pref value in the user
// prefs.
// To set the value of dictionary or list values in the pref tree use
// Set(), but to modify the value of a dictionary or list use either
// ListPrefUpdate or DictionaryPrefUpdate from scoped_user_pref_update.h.
- void Set(const char* path, const base::Value& value);
- void SetBoolean(const char* path, bool value);
- void SetInteger(const char* path, int value);
- void SetDouble(const char* path, double value);
- void SetString(const char* path, const std::string& value);
- void SetFilePath(const char* path, const base::FilePath& value);
+ void Set(const std::string& path, const base::Value& value);
+ void SetBoolean(const std::string& path, bool value);
+ void SetInteger(const std::string& path, int value);
+ void SetDouble(const std::string& path, double value);
+ void SetString(const std::string& path, const std::string& value);
+ void SetFilePath(const std::string& path, const base::FilePath& value);
// Int64 helper methods that actually store the given value as a string.
// Note that if obtaining the named value via GetDictionary or GetList, the
// Value type will be TYPE_STRING.
- void SetInt64(const char* path, int64 value);
- int64 GetInt64(const char* path) const;
+ void SetInt64(const std::string& path, int64 value);
+ int64 GetInt64(const std::string& path) const;
// As above, but for unsigned values.
- void SetUint64(const char* path, uint64 value);
- uint64 GetUint64(const char* path) const;
+ void SetUint64(const std::string& path, uint64 value);
+ uint64 GetUint64(const std::string& path) const;
// Returns the value of the given preference, from the user pref store. If
// the preference is not set in the user pref store, returns NULL.
- const base::Value* GetUserPrefValue(const char* path) const;
+ const base::Value* GetUserPrefValue(const std::string& path) const;
// Changes the default value for a preference. Takes ownership of |value|.
//
// Will cause a pref change notification to be fired if this causes
// the effective value to change.
- void SetDefaultPrefValue(const char* path, base::Value* value);
+ void SetDefaultPrefValue(const std::string& path, base::Value* value);
// Returns the default value of the given preference. |path| must point to a
// registered preference. In that case, will never return NULL.
- const base::Value* GetDefaultPrefValue(const char* path) const;
+ const base::Value* GetDefaultPrefValue(const std::string& path) const;
// Returns true if a value has been set for the specified path.
// NOTE: this is NOT the same as FindPreference. In particular
// FindPreference returns whether RegisterXXX has been invoked, where as
// this checks if a value exists for the path.
- bool HasPrefPath(const char* path) const;
+ bool HasPrefPath(const std::string& path) const;
- // Returns a dictionary with effective preference values. The ownership
- // is passed to the caller.
+ // Returns a dictionary with effective preference values.
scoped_ptr<base::DictionaryValue> GetPreferenceValues() const;
+ // Returns a dictionary with effective preference values, omitting prefs that
+ // are at their default values.
+ scoped_ptr<base::DictionaryValue> GetPreferenceValuesOmitDefaults() const;
+
// Returns a dictionary with effective preference values. Contrary to
// GetPreferenceValues(), the paths of registered preferences are not split on
// '.' characters. If a registered preference stores a dictionary, however,
@@ -238,7 +240,6 @@
// For example, if "foo.bar" is a registered preference, the result could look
// like this:
// {"foo.bar": {"a": {"b": true}}}.
- // The ownership is passed to the caller.
scoped_ptr<base::DictionaryValue> GetPreferenceValuesWithoutPathExpansion()
const;
@@ -316,8 +317,8 @@
// make sure the observer gets cleaned up properly.
//
// Virtual for testing.
- virtual void AddPrefObserver(const char* path, PrefObserver* obs);
- virtual void RemovePrefObserver(const char* path, PrefObserver* obs);
+ virtual void AddPrefObserver(const std::string& path, PrefObserver* obs);
+ virtual void RemovePrefObserver(const std::string& path, PrefObserver* obs);
// Sends notification of a changed preference. This needs to be called by
// a ScopedUserPrefUpdate if a DictionaryValue or ListValue is changed.
@@ -325,7 +326,7 @@
// Sets the value for this pref path in the user pref store and informs the
// PrefNotifier of the change.
- void SetUserPrefValue(const char* path, base::Value* new_value);
+ void SetUserPrefValue(const std::string& path, base::Value* new_value);
// Load preferences from storage, attempting to diagnose and handle errors.
// This should only be called from the constructor.
@@ -338,7 +339,7 @@
// |type| may only be Values::TYPE_DICTIONARY or Values::TYPE_LIST and
// |path| must point to a registered preference of type |type|.
// Ownership of the returned value remains at the user pref store.
- base::Value* GetMutableUserPref(const char* path,
+ base::Value* GetMutableUserPref(const std::string& path,
base::Value::Type type);
// GetPreferenceValue is the equivalent of FindPreference(path)->GetValue(),
diff --git a/base/prefs/pref_value_store.cc b/base/prefs/pref_value_store.cc
index 2c22f17..4b7aab9 100644
--- a/base/prefs/pref_value_store.cc
+++ b/base/prefs/pref_value_store.cc
@@ -109,8 +109,8 @@
// Check the |PrefStore|s in order of their priority from highest to lowest,
// looking for the first preference value with the given |name| and |type|.
for (size_t i = 0; i <= PREF_STORE_TYPE_MAX; ++i) {
- if (GetValueFromStoreWithType(name.c_str(), type,
- static_cast<PrefStoreType>(i), out_value))
+ if (GetValueFromStoreWithType(name, type, static_cast<PrefStoreType>(i),
+ out_value))
return true;
}
return false;
@@ -119,12 +119,11 @@
bool PrefValueStore::GetRecommendedValue(const std::string& name,
base::Value::Type type,
const base::Value** out_value) const {
- return GetValueFromStoreWithType(name.c_str(), type, RECOMMENDED_STORE,
- out_value);
+ return GetValueFromStoreWithType(name, type, RECOMMENDED_STORE, out_value);
}
void PrefValueStore::NotifyPrefChanged(
- const char* path,
+ const std::string& path,
PrefValueStore::PrefStoreType new_store) {
DCHECK(new_store != INVALID_STORE);
// A notification is sent when the pref value in any store changes. If this
@@ -135,41 +134,44 @@
pref_changed_callback_.Run(path);
}
-bool PrefValueStore::PrefValueInManagedStore(const char* name) const {
+bool PrefValueStore::PrefValueInManagedStore(const std::string& name) const {
return PrefValueInStore(name, MANAGED_STORE);
}
-bool PrefValueStore::PrefValueInExtensionStore(const char* name) const {
+bool PrefValueStore::PrefValueInExtensionStore(const std::string& name) const {
return PrefValueInStore(name, EXTENSION_STORE);
}
-bool PrefValueStore::PrefValueInUserStore(const char* name) const {
+bool PrefValueStore::PrefValueInUserStore(const std::string& name) const {
return PrefValueInStore(name, USER_STORE);
}
-bool PrefValueStore::PrefValueFromExtensionStore(const char* name) const {
+bool PrefValueStore::PrefValueFromExtensionStore(
+ const std::string& name) const {
return ControllingPrefStoreForPref(name) == EXTENSION_STORE;
}
-bool PrefValueStore::PrefValueFromUserStore(const char* name) const {
+bool PrefValueStore::PrefValueFromUserStore(const std::string& name) const {
return ControllingPrefStoreForPref(name) == USER_STORE;
}
-bool PrefValueStore::PrefValueFromRecommendedStore(const char* name) const {
+bool PrefValueStore::PrefValueFromRecommendedStore(
+ const std::string& name) const {
return ControllingPrefStoreForPref(name) == RECOMMENDED_STORE;
}
-bool PrefValueStore::PrefValueFromDefaultStore(const char* name) const {
+bool PrefValueStore::PrefValueFromDefaultStore(const std::string& name) const {
return ControllingPrefStoreForPref(name) == DEFAULT_STORE;
}
-bool PrefValueStore::PrefValueUserModifiable(const char* name) const {
+bool PrefValueStore::PrefValueUserModifiable(const std::string& name) const {
PrefStoreType effective_store = ControllingPrefStoreForPref(name);
return effective_store >= USER_STORE ||
effective_store == INVALID_STORE;
}
-bool PrefValueStore::PrefValueExtensionModifiable(const char* name) const {
+bool PrefValueStore::PrefValueExtensionModifiable(
+ const std::string& name) const {
PrefStoreType effective_store = ControllingPrefStoreForPref(name);
return effective_store >= EXTENSION_STORE ||
effective_store == INVALID_STORE;
@@ -180,7 +182,7 @@
}
bool PrefValueStore::PrefValueInStore(
- const char* name,
+ const std::string& name,
PrefValueStore::PrefStoreType store) const {
// Declare a temp Value* and call GetValueFromStore,
// ignoring the output value.
@@ -189,7 +191,7 @@
}
bool PrefValueStore::PrefValueInStoreRange(
- const char* name,
+ const std::string& name,
PrefValueStore::PrefStoreType first_checked_store,
PrefValueStore::PrefStoreType last_checked_store) const {
if (first_checked_store > last_checked_store) {
@@ -206,7 +208,7 @@
}
PrefValueStore::PrefStoreType PrefValueStore::ControllingPrefStoreForPref(
- const char* name) const {
+ const std::string& name) const {
for (size_t i = 0; i <= PREF_STORE_TYPE_MAX; ++i) {
if (PrefValueInStore(name, static_cast<PrefStoreType>(i)))
return static_cast<PrefStoreType>(i);
@@ -214,7 +216,7 @@
return INVALID_STORE;
}
-bool PrefValueStore::GetValueFromStore(const char* name,
+bool PrefValueStore::GetValueFromStore(const std::string& name,
PrefValueStore::PrefStoreType store_type,
const base::Value** out_value) const {
// Only return true if we find a value and it is the correct type, so stale
@@ -230,7 +232,7 @@
}
bool PrefValueStore::GetValueFromStoreWithType(
- const char* name,
+ const std::string& name,
base::Value::Type type,
PrefStoreType store,
const base::Value** out_value) const {
@@ -249,7 +251,7 @@
void PrefValueStore::OnPrefValueChanged(PrefValueStore::PrefStoreType type,
const std::string& key) {
- NotifyPrefChanged(key.c_str(), type);
+ NotifyPrefChanged(key, type);
}
void PrefValueStore::OnInitializationCompleted(
diff --git a/base/prefs/pref_value_store.h b/base/prefs/pref_value_store.h
index db82a82..33203bd 100644
--- a/base/prefs/pref_value_store.h
+++ b/base/prefs/pref_value_store.h
@@ -94,25 +94,25 @@
// These methods return true if a preference with the given name is in the
// indicated pref store, even if that value is currently being overridden by
// a higher-priority source.
- bool PrefValueInManagedStore(const char* name) const;
- bool PrefValueInExtensionStore(const char* name) const;
- bool PrefValueInUserStore(const char* name) const;
+ bool PrefValueInManagedStore(const std::string& name) const;
+ bool PrefValueInExtensionStore(const std::string& name) const;
+ bool PrefValueInUserStore(const std::string& name) const;
// These methods return true if a preference with the given name is actually
// being controlled by the indicated pref store and not being overridden by
// a higher-priority source.
- bool PrefValueFromExtensionStore(const char* name) const;
- bool PrefValueFromUserStore(const char* name) const;
- bool PrefValueFromRecommendedStore(const char* name) const;
- bool PrefValueFromDefaultStore(const char* name) const;
+ bool PrefValueFromExtensionStore(const std::string& name) const;
+ bool PrefValueFromUserStore(const std::string& name) const;
+ bool PrefValueFromRecommendedStore(const std::string& name) const;
+ bool PrefValueFromDefaultStore(const std::string& name) const;
// Check whether a Preference value is modifiable by the user, i.e. whether
// there is no higher-priority source controlling it.
- bool PrefValueUserModifiable(const char* name) const;
+ bool PrefValueUserModifiable(const std::string& name) const;
// Check whether a Preference value is modifiable by an extension, i.e.
// whether there is no higher-priority source controlling it.
- bool PrefValueExtensionModifiable(const char* name) const;
+ bool PrefValueExtensionModifiable(const std::string& name) const;
// Update the command line PrefStore with |command_line_prefs|.
void UpdateCommandLinePrefStore(PrefStore* command_line_prefs);
@@ -188,13 +188,13 @@
// Returns true if the preference with the given name has a value in the
// given PrefStoreType, of the same value type as the preference was
// registered with.
- bool PrefValueInStore(const char* name, PrefStoreType store) const;
+ bool PrefValueInStore(const std::string& name, PrefStoreType store) const;
// Returns true if a preference has an explicit value in any of the
// stores in the range specified by |first_checked_store| and
// |last_checked_store|, even if that value is currently being
// overridden by a higher-priority store.
- bool PrefValueInStoreRange(const char* name,
+ bool PrefValueInStoreRange(const std::string& name,
PrefStoreType first_checked_store,
PrefStoreType last_checked_store) const;
@@ -203,15 +203,15 @@
// INVALID_STORE is returned. In practice, the default PrefStore
// should always have a value for any registered preferencem, so INVALID_STORE
// indicates an error.
- PrefStoreType ControllingPrefStoreForPref(const char* name) const;
+ PrefStoreType ControllingPrefStoreForPref(const std::string& name) const;
// Get a value from the specified |store|.
- bool GetValueFromStore(const char* name,
+ bool GetValueFromStore(const std::string& name,
PrefStoreType store,
const base::Value** out_value) const;
// Get a value from the specified |store| if its |type| matches.
- bool GetValueFromStoreWithType(const char* name,
+ bool GetValueFromStoreWithType(const std::string& name,
base::Value::Type type,
PrefStoreType store,
const base::Value** out_value) const;
@@ -220,7 +220,7 @@
// the user-visible pref value has changed. Triggers the change notification
// if the effective value of the preference has changed, or if the store
// controlling the pref has changed.
- void NotifyPrefChanged(const char* path, PrefStoreType new_store);
+ void NotifyPrefChanged(const std::string& path, PrefStoreType new_store);
// Called from the PrefStoreKeeper implementation when a pref value for |key|
// changed in the pref store for |type|.
diff --git a/base/prefs/pref_value_store_unittest.cc b/base/prefs/pref_value_store_unittest.cc
index 3afe9dc..9194b22 100644
--- a/base/prefs/pref_value_store_unittest.cc
+++ b/base/prefs/pref_value_store_unittest.cc
@@ -237,7 +237,7 @@
default_pref::kDefaultValue);
}
- void ExpectValueChangeNotifications(const char* name) {
+ void ExpectValueChangeNotifications(const std::string& name) {
EXPECT_CALL(pref_notifier_, OnPreferenceChanged(name));
EXPECT_CALL(*sync_associator_, ProcessPrefChange(name));
}
diff --git a/base/prefs/scoped_user_pref_update.cc b/base/prefs/scoped_user_pref_update.cc
index 7871c75..1440a57 100644
--- a/base/prefs/scoped_user_pref_update.cc
+++ b/base/prefs/scoped_user_pref_update.cc
@@ -11,10 +11,8 @@
namespace subtle {
ScopedUserPrefUpdateBase::ScopedUserPrefUpdateBase(PrefService* service,
- const char* path)
- : service_(service),
- path_(path),
- value_(NULL) {
+ const std::string& path)
+ : service_(service), path_(path), value_(NULL) {
DCHECK(service_->CalledOnValidThread());
}
@@ -25,7 +23,7 @@
base::Value* ScopedUserPrefUpdateBase::GetValueOfType(base::Value::Type type) {
DCHECK(CalledOnValidThread());
if (!value_)
- value_ = service_->GetMutableUserPref(path_.c_str(), type);
+ value_ = service_->GetMutableUserPref(path_, type);
return value_;
}
diff --git a/base/prefs/scoped_user_pref_update.h b/base/prefs/scoped_user_pref_update.h
index 82d6739..f8bebfe 100644
--- a/base/prefs/scoped_user_pref_update.h
+++ b/base/prefs/scoped_user_pref_update.h
@@ -33,7 +33,7 @@
// PrefService::ReportUserPrefChanged.
class BASE_PREFS_EXPORT ScopedUserPrefUpdateBase : public base::NonThreadSafe {
protected:
- ScopedUserPrefUpdateBase(PrefService* service, const char* path);
+ ScopedUserPrefUpdateBase(PrefService* service, const std::string& path);
// Calls Notify().
~ScopedUserPrefUpdateBase();
@@ -66,7 +66,7 @@
template <typename T, base::Value::Type type_enum_value>
class ScopedUserPrefUpdate : public subtle::ScopedUserPrefUpdateBase {
public:
- ScopedUserPrefUpdate(PrefService* service, const char* path)
+ ScopedUserPrefUpdate(PrefService* service, const std::string& path)
: ScopedUserPrefUpdateBase(service, path) {}
// Triggers an update notification if Get() was called.
diff --git a/base/prefs/testing_pref_service.h b/base/prefs/testing_pref_service.h
index 2f6d494..40fd66a 100644
--- a/base/prefs/testing_pref_service.h
+++ b/base/prefs/testing_pref_service.h
@@ -27,25 +27,25 @@
// Read the value of a preference from the managed layer. Returns NULL if the
// preference is not defined at the managed layer.
- const base::Value* GetManagedPref(const char* path) const;
+ const base::Value* GetManagedPref(const std::string& path) const;
// Set a preference on the managed layer and fire observers if the preference
// changed. Assumes ownership of |value|.
- void SetManagedPref(const char* path, base::Value* value);
+ void SetManagedPref(const std::string& path, base::Value* value);
// Clear the preference on the managed layer and fire observers if the
// preference has been defined previously.
- void RemoveManagedPref(const char* path);
+ void RemoveManagedPref(const std::string& path);
// Similar to the above, but for user preferences.
- const base::Value* GetUserPref(const char* path) const;
- void SetUserPref(const char* path, base::Value* value);
- void RemoveUserPref(const char* path);
+ const base::Value* GetUserPref(const std::string& path) const;
+ void SetUserPref(const std::string& path, base::Value* value);
+ void RemoveUserPref(const std::string& path);
// Similar to the above, but for recommended policy preferences.
- const base::Value* GetRecommendedPref(const char* path) const;
- void SetRecommendedPref(const char* path, base::Value* value);
- void RemoveRecommendedPref(const char* path);
+ const base::Value* GetRecommendedPref(const std::string& path) const;
+ void SetRecommendedPref(const std::string& path, base::Value* value);
+ void RemoveRecommendedPref(const std::string& path);
// Do-nothing implementation for TestingPrefService.
static void HandleReadError(PersistentPrefStore::PrefReadError error) {}
@@ -62,14 +62,15 @@
// Reads the value of the preference indicated by |path| from |pref_store|.
// Returns NULL if the preference was not found.
const base::Value* GetPref(TestingPrefStore* pref_store,
- const char* path) const;
+ const std::string& path) const;
// Sets the value for |path| in |pref_store|.
- void SetPref(TestingPrefStore* pref_store, const char* path,
+ void SetPref(TestingPrefStore* pref_store,
+ const std::string& path,
base::Value* value);
// Removes the preference identified by |path| from |pref_store|.
- void RemovePref(TestingPrefStore* pref_store, const char* path);
+ void RemovePref(TestingPrefStore* pref_store, const std::string& path);
// Pointers to the pref stores our value store uses.
scoped_refptr<TestingPrefStore> managed_prefs_;
@@ -110,88 +111,83 @@
SuperPrefService, ConstructionPrefRegistry>::~TestingPrefServiceBase() {
}
-template<class SuperPrefService, class ConstructionPrefRegistry>
+template <class SuperPrefService, class ConstructionPrefRegistry>
const base::Value* TestingPrefServiceBase<
- SuperPrefService, ConstructionPrefRegistry>::GetManagedPref(
- const char* path) const {
+ SuperPrefService,
+ ConstructionPrefRegistry>::GetManagedPref(const std::string& path) const {
return GetPref(managed_prefs_.get(), path);
}
-template<class SuperPrefService, class ConstructionPrefRegistry>
-void TestingPrefServiceBase<
- SuperPrefService, ConstructionPrefRegistry>::SetManagedPref(
- const char* path, base::Value* value) {
+template <class SuperPrefService, class ConstructionPrefRegistry>
+void TestingPrefServiceBase<SuperPrefService, ConstructionPrefRegistry>::
+ SetManagedPref(const std::string& path, base::Value* value) {
SetPref(managed_prefs_.get(), path, value);
}
-template<class SuperPrefService, class ConstructionPrefRegistry>
-void TestingPrefServiceBase<
- SuperPrefService, ConstructionPrefRegistry>::RemoveManagedPref(
- const char* path) {
+template <class SuperPrefService, class ConstructionPrefRegistry>
+void TestingPrefServiceBase<SuperPrefService, ConstructionPrefRegistry>::
+ RemoveManagedPref(const std::string& path) {
RemovePref(managed_prefs_.get(), path);
}
-template<class SuperPrefService, class ConstructionPrefRegistry>
-const base::Value* TestingPrefServiceBase<
- SuperPrefService, ConstructionPrefRegistry>::GetUserPref(
- const char* path) const {
+template <class SuperPrefService, class ConstructionPrefRegistry>
+const base::Value*
+TestingPrefServiceBase<SuperPrefService, ConstructionPrefRegistry>::GetUserPref(
+ const std::string& path) const {
return GetPref(user_prefs_.get(), path);
}
-template<class SuperPrefService, class ConstructionPrefRegistry>
-void TestingPrefServiceBase<
- SuperPrefService, ConstructionPrefRegistry>::SetUserPref(
- const char* path, base::Value* value) {
+template <class SuperPrefService, class ConstructionPrefRegistry>
+void TestingPrefServiceBase<SuperPrefService, ConstructionPrefRegistry>::
+ SetUserPref(const std::string& path, base::Value* value) {
SetPref(user_prefs_.get(), path, value);
}
-template<class SuperPrefService, class ConstructionPrefRegistry>
-void TestingPrefServiceBase<
- SuperPrefService, ConstructionPrefRegistry>::RemoveUserPref(
- const char* path) {
+template <class SuperPrefService, class ConstructionPrefRegistry>
+void TestingPrefServiceBase<SuperPrefService, ConstructionPrefRegistry>::
+ RemoveUserPref(const std::string& path) {
RemovePref(user_prefs_.get(), path);
}
-template<class SuperPrefService, class ConstructionPrefRegistry>
-const base::Value* TestingPrefServiceBase<
- SuperPrefService, ConstructionPrefRegistry>::GetRecommendedPref(
- const char* path) const {
+template <class SuperPrefService, class ConstructionPrefRegistry>
+const base::Value*
+TestingPrefServiceBase<SuperPrefService, ConstructionPrefRegistry>::
+ GetRecommendedPref(const std::string& path) const {
return GetPref(recommended_prefs_, path);
}
-template<class SuperPrefService, class ConstructionPrefRegistry>
-void TestingPrefServiceBase<
- SuperPrefService, ConstructionPrefRegistry>::SetRecommendedPref(
- const char* path, base::Value* value) {
+template <class SuperPrefService, class ConstructionPrefRegistry>
+void TestingPrefServiceBase<SuperPrefService, ConstructionPrefRegistry>::
+ SetRecommendedPref(const std::string& path, base::Value* value) {
SetPref(recommended_prefs_.get(), path, value);
}
-template<class SuperPrefService, class ConstructionPrefRegistry>
-void TestingPrefServiceBase<
- SuperPrefService, ConstructionPrefRegistry>::RemoveRecommendedPref(
- const char* path) {
+template <class SuperPrefService, class ConstructionPrefRegistry>
+void TestingPrefServiceBase<SuperPrefService, ConstructionPrefRegistry>::
+ RemoveRecommendedPref(const std::string& path) {
RemovePref(recommended_prefs_.get(), path);
}
-template<class SuperPrefService, class ConstructionPrefRegistry>
-const base::Value* TestingPrefServiceBase<
- SuperPrefService, ConstructionPrefRegistry>::GetPref(
- TestingPrefStore* pref_store, const char* path) const {
+template <class SuperPrefService, class ConstructionPrefRegistry>
+const base::Value*
+TestingPrefServiceBase<SuperPrefService, ConstructionPrefRegistry>::GetPref(
+ TestingPrefStore* pref_store,
+ const std::string& path) const {
const base::Value* res;
return pref_store->GetValue(path, &res) ? res : NULL;
}
-template<class SuperPrefService, class ConstructionPrefRegistry>
-void TestingPrefServiceBase<
- SuperPrefService, ConstructionPrefRegistry>::SetPref(
- TestingPrefStore* pref_store, const char* path, base::Value* value) {
+template <class SuperPrefService, class ConstructionPrefRegistry>
+void TestingPrefServiceBase<SuperPrefService, ConstructionPrefRegistry>::
+ SetPref(TestingPrefStore* pref_store,
+ const std::string& path,
+ base::Value* value) {
pref_store->SetValue(path, value);
}
-template<class SuperPrefService, class ConstructionPrefRegistry>
-void TestingPrefServiceBase<
- SuperPrefService, ConstructionPrefRegistry>::RemovePref(
- TestingPrefStore* pref_store, const char* path) {
+template <class SuperPrefService, class ConstructionPrefRegistry>
+void TestingPrefServiceBase<SuperPrefService, ConstructionPrefRegistry>::
+ RemovePref(TestingPrefStore* pref_store, const std::string& path) {
pref_store->RemoveValue(path);
}
diff --git a/base/process/launch.h b/base/process/launch.h
index 261019b..06abb29 100644
--- a/base/process/launch.h
+++ b/base/process/launch.h
@@ -14,6 +14,7 @@
#include "base/base_export.h"
#include "base/basictypes.h"
#include "base/environment.h"
+#include "base/process/process.h"
#include "base/process/process_handle.h"
#include "base/strings/string_piece.h"
@@ -143,12 +144,7 @@
// Launch a process via the command line |cmdline|.
// See the documentation of LaunchOptions for details on |options|.
//
-// Returns true upon success.
-//
-// Upon success, if |process_handle| is non-null, it will be filled in with the
-// handle of the launched process. NOTE: In this case, the caller is
-// responsible for closing the handle so that it doesn't leak!
-// Otherwise, the process handle will be implicitly closed.
+// Returns a valid Process upon success.
//
// Unix-specific notes:
// - All file descriptors open in the parent process will be closed in the
@@ -158,6 +154,11 @@
// parent's stdout and stderr.
// - If the first argument on the command line does not contain a slash,
// PATH will be searched. (See man execvp.)
+BASE_EXPORT Process LaunchProcess(const CommandLine& cmdline,
+ const LaunchOptions& options);
+
+// Deprecated version.
+// TODO(rvargas) crbug.com/417532: Remove this after migrating all consumers.
BASE_EXPORT bool LaunchProcess(const CommandLine& cmdline,
const LaunchOptions& options,
ProcessHandle* process_handle);
@@ -180,12 +181,10 @@
// Launches a process with elevated privileges. This does not behave exactly
// like LaunchProcess as it uses ShellExecuteEx instead of CreateProcess to
// create the process. This means the process will have elevated privileges
-// and thus some common operations like OpenProcess will fail. The process will
-// be available through the |process_handle| argument. Currently the only
-// supported LaunchOptions are |start_hidden| and |wait|.
-BASE_EXPORT bool LaunchElevatedProcess(const CommandLine& cmdline,
- const LaunchOptions& options,
- ProcessHandle* process_handle);
+// and thus some common operations like OpenProcess will fail. Currently the
+// only supported LaunchOptions are |start_hidden| and |wait|.
+BASE_EXPORT Process LaunchElevatedProcess(const CommandLine& cmdline,
+ const LaunchOptions& options);
#elif defined(OS_POSIX)
// A POSIX-specific version of LaunchProcess that takes an argv array
diff --git a/base/process/launch_posix.cc b/base/process/launch_posix.cc
index bc6294b..3322d26 100644
--- a/base/process/launch_posix.cc
+++ b/base/process/launch_posix.cc
@@ -480,6 +480,15 @@
return LaunchProcess(cmdline.argv(), options, process_handle);
}
+Process LaunchProcess(const CommandLine& cmdline,
+ const LaunchOptions& options) {
+ ProcessHandle process_handle;
+ if (LaunchProcess(cmdline, options, &process_handle))
+ return Process(process_handle);
+
+ return Process();
+}
+
void RaiseProcessToHighPriority() {
// On POSIX, we don't actually do anything here. We could try to nice() or
// setpriority() or sched_getscheduler, but these all require extra rights.
diff --git a/base/process/launch_win.cc b/base/process/launch_win.cc
index a3303a5..3c787fe 100644
--- a/base/process/launch_win.cc
+++ b/base/process/launch_win.cc
@@ -244,9 +244,17 @@
return rv;
}
-bool LaunchElevatedProcess(const CommandLine& cmdline,
- const LaunchOptions& options,
- ProcessHandle* process_handle) {
+Process LaunchProcess(const CommandLine& cmdline,
+ const LaunchOptions& options) {
+ ProcessHandle process_handle;
+ if (LaunchProcess(cmdline, options, &process_handle))
+ return Process(process_handle);
+
+ return Process();
+}
+
+Process LaunchElevatedProcess(const CommandLine& cmdline,
+ const LaunchOptions& options) {
const string16 file = cmdline.GetProgram().value();
const string16 arguments = cmdline.GetArgumentsString();
@@ -263,20 +271,13 @@
if (!ShellExecuteEx(&shex_info)) {
DPLOG(ERROR);
- return false;
+ return Process();
}
if (options.wait)
WaitForSingleObject(shex_info.hProcess, INFINITE);
- // If the caller wants the process handle give it to them, otherwise just
- // close it. Closing it does not terminate the process.
- if (process_handle)
- *process_handle = shex_info.hProcess;
- else
- CloseHandle(shex_info.hProcess);
-
- return true;
+ return Process(shex_info.hProcess);
}
bool SetJobObjectLimitFlags(HANDLE job_object, DWORD limit_flags) {
diff --git a/base/process/process_util_unittest.cc b/base/process/process_util_unittest.cc
index d846d1a..c98884d 100644
--- a/base/process/process_util_unittest.cc
+++ b/base/process/process_util_unittest.cc
@@ -325,7 +325,7 @@
expected += "\r\n";
FilePath cmd(L"cmd.exe");
- CommandLine cmd_line(cmd);
+ base::CommandLine cmd_line(cmd);
cmd_line.AppendArg("/c");
cmd_line.AppendArg("echo " + message + "");
std::string output;
@@ -333,7 +333,7 @@
EXPECT_EQ(expected, output);
// Let's make sure stderr is ignored.
- CommandLine other_cmd_line(cmd);
+ base::CommandLine other_cmd_line(cmd);
other_cmd_line.AppendArg("/c");
// http://msdn.microsoft.com/library/cc772622.aspx
cmd_line.AppendArg("echo " + message + " >&2");
@@ -348,22 +348,23 @@
ASSERT_TRUE(OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &token));
base::LaunchOptions options;
options.as_user = token;
- EXPECT_TRUE(base::LaunchProcess(MakeCmdLine("SimpleChildProcess"), options,
- NULL));
+ EXPECT_TRUE(base::LaunchProcess(MakeCmdLine("SimpleChildProcess"),
+ options).IsValid());
}
static const char kEventToTriggerHandleSwitch[] = "event-to-trigger-handle";
MULTIPROCESS_TEST_MAIN(TriggerEventChildProcess) {
std::string handle_value_string =
- CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
+ base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
kEventToTriggerHandleSwitch);
CHECK(!handle_value_string.empty());
uint64 handle_value_uint64;
CHECK(base::StringToUint64(handle_value_string, &handle_value_uint64));
// Give ownership of the handle to |event|.
- base::WaitableEvent event(reinterpret_cast<HANDLE>(handle_value_uint64));
+ base::WaitableEvent event(base::win::ScopedHandle(
+ reinterpret_cast<HANDLE>(handle_value_uint64)));
event.Signal();
@@ -378,26 +379,26 @@
security_attributes.bInheritHandle = true;
// Takes ownership of the event handle.
- base::WaitableEvent event(
- CreateEvent(&security_attributes, true, false, NULL));
+ base::WaitableEvent event(base::win::ScopedHandle(
+ CreateEvent(&security_attributes, true, false, NULL)));
base::HandlesToInheritVector handles_to_inherit;
handles_to_inherit.push_back(event.handle());
base::LaunchOptions options;
options.handles_to_inherit = &handles_to_inherit;
- CommandLine cmd_line = MakeCmdLine("TriggerEventChildProcess");
+ base::CommandLine cmd_line = MakeCmdLine("TriggerEventChildProcess");
cmd_line.AppendSwitchASCII(kEventToTriggerHandleSwitch,
base::Uint64ToString(reinterpret_cast<uint64>(event.handle())));
// This functionality actually requires Vista or later. Make sure that it
// fails properly on XP.
if (base::win::GetVersion() < base::win::VERSION_VISTA) {
- EXPECT_FALSE(base::LaunchProcess(cmd_line, options, NULL));
+ EXPECT_FALSE(base::LaunchProcess(cmd_line, options).IsValid());
return;
}
// Launch the process and wait for it to trigger the event.
- ASSERT_TRUE(base::LaunchProcess(cmd_line, options, NULL));
+ ASSERT_TRUE(base::LaunchProcess(cmd_line, options).IsValid());
EXPECT_TRUE(event.TimedWait(TestTimeouts::action_max_timeout()));
}
#endif // defined(OS_WIN)
@@ -710,27 +711,29 @@
argv.push_back("-c");
argv.push_back("exit 0");
- EXPECT_TRUE(base::GetAppOutput(CommandLine(argv), &output));
+ EXPECT_TRUE(base::GetAppOutput(base::CommandLine(argv), &output));
EXPECT_STREQ("", output.c_str());
argv[2] = "exit 1";
- EXPECT_FALSE(base::GetAppOutput(CommandLine(argv), &output));
+ EXPECT_FALSE(base::GetAppOutput(base::CommandLine(argv), &output));
EXPECT_STREQ("", output.c_str());
argv[2] = "echo foobar42";
- EXPECT_TRUE(base::GetAppOutput(CommandLine(argv), &output));
+ EXPECT_TRUE(base::GetAppOutput(base::CommandLine(argv), &output));
EXPECT_STREQ("foobar42\n", output.c_str());
#else
- EXPECT_TRUE(base::GetAppOutput(CommandLine(FilePath("true")), &output));
+ EXPECT_TRUE(base::GetAppOutput(base::CommandLine(FilePath("true")),
+ &output));
EXPECT_STREQ("", output.c_str());
- EXPECT_FALSE(base::GetAppOutput(CommandLine(FilePath("false")), &output));
+ EXPECT_FALSE(base::GetAppOutput(base::CommandLine(FilePath("false")),
+ &output));
std::vector<std::string> argv;
argv.push_back("/bin/echo");
argv.push_back("-n");
argv.push_back("foobar42");
- EXPECT_TRUE(base::GetAppOutput(CommandLine(argv), &output));
+ EXPECT_TRUE(base::GetAppOutput(base::CommandLine(argv), &output));
EXPECT_STREQ("foobar42", output.c_str());
#endif // defined(OS_ANDROID)
}
@@ -754,34 +757,39 @@
// need absolute paths).
argv.push_back("exit 0"); // argv[2]; equivalent to "true"
std::string output = "abc";
- EXPECT_TRUE(base::GetAppOutputRestricted(CommandLine(argv), &output, 100));
+ EXPECT_TRUE(base::GetAppOutputRestricted(base::CommandLine(argv), &output,
+ 100));
EXPECT_STREQ("", output.c_str());
argv[2] = "exit 1"; // equivalent to "false"
output = "before";
- EXPECT_FALSE(base::GetAppOutputRestricted(CommandLine(argv),
- &output, 100));
+ EXPECT_FALSE(base::GetAppOutputRestricted(base::CommandLine(argv), &output,
+ 100));
EXPECT_STREQ("", output.c_str());
// Amount of output exactly equal to space allowed.
argv[2] = "echo 123456789"; // (the sh built-in doesn't take "-n")
output.clear();
- EXPECT_TRUE(base::GetAppOutputRestricted(CommandLine(argv), &output, 10));
+ EXPECT_TRUE(base::GetAppOutputRestricted(base::CommandLine(argv), &output,
+ 10));
EXPECT_STREQ("123456789\n", output.c_str());
// Amount of output greater than space allowed.
output.clear();
- EXPECT_TRUE(base::GetAppOutputRestricted(CommandLine(argv), &output, 5));
+ EXPECT_TRUE(base::GetAppOutputRestricted(base::CommandLine(argv), &output,
+ 5));
EXPECT_STREQ("12345", output.c_str());
// Amount of output less than space allowed.
output.clear();
- EXPECT_TRUE(base::GetAppOutputRestricted(CommandLine(argv), &output, 15));
+ EXPECT_TRUE(base::GetAppOutputRestricted(base::CommandLine(argv), &output,
+ 15));
EXPECT_STREQ("123456789\n", output.c_str());
// Zero space allowed.
output = "abc";
- EXPECT_TRUE(base::GetAppOutputRestricted(CommandLine(argv), &output, 0));
+ EXPECT_TRUE(base::GetAppOutputRestricted(base::CommandLine(argv), &output,
+ 0));
EXPECT_STREQ("", output.c_str());
}
@@ -796,11 +804,13 @@
argv.push_back("-c");
#if defined(OS_ANDROID)
argv.push_back("while echo 12345678901234567890; do :; done");
- EXPECT_TRUE(base::GetAppOutputRestricted(CommandLine(argv), &output, 10));
+ EXPECT_TRUE(base::GetAppOutputRestricted(base::CommandLine(argv), &output,
+ 10));
EXPECT_STREQ("1234567890", output.c_str());
#else
argv.push_back("yes");
- EXPECT_TRUE(base::GetAppOutputRestricted(CommandLine(argv), &output, 10));
+ EXPECT_TRUE(base::GetAppOutputRestricted(base::CommandLine(argv), &output,
+ 10));
EXPECT_STREQ("y\ny\ny\ny\ny\n", output.c_str());
#endif
}
@@ -826,14 +836,16 @@
// 10.5) times with an output buffer big enough to capture all output.
for (int i = 0; i < 300; i++) {
std::string output;
- EXPECT_TRUE(base::GetAppOutputRestricted(CommandLine(argv), &output, 100));
+ EXPECT_TRUE(base::GetAppOutputRestricted(base::CommandLine(argv), &output,
+ 100));
EXPECT_STREQ("123456789012345678901234567890\n", output.c_str());
}
// Ditto, but with an output buffer too small to capture all output.
for (int i = 0; i < 300; i++) {
std::string output;
- EXPECT_TRUE(base::GetAppOutputRestricted(CommandLine(argv), &output, 10));
+ EXPECT_TRUE(base::GetAppOutputRestricted(base::CommandLine(argv), &output,
+ 10));
EXPECT_STREQ("1234567890", output.c_str());
}
}
@@ -846,7 +858,7 @@
argv.push_back(std::string(kShellPath)); // argv[0]
argv.push_back("-c"); // argv[1]
argv.push_back("echo foo"); // argv[2];
- EXPECT_TRUE(base::GetAppOutputWithExitCode(CommandLine(argv), &output,
+ EXPECT_TRUE(base::GetAppOutputWithExitCode(base::CommandLine(argv), &output,
&exit_code));
EXPECT_STREQ("foo\n", output.c_str());
EXPECT_EQ(exit_code, 0);
@@ -855,7 +867,7 @@
// code.
output.clear();
argv[2] = "echo foo; exit 2";
- EXPECT_TRUE(base::GetAppOutputWithExitCode(CommandLine(argv), &output,
+ EXPECT_TRUE(base::GetAppOutputWithExitCode(base::CommandLine(argv), &output,
&exit_code));
EXPECT_STREQ("foo\n", output.c_str());
EXPECT_EQ(exit_code, 2);
diff --git a/base/synchronization/waitable_event.h b/base/synchronization/waitable_event.h
index 39c0d11..5adc1ec 100644
--- a/base/synchronization/waitable_event.h
+++ b/base/synchronization/waitable_event.h
@@ -53,11 +53,7 @@
// Create a WaitableEvent from an Event HANDLE which has already been
// created. This objects takes ownership of the HANDLE and will close it when
// deleted.
- // TODO(rvargas): Pass ScopedHandle instead (and on Release).
- explicit WaitableEvent(HANDLE event_handle);
-
- // Releases ownership of the handle from this object.
- HANDLE Release();
+ explicit WaitableEvent(win::ScopedHandle event_handle);
#endif
~WaitableEvent();
diff --git a/base/synchronization/waitable_event_win.cc b/base/synchronization/waitable_event_win.cc
index ec2d84f..770c582 100644
--- a/base/synchronization/waitable_event_win.cc
+++ b/base/synchronization/waitable_event_win.cc
@@ -20,18 +20,14 @@
CHECK(handle_.IsValid());
}
-WaitableEvent::WaitableEvent(HANDLE handle)
- : handle_(handle) {
+WaitableEvent::WaitableEvent(win::ScopedHandle handle)
+ : handle_(handle.Pass()) {
CHECK(handle_.IsValid()) << "Tried to create WaitableEvent from NULL handle";
}
WaitableEvent::~WaitableEvent() {
}
-HANDLE WaitableEvent::Release() {
- return handle_.Take();
-}
-
void WaitableEvent::Reset() {
ResetEvent(handle_.Get());
}
diff --git a/base/test/BUILD.gn b/base/test/BUILD.gn
index a2864b5..3aab89e 100644
--- a/base/test/BUILD.gn
+++ b/base/test/BUILD.gn
@@ -17,6 +17,8 @@
"expectations/expectation.h",
"expectations/parser.cc",
"expectations/parser.h",
+ "gtest_util.cc",
+ "gtest_util.h",
"gtest_xml_util.cc",
"gtest_xml_util.h",
"histogram_tester.cc",
@@ -113,7 +115,7 @@
"//base/third_party/dynamic_annotations",
"//testing/gmock",
"//testing/gtest",
- "//third_party/libxml"
+ "//third_party/libxml",
]
if (!is_posix) {
diff --git a/base/test/gtest_util.cc b/base/test/gtest_util.cc
new file mode 100644
index 0000000..47fd639
--- /dev/null
+++ b/base/test/gtest_util.cc
@@ -0,0 +1,43 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/test/gtest_util.h"
+
+#include "base/files/file_path.h"
+#include "base/json/json_file_value_serializer.h"
+#include "base/values.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace base {
+
+std::vector<SplitTestName> GetCompiledInTests() {
+ testing::UnitTest* const unit_test = testing::UnitTest::GetInstance();
+
+ std::vector<SplitTestName> tests;
+ for (int i = 0; i < unit_test->total_test_case_count(); ++i) {
+ const testing::TestCase* test_case = unit_test->GetTestCase(i);
+ for (int j = 0; j < test_case->total_test_count(); ++j) {
+ const testing::TestInfo* test_info = test_case->GetTestInfo(j);
+ tests.push_back(std::make_pair(test_case->name(), test_info->name()));
+ }
+ }
+ return tests;
+}
+
+bool WriteCompiledInTestsToFile(const FilePath& path) {
+ std::vector<SplitTestName> tests(GetCompiledInTests());
+
+ ListValue root;
+ for (size_t i = 0; i < tests.size(); ++i) {
+ DictionaryValue* test_info = new DictionaryValue;
+ test_info->SetString("test_case_name", tests[i].first);
+ test_info->SetString("test_name", tests[i].second);
+ root.Append(test_info);
+ }
+
+ JSONFileValueSerializer serializer(path);
+ return serializer.Serialize(root);
+}
+
+} // namespace
diff --git a/base/test/gtest_util.h b/base/test/gtest_util.h
new file mode 100644
index 0000000..93382f8
--- /dev/null
+++ b/base/test/gtest_util.h
@@ -0,0 +1,31 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_TEST_GTEST_UTIL_H_
+#define BASE_TEST_GTEST_UTIL_H_
+
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "base/compiler_specific.h"
+
+namespace base {
+
+class FilePath;
+
+// First value is test case name, second one is test name.
+typedef std::pair<std::string, std::string> SplitTestName;
+
+// Returns a vector of gtest-based tests compiled into
+// current executable.
+std::vector<SplitTestName> GetCompiledInTests();
+
+// Writes the list of gtest-based tests compiled into
+// current executable as a JSON file. Returns true on success.
+bool WriteCompiledInTestsToFile(const FilePath& path) WARN_UNUSED_RESULT;
+
+} // namespace base
+
+#endif // BASE_TEST_GTEST_UTIL_H_
diff --git a/base/test/launcher/test_launcher.cc b/base/test/launcher/test_launcher.cc
index c0ae6a9..0d3eba9 100644
--- a/base/test/launcher/test_launcher.cc
+++ b/base/test/launcher/test_launcher.cc
@@ -29,6 +29,7 @@
#include "base/strings/stringize_macros.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
+#include "base/test/gtest_util.h"
#include "base/test/launcher/test_results_tracker.h"
#include "base/test/sequenced_worker_pool_owner.h"
#include "base/test/test_switches.h"
@@ -900,61 +901,56 @@
}
void TestLauncher::RunTests() {
- testing::UnitTest* const unit_test = testing::UnitTest::GetInstance();
+ std::vector<SplitTestName> tests(GetCompiledInTests());
std::vector<std::string> test_names;
- for (int i = 0; i < unit_test->total_test_case_count(); ++i) {
- const testing::TestCase* test_case = unit_test->GetTestCase(i);
- for (int j = 0; j < test_case->total_test_count(); ++j) {
- const testing::TestInfo* test_info = test_case->GetTestInfo(j);
- std::string test_name = FormatFullTestName(
- test_info->test_case_name(), test_info->name());
+ for (size_t i = 0; i < tests.size(); i++) {
+ std::string test_name = FormatFullTestName(tests[i].first, tests[i].second);
- results_tracker_.AddTest(test_name);
+ results_tracker_.AddTest(test_name);
- const CommandLine* command_line = CommandLine::ForCurrentProcess();
- if (test_name.find("DISABLED") != std::string::npos) {
- results_tracker_.AddDisabledTest(test_name);
+ const CommandLine* command_line = CommandLine::ForCurrentProcess();
+ if (test_name.find("DISABLED") != std::string::npos) {
+ results_tracker_.AddDisabledTest(test_name);
- // Skip disabled tests unless explicitly requested.
- if (!command_line->HasSwitch(kGTestRunDisabledTestsFlag))
- continue;
- }
-
- if (!launcher_delegate_->ShouldRunTest(test_case, test_info))
+ // Skip disabled tests unless explicitly requested.
+ if (!command_line->HasSwitch(kGTestRunDisabledTestsFlag))
continue;
+ }
- // Skip the test that doesn't match the filter (if given).
- if (!positive_test_filter_.empty()) {
- bool found = false;
- for (size_t k = 0; k < positive_test_filter_.size(); ++k) {
- if (MatchPattern(test_name, positive_test_filter_[k])) {
- found = true;
- break;
- }
- }
+ if (!launcher_delegate_->ShouldRunTest(tests[i].first, tests[i].second))
+ continue;
- if (!found)
- continue;
- }
- bool excluded = false;
- for (size_t k = 0; k < negative_test_filter_.size(); ++k) {
- if (MatchPattern(test_name, negative_test_filter_[k])) {
- excluded = true;
+ // Skip the test that doesn't match the filter (if given).
+ if (!positive_test_filter_.empty()) {
+ bool found = false;
+ for (size_t k = 0; k < positive_test_filter_.size(); ++k) {
+ if (MatchPattern(test_name, positive_test_filter_[k])) {
+ found = true;
break;
}
}
- if (excluded)
- continue;
- if (base::Hash(test_name) % total_shards_ !=
- static_cast<uint32>(shard_index_)) {
+ if (!found)
continue;
- }
-
- test_names.push_back(test_name);
}
+ bool excluded = false;
+ for (size_t k = 0; k < negative_test_filter_.size(); ++k) {
+ if (MatchPattern(test_name, negative_test_filter_[k])) {
+ excluded = true;
+ break;
+ }
+ }
+ if (excluded)
+ continue;
+
+ if (base::Hash(test_name) % total_shards_ !=
+ static_cast<uint32>(shard_index_)) {
+ continue;
+ }
+
+ test_names.push_back(test_name);
}
test_started_count_ = launcher_delegate_->RunTests(this, test_names);
diff --git a/base/test/launcher/test_launcher.h b/base/test/launcher/test_launcher.h
index 8c72ee7..78a854b 100644
--- a/base/test/launcher/test_launcher.h
+++ b/base/test/launcher/test_launcher.h
@@ -43,8 +43,8 @@
// Called before a test is considered for running. If it returns false,
// the test is not run. If it returns true, the test will be run provided
// it is part of the current shard.
- virtual bool ShouldRunTest(const testing::TestCase* test_case,
- const testing::TestInfo* test_info) = 0;
+ virtual bool ShouldRunTest(const std::string& test_case_name,
+ const std::string& test_name) = 0;
// Called to make the delegate run the specified tests. The delegate must
// return the number of actual tests it's going to run (can be smaller,
diff --git a/base/test/launcher/test_launcher_ios.cc b/base/test/launcher/test_launcher_ios.cc
index 38e4ef9..39051ca 100644
--- a/base/test/launcher/test_launcher_ios.cc
+++ b/base/test/launcher/test_launcher_ios.cc
@@ -4,6 +4,7 @@
#include "base/test/launcher/test_launcher.h"
+#include "base/at_exit.h"
#include "base/bind.h"
#include "base/test/launcher/unit_test_launcher.h"
@@ -16,5 +17,6 @@
} // namespace
int main(int argc, char** argv) {
+ base::AtExitManager at_exit;
return base::LaunchUnitTests(argc, argv, base::Bind(&DummyRunTestSuite));
}
diff --git a/base/test/launcher/unit_test_launcher.cc b/base/test/launcher/unit_test_launcher.cc
index a49e777..6309cde 100644
--- a/base/test/launcher/unit_test_launcher.cc
+++ b/base/test/launcher/unit_test_launcher.cc
@@ -118,8 +118,8 @@
FilePath output_file;
};
- bool ShouldRunTest(const testing::TestCase* test_case,
- const testing::TestInfo* test_info) override {
+ bool ShouldRunTest(const std::string& test_case_name,
+ const std::string& test_name) override {
DCHECK(thread_checker_.CalledOnValidThread());
// There is no additional logic to disable specific tests.
diff --git a/base/test/launcher/unit_test_launcher_ios.cc b/base/test/launcher/unit_test_launcher_ios.cc
index ae08acd..d4276c8 100644
--- a/base/test/launcher/unit_test_launcher_ios.cc
+++ b/base/test/launcher/unit_test_launcher_ios.cc
@@ -4,13 +4,31 @@
#include "base/test/launcher/unit_test_launcher.h"
+#include "base/command_line.h"
+#include "base/files/file_path.h"
+#include "base/logging.h"
+#include "base/test/gtest_util.h"
+#include "base/test/test_switches.h"
+
namespace base {
int LaunchUnitTests(int argc,
char** argv,
const RunTestSuiteCallback& run_test_suite) {
- // Stub implementation - iOS doesn't support features we need for
- // the full test launcher (e.g. process_util).
+ CHECK(CommandLine::InitializedForCurrentProcess() ||
+ CommandLine::Init(argc, argv));
+ const CommandLine* command_line = CommandLine::ForCurrentProcess();
+ if (command_line->HasSwitch(switches::kTestLauncherListTests)) {
+ FilePath list_path(command_line->GetSwitchValuePath(
+ switches::kTestLauncherListTests));
+ if (WriteCompiledInTestsToFile(list_path)) {
+ return 0;
+ } else {
+ LOG(ERROR) << "Failed to write list of tests.";
+ return 1;
+ }
+ }
+
return run_test_suite.Run();
}
diff --git a/base/test/scoped_path_override.cc b/base/test/scoped_path_override.cc
index 495ba2f..9a77611 100644
--- a/base/test/scoped_path_override.cc
+++ b/base/test/scoped_path_override.cc
@@ -22,6 +22,16 @@
CHECK(result);
}
+ScopedPathOverride::ScopedPathOverride(int key,
+ const FilePath& path,
+ bool is_absolute,
+ bool create)
+ : key_(key) {
+ bool result =
+ PathService::OverrideAndCreateIfNeeded(key, path, is_absolute, create);
+ CHECK(result);
+}
+
ScopedPathOverride::~ScopedPathOverride() {
bool result = PathService::RemoveOverride(key_);
CHECK(result) << "The override seems to have been removed already!";
diff --git a/base/test/scoped_path_override.h b/base/test/scoped_path_override.h
index a1e18e3..c6cffe2 100644
--- a/base/test/scoped_path_override.h
+++ b/base/test/scoped_path_override.h
@@ -20,8 +20,15 @@
public:
// Contructor that initializes the override to a scoped temp directory.
explicit ScopedPathOverride(int key);
+
// Constructor that would use a path provided by the user.
ScopedPathOverride(int key, const FilePath& dir);
+
+ // See PathService::OverrideAndCreateIfNeeded.
+ ScopedPathOverride(int key,
+ const FilePath& path,
+ bool is_absolute,
+ bool create);
~ScopedPathOverride();
private:
diff --git a/base/test/test_suite.cc b/base/test/test_suite.cc
index 206507b..a6fc201 100644
--- a/base/test/test_suite.cc
+++ b/base/test/test_suite.cc
@@ -58,19 +58,19 @@
class TestClientInitializer : public testing::EmptyTestEventListener {
public:
TestClientInitializer()
- : old_command_line_(CommandLine::NO_PROGRAM) {
+ : old_command_line_(base::CommandLine::NO_PROGRAM) {
}
virtual void OnTestStart(const testing::TestInfo& test_info) override {
- old_command_line_ = *CommandLine::ForCurrentProcess();
+ old_command_line_ = *base::CommandLine::ForCurrentProcess();
}
virtual void OnTestEnd(const testing::TestInfo& test_info) override {
- *CommandLine::ForCurrentProcess() = old_command_line_;
+ *base::CommandLine::ForCurrentProcess() = old_command_line_;
}
private:
- CommandLine old_command_line_;
+ base::CommandLine old_command_line_;
DISALLOW_COPY_AND_ASSIGN(TestClientInitializer);
};
@@ -108,11 +108,11 @@
TestSuite::~TestSuite() {
if (initialized_command_line_)
- CommandLine::Reset();
+ base::CommandLine::Reset();
}
void TestSuite::InitializeFromCommandLine(int argc, char** argv) {
- initialized_command_line_ = CommandLine::Init(argc, argv);
+ initialized_command_line_ = base::CommandLine::Init(argc, argv);
testing::InitGoogleTest(&argc, argv);
testing::InitGoogleMock(&argc, argv);
@@ -124,7 +124,7 @@
#if defined(OS_WIN)
void TestSuite::InitializeFromCommandLine(int argc, wchar_t** argv) {
// Windows CommandLine::Init ignores argv anyway.
- initialized_command_line_ = CommandLine::Init(argc, NULL);
+ initialized_command_line_ = base::CommandLine::Init(argc, NULL);
testing::InitGoogleTest(&argc, argv);
testing::InitGoogleMock(&argc, argv);
}
@@ -174,13 +174,13 @@
#if !defined(OS_IOS)
void TestSuite::AddTestLauncherResultPrinter() {
// Only add the custom printer if requested.
- if (!CommandLine::ForCurrentProcess()->HasSwitch(
+ if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kTestLauncherOutput)) {
return;
}
- FilePath output_path(CommandLine::ForCurrentProcess()->GetSwitchValuePath(
- switches::kTestLauncherOutput));
+ FilePath output_path(base::CommandLine::ForCurrentProcess()->
+ GetSwitchValuePath(switches::kTestLauncherOutput));
// Do not add the result printer if output path already exists. It's an
// indicator there is a process printing to that file, and we're likely
@@ -212,7 +212,7 @@
Initialize();
std::string client_func =
- CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
+ base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
switches::kTestChildProcess);
// Check to see if we are being run as a client process.
@@ -315,7 +315,8 @@
// In some cases, we do not want to see standard error dialogs.
if (!base::debug::BeingDebugged() &&
- !CommandLine::ForCurrentProcess()->HasSwitch("show-error-dialogs")) {
+ !base::CommandLine::ForCurrentProcess()->HasSwitch(
+ "show-error-dialogs")) {
SuppressErrorDialogs();
base::debug::SetSuppressDebugUI(true);
logging::SetLogAssertHandler(UnitTestAssertHandler);
diff --git a/base/test/test_switches.cc b/base/test/test_switches.cc
index c970fd2..4d8331d 100644
--- a/base/test/test_switches.cc
+++ b/base/test/test_switches.cc
@@ -24,6 +24,9 @@
// Number of parallel test launcher jobs.
const char switches::kTestLauncherJobs[] = "test-launcher-jobs";
+// Path to list of compiled in tests.
+const char switches::kTestLauncherListTests[] = "test-launcher-list-tests";
+
// Path to test results file in our custom test launcher format.
const char switches::kTestLauncherOutput[] = "test-launcher-output";
diff --git a/base/test/test_switches.h b/base/test/test_switches.h
index c228cf0..336d036 100644
--- a/base/test/test_switches.h
+++ b/base/test/test_switches.h
@@ -14,6 +14,7 @@
extern const char kTestLauncherDebugLauncher[];
extern const char kTestLauncherFilterFile[];
extern const char kTestLauncherJobs[];
+extern const char kTestLauncherListTests[];
extern const char kTestLauncherOutput[];
extern const char kTestLauncherRetryLimit[];
extern const char kTestLauncherSummaryOutput[];
diff --git a/base/test/test_timeouts.cc b/base/test/test_timeouts.cc
index c84cd38..66ae85e 100644
--- a/base/test/test_timeouts.cc
+++ b/base/test/test_timeouts.cc
@@ -41,9 +41,9 @@
// by kTimeoutMultiplier.
void InitializeTimeout(const char* switch_name, int min_value, int* value) {
DCHECK(value);
- if (CommandLine::ForCurrentProcess()->HasSwitch(switch_name)) {
- std::string string_value(
- CommandLine::ForCurrentProcess()->GetSwitchValueASCII(switch_name));
+ if (base::CommandLine::ForCurrentProcess()->HasSwitch(switch_name)) {
+ std::string string_value(base::CommandLine::ForCurrentProcess()->
+ GetSwitchValueASCII(switch_name));
int timeout;
base::StringToInt(string_value, &timeout);
*value = std::max(*value, timeout);
diff --git a/base/threading/thread_unittest.cc b/base/threading/thread_unittest.cc
index f3fb334..f4d024f 100644
--- a/base/threading/thread_unittest.cc
+++ b/base/threading/thread_unittest.cc
@@ -133,7 +133,12 @@
// Ensure that the thread can work with only 12 kb and still process a
// message.
Thread::Options options;
+#if defined(ADDRESS_SANITIZER) && defined(OS_MACOSX)
+ // ASan bloats the stack variables and overflows the 12 kb stack on OSX.
+ options.stack_size = 24*1024;
+#else
options.stack_size = 12*1024;
+#endif
EXPECT_TRUE(a.StartWithOptions(options));
EXPECT_TRUE(a.message_loop());
EXPECT_TRUE(a.IsRunning());
diff --git a/base/tracked_objects.cc b/base/tracked_objects.cc
index 5e30762..4320509 100644
--- a/base/tracked_objects.cc
+++ b/base/tracked_objects.cc
@@ -76,10 +76,10 @@
base::subtle::Atomic32 current_timing_enabled =
base::subtle::NoBarrier_Load(&g_profiler_timing_enabled);
if (current_timing_enabled == UNDEFINED_TIMING) {
- if (!CommandLine::InitializedForCurrentProcess())
+ if (!base::CommandLine::InitializedForCurrentProcess())
return true;
current_timing_enabled =
- (CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
+ (base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
switches::kProfilerTiming) ==
switches::kProfilerTimingDisabledValue)
? DISABLED_TIMING
diff --git a/base/win/pe_image.cc b/base/win/pe_image.cc
index db28699..572b4d9 100644
--- a/base/win/pe_image.cc
+++ b/base/win/pe_image.cc
@@ -10,14 +10,7 @@
namespace base {
namespace win {
-#if defined(_WIN64) && !defined(NACL_WIN64)
-// TODO(jschuh): crbug.com/167707 Make sure this is ok.
-#pragma message ("Warning: \
- This code is not tested on x64. Please make sure all the base unit tests\
- pass before doing any real work. The current unit tests don't test the\
- differences between 32- and 64-bits implementations. Bugs may slip through.\
- You need to improve the coverage before continuing.")
-#endif
+// TODO(jschuh): crbug.com/167707 Make sure this code works on 64-bit.
// Structure to perform imports enumerations.
struct EnumAllImportsStorage {
diff --git a/base/win/scoped_comptr.h b/base/win/scoped_comptr.h
index 98cea0f..373c0c3 100644
--- a/base/win/scoped_comptr.h
+++ b/base/win/scoped_comptr.h
@@ -133,8 +133,7 @@
ScopedComPtr<IUnknown> other_identity;
other->QueryInterface(other_identity.Receive());
- return static_cast<IUnknown*>(my_identity) ==
- static_cast<IUnknown*>(other_identity);
+ return my_identity == other_identity;
}
// Provides direct access to the interface.
diff --git a/build/all.gyp b/build/all.gyp
index 5fe54d7..9c325fb 100644
--- a/build/all.gyp
+++ b/build/all.gyp
@@ -843,6 +843,7 @@
'../chrome/chrome.gyp:chrome_shell_test_apk',
'../chrome/chrome.gyp:chrome_sync_shell_test_apk',
'../chrome/chrome.gyp:chrome_shell_uiautomator_tests',
+ '../chrome/chrome.gyp:chromedriver_webview_shell_apk',
'../chrome/chrome.gyp:unit_tests_apk',
'../components/components_tests.gyp:components_unittests_apk',
'../content/content_shell_and_tests.gyp:content_browsertests_apk',
diff --git a/build/android/PRESUBMIT.py b/build/android/PRESUBMIT.py
index f226b37..7bce71b 100644
--- a/build/android/PRESUBMIT.py
+++ b/build/android/PRESUBMIT.py
@@ -64,6 +64,7 @@
J('pylib', 'device', 'device_utils_test.py'),
J('pylib', 'gtest', 'test_package_test.py'),
J('pylib', 'instrumentation', 'test_runner_test.py'),
+ J('pylib', 'results', 'json_results_test.py'),
J('pylib', 'utils', 'md5sum_test.py'),
],
env=pylib_test_env))
diff --git a/build/android/adb_gdb b/build/android/adb_gdb
index 07178c2..3d8c70c 100755
--- a/build/android/adb_gdb
+++ b/build/android/adb_gdb
@@ -338,7 +338,7 @@
fi
if [ -z "$NDK_DIR" ]; then
- ANDROID_NDK_ROOT=$(PYTHONPATH=build/android python -c \
+ ANDROID_NDK_ROOT=$(PYTHONPATH=$CHROMIUM_SRC/build/android python -c \
'from pylib.constants import ANDROID_NDK_ROOT; print ANDROID_NDK_ROOT,')
else
if [ ! -d "$NDK_DIR" ]; then
diff --git a/build/android/buildbot/bb_device_steps.py b/build/android/buildbot/bb_device_steps.py
index 3142b23..3ca0f4d 100755
--- a/build/android/buildbot/bb_device_steps.py
+++ b/build/android/buildbot/bb_device_steps.py
@@ -78,6 +78,11 @@
'org.chromium.chrome.browser.sync',
'ChromeSyncShellTest',
None),
+ I('ChromeDriverWebViewShell',
+ 'ChromeDriverWebViewShell.apk',
+ 'org.chromium.chromedriver_webview_shell',
+ None,
+ None),
])
VALID_TESTS = set(['chromedriver', 'chrome_proxy', 'gpu',
diff --git a/build/android/buildbot/bb_run_bot.py b/build/android/buildbot/bb_run_bot.py
index abdd2be..38ff93a 100755
--- a/build/android/buildbot/bb_run_bot.py
+++ b/build/android/buildbot/bb_run_bot.py
@@ -158,8 +158,9 @@
T(std_tests, ['--asan', '--asan-symbolize'])),
B('blink-try-builder', H(compile_step)),
B('chromedriver-fyi-tests-dbg', H(std_test_steps),
- T(['chromedriver'], ['--install=ChromeShell', '--skip-wipe',
- '--cleanup'])),
+ T(['chromedriver'],
+ ['--install=ChromeShell', '--install=ChromeDriverWebViewShell',
+ '--skip-wipe', '--cleanup'])),
B('fyi-x86-builder-dbg',
H(compile_step + std_host_tests, experimental, target_arch='ia32')),
B('fyi-builder-dbg',
diff --git a/build/android/findbugs_filter/findbugs_exclude.xml b/build/android/findbugs_filter/findbugs_exclude.xml
index 59aa92f..06358d9 100644
--- a/build/android/findbugs_filter/findbugs_exclude.xml
+++ b/build/android/findbugs_filter/findbugs_exclude.xml
@@ -75,6 +75,11 @@
<Bug code="Dm" />
</Match>
<Match>
+ <Class name="~org\.chromium\.chrome\..*\.NotificationService" />
+ <Method name="dispatchIntentOnUIThread" />
+ <Bug code="Dm" />
+ </Match>
+ <Match>
<Class name="~org\.chromium\.content\..*\.ChildProcessService.*" />
<Method name="run" />
<Bug code="Dm" />
diff --git a/build/android/gyp/delete_files.py b/build/android/gyp/delete_files.py
deleted file mode 100755
index 2fd945c..0000000
--- a/build/android/gyp/delete_files.py
+++ /dev/null
@@ -1,53 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Delete files in directories matching a pattern.
-"""
-
-import glob
-import optparse
-import os
-import sys
-
-from util import build_utils
-
-def main():
- parser = optparse.OptionParser()
- parser.add_option(
- '--pattern',
- help='Pattern for matching Files to delete.')
- parser.add_option(
- '--keep',
- help='Files to keep even if they matches the pattern.')
- parser.add_option(
- '--stamp',
- help='Path to touch on success')
-
- options, args = parser.parse_args()
-
- if not options.pattern or not args:
- print 'No --pattern or target directories given'
- return
-
- for target_dir in args:
- target_pattern = os.path.join(target_dir, options.pattern)
- matching_files = glob.glob(target_pattern)
-
- keep_pattern = os.path.join(target_dir, options.keep)
- files_to_keep = glob.glob(keep_pattern)
-
- for target_file in matching_files:
- if target_file in files_to_keep:
- continue
-
- if os.path.isfile(target_file):
- os.remove(target_file)
-
- if options.stamp:
- build_utils.Touch(options.stamp)
-
-if __name__ == '__main__':
- sys.exit(main())
-
diff --git a/build/android/gyp/test/BUILD.gn b/build/android/gyp/test/BUILD.gn
index 6621489..2deac1d 100644
--- a/build/android/gyp/test/BUILD.gn
+++ b/build/android/gyp/test/BUILD.gn
@@ -5,7 +5,9 @@
}
java_binary("hello_world") {
- deps = [ ":hello_world_java" ]
+ deps = [
+ ":hello_world_java",
+ ]
java_files = [ "java/org/chromium/helloworld/HelloWorldMain.java" ]
main_class = "org.chromium.helloworld.HelloWorldMain"
}
diff --git a/build/android/gyp/write_build_config.py b/build/android/gyp/write_build_config.py
index ed68e6c..a14ef77 100755
--- a/build/android/gyp/write_build_config.py
+++ b/build/android/gyp/write_build_config.py
@@ -213,13 +213,17 @@
c['package_name'] for c in all_resources_deps if 'package_name' in c]
- if options.type == 'android_apk':
- config['apk_dex'] = {}
- dex_config = config['apk_dex']
+ # Dependencies for the final dex file of an apk or the standalone .dex.jar
+ # output of a library.
+ if options.type == 'android_apk' or (options.type == "java_library"
+ and options.supports_android):
+ config['final_dex'] = {}
+ dex_config = config['final_dex']
# TODO(cjhopman): proguard version
dex_deps_files = [c['dex_path'] for c in all_library_deps]
dex_config['dependency_dex_files'] = dex_deps_files
+ if options.type == 'android_apk':
config['dist_jar'] = {
'dependency_jars': [
c['jar_path'] for c in all_library_deps
diff --git a/build/android/provision_devices.py b/build/android/provision_devices.py
index 0dc8c81..c719754 100755
--- a/build/android/provision_devices.py
+++ b/build/android/provision_devices.py
@@ -179,7 +179,7 @@
logging.error('Unable to obtain battery info for %s, %s',
str(device), e)
- while int(battery_info.get('level', 100)) < 95:
+ while int(battery_info.get('level', 100)) < options.min_battery_level:
if not device.old_interface.IsDeviceCharging():
if device.old_interface.CanControlUsbCharging():
device.old_interface.EnableUsbCharging()
@@ -237,6 +237,9 @@
logging.getLogger().setLevel(logging.INFO)
parser = optparse.OptionParser()
+ parser.add_option('--min-battery-level', default=95, type='int',
+ help="Minimum battery level for performance testing "
+ "(default: 95).")
parser.add_option('--skip-wipe', action='store_true', default=False,
help="Don't wipe device data during provisioning.")
parser.add_option('--disable-location', action='store_true', default=False,
diff --git a/build/android/pylib/base/environment_factory.py b/build/android/pylib/base/environment_factory.py
index ad2eafd..c96d199 100644
--- a/build/android/pylib/base/environment_factory.py
+++ b/build/android/pylib/base/environment_factory.py
@@ -3,7 +3,7 @@
# found in the LICENSE file.
-def CreateEnvironment(_command, _options, error_func):
+def CreateEnvironment(_args, error_func):
# TODO(jbudorick) Add local device environment.
# TODO(jbudorick) Add local machine environment.
diff --git a/build/android/pylib/base/test_instance_factory.py b/build/android/pylib/base/test_instance_factory.py
index fd74b96..9f62278 100644
--- a/build/android/pylib/base/test_instance_factory.py
+++ b/build/android/pylib/base/test_instance_factory.py
@@ -3,7 +3,7 @@
# found in the LICENSE file.
-def CreateTestInstance(_command, _options, error_func):
+def CreateTestInstance(_args, error_func):
# TODO(jbudorick) Add gtest test instance.
# TODO(jbudorick) Add instrumentation test instance.
diff --git a/build/android/pylib/base/test_run_factory.py b/build/android/pylib/base/test_run_factory.py
index 50a9690..6ccfb37 100644
--- a/build/android/pylib/base/test_run_factory.py
+++ b/build/android/pylib/base/test_run_factory.py
@@ -2,7 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-def CreateTestRun(_options, _env, _test_instance, error_func):
+def CreateTestRun(_args, _env, _test_instance, error_func):
# TODO(jbudorick) Add local gtest test runs
# TODO(jbudorick) Add local instrumentation test runs.
diff --git a/build/android/pylib/constants.py b/build/android/pylib/constants.py
index e89a298..ac57969 100644
--- a/build/android/pylib/constants.py
+++ b/build/android/pylib/constants.py
@@ -120,6 +120,7 @@
LIGHTTPD_RANDOM_PORT_LAST = 8999
TEST_SYNC_SERVER_PORT = 9031
TEST_SEARCH_BY_IMAGE_SERVER_PORT = 9041
+TEST_POLICY_SERVER_PORT = 9051
# The net test server is started from port 10201.
# TODO(pliard): http://crbug.com/239014. Remove this dirty workaround once
@@ -187,6 +188,7 @@
'path': os.path.join(DIR_SOURCE_ROOT, 'build', 'android'),
'test_modules': [
'pylib.device.device_utils_test',
+ 'pylib.results.json_results_test',
'pylib.utils.md5sum_test',
]
},
@@ -200,6 +202,8 @@
LOCAL_MACHINE_TESTS = ['junit', 'python']
VALID_ENVIRONMENTS = ['local']
+VALID_TEST_TYPES = ['gtest', 'instrumentation', 'junit', 'linker', 'monkey',
+ 'perf', 'python', 'uiautomator']
def GetBuildType():
diff --git a/build/android/pylib/device/adb_wrapper.py b/build/android/pylib/device/adb_wrapper.py
index c7ea310..4981f28 100644
--- a/build/android/pylib/device/adb_wrapper.py
+++ b/build/android/pylib/device/adb_wrapper.py
@@ -9,6 +9,7 @@
"""
import errno
+import logging
import os
from pylib import cmd_helper
@@ -44,43 +45,48 @@
Args:
device_serial: The device serial number as a string.
"""
+ if not device_serial:
+ raise ValueError('A device serial must be specified')
self._device_serial = str(device_serial)
# pylint: disable=unused-argument
@classmethod
@decorators.WithTimeoutAndRetries
- def _RunAdbCmd(cls, arg_list, timeout=None, retries=None, check_error=True):
- cmd = [constants.GetAdbPath()] + arg_list
- exit_code, output = cmd_helper.GetCmdStatusAndOutputWithTimeout(
- cmd, timeout_retry.CurrentTimeoutThread().GetRemainingTime())
- if exit_code != 0:
+ def _RunAdbCmd(cls, args, timeout=None, retries=None, device_serial=None,
+ check_error=True):
+ cmd = [constants.GetAdbPath()]
+ if device_serial is not None:
+ cmd.extend(['-s', device_serial])
+ cmd.extend(args)
+ status, output = cmd_helper.GetCmdStatusAndOutputWithTimeout(
+ cmd, timeout_retry.CurrentTimeoutThread().GetRemainingTime())
+ if status != 0:
raise device_errors.AdbCommandFailedError(
- cmd, 'returned non-zero exit code %d and output %r' %
- (exit_code, output))
+ args, output, status, device_serial)
# This catches some errors, including when the device drops offline;
# unfortunately adb is very inconsistent with error reporting so many
# command failures present differently.
- if check_error and output[:len('error:')] == 'error:':
- raise device_errors.AdbCommandFailedError(arg_list, output)
+ if check_error and output.startswith('error:'):
+ raise device_errors.AdbCommandFailedError(args, output)
return output
# pylint: enable=unused-argument
- def _DeviceAdbCmd(self, arg_list, timeout, retries, check_error=True):
+ def _RunDeviceAdbCmd(self, args, timeout, retries, check_error=True):
"""Runs an adb command on the device associated with this object.
Args:
- arg_list: A list of arguments to adb.
+ args: A list of arguments to adb.
timeout: Timeout in seconds.
retries: Number of retries.
check_error: Check that the command doesn't return an error message. This
- does NOT check the return code of shell commands.
+ does NOT check the exit status of shell commands.
Returns:
The output of the command.
"""
- return self._RunAdbCmd(
- ['-s', self._device_serial] + arg_list, timeout=timeout,
- retries=retries, check_error=check_error)
+ return self._RunAdbCmd(args, timeout=timeout, retries=retries,
+ device_serial=self._device_serial,
+ check_error=check_error)
def __eq__(self, other):
"""Consider instances equal if they refer to the same device.
@@ -117,7 +123,7 @@
AdbWrapper instances.
"""
output = cls._RunAdbCmd(['devices'], timeout=timeout, retries=retries)
- lines = [line.split() for line in output.split('\n')]
+ lines = [line.split() for line in output.splitlines()]
return [AdbWrapper(line[0]) for line in lines
if len(line) == 2 and line[1] == 'device']
@@ -139,7 +145,7 @@
retries: (optional) Number of retries to attempt.
"""
_VerifyLocalFileExists(local)
- self._DeviceAdbCmd(['push', local, remote], timeout, retries)
+ self._RunDeviceAdbCmd(['push', local, remote], timeout, retries)
def Pull(self, remote, local, timeout=60*5, retries=_DEFAULT_RETRIES):
"""Pulls a file from the device to the host.
@@ -150,17 +156,17 @@
timeout: (optional) Timeout per try in seconds.
retries: (optional) Number of retries to attempt.
"""
- self._DeviceAdbCmd(['pull', remote, local], timeout, retries)
+ self._RunDeviceAdbCmd(['pull', remote, local], timeout, retries)
_VerifyLocalFileExists(local)
- def Shell(self, command, expect_rc=0, timeout=_DEFAULT_TIMEOUT,
+ def Shell(self, command, expect_status=0, timeout=_DEFAULT_TIMEOUT,
retries=_DEFAULT_RETRIES):
"""Runs a shell command on the device.
Args:
- command: The shell command to run.
- expect_rc: (optional) Check that the command's return code matches this
- value. Default is 0. If set to None the test is skipped.
+ command: A string with the shell command to run.
+ expect_status: (optional) Check that the command's exit status matches
+ this value. Default is 0. If set to None the test is skipped.
timeout: (optional) Timeout per try in seconds.
retries: (optional) Number of retries to attempt.
@@ -168,33 +174,30 @@
The output of the shell command as a string.
Raises:
- device_errors.AdbCommandFailedError: If the return code doesn't match
- |expect_rc|.
+ device_errors.AdbCommandFailedError: If the exit status doesn't match
+ |expect_status|.
"""
- if expect_rc is None:
- actual_command = command
+ if expect_status is None:
+ args = ['shell', command]
else:
- actual_command = '%s; echo %%$?;' % command.rstrip()
- output = self._DeviceAdbCmd(
- ['shell', actual_command], timeout, retries, check_error=False)
- if expect_rc is not None:
+ args = ['shell', '%s; echo %%$?;' % command.rstrip()]
+ output = self._RunDeviceAdbCmd(args, timeout, retries, check_error=False)
+ if expect_status is not None:
output_end = output.rfind('%')
if output_end < 0:
- # causes the string for rc to become empty and also raise a ValueError
+ # causes the status string to become empty and raise a ValueError
output_end = len(output)
try:
- rc = int(output[output_end+1:])
+ status = int(output[output_end+1:])
except ValueError:
+ logging.warning('exit status of shell command %r missing.', command)
raise device_errors.AdbCommandFailedError(
- ['shell'], 'command %r on device produced output %r where no'
- ' valid return code was found' % (actual_command, output),
- self._device_serial)
-
+ args, output, device_serial=self._device_serial)
output = output[:output_end]
- if rc != expect_rc:
- raise device_errors.AdbShellCommandFailedError(
- command, rc, output, self._device_serial)
+ if status != expect_status:
+ raise device_errors.AdbCommandFailedError(
+ args, output, status, self._device_serial)
return output
def Logcat(self, filter_spec=None, timeout=_DEFAULT_TIMEOUT,
@@ -212,7 +215,7 @@
cmd = ['logcat']
if filter_spec is not None:
cmd.append(filter_spec)
- return self._DeviceAdbCmd(cmd, timeout, retries, check_error=False)
+ return self._RunDeviceAdbCmd(cmd, timeout, retries, check_error=False)
def Forward(self, local, remote, timeout=_DEFAULT_TIMEOUT,
retries=_DEFAULT_RETRIES):
@@ -232,7 +235,8 @@
timeout: (optional) Timeout per try in seconds.
retries: (optional) Number of retries to attempt.
"""
- self._DeviceAdbCmd(['forward', str(local), str(remote)], timeout, retries)
+ self._RunDeviceAdbCmd(['forward', str(local), str(remote)], timeout,
+ retries)
def JDWP(self, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES):
"""List of PIDs of processes hosting a JDWP transport.
@@ -245,7 +249,7 @@
A list of PIDs as strings.
"""
return [a.strip() for a in
- self._DeviceAdbCmd(['jdwp'], timeout, retries).split('\n')]
+ self._RunDeviceAdbCmd(['jdwp'], timeout, retries).split('\n')]
def Install(self, apk_path, forward_lock=False, reinstall=False,
sd_card=False, timeout=60*2, retries=_DEFAULT_RETRIES):
@@ -268,9 +272,10 @@
if sd_card:
cmd.append('-s')
cmd.append(apk_path)
- output = self._DeviceAdbCmd(cmd, timeout, retries)
+ output = self._RunDeviceAdbCmd(cmd, timeout, retries)
if 'Success' not in output:
- raise device_errors.AdbCommandFailedError(cmd, output)
+ raise device_errors.AdbCommandFailedError(
+ cmd, output, device_serial=self._device_serial)
def Uninstall(self, package, keep_data=False, timeout=_DEFAULT_TIMEOUT,
retries=_DEFAULT_RETRIES):
@@ -286,9 +291,10 @@
if keep_data:
cmd.append('-k')
cmd.append(package)
- output = self._DeviceAdbCmd(cmd, timeout, retries)
+ output = self._RunDeviceAdbCmd(cmd, timeout, retries)
if 'Failure' in output:
- raise device_errors.AdbCommandFailedError(cmd, output)
+ raise device_errors.AdbCommandFailedError(
+ cmd, output, device_serial=self._device_serial)
def Backup(self, path, packages=None, apk=False, shared=False,
nosystem=True, include_all=False, timeout=_DEFAULT_TIMEOUT,
@@ -319,7 +325,7 @@
cmd.extend(packages)
assert bool(packages) ^ bool(include_all), (
'Provide \'packages\' or set \'include_all\' but not both.')
- ret = self._DeviceAdbCmd(cmd, timeout, retries)
+ ret = self._RunDeviceAdbCmd(cmd, timeout, retries)
_VerifyLocalFileExists(path)
return ret
@@ -332,7 +338,7 @@
retries: (optional) Number of retries to attempt.
"""
_VerifyLocalFileExists(path)
- self._DeviceAdbCmd(['restore'] + [path], timeout, retries)
+ self._RunDeviceAdbCmd(['restore'] + [path], timeout, retries)
def WaitForDevice(self, timeout=60*5, retries=_DEFAULT_RETRIES):
"""Block until the device is online.
@@ -341,7 +347,7 @@
timeout: (optional) Timeout per try in seconds.
retries: (optional) Number of retries to attempt.
"""
- self._DeviceAdbCmd(['wait-for-device'], timeout, retries)
+ self._RunDeviceAdbCmd(['wait-for-device'], timeout, retries)
def GetState(self, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES):
"""Get device state.
@@ -353,7 +359,7 @@
Returns:
One of 'offline', 'bootloader', or 'device'.
"""
- return self._DeviceAdbCmd(['get-state'], timeout, retries).strip()
+ return self._RunDeviceAdbCmd(['get-state'], timeout, retries).strip()
def GetDevPath(self, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES):
"""Gets the device path.
@@ -365,11 +371,11 @@
Returns:
The device path (e.g. usb:3-4)
"""
- return self._DeviceAdbCmd(['get-devpath'], timeout, retries)
+ return self._RunDeviceAdbCmd(['get-devpath'], timeout, retries)
def Remount(self, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES):
"""Remounts the /system partition on the device read-write."""
- self._DeviceAdbCmd(['remount'], timeout, retries)
+ self._RunDeviceAdbCmd(['remount'], timeout, retries)
def Reboot(self, to_bootloader=False, timeout=60*5,
retries=_DEFAULT_RETRIES):
@@ -384,7 +390,7 @@
cmd = ['reboot-bootloader']
else:
cmd = ['reboot']
- self._DeviceAdbCmd(cmd, timeout, retries)
+ self._RunDeviceAdbCmd(cmd, timeout, retries)
def Root(self, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES):
"""Restarts the adbd daemon with root permissions, if possible.
@@ -393,7 +399,7 @@
timeout: (optional) Timeout per try in seconds.
retries: (optional) Number of retries to attempt.
"""
- output = self._DeviceAdbCmd(['root'], timeout, retries)
+ output = self._RunDeviceAdbCmd(['root'], timeout, retries)
if 'cannot' in output:
- raise device_errors.AdbCommandFailedError(['root'], output)
-
+ raise device_errors.AdbCommandFailedError(
+ ['root'], output, device_serial=self._device_serial)
diff --git a/build/android/pylib/device/adb_wrapper_test.py b/build/android/pylib/device/adb_wrapper_test.py
index 208196a..6a2581c 100644
--- a/build/android/pylib/device/adb_wrapper_test.py
+++ b/build/android/pylib/device/adb_wrapper_test.py
@@ -37,12 +37,12 @@
return path
def testShell(self):
- output = self._adb.Shell('echo test', expect_rc=0)
+ output = self._adb.Shell('echo test', expect_status=0)
self.assertEqual(output.strip(), 'test')
output = self._adb.Shell('echo test')
self.assertEqual(output.strip(), 'test')
- self.assertRaises(device_errors.AdbShellCommandFailedError,
- self._adb.Shell, 'echo test', expect_rc=1)
+ with self.assertRaises(device_errors.AdbCommandFailedError):
+ self._adb.Shell('echo test', expect_status=1)
def testPushPull(self):
path = self._MakeTempFile('foo')
@@ -56,16 +56,16 @@
def testInstall(self):
path = self._MakeTempFile('foo')
- self.assertRaises(device_errors.AdbCommandFailedError, self._adb.Install,
- path)
+ with self.assertRaises(device_errors.AdbCommandFailedError):
+ self._adb.Install(path)
def testForward(self):
- self.assertRaises(device_errors.AdbCommandFailedError, self._adb.Forward,
- 0, 0)
+ with self.assertRaises(device_errors.AdbCommandFailedError):
+ self._adb.Forward(0, 0)
def testUninstall(self):
- self.assertRaises(device_errors.AdbCommandFailedError, self._adb.Uninstall,
- 'some.nonexistant.package')
+ with self.assertRaises(device_errors.AdbCommandFailedError):
+ self._adb.Uninstall('some.nonexistant.package')
def testRebootWaitForDevice(self):
self._adb.Reboot()
diff --git a/build/android/pylib/device/device_errors.py b/build/android/pylib/device/device_errors.py
index 7d1ebe6..170637d 100644
--- a/build/android/pylib/device/device_errors.py
+++ b/build/android/pylib/device/device_errors.py
@@ -6,6 +6,9 @@
Exception classes raised by AdbWrapper and DeviceUtils.
"""
+from pylib import cmd_helper
+
+
class BaseError(Exception):
"""Base exception for all device and command errors."""
pass
@@ -14,31 +17,35 @@
class CommandFailedError(BaseError):
"""Exception for command failures."""
- def __init__(self, msg, device=None):
- super(CommandFailedError, self).__init__(
- '%s%s' % ('(device: %s) ' % device if device else '', msg))
+ def __init__(self, message, device_serial=None):
+ if device_serial is not None:
+ message = '(device: %s) %s' % (device_serial, message)
+ self.device_serial = device_serial
+ super(CommandFailedError, self).__init__(message)
class AdbCommandFailedError(CommandFailedError):
"""Exception for adb command failures."""
- def __init__(self, cmd, msg, device=None):
- super(AdbCommandFailedError, self).__init__(
- 'adb command %r failed with message: %s' % (' '.join(cmd), msg),
- device=device)
-
-
-class AdbShellCommandFailedError(AdbCommandFailedError):
- """Exception for adb shell command failing with non-zero return code."""
-
- def __init__(self, cmd, return_code, output, device=None):
- super(AdbShellCommandFailedError, self).__init__(
- ['shell'],
- 'command %r on device failed with return code %d and output %r'
- % (cmd, return_code, output),
- device=device)
- self.return_code = return_code
+ def __init__(self, cmd, output, status=None, device_serial=None):
+ self.cmd = cmd
self.output = output
+ self.status = status
+ message = []
+ if self.cmd[0] == 'shell':
+ assert len(self.cmd) == 2
+ message.append('adb shell command %r failed with' % self.cmd[1])
+ else:
+ command = ' '.join(cmd_helper.SingleQuote(arg) for arg in self.cmd)
+ message.append('adb command %r failed with' % command)
+ if status:
+ message.append(' exit status %d and' % self.status)
+ if output:
+ message.append(' output:\n')
+ message.extend('> %s\n' % line for line in output.splitlines())
+ else:
+ message.append(' no output')
+ super(AdbCommandFailedError, self).__init__(''.join(message), device_serial)
class CommandTimeoutError(BaseError):
diff --git a/build/android/pylib/device/device_utils.py b/build/android/pylib/device/device_utils.py
index 845d580..0ff3a84 100644
--- a/build/android/pylib/device/device_utils.py
+++ b/build/android/pylib/device/device_utils.py
@@ -65,8 +65,8 @@
"""DeviceUtils constructor.
Args:
- device: Either a device serial, an existing AdbWrapper instance, an
- an existing AndroidCommands instance, or nothing.
+ device: Either a device serial, an existing AdbWrapper instance, or an
+ an existing AndroidCommands instance.
default_timeout: An integer containing the default number of seconds to
wait for an operation to complete if no explicit value
is provided.
@@ -85,11 +85,8 @@
elif isinstance(device, pylib.android_commands.AndroidCommands):
self.adb = adb_wrapper.AdbWrapper(device.GetDevice())
self.old_interface = device
- elif not device:
- self.adb = adb_wrapper.AdbWrapper('')
- self.old_interface = pylib.android_commands.AndroidCommands()
else:
- raise ValueError('Unsupported type passed for argument "device"')
+ raise ValueError('Unsupported device value: %r' % device)
self._commands_installed = None
self._default_timeout = default_timeout
self._default_retries = default_retries
@@ -135,7 +132,7 @@
try:
self.RunShellCommand('ls /root', check_return=True)
return True
- except device_errors.AdbShellCommandFailedError:
+ except device_errors.AdbCommandFailedError:
return False
def NeedsSU(self, timeout=None, retries=None):
@@ -160,7 +157,7 @@
self.RunShellCommand('su -c ls /root && ! ls /root', check_return=True,
timeout=timeout, retries=retries)
self._cache['needs_su'] = True
- except device_errors.AdbShellCommandFailedError:
+ except device_errors.AdbCommandFailedError:
self._cache['needs_su'] = False
return self._cache['needs_su']
@@ -177,11 +174,13 @@
CommandFailedError if root could not be enabled.
CommandTimeoutError on timeout.
"""
+ if self.IsUserBuild():
+ raise device_errors.CommandFailedError(
+ 'Cannot enable root in user builds.', str(self))
if 'needs_su' in self._cache:
del self._cache['needs_su']
- if not self.old_interface.EnableAdbRoot():
- raise device_errors.CommandFailedError(
- 'Could not enable root.', device=str(self))
+ self.adb.Root()
+ self.adb.WaitForDevice()
@decorators.WithTimeoutAndRetriesFromInstance()
def IsUserBuild(self, timeout=None, retries=None):
@@ -271,7 +270,7 @@
self.RunShellCommand(['test', '-d', self.GetExternalStoragePath()],
check_return=True)
return True
- except device_errors.AdbShellCommandFailedError:
+ except device_errors.AdbCommandFailedError:
return False
def pm_ready():
@@ -354,8 +353,7 @@
out = self.old_interface.Uninstall(package_name)
for line in out.splitlines():
if 'Failure' in line:
- raise device_errors.CommandFailedError(
- line.strip(), device=str(self))
+ raise device_errors.CommandFailedError(line.strip(), str(self))
else:
should_install = False
else:
@@ -365,11 +363,10 @@
out = self.old_interface.Install(apk_path, reinstall=reinstall)
for line in out.splitlines():
if 'Failure' in line:
- raise device_errors.CommandFailedError(
- line.strip(), device=str(self))
+ raise device_errors.CommandFailedError(line.strip(), str(self))
except AssertionError as e:
raise device_errors.CommandFailedError(
- str(e), device=str(self)), None, sys.exc_info()[2]
+ str(e), str(self)), None, sys.exc_info()[2]
@decorators.WithTimeoutAndRetriesFromInstance()
def RunShellCommand(self, cmd, check_return=False, cwd=None, env=None,
@@ -416,7 +413,7 @@
(with the optional newline at the end stripped).
Raises:
- AdbShellCommandFailedError if check_return is True and the exit code of
+ AdbCommandFailedError if check_return is True and the exit code of
the command run on the device is non-zero.
CommandFailedError if single_line is True but the output contains two or
more lines.
@@ -444,7 +441,7 @@
try:
output = self.adb.Shell(cmd)
- except device_errors.AdbShellCommandFailedError as e:
+ except device_errors.AdbCommandFailedError as e:
if check_return:
raise
else:
@@ -486,7 +483,7 @@
pids = self._GetPidsImpl(process_name)
if not pids:
raise device_errors.CommandFailedError(
- 'No process "%s"' % process_name, device=str(self))
+ 'No process "%s"' % process_name, str(self))
cmd = ['kill', '-%d' % signum] + pids.values()
self.RunShellCommand(cmd, as_root=as_root, check_return=True)
@@ -529,7 +526,7 @@
force_stop=force_stop, flags=intent.flags)
for l in output:
if l.startswith('Error:'):
- raise device_errors.CommandFailedError(l, device=str(self))
+ raise device_errors.CommandFailedError(l, str(self))
@decorators.WithTimeoutAndRetriesFromInstance()
def StartInstrumentation(self, component, finish=True, raw=False,
@@ -831,7 +828,11 @@
CommandTimeoutError on timeout.
DeviceUnreachableError on missing device.
"""
- return self.old_interface.FileExistsOnDevice(device_path)
+ try:
+ self.RunShellCommand(['test', '-e', device_path], check_return=True)
+ return True
+ except device_errors.AdbCommandFailedError:
+ return False
@decorators.WithTimeoutAndRetriesFromInstance()
def PullFile(self, device_path, host_path, timeout=None, retries=None):
@@ -853,7 +854,7 @@
self.old_interface.PullFileFromDevice(device_path, host_path)
except AssertionError as e:
raise device_errors.CommandFailedError(
- str(e), device=str(self)), None, sys.exc_info()[2]
+ str(e), str(self)), None, sys.exc_info()[2]
@decorators.WithTimeoutAndRetriesFromInstance()
def ReadFile(self, device_path, as_root=False, timeout=None, retries=None):
@@ -985,6 +986,9 @@
Raises:
CommandTimeoutError on timeout.
"""
+ assert isinstance(property_name, basestring), (
+ "property_name is not a string: %r" % property_name)
+
cache_key = '_prop:' + property_name
if cache and cache_key in self._cache:
return self._cache[cache_key]
@@ -1018,6 +1022,10 @@
set on the device (e.g. because it is not rooted).
CommandTimeoutError on timeout.
"""
+ assert isinstance(property_name, basestring), (
+ "property_name is not a string: %r" % property_name)
+ assert isinstance(value, basestring), "value is not a string: %r" % value
+
self.RunShellCommand(['setprop', property_name, value], check_return=True)
if property_name in self._cache:
del self._cache[property_name]
@@ -1134,12 +1142,7 @@
def __str__(self):
"""Returns the device serial."""
- s = self.old_interface.GetDevice()
- if not s:
- s = self.old_interface.Adb().GetSerialNumber()
- if s == 'unknown':
- raise device_errors.NoDevicesError()
- return s
+ return self.adb.GetDeviceSerial()
@staticmethod
def parallel(devices=None, async=False):
diff --git a/build/android/pylib/device/device_utils_test.py b/build/android/pylib/device/device_utils_test.py
index 8d78b2d..760e61f 100755
--- a/build/android/pylib/device/device_utils_test.py
+++ b/build/android/pylib/device/device_utils_test.py
@@ -43,28 +43,30 @@
def testInitWithStr(self):
serial_as_str = str('0123456789abcdef')
d = device_utils.DeviceUtils('0123456789abcdef')
- self.assertEqual(serial_as_str, d.old_interface.GetDevice())
+ self.assertEqual(serial_as_str, d.adb.GetDeviceSerial())
def testInitWithUnicode(self):
serial_as_unicode = unicode('fedcba9876543210')
d = device_utils.DeviceUtils(serial_as_unicode)
- self.assertEqual(serial_as_unicode, d.old_interface.GetDevice())
+ self.assertEqual(serial_as_unicode, d.adb.GetDeviceSerial())
def testInitWithAdbWrapper(self):
serial = '123456789abcdef0'
a = adb_wrapper.AdbWrapper(serial)
d = device_utils.DeviceUtils(a)
- self.assertEqual(serial, d.old_interface.GetDevice())
+ self.assertEqual(serial, d.adb.GetDeviceSerial())
def testInitWithAndroidCommands(self):
serial = '0fedcba987654321'
a = android_commands.AndroidCommands(device=serial)
d = device_utils.DeviceUtils(a)
- self.assertEqual(serial, d.old_interface.GetDevice())
+ self.assertEqual(serial, d.adb.GetDeviceSerial())
- def testInitWithNone(self):
- d = device_utils.DeviceUtils(None)
- self.assertIsNone(d.old_interface.GetDevice())
+ def testInitWithMissing_fails(self):
+ with self.assertRaises(ValueError):
+ device_utils.DeviceUtils(None)
+ with self.assertRaises(ValueError):
+ device_utils.DeviceUtils('')
class MockTempFile(object):
@@ -246,12 +248,12 @@
self.adb.GetDeviceSerial.return_value = test_serial
self.device = device_utils.DeviceUtils(
self.adb, default_timeout=10, default_retries=0)
- self.watchMethodCalls(self.call.adb)
+ self.watchMethodCalls(self.call.adb, ignore=['GetDeviceSerial'])
def ShellError(self, output=None, exit_code=1):
def action(cmd, *args, **kwargs):
- raise device_errors.AdbShellCommandFailedError(
- cmd, exit_code, output, str(self.device))
+ raise device_errors.AdbCommandFailedError(
+ cmd, output, exit_code, str(self.device))
if output is None:
output = 'Permission denied\n'
return action
@@ -295,29 +297,25 @@
self.assertFalse(self.device.HasRoot())
-class DeviceUtilsEnableRootTest(DeviceUtilsOldImplTest):
+class DeviceUtilsEnableRootTest(DeviceUtilsNewImplTest):
def testEnableRoot_succeeds(self):
- with self.assertCallsSequence([
- ('adb -s 0123456789abcdef shell getprop ro.build.type',
- 'userdebug\r\n'),
- ('adb -s 0123456789abcdef root', 'restarting adbd as root\r\n'),
- ('adb -s 0123456789abcdef wait-for-device', ''),
- ('adb -s 0123456789abcdef wait-for-device', '')]):
+ with self.assertCalls(
+ (self.call.device.IsUserBuild(), False),
+ self.call.adb.Root(),
+ self.call.adb.WaitForDevice()):
self.device.EnableRoot()
def testEnableRoot_userBuild(self):
- with self.assertCallsSequence([
- ('adb -s 0123456789abcdef shell getprop ro.build.type', 'user\r\n')]):
+ with self.assertCalls(
+ (self.call.device.IsUserBuild(), True)):
with self.assertRaises(device_errors.CommandFailedError):
self.device.EnableRoot()
def testEnableRoot_rootFails(self):
- with self.assertCallsSequence([
- ('adb -s 0123456789abcdef shell getprop ro.build.type',
- 'userdebug\r\n'),
- ('adb -s 0123456789abcdef root', 'no\r\n'),
- ('adb -s 0123456789abcdef wait-for-device', '')]):
+ with self.assertCalls(
+ (self.call.device.IsUserBuild(), False),
+ (self.call.adb.Root(), self.CommandError())):
with self.assertRaises(device_errors.CommandFailedError):
self.device.EnableRoot()
@@ -675,7 +673,7 @@
cmd = 'ls /root'
output = 'opendir failed, Permission denied\n'
with self.assertCall(self.call.adb.Shell(cmd), self.ShellError(output)):
- with self.assertRaises(device_errors.AdbShellCommandFailedError):
+ with self.assertRaises(device_errors.AdbCommandFailedError):
self.device.RunShellCommand(cmd, check_return=True)
def testRunShellCommand_checkReturn_disabled(self):
@@ -1084,44 +1082,20 @@
('/test/host/path/file2', '/test/device/path/file2')])
-class DeviceUtilsFileExistsTest(DeviceUtilsOldImplTest):
+class DeviceUtilsFileExistsTest(DeviceUtilsNewImplTest):
def testFileExists_usingTest_fileExists(self):
- with self.assertCalls(
- "adb -s 0123456789abcdef shell "
- "'test -e \"/data/app/test.file.exists\"; echo $?'",
- '0\r\n'):
- self.assertTrue(self.device.FileExists('/data/app/test.file.exists'))
+ with self.assertCall(
+ self.call.device.RunShellCommand(
+ ['test', '-e', '/path/file.exists'], check_return=True), ''):
+ self.assertTrue(self.device.FileExists('/path/file.exists'))
def testFileExists_usingTest_fileDoesntExist(self):
- with self.assertCalls(
- "adb -s 0123456789abcdef shell "
- "'test -e \"/data/app/test.file.does.not.exist\"; echo $?'",
- '1\r\n'):
- self.assertFalse(self.device.FileExists(
- '/data/app/test.file.does.not.exist'))
-
- def testFileExists_usingLs_fileExists(self):
- with self.assertCallsSequence([
- ("adb -s 0123456789abcdef shell "
- "'test -e \"/data/app/test.file.exists\"; echo $?'",
- 'test: not found\r\n'),
- ("adb -s 0123456789abcdef shell "
- "'ls \"/data/app/test.file.exists\" >/dev/null 2>&1; echo $?'",
- '0\r\n')]):
- self.assertTrue(self.device.FileExists('/data/app/test.file.exists'))
-
- def testFileExists_usingLs_fileDoesntExist(self):
- with self.assertCallsSequence([
- ("adb -s 0123456789abcdef shell "
- "'test -e \"/data/app/test.file.does.not.exist\"; echo $?'",
- 'test: not found\r\n'),
- ("adb -s 0123456789abcdef shell "
- "'ls \"/data/app/test.file.does.not.exist\" "
- ">/dev/null 2>&1; echo $?'",
- '1\r\n')]):
- self.assertFalse(self.device.FileExists(
- '/data/app/test.file.does.not.exist'))
+ with self.assertCall(
+ self.call.device.RunShellCommand(
+ ['test', '-e', '/does/not/exist'], check_return=True),
+ self.ShellError('', 1)):
+ self.assertFalse(self.device.FileExists('/does/not/exist'))
class DeviceUtilsPullFileTest(DeviceUtilsOldImplTest):
@@ -1552,23 +1526,13 @@
self.assertEqual({}, self.device.GetMemoryUsageForPid(4321))
-class DeviceUtilsStrTest(DeviceUtilsOldImplTest):
+class DeviceUtilsStrTest(DeviceUtilsNewImplTest):
- def testStr_noAdbCalls(self):
- with self.assertNoAdbCalls():
+ def testStr_returnsSerial(self):
+ with self.assertCalls(
+ (self.call.adb.GetDeviceSerial(), '0123456789abcdef')):
self.assertEqual('0123456789abcdef', str(self.device))
- def testStr_noSerial(self):
- self.device = device_utils.DeviceUtils(None)
- with self.assertCalls('adb get-serialno', '0123456789abcdef'):
- self.assertEqual('0123456789abcdef', str(self.device))
-
- def testStr_noSerial_noDevices(self):
- self.device = device_utils.DeviceUtils(None)
- with self.assertCalls('adb get-serialno', 'unknown'), (
- self.assertRaises(device_errors.NoDevicesError)):
- str(self.device)
-
if __name__ == '__main__':
logging.getLogger().setLevel(logging.DEBUG)
diff --git a/build/android/pylib/device_settings.py b/build/android/pylib/device_settings.py
index 0580fcf..246c1d1 100644
--- a/build/android/pylib/device_settings.py
+++ b/build/android/pylib/device_settings.py
@@ -81,17 +81,20 @@
if device.FileExists(_LOCK_SCREEN_SETTINGS_PATH):
db = _LOCK_SCREEN_SETTINGS_PATH
locksettings = get_lock_settings('locksettings')
+ columns = ['name', 'user', 'value']
+ generate_values = lambda k, v: [k, '0', v]
elif device.FileExists(_ALTERNATE_LOCK_SCREEN_SETTINGS_PATH):
db = _ALTERNATE_LOCK_SCREEN_SETTINGS_PATH
locksettings = get_lock_settings('secure') + get_lock_settings('system')
+ columns = ['name', 'value']
+ generate_values = lambda k, v: [k, v]
else:
logging.warning('Unable to find database file to set lock screen settings.')
return
for table, key, value in locksettings:
# Set the lockscreen setting for default user '0'
- columns = ['name', 'user', 'value']
- values = [key, '0', value]
+ values = generate_values(key, value)
cmd = """begin transaction;
delete from '%(table)s' where %(primary_key)s='%(primary_value)s';
diff --git a/build/android/pylib/gtest/test_package_apk.py b/build/android/pylib/gtest/test_package_apk.py
index 4a91278..67571a4 100644
--- a/build/android/pylib/gtest/test_package_apk.py
+++ b/build/android/pylib/gtest/test_package_apk.py
@@ -40,13 +40,8 @@
self._package_info = constants.PACKAGE_INFO['gtest']
def _CreateCommandLineFileOnDevice(self, device, options):
- command_line_file = tempfile.NamedTemporaryFile()
- # GTest expects argv[0] to be the executable path.
- command_line_file.write(self.suite_name + ' ' + options)
- command_line_file.flush()
- device.PushChangedFiles([(
- command_line_file.name,
- self._package_info.cmdline_file)])
+ device.WriteFile(self._package_info.cmdline_file,
+ self.suite_name + ' ' + options)
def _GetFifo(self):
# The test.fifo path is determined by:
diff --git a/build/android/pylib/host_driven/test_server.py b/build/android/pylib/host_driven/test_server.py
index d6203cc..959e7a9 100644
--- a/build/android/pylib/host_driven/test_server.py
+++ b/build/android/pylib/host_driven/test_server.py
@@ -40,6 +40,7 @@
# The correct path is determined based on the build type. E.g. out/Debug for
# debug builds and out/Release for release builds.
_GENERATED_PYTHONPATH_DIRS = [
+ 'pyproto/policy/proto/',
'pyproto/sync/protocol/',
'pyproto/'
]
@@ -48,6 +49,7 @@
# Paths for supported test server executables.
TEST_NET_SERVER_PATH = 'net/tools/testserver/testserver.py'
TEST_SYNC_SERVER_PATH = 'sync/tools/testserver/sync_testserver.py'
+TEST_POLICY_SERVER_PATH = 'chrome/browser/policy/test/policy_testserver.py'
# Parameters to check that the server is up and running.
TEST_SERVER_CHECK_PARAMS = {
TEST_NET_SERVER_PATH: {
@@ -58,6 +60,10 @@
'url_path': 'chromiumsync/time',
'response': '0123456789'
},
+ TEST_POLICY_SERVER_PATH: {
+ 'url_path': 'test/ping',
+ 'response': 'Policy server is up.'
+ },
}
class TestServer(object):
@@ -66,7 +72,8 @@
For shutting down the server, call TearDown().
"""
- def __init__(self, shard_index, test_server_port, test_server_path):
+ def __init__(self, shard_index, test_server_port, test_server_path,
+ test_server_flags=None):
"""Sets up a Python driven test server on the host machine.
Args:
@@ -75,6 +82,7 @@
the shard index. To retrieve the real port access the
member variable |port|.
test_server_path: The path (relative to the root src dir) of the server
+ test_server_flags: Optional list of additional flags to the test server
"""
self.host = _TEST_SERVER_HOST
self.port = test_server_port + shard_index
@@ -94,10 +102,11 @@
# NOTE: A separate python process is used to simplify getting the right
# system path for finding includes.
+ test_server_flags = test_server_flags or []
cmd = ['python', os.path.join(src_dir, test_server_path),
'--log-to-console',
('--host=%s' % self.host),
- ('--port=%d' % self.port)]
+ ('--port=%d' % self.port)] + test_server_flags
self._test_server_process = subprocess.Popen(
cmd, env={'PYTHONPATH': python_path})
test_url = 'http://%s:%d/%s' % (self.host, self.port,
diff --git a/build/android/pylib/instrumentation/test_runner_test.py b/build/android/pylib/instrumentation/test_runner_test.py
index 0f2845e..fda1e23 100755
--- a/build/android/pylib/instrumentation/test_runner_test.py
+++ b/build/android/pylib/instrumentation/test_runner_test.py
@@ -27,7 +27,8 @@
options = mock.Mock()
options.tool = ''
package = mock.Mock()
- self.instance = test_runner.TestRunner(options, None, 0, package)
+ self.instance = test_runner.TestRunner(
+ options, '123456789abcdef0', 0, package)
def testParseAmInstrumentRawOutput_nothing(self):
code, result, statuses = (
@@ -226,6 +227,8 @@
'test': ['testMethod'],
}),
]
+ self.instance.device.old_interface.DismissCrashDialogIfNeeded = mock.Mock(
+ return_value=None)
result = self.instance._GenerateTestResult(
'test.package.TestClass#testMethod', statuses, 0, 1000)
self.assertEqual(base_test_result.ResultType.FAIL, result.GetType())
diff --git a/build/android/pylib/junit/setup.py b/build/android/pylib/junit/setup.py
index 6ae0006..94d4277 100644
--- a/build/android/pylib/junit/setup.py
+++ b/build/android/pylib/junit/setup.py
@@ -4,15 +4,17 @@
from pylib.junit import test_runner
-def Setup(options):
+def Setup(args):
"""Creates a test runner factory for junit tests.
+ Args:
+ args: an argparse.Namespace object.
Return:
A (runner_factory, tests) tuple.
"""
def TestRunnerFactory(_unused_device, _unused_shard_index):
- return test_runner.JavaTestRunner(options)
+ return test_runner.JavaTestRunner(args)
return (TestRunnerFactory, ['JUnit tests'])
diff --git a/build/android/pylib/junit/test_runner.py b/build/android/pylib/junit/test_runner.py
index d0803ea..35ac666 100644
--- a/build/android/pylib/junit/test_runner.py
+++ b/build/android/pylib/junit/test_runner.py
@@ -10,12 +10,12 @@
class JavaTestRunner(object):
"""Runs java tests on the host."""
- def __init__(self, options):
- self._package_filter = options.package_filter
- self._runner_filter = options.runner_filter
- self._sdk_version = options.sdk_version
- self._test_filter = options.test_filter
- self._test_suite = options.test_suite
+ def __init__(self, args):
+ self._package_filter = args.package_filter
+ self._runner_filter = args.runner_filter
+ self._sdk_version = args.sdk_version
+ self._test_filter = args.test_filter
+ self._test_suite = args.test_suite
def SetUp(self):
pass
diff --git a/build/android/pylib/linker/setup.py b/build/android/pylib/linker/setup.py
index ebfac87..ff21f10 100644
--- a/build/android/pylib/linker/setup.py
+++ b/build/android/pylib/linker/setup.py
@@ -16,9 +16,11 @@
'common'))
import unittest_util # pylint: disable=F0401
-def Setup(options, _devices):
+def Setup(args, _devices):
"""Creates a list of test cases and a runner factory.
+ Args:
+ args: an argparse.Namespace object.
Returns:
A tuple of (TestRunnerFactory, tests).
"""
@@ -30,15 +32,15 @@
low_memory_modes = [False, True]
all_tests = [t(is_low_memory=m) for t in test_cases for m in low_memory_modes]
- if options.test_filter:
+ if args.test_filter:
all_test_names = [test.qualified_name for test in all_tests]
filtered_test_names = unittest_util.FilterTestNames(all_test_names,
- options.test_filter)
+ args.test_filter)
all_tests = [t for t in all_tests \
if t.qualified_name in filtered_test_names]
def TestRunnerFactory(device, _shard_index):
return test_runner.LinkerTestRunner(
- device, options.tool, options.cleanup_test_files)
+ device, args.tool, args.cleanup_test_files)
return (TestRunnerFactory, all_tests)
diff --git a/build/android/pylib/perf/perf_control.py b/build/android/pylib/perf/perf_control.py
index 73cf95c..0da1bcf 100644
--- a/build/android/pylib/perf/perf_control.py
+++ b/build/android/pylib/perf/perf_control.py
@@ -18,7 +18,7 @@
if isinstance(device, android_commands.AndroidCommands):
device = device_utils.DeviceUtils(device)
self._device = device
- # this will raise an AdbShellCommandFailedError if no CPU files are found
+ # this will raise an AdbCommandFailedError if no CPU files are found
self._cpu_files = self._device.RunShellCommand(
'ls -d cpu[0-9]*', cwd=self._CPU_PATH, check_return=True, as_root=True)
assert self._cpu_files, 'Failed to detect CPUs.'
diff --git a/build/android/pylib/perf/test_options.py b/build/android/pylib/perf/test_options.py
index b04d748..0a0ace0 100644
--- a/build/android/pylib/perf/test_options.py
+++ b/build/android/pylib/perf/test_options.py
@@ -15,4 +15,6 @@
'test_filter',
'dry_run',
'single_step',
+ 'collect_chartjson_data',
+ 'output_chartjson_data',
])
diff --git a/build/android/pylib/perf/test_runner.py b/build/android/pylib/perf/test_runner.py
index c8563a6..a8048d4 100644
--- a/build/android/pylib/perf/test_runner.py
+++ b/build/android/pylib/perf/test_runner.py
@@ -52,7 +52,9 @@
import logging
import os
import pickle
+import shutil
import sys
+import tempfile
import threading
import time
@@ -73,6 +75,14 @@
return 0
+def OutputChartjson(test_name, json_file_name):
+ file_name = os.path.join(constants.PERF_OUTPUT_DIR, test_name)
+ with file(file_name, 'r') as f:
+ persisted_result = pickle.load(f)
+ with open(json_file_name, 'w') as o:
+ o.write(persisted_result['chartjson'])
+
+
def PrintTestOutput(test_name):
"""Helper method to print the output of previously executed test_name.
@@ -168,6 +178,7 @@
self._max_shard = max_shard
self._tests = tests
self._flaky_tests = flaky_tests
+ self._output_dir = None
@staticmethod
def _IsBetter(result):
@@ -198,6 +209,19 @@
test_name, self.device_serial, affinity, self._shard_index)
return False
+ def _CleanupOutputDirectory(self):
+ if self._output_dir:
+ shutil.rmtree(self._output_dir, ignore_errors=True)
+ self._output_dir = None
+
+ def _ReadChartjsonOutput(self):
+ if not self._output_dir:
+ return ''
+
+ json_output_path = os.path.join(self._output_dir, 'results-chart.json')
+ with open(json_output_path) as f:
+ return f.read()
+
def _LaunchPerfTest(self, test_name):
"""Runs a perf test.
@@ -220,6 +244,11 @@
cmd = ('%s --device %s' %
(self._tests['steps'][test_name]['cmd'],
self.device_serial))
+
+ if self._options.collect_chartjson_data:
+ self._output_dir = tempfile.mkdtemp()
+ cmd = cmd + ' --output-dir=%s' % self._output_dir
+
logging.info('%s : %s', test_name, cmd)
start_time = datetime.datetime.now()
@@ -241,10 +270,13 @@
try:
exit_code, output = cmd_helper.GetCmdStatusAndOutputWithTimeout(
full_cmd, timeout, cwd=cwd, shell=True, logfile=logfile)
+ json_output = self._ReadChartjsonOutput()
except cmd_helper.TimeoutError as e:
exit_code = -1
output = str(e)
+ json_output = ''
finally:
+ self._CleanupOutputDirectory()
if self._options.single_step:
logfile.stop()
end_time = datetime.datetime.now()
@@ -277,6 +309,7 @@
persisted_result = {
'name': test_name,
'output': output,
+ 'chartjson': json_output,
'exit_code': exit_code,
'actual_exit_code': actual_exit_code,
'result_type': result_type,
diff --git a/build/android/pylib/results/__init__.py b/build/android/pylib/results/__init__.py
new file mode 100644
index 0000000..4d6aabb
--- /dev/null
+++ b/build/android/pylib/results/__init__.py
@@ -0,0 +1,3 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
diff --git a/build/android/pylib/results/flakiness_dashboard/__init__.py b/build/android/pylib/results/flakiness_dashboard/__init__.py
new file mode 100644
index 0000000..4d6aabb
--- /dev/null
+++ b/build/android/pylib/results/flakiness_dashboard/__init__.py
@@ -0,0 +1,3 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
diff --git a/build/android/pylib/utils/json_results_generator.py b/build/android/pylib/results/flakiness_dashboard/json_results_generator.py
similarity index 100%
rename from build/android/pylib/utils/json_results_generator.py
rename to build/android/pylib/results/flakiness_dashboard/json_results_generator.py
diff --git a/build/android/pylib/utils/flakiness_dashboard_results_uploader.py b/build/android/pylib/results/flakiness_dashboard/results_uploader.py
similarity index 97%
rename from build/android/pylib/utils/flakiness_dashboard_results_uploader.py
rename to build/android/pylib/results/flakiness_dashboard/results_uploader.py
index ff286b6..856fa9c 100644
--- a/build/android/pylib/utils/flakiness_dashboard_results_uploader.py
+++ b/build/android/pylib/results/flakiness_dashboard/results_uploader.py
@@ -12,10 +12,9 @@
import xml
-#TODO(craigdh): pylib/utils/ should not depend on pylib/.
from pylib import cmd_helper
from pylib import constants
-from pylib.utils import json_results_generator
+from pylib.results.flakiness_dashboard import json_results_generator
from pylib.utils import repo_utils
diff --git a/build/android/pylib/results/json_results.py b/build/android/pylib/results/json_results.py
new file mode 100644
index 0000000..c34244e
--- /dev/null
+++ b/build/android/pylib/results/json_results.py
@@ -0,0 +1,73 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import json
+import logging
+
+from pylib.base import base_test_result
+
+
+def GenerateResultsDict(test_run_result):
+ """Create a results dict from |test_run_result| suitable for writing to JSON.
+ Args:
+ test_run_result: a base_test_result.TestRunResults object.
+ Returns:
+ A results dict that mirrors the one generated by
+ base/test/launcher/test_results_tracker.cc:SaveSummaryAsJSON.
+ """
+ assert isinstance(test_run_result, base_test_result.TestRunResults)
+
+ def status_as_string(s):
+ if s == base_test_result.ResultType.PASS:
+ return 'SUCCESS'
+ elif s == base_test_result.ResultType.SKIP:
+ return 'SKIPPED'
+ elif s == base_test_result.ResultType.FAIL:
+ return 'FAILURE'
+ elif s == base_test_result.ResultType.CRASH:
+ return 'CRASH'
+ elif s == base_test_result.ResultType.TIMEOUT:
+ return 'TIMEOUT'
+ elif s == base_test_result.ResultType.UNKNOWN:
+ return 'UNKNOWN'
+
+ def generate_iteration_data(t):
+ return {
+ t.GetName(): [
+ {
+ 'status': status_as_string(t.GetType()),
+ 'elapsed_time_ms': t.GetDuration(),
+ 'output_snippet': '',
+ 'losless_snippet': '',
+ 'output_snippet_base64:': '',
+ }
+ ]
+ }
+
+ all_tests_tuple, per_iteration_data_tuple = zip(
+ *[(t.GetName(), generate_iteration_data(t))
+ for t in test_run_result.GetAll()])
+
+ return {
+ 'global_tags': [],
+ 'all_tests': list(all_tests_tuple),
+ # TODO(jbudorick): Add support for disabled tests within base_test_result.
+ 'disabled_tests': [],
+ 'per_iteration_data': list(per_iteration_data_tuple),
+ }
+
+
+def GenerateJsonResultsFile(test_run_result, file_path):
+ """Write |test_run_result| to JSON.
+
+ This emulates the format of the JSON emitted by
+ base/test/launcher/test_results_tracker.cc:SaveSummaryAsJSON.
+
+ Args:
+ test_run_result: a base_test_result.TestRunResults object.
+ file_path: The path to the JSON file to write.
+ """
+ with open(file_path, 'w') as json_result_file:
+ json_result_file.write(json.dumps(GenerateResultsDict(test_run_result)))
+
diff --git a/build/android/pylib/results/json_results_test.py b/build/android/pylib/results/json_results_test.py
new file mode 100755
index 0000000..1bc730d
--- /dev/null
+++ b/build/android/pylib/results/json_results_test.py
@@ -0,0 +1,133 @@
+#!/usr/bin/env python
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import unittest
+
+from pylib.base import base_test_result
+from pylib.results import json_results
+
+
+class JsonResultsTest(unittest.TestCase):
+
+ def testGenerateResultsDict_passedResult(self):
+ result = base_test_result.BaseTestResult(
+ 'test.package.TestName', base_test_result.ResultType.PASS)
+
+ all_results = base_test_result.TestRunResults()
+ all_results.AddResult(result)
+
+ results_dict = json_results.GenerateResultsDict(all_results)
+ self.assertEquals(
+ ['test.package.TestName'],
+ results_dict['all_tests'])
+ self.assertEquals(1, len(results_dict['per_iteration_data']))
+
+ iteration_result = results_dict['per_iteration_data'][0]
+ self.assertTrue('test.package.TestName' in iteration_result)
+ self.assertEquals(1, len(iteration_result['test.package.TestName']))
+
+ test_iteration_result = iteration_result['test.package.TestName'][0]
+ self.assertTrue('status' in test_iteration_result)
+ self.assertEquals('SUCCESS', test_iteration_result['status'])
+
+ def testGenerateResultsDict_skippedResult(self):
+ result = base_test_result.BaseTestResult(
+ 'test.package.TestName', base_test_result.ResultType.SKIP)
+
+ all_results = base_test_result.TestRunResults()
+ all_results.AddResult(result)
+
+ results_dict = json_results.GenerateResultsDict(all_results)
+ self.assertEquals(
+ ['test.package.TestName'],
+ results_dict['all_tests'])
+ self.assertEquals(1, len(results_dict['per_iteration_data']))
+
+ iteration_result = results_dict['per_iteration_data'][0]
+ self.assertTrue('test.package.TestName' in iteration_result)
+ self.assertEquals(1, len(iteration_result['test.package.TestName']))
+
+ test_iteration_result = iteration_result['test.package.TestName'][0]
+ self.assertTrue('status' in test_iteration_result)
+ self.assertEquals('SKIPPED', test_iteration_result['status'])
+
+ def testGenerateResultsDict_failedResult(self):
+ result = base_test_result.BaseTestResult(
+ 'test.package.TestName', base_test_result.ResultType.FAIL)
+
+ all_results = base_test_result.TestRunResults()
+ all_results.AddResult(result)
+
+ results_dict = json_results.GenerateResultsDict(all_results)
+ self.assertEquals(
+ ['test.package.TestName'],
+ results_dict['all_tests'])
+ self.assertEquals(1, len(results_dict['per_iteration_data']))
+
+ iteration_result = results_dict['per_iteration_data'][0]
+ self.assertTrue('test.package.TestName' in iteration_result)
+ self.assertEquals(1, len(iteration_result['test.package.TestName']))
+
+ test_iteration_result = iteration_result['test.package.TestName'][0]
+ self.assertTrue('status' in test_iteration_result)
+ self.assertEquals('FAILURE', test_iteration_result['status'])
+
+ def testGenerateResultsDict_duration(self):
+ result = base_test_result.BaseTestResult(
+ 'test.package.TestName', base_test_result.ResultType.PASS, duration=123)
+
+ all_results = base_test_result.TestRunResults()
+ all_results.AddResult(result)
+
+ results_dict = json_results.GenerateResultsDict(all_results)
+ self.assertEquals(
+ ['test.package.TestName'],
+ results_dict['all_tests'])
+ self.assertEquals(1, len(results_dict['per_iteration_data']))
+
+ iteration_result = results_dict['per_iteration_data'][0]
+ self.assertTrue('test.package.TestName' in iteration_result)
+ self.assertEquals(1, len(iteration_result['test.package.TestName']))
+
+ test_iteration_result = iteration_result['test.package.TestName'][0]
+ self.assertTrue('elapsed_time_ms' in test_iteration_result)
+ self.assertEquals(123, test_iteration_result['elapsed_time_ms'])
+
+ def testGenerateResultsDict_multipleResults(self):
+ result1 = base_test_result.BaseTestResult(
+ 'test.package.TestName1', base_test_result.ResultType.PASS)
+ result2 = base_test_result.BaseTestResult(
+ 'test.package.TestName2', base_test_result.ResultType.PASS)
+
+ all_results = base_test_result.TestRunResults()
+ all_results.AddResult(result1)
+ all_results.AddResult(result2)
+
+ results_dict = json_results.GenerateResultsDict(all_results)
+ self.assertEquals(
+ ['test.package.TestName1', 'test.package.TestName2'],
+ results_dict['all_tests'])
+ self.assertEquals(2, len(results_dict['per_iteration_data']))
+
+ expected_tests = set([
+ 'test.package.TestName1',
+ 'test.package.TestName2',
+ ])
+
+ for iteration_result in results_dict['per_iteration_data']:
+ self.assertEquals(1, len(iteration_result))
+ name = iteration_result.keys()[0]
+ self.assertTrue(name in expected_tests)
+ expected_tests.remove(name)
+ self.assertEquals(1, len(iteration_result[name]))
+
+ test_iteration_result = iteration_result[name][0]
+ self.assertTrue('status' in test_iteration_result)
+ self.assertEquals('SUCCESS', test_iteration_result['status'])
+
+
+if __name__ == '__main__':
+ unittest.main(verbosity=2)
+
diff --git a/build/android/pylib/utils/report_results.py b/build/android/pylib/results/report_results.py
similarity index 97%
rename from build/android/pylib/utils/report_results.py
rename to build/android/pylib/results/report_results.py
index 8f81c95..4c9518e 100644
--- a/build/android/pylib/utils/report_results.py
+++ b/build/android/pylib/results/report_results.py
@@ -9,7 +9,7 @@
import re
from pylib import constants
-from pylib.utils import flakiness_dashboard_results_uploader
+from pylib.results.flakiness_dashboard import results_uploader
def _LogToFile(results, test_type, suite_name):
@@ -58,7 +58,7 @@
logging.warning('Invalid test type')
return
- flakiness_dashboard_results_uploader.Upload(
+ results_uploader.Upload(
results, flakiness_server, dashboard_test_type)
except Exception as e:
diff --git a/build/android/pylib/utils/mock_calls.py b/build/android/pylib/utils/mock_calls.py
index b10ebc6..fab9f2b 100644
--- a/build/android/pylib/utils/mock_calls.py
+++ b/build/android/pylib/utils/mock_calls.py
@@ -122,16 +122,19 @@
"""
self._watched.update((call.name, call) for call in calls)
- def watchMethodCalls(self, call):
+ def watchMethodCalls(self, call, ignore=None):
"""Watch all public methods of the target identified by a self.call.
Args:
call: a self.call instance indetifying an object
+ ignore: a list of public methods to ignore when watching for calls
"""
target = self.call_target(call)
+ if ignore is None:
+ ignore = []
self.watchCalls(getattr(call, method)
for method in dir(target.__class__)
- if not method.startswith('_'))
+ if not method.startswith('_') and not method in ignore)
def clearWatched(self):
"""Clear the set of watched calls."""
diff --git a/build/android/setup.gyp b/build/android/setup.gyp
index f10ab3e..7dce19d 100644
--- a/build/android/setup.gyp
+++ b/build/android/setup.gyp
@@ -12,26 +12,13 @@
# <(SHARED_LIB_DIR)
'target_name': 'copy_system_libraries',
'type': 'none',
- 'conditions': [
- ['target_arch=="arm" and arm_thumb==1', {
- 'copies': [
- {
- 'destination': '<(SHARED_LIB_DIR)/',
- 'files': [
- '<(android_stlport_libs_dir)/thumb/libstlport_shared.so',
- ],
- },
+ 'copies': [
+ {
+ 'destination': '<(SHARED_LIB_DIR)/',
+ 'files': [
+ '<(android_stlport_libs_dir)/libstlport_shared.so',
],
- }, {
- 'copies': [
- {
- 'destination': '<(SHARED_LIB_DIR)/',
- 'files': [
- '<(android_stlport_libs_dir)/libstlport_shared.so',
- ],
- },
- ],
- }],
+ },
],
},
],
diff --git a/build/android/test_runner.py b/build/android/test_runner.py
index b483d2b..1c06331 100755
--- a/build/android/test_runner.py
+++ b/build/android/test_runner.py
@@ -6,9 +6,9 @@
"""Runs all types of tests from one unified interface."""
+import argparse
import collections
import logging
-import optparse
import os
import shutil
import signal
@@ -39,191 +39,168 @@
from pylib.perf import setup as perf_setup
from pylib.perf import test_options as perf_test_options
from pylib.perf import test_runner as perf_test_runner
+from pylib.results import json_results
+from pylib.results import report_results
from pylib.uiautomator import setup as uiautomator_setup
from pylib.uiautomator import test_options as uiautomator_test_options
from pylib.utils import apk_helper
-from pylib.utils import command_option_parser
-from pylib.utils import report_results
from pylib.utils import reraiser_thread
from pylib.utils import run_tests_helper
-def AddCommonOptions(option_parser):
- """Adds all common options to |option_parser|."""
+def AddCommonOptions(parser):
+ """Adds all common options to |parser|."""
- group = optparse.OptionGroup(option_parser, 'Common Options')
+ group = parser.add_argument_group('Common Options')
+
default_build_type = os.environ.get('BUILDTYPE', 'Debug')
- group.add_option('--debug', action='store_const', const='Debug',
- dest='build_type', default=default_build_type,
- help=('If set, run test suites under out/Debug. '
- 'Default is env var BUILDTYPE or Debug.'))
- group.add_option('--release', action='store_const',
- const='Release', dest='build_type',
- help=('If set, run test suites under out/Release.'
- ' Default is env var BUILDTYPE or Debug.'))
- group.add_option('--build-directory', dest='build_directory',
- help=('Path to the directory in which build files are'
- ' located (should not include build type)'))
- group.add_option('--output-directory', dest='output_directory',
- help=('Path to the directory in which build files are'
- ' located (must include build type). This will take'
- ' precedence over --debug, --release and'
- ' --build-directory'))
- group.add_option('--num_retries', dest='num_retries', type='int',
- default=2,
- help=('Number of retries for a test before '
- 'giving up.'))
- group.add_option('-v',
- '--verbose',
- dest='verbose_count',
- default=0,
- action='count',
- help='Verbose level (multiple times for more)')
- group.add_option('--flakiness-dashboard-server',
- dest='flakiness_dashboard_server',
- help=('Address of the server that is hosting the '
- 'Chrome for Android flakiness dashboard.'))
- group.add_option('--enable-platform-mode', action='store_true',
- help=('Run the test scripts in platform mode, which '
- 'conceptually separates the test runner from the '
- '"device" (local or remote, real or emulated) on '
- 'which the tests are running. [experimental]'))
- group.add_option('-e', '--environment', default='local',
- help=('Test environment to run in. Must be one of: %s' %
- ', '.join(constants.VALID_ENVIRONMENTS)))
- group.add_option('--adb-path',
- help=('Specify the absolute path of the adb binary that '
- 'should be used.'))
- option_parser.add_option_group(group)
+
+ debug_or_release_group = group.add_mutually_exclusive_group()
+ debug_or_release_group.add_argument(
+ '--debug', action='store_const', const='Debug', dest='build_type',
+ default=default_build_type,
+ help=('If set, run test suites under out/Debug. '
+ 'Default is env var BUILDTYPE or Debug.'))
+ debug_or_release_group.add_argument(
+ '--release', action='store_const', const='Release', dest='build_type',
+ help=('If set, run test suites under out/Release. '
+ 'Default is env var BUILDTYPE or Debug.'))
+
+ group.add_argument('--build-directory', dest='build_directory',
+ help=('Path to the directory in which build files are'
+ ' located (should not include build type)'))
+ group.add_argument('--output-directory', dest='output_directory',
+ help=('Path to the directory in which build files are'
+ ' located (must include build type). This will take'
+ ' precedence over --debug, --release and'
+ ' --build-directory'))
+ group.add_argument('--num_retries', dest='num_retries', type=int, default=2,
+ help=('Number of retries for a test before '
+ 'giving up (default: %(default)s).'))
+ group.add_argument('-v',
+ '--verbose',
+ dest='verbose_count',
+ default=0,
+ action='count',
+ help='Verbose level (multiple times for more)')
+ group.add_argument('--flakiness-dashboard-server',
+ dest='flakiness_dashboard_server',
+ help=('Address of the server that is hosting the '
+ 'Chrome for Android flakiness dashboard.'))
+ group.add_argument('--enable-platform-mode', action='store_true',
+ help=('Run the test scripts in platform mode, which '
+ 'conceptually separates the test runner from the '
+ '"device" (local or remote, real or emulated) on '
+ 'which the tests are running. [experimental]'))
+ group.add_argument('-e', '--environment', default='local',
+ choices=constants.VALID_ENVIRONMENTS,
+ help='Test environment to run in (default: %(default)s).')
+ group.add_argument('--adb-path',
+ help=('Specify the absolute path of the adb binary that '
+ 'should be used.'))
+ group.add_argument('--json-results-file', dest='json_results_file',
+ help='If set, will dump results in JSON form '
+ 'to specified file.')
-def ProcessCommonOptions(options, error_func):
+def ProcessCommonOptions(args):
"""Processes and handles all common options."""
- run_tests_helper.SetLogLevel(options.verbose_count)
- constants.SetBuildType(options.build_type)
- if options.build_directory:
- constants.SetBuildDirectory(options.build_directory)
- if options.output_directory:
- constants.SetOutputDirectort(options.output_directory)
- if options.adb_path:
- constants.SetAdbPath(options.adb_path)
+ run_tests_helper.SetLogLevel(args.verbose_count)
+ constants.SetBuildType(args.build_type)
+ if args.build_directory:
+ constants.SetBuildDirectory(args.build_directory)
+ if args.output_directory:
+ constants.SetOutputDirectort(args.output_directory)
+ if args.adb_path:
+ constants.SetAdbPath(args.adb_path)
# Some things such as Forwarder require ADB to be in the environment path.
adb_dir = os.path.dirname(constants.GetAdbPath())
if adb_dir and adb_dir not in os.environ['PATH'].split(os.pathsep):
os.environ['PATH'] = adb_dir + os.pathsep + os.environ['PATH']
- if options.environment not in constants.VALID_ENVIRONMENTS:
- error_func('--environment must be one of: %s' %
- ', '.join(constants.VALID_ENVIRONMENTS))
-def AddDeviceOptions(option_parser):
- group = optparse.OptionGroup(option_parser, 'Device Options')
- group.add_option('-c', dest='cleanup_test_files',
- help='Cleanup test files on the device after run',
- action='store_true')
- group.add_option('--tool',
- dest='tool',
- help=('Run the test under a tool '
- '(use --tool help to list them)'))
- group.add_option('-d', '--device', dest='test_device',
- help=('Target device for the test suite '
- 'to run on.'))
- option_parser.add_option_group(group)
+def AddDeviceOptions(parser):
+ """Adds device options to |parser|."""
+ group = parser.add_argument_group(title='Device Options')
+ group.add_argument('-c', dest='cleanup_test_files',
+ help='Cleanup test files on the device after run',
+ action='store_true')
+ group.add_argument('--tool',
+ dest='tool',
+ help=('Run the test under a tool '
+ '(use --tool help to list them)'))
+ group.add_argument('-d', '--device', dest='test_device',
+ help=('Target device for the test suite '
+ 'to run on.'))
-def AddGTestOptions(option_parser):
- """Adds gtest options to |option_parser|."""
+def AddGTestOptions(parser):
+ """Adds gtest options to |parser|."""
- option_parser.usage = '%prog gtest [options]'
- option_parser.commands_dict = {}
- option_parser.example = '%prog gtest -s base_unittests'
+ gtest_suites = list(gtest_config.STABLE_TEST_SUITES
+ + gtest_config.EXPERIMENTAL_TEST_SUITES)
- # TODO(gkanwar): Make this option required
- option_parser.add_option('-s', '--suite', dest='suite_name',
- help=('Executable name of the test suite to run '
- '(use -s help to list them).'))
- option_parser.add_option('-f', '--gtest_filter', '--gtest-filter',
- dest='test_filter',
- help='googletest-style filter string.')
- option_parser.add_option('--gtest_also_run_disabled_tests',
- '--gtest-also-run-disabled-tests',
- dest='run_disabled', action='store_true',
- help='Also run disabled tests if applicable.')
- option_parser.add_option('-a', '--test-arguments', dest='test_arguments',
- default='',
- help='Additional arguments to pass to the test.')
- option_parser.add_option('-t', dest='timeout',
- help='Timeout to wait for each test',
- type='int',
- default=60)
- option_parser.add_option('--isolate_file_path',
- '--isolate-file-path',
- dest='isolate_file_path',
- help='.isolate file path to override the default '
- 'path')
- # TODO(gkanwar): Move these to Common Options once we have the plumbing
- # in our other test types to handle these commands
- AddCommonOptions(option_parser)
- AddDeviceOptions(option_parser)
+ group = parser.add_argument_group('GTest Options')
+ group.add_argument('-s', '--suite', dest='suite_name',
+ nargs='+', metavar='SUITE_NAME', required=True,
+ help=('Executable name of the test suite to run. '
+ 'Available suites include (but are not limited to): '
+ '%s' % ', '.join('"%s"' % s for s in gtest_suites)))
+ group.add_argument('-f', '--gtest_filter', '--gtest-filter',
+ dest='test_filter',
+ help='googletest-style filter string.')
+ group.add_argument('--gtest_also_run_disabled_tests',
+ '--gtest-also-run-disabled-tests',
+ dest='run_disabled', action='store_true',
+ help='Also run disabled tests if applicable.')
+ group.add_argument('-a', '--test-arguments', dest='test_arguments',
+ default='',
+ help='Additional arguments to pass to the test.')
+ group.add_argument('-t', dest='timeout', type=int, default=60,
+ help='Timeout to wait for each test '
+ '(default: %(default)s).')
+ group.add_argument('--isolate_file_path',
+ '--isolate-file-path',
+ dest='isolate_file_path',
+ help='.isolate file path to override the default '
+ 'path')
+ AddDeviceOptions(parser)
+ AddCommonOptions(parser)
-def AddLinkerTestOptions(option_parser):
- option_parser.usage = '%prog linker'
- option_parser.commands_dict = {}
- option_parser.example = '%prog linker'
-
- option_parser.add_option('-f', '--gtest-filter', dest='test_filter',
- help='googletest-style filter string.')
- AddCommonOptions(option_parser)
- AddDeviceOptions(option_parser)
+def AddLinkerTestOptions(parser):
+ group = parser.add_argument_group('Linker Test Options')
+ group.add_argument('-f', '--gtest-filter', dest='test_filter',
+ help='googletest-style filter string.')
+ AddCommonOptions(parser)
+ AddDeviceOptions(parser)
-def ProcessGTestOptions(options):
- """Intercept test suite help to list test suites.
-
- Args:
- options: Command line options.
- """
- if options.suite_name == 'help':
- print 'Available test suites are:'
- for test_suite in (gtest_config.STABLE_TEST_SUITES +
- gtest_config.EXPERIMENTAL_TEST_SUITES):
- print test_suite
- sys.exit(0)
-
- # Convert to a list, assuming all test suites if nothing was specified.
- # TODO(gkanwar): Require having a test suite
- if options.suite_name:
- options.suite_name = [options.suite_name]
- else:
- options.suite_name = [s for s in gtest_config.STABLE_TEST_SUITES]
-
-
-def AddJavaTestOptions(option_parser):
+def AddJavaTestOptions(argument_group):
"""Adds the Java test options to |option_parser|."""
- option_parser.add_option('-f', '--test-filter', dest='test_filter',
- help=('Test filter (if not fully qualified, '
- 'will run all matches).'))
- option_parser.add_option(
+ argument_group.add_argument(
+ '-f', '--test-filter', dest='test_filter',
+ help=('Test filter (if not fully qualified, will run all matches).'))
+ argument_group.add_argument(
'-A', '--annotation', dest='annotation_str',
help=('Comma-separated list of annotations. Run only tests with any of '
'the given annotations. An annotation can be either a key or a '
'key-values pair. A test that has no annotation is considered '
'"SmallTest".'))
- option_parser.add_option(
+ argument_group.add_argument(
'-E', '--exclude-annotation', dest='exclude_annotation_str',
help=('Comma-separated list of annotations. Exclude tests with these '
'annotations.'))
- option_parser.add_option(
+ argument_group.add_argument(
'--screenshot', dest='screenshot_failures', action='store_true',
help='Capture screenshots of test failures')
- option_parser.add_option(
+ argument_group.add_argument(
'--save-perf-json', action='store_true',
help='Saves the JSON file for each UI Perf test.')
- option_parser.add_option(
+ argument_group.add_argument(
'--official-build', action='store_true', help='Run official build tests.')
- option_parser.add_option(
+ argument_group.add_argument(
'--test_data', '--test-data', action='append', default=[],
help=('Each instance defines a directory of test data that should be '
'copied to the target(s) before running the tests. The argument '
@@ -232,402 +209,360 @@
'chromium build directory.'))
-def ProcessJavaTestOptions(options):
+def ProcessJavaTestOptions(args):
"""Processes options/arguments and populates |options| with defaults."""
- if options.annotation_str:
- options.annotations = options.annotation_str.split(',')
- elif options.test_filter:
- options.annotations = []
+ # TODO(jbudorick): Handle most of this function in argparse.
+ if args.annotation_str:
+ args.annotations = args.annotation_str.split(',')
+ elif args.test_filter:
+ args.annotations = []
else:
- options.annotations = ['Smoke', 'SmallTest', 'MediumTest', 'LargeTest',
- 'EnormousTest', 'IntegrationTest']
+ args.annotations = ['Smoke', 'SmallTest', 'MediumTest', 'LargeTest',
+ 'EnormousTest', 'IntegrationTest']
- if options.exclude_annotation_str:
- options.exclude_annotations = options.exclude_annotation_str.split(',')
+ if args.exclude_annotation_str:
+ args.exclude_annotations = args.exclude_annotation_str.split(',')
else:
- options.exclude_annotations = []
+ args.exclude_annotations = []
-def AddInstrumentationTestOptions(option_parser):
- """Adds Instrumentation test options to |option_parser|."""
+def AddInstrumentationTestOptions(parser):
+ """Adds Instrumentation test options to |parser|."""
- option_parser.usage = '%prog instrumentation [options]'
- option_parser.commands_dict = {}
- option_parser.example = ('%prog instrumentation '
- '--test-apk=ChromeShellTest')
+ parser.usage = '%(prog)s [options]'
- AddJavaTestOptions(option_parser)
- AddCommonOptions(option_parser)
- AddDeviceOptions(option_parser)
+ group = parser.add_argument_group('Instrumentation Test Options')
+ AddJavaTestOptions(group)
- option_parser.add_option('-j', '--java-only', action='store_true',
- default=False, help='Run only the Java tests.')
- option_parser.add_option('-p', '--python-only', action='store_true',
- default=False,
- help='Run only the host-driven tests.')
- option_parser.add_option('--host-driven-root',
- help='Root of the host-driven tests.')
- option_parser.add_option('-w', '--wait_debugger', dest='wait_for_debugger',
- action='store_true',
- help='Wait for debugger.')
- option_parser.add_option(
- '--test-apk', dest='test_apk',
- help=('The name of the apk containing the tests '
- '(without the .apk extension; e.g. "ContentShellTest").'))
- option_parser.add_option('--coverage-dir',
- help=('Directory in which to place all generated '
- 'EMMA coverage files.'))
- option_parser.add_option('--device-flags', dest='device_flags', default='',
- help='The relative filepath to a file containing '
- 'command-line flags to set on the device')
- option_parser.add_option('--isolate_file_path',
- '--isolate-file-path',
- dest='isolate_file_path',
- help='.isolate file path to override the default '
- 'path')
+ java_or_python_group = group.add_mutually_exclusive_group()
+ java_or_python_group.add_argument(
+ '-j', '--java-only', action='store_false',
+ dest='run_python_tests', default=True, help='Run only the Java tests.')
+ java_or_python_group.add_argument(
+ '-p', '--python-only', action='store_false',
+ dest='run_java_tests', default=True,
+ help='Run only the host-driven tests.')
+
+ group.add_argument('--host-driven-root',
+ help='Root of the host-driven tests.')
+ group.add_argument('-w', '--wait_debugger', dest='wait_for_debugger',
+ action='store_true',
+ help='Wait for debugger.')
+ group.add_argument('--test-apk', dest='test_apk', required=True,
+ help=('The name of the apk containing the tests '
+ '(without the .apk extension; '
+ 'e.g. "ContentShellTest").'))
+ group.add_argument('--coverage-dir',
+ help=('Directory in which to place all generated '
+ 'EMMA coverage files.'))
+ group.add_argument('--device-flags', dest='device_flags', default='',
+ help='The relative filepath to a file containing '
+ 'command-line flags to set on the device')
+ group.add_argument('--isolate_file_path',
+ '--isolate-file-path',
+ dest='isolate_file_path',
+ help='.isolate file path to override the default '
+ 'path')
+
+ AddCommonOptions(parser)
+ AddDeviceOptions(parser)
-def ProcessInstrumentationOptions(options, error_func):
+def ProcessInstrumentationOptions(args):
"""Processes options/arguments and populate |options| with defaults.
Args:
- options: optparse.Options object.
- error_func: Function to call with the error message in case of an error.
+ args: argparse.Namespace object.
Returns:
An InstrumentationOptions named tuple which contains all options relevant to
instrumentation tests.
"""
- ProcessJavaTestOptions(options)
+ ProcessJavaTestOptions(args)
- if options.java_only and options.python_only:
- error_func('Options java_only (-j) and python_only (-p) '
- 'are mutually exclusive.')
- options.run_java_tests = True
- options.run_python_tests = True
- if options.java_only:
- options.run_python_tests = False
- elif options.python_only:
- options.run_java_tests = False
+ if not args.host_driven_root:
+ args.run_python_tests = False
- if not options.host_driven_root:
- options.run_python_tests = False
-
- if not options.test_apk:
- error_func('--test-apk must be specified.')
-
-
- options.test_apk_path = os.path.join(
+ args.test_apk_path = os.path.join(
constants.GetOutDirectory(),
constants.SDK_BUILD_APKS_DIR,
- '%s.apk' % options.test_apk)
- options.test_apk_jar_path = os.path.join(
+ '%s.apk' % args.test_apk)
+ args.test_apk_jar_path = os.path.join(
constants.GetOutDirectory(),
constants.SDK_BUILD_TEST_JAVALIB_DIR,
- '%s.jar' % options.test_apk)
- options.test_support_apk_path = '%sSupport%s' % (
- os.path.splitext(options.test_apk_path))
+ '%s.jar' % args.test_apk)
+ args.test_support_apk_path = '%sSupport%s' % (
+ os.path.splitext(args.test_apk_path))
- options.test_runner = apk_helper.GetInstrumentationName(options.test_apk_path)
+ args.test_runner = apk_helper.GetInstrumentationName(args.test_apk_path)
+ # TODO(jbudorick): Get rid of InstrumentationOptions.
return instrumentation_test_options.InstrumentationOptions(
- options.tool,
- options.cleanup_test_files,
- options.annotations,
- options.exclude_annotations,
- options.test_filter,
- options.test_data,
- options.save_perf_json,
- options.screenshot_failures,
- options.wait_for_debugger,
- options.coverage_dir,
- options.test_apk,
- options.test_apk_path,
- options.test_apk_jar_path,
- options.test_runner,
- options.test_support_apk_path,
- options.device_flags,
- options.isolate_file_path
+ args.tool,
+ args.cleanup_test_files,
+ args.annotations,
+ args.exclude_annotations,
+ args.test_filter,
+ args.test_data,
+ args.save_perf_json,
+ args.screenshot_failures,
+ args.wait_for_debugger,
+ args.coverage_dir,
+ args.test_apk,
+ args.test_apk_path,
+ args.test_apk_jar_path,
+ args.test_runner,
+ args.test_support_apk_path,
+ args.device_flags,
+ args.isolate_file_path
)
-def AddUIAutomatorTestOptions(option_parser):
- """Adds UI Automator test options to |option_parser|."""
+def AddUIAutomatorTestOptions(parser):
+ """Adds UI Automator test options to |parser|."""
- option_parser.usage = '%prog uiautomator [options]'
- option_parser.commands_dict = {}
- option_parser.example = (
- '%prog uiautomator --test-jar=chrome_shell_uiautomator_tests'
- ' --package=chrome_shell')
- option_parser.add_option(
- '--package',
- help=('Package under test. Possible values: %s' %
- constants.PACKAGE_INFO.keys()))
- option_parser.add_option(
- '--test-jar', dest='test_jar',
+ group = parser.add_argument_group('UIAutomator Test Options')
+ AddJavaTestOptions(group)
+ group.add_argument(
+ '--package', required=True, choices=constants.PACKAGE_INFO.keys(),
+ metavar='PACKAGE', help='Package under test.')
+ group.add_argument(
+ '--test-jar', dest='test_jar', required=True,
help=('The name of the dexed jar containing the tests (without the '
'.dex.jar extension). Alternatively, this can be a full path '
'to the jar.'))
- AddJavaTestOptions(option_parser)
- AddCommonOptions(option_parser)
- AddDeviceOptions(option_parser)
+ AddCommonOptions(parser)
+ AddDeviceOptions(parser)
-def ProcessUIAutomatorOptions(options, error_func):
+def ProcessUIAutomatorOptions(args):
"""Processes UIAutomator options/arguments.
Args:
- options: optparse.Options object.
- error_func: Function to call with the error message in case of an error.
+ args: argparse.Namespace object.
Returns:
A UIAutomatorOptions named tuple which contains all options relevant to
uiautomator tests.
"""
- ProcessJavaTestOptions(options)
+ ProcessJavaTestOptions(args)
- if not options.package:
- error_func('--package is required.')
-
- if options.package not in constants.PACKAGE_INFO:
- error_func('Invalid package.')
-
- if not options.test_jar:
- error_func('--test-jar must be specified.')
-
- if os.path.exists(options.test_jar):
+ if os.path.exists(args.test_jar):
# The dexed JAR is fully qualified, assume the info JAR lives along side.
- options.uiautomator_jar = options.test_jar
+ args.uiautomator_jar = args.test_jar
else:
- options.uiautomator_jar = os.path.join(
+ args.uiautomator_jar = os.path.join(
constants.GetOutDirectory(),
constants.SDK_BUILD_JAVALIB_DIR,
- '%s.dex.jar' % options.test_jar)
- options.uiautomator_info_jar = (
- options.uiautomator_jar[:options.uiautomator_jar.find('.dex.jar')] +
+ '%s.dex.jar' % args.test_jar)
+ args.uiautomator_info_jar = (
+ args.uiautomator_jar[:args.uiautomator_jar.find('.dex.jar')] +
'_java.jar')
return uiautomator_test_options.UIAutomatorOptions(
- options.tool,
- options.cleanup_test_files,
- options.annotations,
- options.exclude_annotations,
- options.test_filter,
- options.test_data,
- options.save_perf_json,
- options.screenshot_failures,
- options.uiautomator_jar,
- options.uiautomator_info_jar,
- options.package)
+ args.tool,
+ args.cleanup_test_files,
+ args.annotations,
+ args.exclude_annotations,
+ args.test_filter,
+ args.test_data,
+ args.save_perf_json,
+ args.screenshot_failures,
+ args.uiautomator_jar,
+ args.uiautomator_info_jar,
+ args.package)
-def AddJUnitTestOptions(option_parser):
- """Adds junit test options to |option_parser|."""
- option_parser.usage = '%prog junit -s [test suite name]'
- option_parser.commands_dict = {}
+def AddJUnitTestOptions(parser):
+ """Adds junit test options to |parser|."""
- option_parser.add_option(
- '-s', '--test-suite', dest='test_suite',
+ group = parser.add_argument_group('JUnit Test Options')
+ group.add_argument(
+ '-s', '--test-suite', dest='test_suite', required=True,
help=('JUnit test suite to run.'))
- option_parser.add_option(
+ group.add_argument(
'-f', '--test-filter', dest='test_filter',
help='Filters tests googletest-style.')
- option_parser.add_option(
+ group.add_argument(
'--package-filter', dest='package_filter',
help='Filters tests by package.')
- option_parser.add_option(
+ group.add_argument(
'--runner-filter', dest='runner_filter',
help='Filters tests by runner class. Must be fully qualified.')
- option_parser.add_option(
- '--sdk-version', dest='sdk_version', type="int",
+ group.add_argument(
+ '--sdk-version', dest='sdk_version', type=int,
help='The Android SDK version.')
- AddCommonOptions(option_parser)
+ AddCommonOptions(parser)
-def ProcessJUnitTestOptions(options, error_func):
- """Processes all JUnit test options."""
- if not options.test_suite:
- error_func('No test suite specified.')
- return options
+def AddMonkeyTestOptions(parser):
+ """Adds monkey test options to |parser|."""
-
-def AddMonkeyTestOptions(option_parser):
- """Adds monkey test options to |option_parser|."""
-
- option_parser.usage = '%prog monkey [options]'
- option_parser.commands_dict = {}
- option_parser.example = (
- '%prog monkey --package=chrome_shell')
-
- option_parser.add_option(
- '--package',
- help=('Package under test. Possible values: %s' %
- constants.PACKAGE_INFO.keys()))
- option_parser.add_option(
- '--event-count', default=10000, type='int',
- help='Number of events to generate [default: %default].')
- option_parser.add_option(
+ group = parser.add_argument_group('Monkey Test Options')
+ group.add_argument(
+ '--package', required=True, choices=constants.PACKAGE_INFO.keys(),
+ metavar='PACKAGE', help='Package under test.')
+ group.add_argument(
+ '--event-count', default=10000, type=int,
+ help='Number of events to generate (default: %(default)s).')
+ group.add_argument(
'--category', default='',
help='A list of allowed categories.')
- option_parser.add_option(
- '--throttle', default=100, type='int',
- help='Delay between events (ms) [default: %default]. ')
- option_parser.add_option(
- '--seed', type='int',
+ group.add_argument(
+ '--throttle', default=100, type=int,
+ help='Delay between events (ms) (default: %(default)s). ')
+ group.add_argument(
+ '--seed', type=int,
help=('Seed value for pseudo-random generator. Same seed value generates '
'the same sequence of events. Seed is randomized by default.'))
- option_parser.add_option(
+ group.add_argument(
'--extra-args', default='',
- help=('String of other args to pass to the command verbatim '
- '[default: "%default"].'))
+ help=('String of other args to pass to the command verbatim.'))
- AddCommonOptions(option_parser)
- AddDeviceOptions(option_parser)
+ AddCommonOptions(parser)
+ AddDeviceOptions(parser)
-def ProcessMonkeyTestOptions(options, error_func):
+def ProcessMonkeyTestOptions(args):
"""Processes all monkey test options.
Args:
- options: optparse.Options object.
- error_func: Function to call with the error message in case of an error.
+ args: argparse.Namespace object.
Returns:
A MonkeyOptions named tuple which contains all options relevant to
monkey tests.
"""
- if not options.package:
- error_func('--package is required.')
-
- if options.package not in constants.PACKAGE_INFO:
- error_func('Invalid package.')
-
- category = options.category
+ # TODO(jbudorick): Handle this directly in argparse with nargs='+'
+ category = args.category
if category:
- category = options.category.split(',')
+ category = args.category.split(',')
+ # TODO(jbudorick): Get rid of MonkeyOptions.
return monkey_test_options.MonkeyOptions(
- options.verbose_count,
- options.package,
- options.event_count,
+ args.verbose_count,
+ args.package,
+ args.event_count,
category,
- options.throttle,
- options.seed,
- options.extra_args)
+ args.throttle,
+ args.seed,
+ args.extra_args)
-def AddPerfTestOptions(option_parser):
- """Adds perf test options to |option_parser|."""
+def AddPerfTestOptions(parser):
+ """Adds perf test options to |parser|."""
- option_parser.usage = '%prog perf [options]'
- option_parser.commands_dict = {}
- option_parser.example = ('%prog perf '
- '[--single-step -- command args] or '
- '[--steps perf_steps.json] or '
- '[--print-step step]')
+ group = parser.add_argument_group('Perf Test Options')
- option_parser.add_option(
- '--single-step',
- action='store_true',
+ class SingleStepAction(argparse.Action):
+ def __call__(self, parser, namespace, values, option_string=None):
+ if values and not namespace.single_step:
+ parser.error('single step command provided, '
+ 'but --single-step not specified.')
+ elif namespace.single_step and not values:
+ parser.error('--single-step specified, '
+ 'but no single step command provided.')
+ setattr(namespace, self.dest, values)
+
+ step_group = group.add_mutually_exclusive_group(required=True)
+ # TODO(jbudorick): Revise --single-step to use argparse.REMAINDER.
+ # This requires removing "--" from client calls.
+ step_group.add_argument(
+ '--single-step', action='store_true',
help='Execute the given command with retries, but only print the result '
'for the "most successful" round.')
- option_parser.add_option(
+ step_group.add_argument(
'--steps',
help='JSON file containing the list of commands to run.')
- option_parser.add_option(
+ step_group.add_argument(
+ '--print-step',
+ help='The name of a previously executed perf step to print.')
+
+ group.add_argument(
+ '--output-json-list',
+ help='Write a simple list of names from --steps into the given file.')
+ group.add_argument(
+ '--collect-chartjson-data',
+ action='store_true',
+ help='Cache the chartjson output from each step for later use.')
+ group.add_argument(
+ '--output-chartjson-data',
+ default='',
+ help='Write out chartjson into the given file.')
+ group.add_argument(
'--flaky-steps',
help=('A JSON file containing steps that are flaky '
'and will have its exit code ignored.'))
- option_parser.add_option(
- '--output-json-list',
- help='Write a simple list of names from --steps into the given file.')
- option_parser.add_option(
- '--print-step',
- help='The name of a previously executed perf step to print.')
- option_parser.add_option(
+ group.add_argument(
'--no-timeout', action='store_true',
help=('Do not impose a timeout. Each perf step is responsible for '
'implementing the timeout logic.'))
- option_parser.add_option(
+ group.add_argument(
'-f', '--test-filter',
help=('Test filter (will match against the names listed in --steps).'))
- option_parser.add_option(
- '--dry-run',
- action='store_true',
+ group.add_argument(
+ '--dry-run', action='store_true',
help='Just print the steps without executing.')
- AddCommonOptions(option_parser)
- AddDeviceOptions(option_parser)
+ group.add_argument('single_step_command', nargs='*', action=SingleStepAction,
+ help='If --single-step is specified, the command to run.')
+ AddCommonOptions(parser)
+ AddDeviceOptions(parser)
-def ProcessPerfTestOptions(options, args, error_func):
+def ProcessPerfTestOptions(args):
"""Processes all perf test options.
Args:
- options: optparse.Options object.
- error_func: Function to call with the error message in case of an error.
+ args: argparse.Namespace object.
Returns:
A PerfOptions named tuple which contains all options relevant to
perf tests.
"""
- # Only one of steps, print_step or single_step must be provided.
- count = len(filter(None,
- [options.steps, options.print_step, options.single_step]))
- if count != 1:
- error_func('Please specify one of: --steps, --print-step, --single-step.')
- single_step = None
- if options.single_step:
- single_step = ' '.join(args[2:])
+ # TODO(jbudorick): Move single_step handling down into the perf tests.
+ if args.single_step:
+ args.single_step = ' '.join(args.single_step_command)
+ # TODO(jbudorick): Get rid of PerfOptions.
return perf_test_options.PerfOptions(
- options.steps, options.flaky_steps, options.output_json_list,
- options.print_step, options.no_timeout, options.test_filter,
- options.dry_run, single_step)
+ args.steps, args.flaky_steps, args.output_json_list,
+ args.print_step, args.no_timeout, args.test_filter,
+ args.dry_run, args.single_step, args.collect_chartjson_data,
+ args.output_chartjson_data)
-def AddPythonTestOptions(option_parser):
- option_parser.add_option('-s', '--suite', dest='suite_name',
- help=('Name of the test suite to run'
- '(use -s help to list them).'))
- AddCommonOptions(option_parser)
+def AddPythonTestOptions(parser):
+ group = parser.add_argument_group('Python Test Options')
+ group.add_argument(
+ '-s', '--suite', dest='suite_name', metavar='SUITE_NAME',
+ choices=constants.PYTHON_UNIT_TEST_SUITES.keys(),
+ help='Name of the test suite to run.')
+ AddCommonOptions(parser)
-def ProcessPythonTestOptions(options, error_func):
- if options.suite_name not in constants.PYTHON_UNIT_TEST_SUITES:
- available = ('Available test suites: [%s]' %
- ', '.join(constants.PYTHON_UNIT_TEST_SUITES.iterkeys()))
- if options.suite_name == 'help':
- print available
- else:
- error_func('"%s" is not a valid suite. %s' %
- (options.suite_name, available))
-
-
-def _RunGTests(options, devices):
+def _RunGTests(args, devices):
"""Subcommand of RunTestsCommands which runs gtests."""
- ProcessGTestOptions(options)
-
exit_code = 0
- for suite_name in options.suite_name:
- # TODO(gkanwar): Move this into ProcessGTestOptions once we require -s for
- # the gtest command.
+ for suite_name in args.suite_name:
+ # TODO(jbudorick): Either deprecate multi-suite or move its handling down
+ # into the gtest code.
gtest_options = gtest_test_options.GTestOptions(
- options.tool,
- options.cleanup_test_files,
- options.test_filter,
- options.run_disabled,
- options.test_arguments,
- options.timeout,
- options.isolate_file_path,
+ args.tool,
+ args.cleanup_test_files,
+ args.test_filter,
+ args.run_disabled,
+ args.test_arguments,
+ args.timeout,
+ args.isolate_file_path,
suite_name)
runner_factory, tests = gtest_setup.Setup(gtest_options, devices)
results, test_exit_code = test_dispatcher.RunTests(
tests, runner_factory, devices, shard=True, test_timeout=None,
- num_retries=options.num_retries)
+ num_retries=args.num_retries)
if test_exit_code and exit_code != constants.ERROR_EXIT_CODE:
exit_code = test_exit_code
@@ -636,7 +571,10 @@
results=results,
test_type='Unit test',
test_package=suite_name,
- flakiness_server=options.flakiness_dashboard_server)
+ flakiness_server=args.flakiness_dashboard_server)
+
+ if args.json_results_file:
+ json_results.GenerateJsonResultsFile(results, args.json_results_file)
if os.path.isdir(constants.ISOLATE_DEPS_DIR):
shutil.rmtree(constants.ISOLATE_DEPS_DIR)
@@ -644,52 +582,57 @@
return exit_code
-def _RunLinkerTests(options, devices):
+def _RunLinkerTests(args, devices):
"""Subcommand of RunTestsCommands which runs linker tests."""
- runner_factory, tests = linker_setup.Setup(options, devices)
+ runner_factory, tests = linker_setup.Setup(args, devices)
results, exit_code = test_dispatcher.RunTests(
tests, runner_factory, devices, shard=True, test_timeout=60,
- num_retries=options.num_retries)
+ num_retries=args.num_retries)
report_results.LogFull(
results=results,
test_type='Linker test',
test_package='ChromiumLinkerTest')
+ if args.json_results_file:
+ json_results.GenerateJsonResultsFile(results, args.json_results_file)
+
return exit_code
-def _RunInstrumentationTests(options, error_func, devices):
+def _RunInstrumentationTests(args, devices):
"""Subcommand of RunTestsCommands which runs instrumentation tests."""
- instrumentation_options = ProcessInstrumentationOptions(options, error_func)
+ logging.info('_RunInstrumentationTests(%s, %s)' % (str(args), str(devices)))
- if len(devices) > 1 and options.wait_for_debugger:
+ instrumentation_options = ProcessInstrumentationOptions(args)
+
+ if len(devices) > 1 and args.wait_for_debugger:
logging.warning('Debugger can not be sharded, using first available device')
devices = devices[:1]
results = base_test_result.TestRunResults()
exit_code = 0
- if options.run_java_tests:
+ if args.run_java_tests:
runner_factory, tests = instrumentation_setup.Setup(
instrumentation_options, devices)
test_results, exit_code = test_dispatcher.RunTests(
tests, runner_factory, devices, shard=True, test_timeout=None,
- num_retries=options.num_retries)
+ num_retries=args.num_retries)
results.AddTestRunResults(test_results)
- if options.run_python_tests:
+ if args.run_python_tests:
runner_factory, tests = host_driven_setup.InstrumentationSetup(
- options.host_driven_root, options.official_build,
+ args.host_driven_root, args.official_build,
instrumentation_options)
if tests:
test_results, test_exit_code = test_dispatcher.RunTests(
tests, runner_factory, devices, shard=True, test_timeout=None,
- num_retries=options.num_retries)
+ num_retries=args.num_retries)
results.AddTestRunResults(test_results)
@@ -697,76 +640,87 @@
if test_exit_code and exit_code != constants.ERROR_EXIT_CODE:
exit_code = test_exit_code
- if options.device_flags:
- options.device_flags = os.path.join(constants.DIR_SOURCE_ROOT,
- options.device_flags)
+ if args.device_flags:
+ args.device_flags = os.path.join(constants.DIR_SOURCE_ROOT,
+ args.device_flags)
report_results.LogFull(
results=results,
test_type='Instrumentation',
- test_package=os.path.basename(options.test_apk),
- annotation=options.annotations,
- flakiness_server=options.flakiness_dashboard_server)
+ test_package=os.path.basename(args.test_apk),
+ annotation=args.annotations,
+ flakiness_server=args.flakiness_dashboard_server)
+
+ if args.json_results_file:
+ json_results.GenerateJsonResultsFile(results, args.json_results_file)
return exit_code
-def _RunUIAutomatorTests(options, error_func, devices):
+def _RunUIAutomatorTests(args, devices):
"""Subcommand of RunTestsCommands which runs uiautomator tests."""
- uiautomator_options = ProcessUIAutomatorOptions(options, error_func)
+ uiautomator_options = ProcessUIAutomatorOptions(args)
runner_factory, tests = uiautomator_setup.Setup(uiautomator_options)
results, exit_code = test_dispatcher.RunTests(
tests, runner_factory, devices, shard=True, test_timeout=None,
- num_retries=options.num_retries)
+ num_retries=args.num_retries)
report_results.LogFull(
results=results,
test_type='UIAutomator',
- test_package=os.path.basename(options.test_jar),
- annotation=options.annotations,
- flakiness_server=options.flakiness_dashboard_server)
+ test_package=os.path.basename(args.test_jar),
+ annotation=args.annotations,
+ flakiness_server=args.flakiness_dashboard_server)
+
+ if args.json_results_file:
+ json_results.GenerateJsonResultsFile(results, args.json_results_file)
return exit_code
-def _RunJUnitTests(options, error_func):
+def _RunJUnitTests(args):
"""Subcommand of RunTestsCommand which runs junit tests."""
- junit_options = ProcessJUnitTestOptions(options, error_func)
- runner_factory, tests = junit_setup.Setup(junit_options)
+ runner_factory, tests = junit_setup.Setup(args)
_, exit_code = junit_dispatcher.RunTests(tests, runner_factory)
-
return exit_code
-def _RunMonkeyTests(options, error_func, devices):
+def _RunMonkeyTests(args, devices):
"""Subcommand of RunTestsCommands which runs monkey tests."""
- monkey_options = ProcessMonkeyTestOptions(options, error_func)
+ monkey_options = ProcessMonkeyTestOptions(args)
runner_factory, tests = monkey_setup.Setup(monkey_options)
results, exit_code = test_dispatcher.RunTests(
tests, runner_factory, devices, shard=False, test_timeout=None,
- num_retries=options.num_retries)
+ num_retries=args.num_retries)
report_results.LogFull(
results=results,
test_type='Monkey',
test_package='Monkey')
+ if args.json_results_file:
+ json_results.GenerateJsonResultsFile(results, args.json_results_file)
+
return exit_code
-def _RunPerfTests(options, args, error_func):
+def _RunPerfTests(args):
"""Subcommand of RunTestsCommands which runs perf tests."""
- perf_options = ProcessPerfTestOptions(options, args, error_func)
+ perf_options = ProcessPerfTestOptions(args)
# Just save a simple json with a list of test names.
if perf_options.output_json_list:
return perf_test_runner.OutputJsonList(
perf_options.steps, perf_options.output_json_list)
+ if perf_options.output_chartjson_data:
+ return perf_test_runner.OutputChartjson(
+ perf_options.print_step, perf_options.output_chartjson_data)
+
# Just print the results from a single previously executed step.
if perf_options.print_step:
return perf_test_runner.PrintTestOutput(perf_options.print_step)
@@ -779,13 +733,16 @@
# which increases throughput but have no affinity.
results, _ = test_dispatcher.RunTests(
tests, runner_factory, devices, shard=False, test_timeout=None,
- num_retries=options.num_retries)
+ num_retries=args.num_retries)
report_results.LogFull(
results=results,
test_type='Perf',
test_package='Perf')
+ if args.json_results_file:
+ json_results.GenerateJsonResultsFile(results, args.json_results_file)
+
if perf_options.single_step:
return perf_test_runner.PrintTestOutput('single_step')
@@ -796,11 +753,9 @@
return 0
-def _RunPythonTests(options, error_func):
+def _RunPythonTests(args):
"""Subcommand of RunTestsCommand which runs python unit tests."""
- ProcessPythonTestOptions(options, error_func)
-
- suite_vars = constants.PYTHON_UNIT_TEST_SUITES[options.suite_name]
+ suite_vars = constants.PYTHON_UNIT_TEST_SUITES[args.suite_name]
suite_path = suite_vars['path']
suite_test_modules = suite_vars['test_modules']
@@ -809,7 +764,7 @@
suite = unittest.TestSuite()
suite.addTests(unittest.defaultTestLoader.loadTestsFromName(m)
for m in suite_test_modules)
- runner = unittest.TextTestRunner(verbosity=1+options.verbose_count)
+ runner = unittest.TextTestRunner(verbosity=1+args.verbose_count)
return 0 if runner.run(suite).wasSuccessful() else 1
finally:
sys.path = sys.path[1:]
@@ -838,15 +793,12 @@
return sorted(attached_devices)
-def RunTestsCommand(command, options, args, option_parser):
+def RunTestsCommand(args, parser):
"""Checks test type and dispatches to the appropriate function.
Args:
- command: String indicating the command that was received to trigger
- this function.
- options: optparse options dictionary.
- args: List of extra args from optparse.
- option_parser: optparse.OptionParser object.
+ args: argparse.Namespace object.
+ parser: argparse.ArgumentParser object.
Returns:
Integer indicated exit code.
@@ -855,47 +807,38 @@
Exception: Unknown command name passed in, or an exception from an
individual test runner.
"""
+ command = args.command
- # Check for extra arguments
- if len(args) > 2 and command != 'perf':
- option_parser.error('Unrecognized arguments: %s' % (' '.join(args[2:])))
- return constants.ERROR_EXIT_CODE
- if command == 'perf':
- if ((options.single_step and len(args) <= 2) or
- (not options.single_step and len(args) > 2)):
- option_parser.error('Unrecognized arguments: %s' % (' '.join(args)))
- return constants.ERROR_EXIT_CODE
+ ProcessCommonOptions(args)
- ProcessCommonOptions(options, option_parser.error)
-
- if options.enable_platform_mode:
- return RunTestsInPlatformMode(command, options, option_parser)
+ if args.enable_platform_mode:
+ return RunTestsInPlatformMode(args, parser.error)
if command in constants.LOCAL_MACHINE_TESTS:
devices = []
else:
- devices = _GetAttachedDevices(options.test_device)
+ devices = _GetAttachedDevices(args.test_device)
forwarder.Forwarder.RemoveHostLog()
if not ports.ResetTestServerPortAllocation():
raise Exception('Failed to reset test server port.')
if command == 'gtest':
- return _RunGTests(options, devices)
+ return _RunGTests(args, devices)
elif command == 'linker':
- return _RunLinkerTests(options, devices)
+ return _RunLinkerTests(args, devices)
elif command == 'instrumentation':
- return _RunInstrumentationTests(options, option_parser.error, devices)
+ return _RunInstrumentationTests(args, devices)
elif command == 'uiautomator':
- return _RunUIAutomatorTests(options, option_parser.error, devices)
+ return _RunUIAutomatorTests(args, devices)
elif command == 'junit':
- return _RunJUnitTests(options, option_parser.error)
+ return _RunJUnitTests(args)
elif command == 'monkey':
- return _RunMonkeyTests(options, option_parser.error, devices)
+ return _RunMonkeyTests(args, devices)
elif command == 'perf':
- return _RunPerfTests(options, args, option_parser.error)
+ return _RunPerfTests(args)
elif command == 'python':
- return _RunPythonTests(options, option_parser.error)
+ return _RunPythonTests(args)
else:
raise Exception('Unknown test type.')
@@ -906,93 +849,60 @@
]
-def RunTestsInPlatformMode(command, options, option_parser):
+def RunTestsInPlatformMode(args, parser):
- if command not in _SUPPORTED_IN_PLATFORM_MODE:
- option_parser.error('%s is not yet supported in platform mode' % command)
+ if args.command not in _SUPPORTED_IN_PLATFORM_MODE:
+ parser.error('%s is not yet supported in platform mode' % args.command)
- with environment_factory.CreateEnvironment(
- command, options, option_parser.error) as env:
- with test_instance_factory.CreateTestInstance(
- command, options, option_parser.error) as test:
+ with environment_factory.CreateEnvironment(args, parser.error) as env:
+ with test_instance_factory.CreateTestInstance(args, parser.error) as test:
with test_run_factory.CreateTestRun(
- options, env, test, option_parser.error) as test_run:
+ args, env, test, parser.error) as test_run:
results = test_run.RunTests()
report_results.LogFull(
results=results,
test_type=test.TestType(),
test_package=test_run.TestPackage(),
- annotation=options.annotations,
- flakiness_server=options.flakiness_dashboard_server)
+ annotation=args.annotations,
+ flakiness_server=args.flakiness_dashboard_server)
+
+ if args.json_results_file:
+ json_results.GenerateJsonResultsFile(
+ results, args.json_results_file)
return results
-def HelpCommand(command, _options, args, option_parser):
- """Display help for a certain command, or overall help.
-
- Args:
- command: String indicating the command that was received to trigger
- this function.
- options: optparse options dictionary. unused.
- args: List of extra args from optparse.
- option_parser: optparse.OptionParser object.
-
- Returns:
- Integer indicated exit code.
- """
- # If we don't have any args, display overall help
- if len(args) < 3:
- option_parser.print_help()
- return 0
- # If we have too many args, print an error
- if len(args) > 3:
- option_parser.error('Unrecognized arguments: %s' % (' '.join(args[3:])))
- return constants.ERROR_EXIT_CODE
-
- command = args[2]
-
- if command not in VALID_COMMANDS:
- option_parser.error('Unrecognized command.')
-
- # Treat the help command as a special case. We don't care about showing a
- # specific help page for itself.
- if command == 'help':
- option_parser.print_help()
- return 0
-
- VALID_COMMANDS[command].add_options_func(option_parser)
- option_parser.usage = '%prog ' + command + ' [options]'
- option_parser.commands_dict = {}
- option_parser.print_help()
-
- return 0
-
-
-# Define a named tuple for the values in the VALID_COMMANDS dictionary so the
-# syntax is a bit prettier. The tuple is two functions: (add options, run
-# command).
-CommandFunctionTuple = collections.namedtuple(
- 'CommandFunctionTuple', ['add_options_func', 'run_command_func'])
+CommandConfigTuple = collections.namedtuple(
+ 'CommandConfigTuple',
+ ['add_options_func', 'help_txt'])
VALID_COMMANDS = {
- 'gtest': CommandFunctionTuple(AddGTestOptions, RunTestsCommand),
- 'instrumentation': CommandFunctionTuple(
- AddInstrumentationTestOptions, RunTestsCommand),
- 'uiautomator': CommandFunctionTuple(
- AddUIAutomatorTestOptions, RunTestsCommand),
- 'junit': CommandFunctionTuple(
- AddJUnitTestOptions, RunTestsCommand),
- 'monkey': CommandFunctionTuple(
- AddMonkeyTestOptions, RunTestsCommand),
- 'perf': CommandFunctionTuple(
- AddPerfTestOptions, RunTestsCommand),
- 'python': CommandFunctionTuple(
- AddPythonTestOptions, RunTestsCommand),
- 'linker': CommandFunctionTuple(
- AddLinkerTestOptions, RunTestsCommand),
- 'help': CommandFunctionTuple(lambda option_parser: None, HelpCommand)
- }
+ 'gtest': CommandConfigTuple(
+ AddGTestOptions,
+ 'googletest-based C++ tests'),
+ 'instrumentation': CommandConfigTuple(
+ AddInstrumentationTestOptions,
+ 'InstrumentationTestCase-based Java tests'),
+ 'uiautomator': CommandConfigTuple(
+ AddUIAutomatorTestOptions,
+ "Tests that run via Android's uiautomator command"),
+ 'junit': CommandConfigTuple(
+ AddJUnitTestOptions,
+ 'JUnit4-based Java tests'),
+ 'monkey': CommandConfigTuple(
+ AddMonkeyTestOptions,
+ "Tests based on Android's monkey"),
+ 'perf': CommandConfigTuple(
+ AddPerfTestOptions,
+ 'Performance tests'),
+ 'python': CommandConfigTuple(
+ AddPythonTestOptions,
+ 'Python tests based on unittest.TestCase'),
+ 'linker': CommandConfigTuple(
+ AddLinkerTestOptions,
+ 'Linker tests'),
+}
def DumpThreadStacks(_signal, _frame):
@@ -1002,9 +912,19 @@
def main():
signal.signal(signal.SIGUSR1, DumpThreadStacks)
- option_parser = command_option_parser.CommandOptionParser(
- commands_dict=VALID_COMMANDS)
- return command_option_parser.ParseAndExecute(option_parser)
+
+ parser = argparse.ArgumentParser()
+ command_parsers = parser.add_subparsers(title='test types',
+ dest='command')
+
+ for test_type, config in sorted(VALID_COMMANDS.iteritems(),
+ key=lambda x: x[0]):
+ subparser = command_parsers.add_parser(
+ test_type, usage='%(prog)s [options]', help=config.help_txt)
+ config.add_options_func(subparser)
+
+ args = parser.parse_args()
+ return RunTestsCommand(args, parser)
if __name__ == '__main__':
diff --git a/build/common.gypi b/build/common.gypi
index 77939be..f5a3e80 100644
--- a/build/common.gypi
+++ b/build/common.gypi
@@ -567,6 +567,9 @@
# cross-compile builds.
'clang%': 0,
+ # Use experimental lld linker instead of the platform's default linker.
+ 'use_lld%': 0,
+
# Enable plug-in installation by default.
'enable_plugin_installation%': 1,
@@ -589,8 +592,8 @@
'wix_path%': '<(DEPTH)/third_party/wix',
- # Managed users are enabled by default.
- 'enable_managed_users%': 1,
+ # Supervised users are enabled by default.
+ 'enable_supervised_users%': 1,
# Platform natively supports discardable memory.
'native_discardable_memory%': 0,
@@ -798,7 +801,7 @@
'notifications%': 0,
'remoting%': 0,
'safe_browsing%': 0,
- 'enable_managed_users%': 0,
+ 'enable_supervised_users%': 0,
'enable_task_manager%': 0,
'use_system_libcxx%': 1,
'support_pre_M6_history_database%': 0,
@@ -997,7 +1000,7 @@
# TODO(baixo): Enable v8_use_external_startup_data
# http://crbug.com/421063
- ['android_webview_build==0 and android_webview_telemetry_build==0 and chromecast==0 and OS=="android"', {
+ ['android_webview_build==0 and android_webview_telemetry_build==0 and chromecast==0 and chromeos==0 and (OS=="android" or OS=="linux" or OS=="mac")', {
'v8_use_external_startup_data': 1,
}, {
'v8_use_external_startup_data': 0,
@@ -1186,7 +1189,7 @@
'google_api_key%': '<(google_api_key)',
'google_default_client_id%': '<(google_default_client_id)',
'google_default_client_secret%': '<(google_default_client_secret)',
- 'enable_managed_users%': '<(enable_managed_users)',
+ 'enable_supervised_users%': '<(enable_supervised_users)',
'native_discardable_memory%': '<(native_discardable_memory)',
'native_memory_pressure_signals%': '<(native_memory_pressure_signals)',
'spdy_proxy_auth_property%': '<(spdy_proxy_auth_property)',
@@ -1259,7 +1262,7 @@
# 'win_use_allocator_shim': 0,
# 'win_release_RuntimeLibrary': 2
# to ~/.gyp/include.gypi, gclient runhooks --force, and do a release build.
- 'win_use_allocator_shim%': 1, # 1 = shim allocator via libcmt; 0 = msvcrt
+ 'win_use_allocator_shim%': 0, # 1 = shim allocator via libcmt; 0 = msvcrt
# TODO(bradnelson): eliminate this when possible.
# To allow local gyp files to prevent release.vsprops from being included.
@@ -1302,6 +1305,7 @@
'clang%': '<(clang)',
'host_clang%': '<(host_clang)',
'make_clang_dir%': '<(make_clang_dir)',
+ 'use_lld%': '<(use_lld)',
# Control which version of clang to use when building for iOS. If set to
# '1', uses the version of clang that ships with Xcode. If set to '0', uses
@@ -1773,7 +1777,7 @@
'use_openssl_certs%': 1,
'proprietary_codecs%': '<(proprietary_codecs)',
- 'safe_browsing%': 1,
+ 'safe_browsing%': 2,
'enable_web_speech%': 0,
'java_bridge%': 1,
'build_ffmpegsumo%': 0,
@@ -2235,7 +2239,7 @@
# Iterator debugging is slow.
'win_debug_disable_iterator_debugging': '1',
# Try to disable optimizations that mess up stacks in a release build.
- # DrM-i#1054 (http://code.google.com/p/drmemory/issues/detail?id=1054)
+ # DrM-i#1054 (https://github.com/DynamoRIO/drmemory/issues/1054)
# /O2 and /Ob0 (disable inline) cannot be used together because of a
# compiler bug, so we use /Ob1 instead.
'win_release_InlineFunctionExpansion': '1',
@@ -2345,7 +2349,6 @@
}, {
'use_seccomp_bpf%': 0,
}],
-
# Set component build with LTO until all tests pass.
# This also reduces link time.
['use_lto==1', {
@@ -2384,7 +2387,7 @@
# Whether to allow building of the GPU-related isolates.
'archive_gpu_tests%': 0,
- # Whether to allow building of chromoting related isolates.
+ # Whether to allow building of chromoting related isolates.
'archive_chromoting_tests%': 0,
},
'target_defaults': {
@@ -2944,8 +2947,8 @@
['use_icu_alternatives_on_android==1', {
'defines': ['USE_ICU_ALTERNATIVES_ON_ANDROID=1'],
}],
- ['enable_managed_users==1', {
- 'defines': ['ENABLE_MANAGED_USERS=1'],
+ ['enable_supervised_users==1', {
+ 'defines': ['ENABLE_SUPERVISED_USERS=1'],
}],
['spdy_proxy_auth_property != ""', {
'defines': ['SPDY_PROXY_AUTH_PROPERTY="<(spdy_proxy_auth_property)"'],
@@ -3412,7 +3415,7 @@
'WTF_USE_DYNAMIC_ANNOTATIONS=1',
],
}],
- ['win_use_allocator_shim==0', {
+ ['OS=="win" and win_use_allocator_shim==0', {
'defines': ['NO_TCMALLOC'],
}],
# _FORTIFY_SOURCE isn't really supported by Clang now, see
@@ -3629,6 +3632,7 @@
'cflags': ['-funwind-tables'],
}, {
'cflags': ['-fno-unwind-tables', '-fno-asynchronous-unwind-tables'],
+ 'defines': ['NO_UNWIND_TABLES'],
}],
# TODO(mostynb): shuffle clang/gcc_version/binutils_version
# definitions in to the right scope to use them when setting
@@ -3710,6 +3714,7 @@
'cflags': ['-funwind-tables'],
}, {
'cflags': ['-fno-unwind-tables', '-fno-asynchronous-unwind-tables'],
+ 'defines': ['NO_UNWIND_TABLES'],
}],
],
},
@@ -4272,7 +4277,6 @@
['_toolset=="target"', {
'cflags': [
'-fsanitize=thread',
- '-fPIC',
'-fsanitize-blacklist=<(tsan_blacklist)',
],
'ldflags': [
@@ -4283,13 +4287,6 @@
'DYNAMIC_ANNOTATIONS_EXTERNAL_IMPL=1',
'WTF_USE_DYNAMIC_ANNOTATIONS_NOIMPL=1',
],
- 'target_conditions': [
- ['_type=="executable"', {
- 'ldflags': [
- '-pie',
- ],
- }],
- ],
}],
],
}],
@@ -4299,7 +4296,6 @@
'cflags': [
'-fsanitize=memory',
'-fsanitize-memory-track-origins=<(msan_track_origins)',
- '-fPIC',
'-fsanitize-blacklist=<(msan_blacklist)',
],
'ldflags': [
@@ -4308,13 +4304,6 @@
'defines': [
'MEMORY_SANITIZER',
],
- 'target_conditions': [
- ['_type=="executable"', {
- 'ldflags': [
- '-pie',
- ],
- }],
- ],
}],
],
}],
@@ -4648,19 +4637,10 @@
'--sysroot=<(android_ndk_sysroot)',
'-nostdlib',
],
- 'variables': {
- 'conditions': [
- ['target_arch=="arm" and arm_thumb==1', {
- 'thumb_option%': '-mthumb',
- }, {
- 'thumb_option%': '',
- }],
- ],
- },
'libraries': [
'-l<(android_stlport_library)',
# Manually link the libgcc.a that the cross compiler uses.
- '<!(<(android_toolchain)/*-gcc <(thumb_option) -print-libgcc-file-name)',
+ '<!(<(android_toolchain)/*-gcc -print-libgcc-file-name)',
'-lc',
'-ldl',
'-lm',
@@ -4725,12 +4705,8 @@
'cflags': [
'-isystem<(android_stlport_include)',
],
- 'conditions': [
- ['target_arch=="arm" and arm_thumb==1', {
- 'ldflags': [ '-L<(android_stlport_libs_dir)/thumb' ]
- }, {
- 'ldflags': [ '-L<(android_stlport_libs_dir)' ]
- }],
+ 'ldflags': [
+ '-L<(android_stlport_libs_dir)',
],
}, { # else: android_webview_build!=0
'aosp_build_settings': {
@@ -5736,6 +5712,13 @@
['CC', '<(make_clang_dir)/bin/clang-cl'],
],
}],
+ ['use_lld==1 and OS=="win"', {
+ 'make_global_settings': [
+ # Limited to Windows because lld-link is the driver that is compatible
+ # to link.exe.
+ ['LD', '<(make_clang_dir)/bin/lld-link'],
+ ],
+ }],
['OS=="android" and clang==0', {
# Hardcode the compiler names in the Makefile so that
# it won't depend on the environment at make time.
diff --git a/build/compiled_action.gni b/build/compiled_action.gni
index b750af0..e5059aa 100644
--- a/build/compiled_action.gni
+++ b/build/compiled_action.gni
@@ -102,22 +102,23 @@
# If that's not the case, we'll need another argument to the script to
# specify this, since we can't know what the output name is (it might be in
# another file not processed yet).
- host_executable = get_label_info(host_tool, "root_out_dir") + "/" +
- get_label_info(host_tool, "name") + _host_executable_suffix
+ host_executable =
+ get_label_info(host_tool, "root_out_dir") + "/" +
+ get_label_info(host_tool, "name") + _host_executable_suffix
# Add the executable itself as an input.
inputs += [ host_executable ]
- deps = [ host_tool ]
+ deps = [
+ host_tool,
+ ]
if (defined(invoker.deps)) {
deps += invoker.deps
}
# The script takes as arguments the binary to run, and then the arguments
# to pass it.
- args = [
- rebase_path(host_executable, root_build_dir)
- ] + invoker.args
+ args = [ rebase_path(host_executable, root_build_dir) ] + invoker.args
}
}
@@ -151,21 +152,22 @@
# If that's not the case, we'll need another argument to the script to
# specify this, since we can't know what the output name is (it might be in
# another file not processed yet).
- host_executable = get_label_info(host_tool, "root_out_dir") + "/" +
- get_label_info(host_tool, "name") + _host_executable_suffix
+ host_executable =
+ get_label_info(host_tool, "root_out_dir") + "/" +
+ get_label_info(host_tool, "name") + _host_executable_suffix
# Add the executable itself as an input.
inputs += [ host_executable ]
- deps = [ host_tool ]
+ deps = [
+ host_tool,
+ ]
if (defined(invoker.deps)) {
deps += invoker.deps
}
# The script takes as arguments the binary to run, and then the arguments
# to pass it.
- args = [
- rebase_path(host_executable, root_build_dir)
- ] + invoker.args
+ args = [ rebase_path(host_executable, root_build_dir) ] + invoker.args
}
}
diff --git a/build/config/BUILD.gn b/build/config/BUILD.gn
index c51709c..bd803ef 100644
--- a/build/config/BUILD.gn
+++ b/build/config/BUILD.gn
@@ -30,8 +30,8 @@
config("feature_flags") {
# TODO(brettw) most of these need to be parameterized.
defines = [
- "CHROMIUM_BUILD",
- "V8_DEPRECATION_WARNINGS", # Don't use deprecated V8 APIs anywhere.
+ "CHROMIUM_BUILD",
+ "V8_DEPRECATION_WARNINGS", # Don't use deprecated V8 APIs anywhere.
]
if (cld_version > 0) {
@@ -171,8 +171,8 @@
if (enable_settings_app) {
defines += [ "ENABLE_SETTINGS_APP=1" ]
}
- if (enable_managed_users) {
- defines += [ "ENABLE_MANAGED_USERS=1" ]
+ if (enable_supervised_users) {
+ defines += [ "ENABLE_SUPERVISED_USERS=1" ]
}
if (enable_service_discovery) {
defines += [ "ENABLE_SERVICE_DISCOVERY=1" ]
@@ -204,6 +204,9 @@
if (proprietary_codecs) {
defines += [ "USE_PROPRIETARY_CODECS" ]
}
+ if (enable_hangout_services_extension) {
+ defines += [ "ENABLE_HANGOUT_SERVICES_EXTENSION=1" ]
+ }
}
# Debug/release ----------------------------------------------------------------
@@ -231,9 +234,7 @@
}
config("release") {
- defines = [
- "NDEBUG",
- ]
+ defines = [ "NDEBUG" ]
}
# Default libraries ------------------------------------------------------------
@@ -268,6 +269,7 @@
"winmm.lib",
"winspool.lib",
"ws2_32.lib",
+
# Please don't add more stuff here. We should actually be making this
# list smaller, since all common things should be covered. If you need
# some extra libraries, please just add a libs = [ "foo.lib" ] to your
@@ -284,7 +286,7 @@
# '<!(<(android_toolchain)/*-gcc -print-libgcc-file-name)',
"c",
"dl",
- "m"
+ "m",
]
} else if (is_mac) {
libs = [
@@ -305,8 +307,6 @@
"UIKit.framework",
]
} else if (is_linux) {
- libs = [
- "dl",
- ]
+ libs = [ "dl" ]
}
}
diff --git a/build/config/BUILDCONFIG.gn b/build/config/BUILDCONFIG.gn
index 0d65c44..39372d8 100644
--- a/build/config/BUILDCONFIG.gn
+++ b/build/config/BUILDCONFIG.gn
@@ -27,12 +27,13 @@
# Component build.
is_component_build = false
+
# Debug build.
is_debug = true
# Set to true when compiling with the Clang compiler. Typically this is used
# to configure warnings.
- is_clang = (os == "mac" || os == "ios" || os == "linux" || os == "chromeos")
+ is_clang = os == "mac" || os == "ios" || os == "linux" || os == "chromeos"
# Selects the desired build flavor. Official builds get additional
# processing to prepare for release. Normally you will want to develop and
@@ -238,9 +239,7 @@
]
}
if (!is_mac && !is_ios) {
- sources_assignment_filter += [
- "*.mm",
- ]
+ sources_assignment_filter += [ "*.mm" ]
}
if (!is_linux) {
sources_assignment_filter += [
@@ -269,6 +268,7 @@
"*\bchromeos/*",
]
}
+
# DO NOT ADD MORE PATTERNS TO THIS LIST, see set_sources_assignment_filter call
# below.
@@ -309,7 +309,6 @@
# duplication in each target below.
_native_compiler_configs = [
"//build/config:feature_flags",
-
"//build/config/compiler:compiler",
"//build/config/compiler:compiler_arm_fpu",
"//build/config/compiler:chromium_code",
@@ -335,13 +334,13 @@
}
if (is_linux) {
- _native_compiler_configs += [ "//build/config/linux:sdk", ]
+ _native_compiler_configs += [ "//build/config/linux:sdk" ]
} else if (is_mac) {
- _native_compiler_configs += [ "//build/config/mac:sdk", ]
+ _native_compiler_configs += [ "//build/config/mac:sdk" ]
} else if (is_ios) {
- _native_compiler_configs += [ "//build/config/ios:sdk", ]
+ _native_compiler_configs += [ "//build/config/ios:sdk" ]
} else if (is_android) {
- _native_compiler_configs += [ "//build/config/android:sdk", ]
+ _native_compiler_configs += [ "//build/config/android:sdk" ]
}
if (is_clang) {
@@ -388,15 +387,16 @@
if (is_win) {
if (is_debug) {
_default_incremental_linking_config =
- "//build/config/win:incremental_linking"
+ "//build/config/win:incremental_linking"
} else {
_default_incremental_linking_config =
- "//build/config/win:no_incremental_linking"
+ "//build/config/win:no_incremental_linking"
}
_windows_linker_configs = [
_default_incremental_linking_config,
"//build/config/win:sdk_link",
"//build/config/win:common_linker_setup",
+
# Default to console-mode apps. Most of our targets are tests and such
# that shouldn't use the windows subsystem.
"//build/config/win:console",
@@ -404,15 +404,15 @@
}
# Executable defaults.
-_executable_configs = _native_compiler_configs + [
- "//build/config:default_libs",
-]
+_executable_configs =
+ _native_compiler_configs + [ "//build/config:default_libs" ]
if (is_win) {
_executable_configs += _windows_linker_configs
} else if (is_mac) {
_executable_configs += [
"//build/config/mac:mac_dynamic_flags",
- "//build/config/mac:mac_executable_flags" ]
+ "//build/config/mac:mac_executable_flags",
+ ]
} else if (is_linux || is_android) {
_executable_configs += [ "//build/config/gcc:executable_ldconfig" ]
if (is_android) {
@@ -429,9 +429,8 @@
}
# Shared library defaults (also for components in component mode).
-_shared_library_configs = _native_compiler_configs + [
- "//build/config:default_libs",
-]
+_shared_library_configs =
+ _native_compiler_configs + [ "//build/config:default_libs" ]
if (is_win) {
_shared_library_configs += _windows_linker_configs
} else if (is_mac) {
@@ -465,7 +464,6 @@
}
}
-
# ==============================================================================
# TOOLCHAIN SETUP
# ==============================================================================
@@ -536,38 +534,91 @@
# the original target may have override it for some assignments.
set_sources_assignment_filter([])
- if (defined(invoker.all_dependent_configs)) { all_dependent_configs = invoker.all_dependent_configs }
- if (defined(invoker.allow_circular_includes_from)) { allow_circular_includes_from = invoker.allow_circular_includes_from }
- if (defined(invoker.cflags)) { cflags = invoker.cflags }
- if (defined(invoker.cflags_c)) { cflags_c = invoker.cflags_c }
- if (defined(invoker.cflags_cc)) { cflags_cc = invoker.cflags_cc }
- if (defined(invoker.cflags_objc)) { cflags_objc = invoker.cflags_objc }
- if (defined(invoker.cflags_objcc)) { cflags_objcc = invoker.cflags_objcc }
- if (defined(invoker.check_includes)) { check_includes = invoker.check_includes }
- if (defined(invoker.data)) { data = invoker.data }
- if (defined(invoker.datadeps)) { datadeps = invoker.datadeps }
- if (defined(invoker.defines)) { defines = invoker.defines }
+ if (defined(invoker.all_dependent_configs)) {
+ all_dependent_configs = invoker.all_dependent_configs
+ }
+ if (defined(invoker.allow_circular_includes_from)) {
+ allow_circular_includes_from = invoker.allow_circular_includes_from
+ }
+ if (defined(invoker.cflags)) {
+ cflags = invoker.cflags
+ }
+ if (defined(invoker.cflags_c)) {
+ cflags_c = invoker.cflags_c
+ }
+ if (defined(invoker.cflags_cc)) {
+ cflags_cc = invoker.cflags_cc
+ }
+ if (defined(invoker.cflags_objc)) {
+ cflags_objc = invoker.cflags_objc
+ }
+ if (defined(invoker.cflags_objcc)) {
+ cflags_objcc = invoker.cflags_objcc
+ }
+ if (defined(invoker.check_includes)) {
+ check_includes = invoker.check_includes
+ }
+ if (defined(invoker.data)) {
+ data = invoker.data
+ }
+ if (defined(invoker.datadeps)) {
+ datadeps = invoker.datadeps
+ }
+ if (defined(invoker.defines)) {
+ defines = invoker.defines
+ }
+
# All shared libraries must have the sanitizer deps to properly link in
# asan mode (this target will be empty in other cases).
if (defined(invoker.deps)) {
deps = invoker.deps + [ "//build/config/sanitizers:deps" ]
} else {
- deps = [ "//build/config/sanitizers:deps" ]
+ deps = [
+ "//build/config/sanitizers:deps",
+ ]
}
- if (defined(invoker.direct_dependent_configs)) { direct_dependent_configs = invoker.direct_dependent_configs }
- if (defined(invoker.forward_dependent_configs_from)) { forward_dependent_configs_from = invoker.forward_dependent_configs_from }
- if (defined(invoker.include_dirs)) { include_dirs = invoker.include_dirs }
- if (defined(invoker.ldflags)) { ldflags = invoker.ldflags }
- if (defined(invoker.lib_dirs)) { lib_dirs = invoker.lib_dirs }
- if (defined(invoker.libs)) { libs = invoker.libs }
- if (defined(invoker.output_extension)) { output_extension = invoker.output_extension }
- if (defined(invoker.output_name)) { output_name = invoker.output_name }
- if (defined(invoker.public)) { public = invoker.public }
- if (defined(invoker.public_configs)) { public_configs = invoker.public_configs }
- if (defined(invoker.public_deps)) { public_deps = invoker.public_deps }
- if (defined(invoker.sources)) { sources = invoker.sources }
- if (defined(invoker.testonly)) { testonly = invoker.testonly }
- if (defined(invoker.visibility)) { visibility = invoker.visibility }
+ if (defined(invoker.direct_dependent_configs)) {
+ direct_dependent_configs = invoker.direct_dependent_configs
+ }
+ if (defined(invoker.forward_dependent_configs_from)) {
+ forward_dependent_configs_from = invoker.forward_dependent_configs_from
+ }
+ if (defined(invoker.include_dirs)) {
+ include_dirs = invoker.include_dirs
+ }
+ if (defined(invoker.ldflags)) {
+ ldflags = invoker.ldflags
+ }
+ if (defined(invoker.lib_dirs)) {
+ lib_dirs = invoker.lib_dirs
+ }
+ if (defined(invoker.libs)) {
+ libs = invoker.libs
+ }
+ if (defined(invoker.output_extension)) {
+ output_extension = invoker.output_extension
+ }
+ if (defined(invoker.output_name)) {
+ output_name = invoker.output_name
+ }
+ if (defined(invoker.public)) {
+ public = invoker.public
+ }
+ if (defined(invoker.public_configs)) {
+ public_configs = invoker.public_configs
+ }
+ if (defined(invoker.public_deps)) {
+ public_deps = invoker.public_deps
+ }
+ if (defined(invoker.sources)) {
+ sources = invoker.sources
+ }
+ if (defined(invoker.testonly)) {
+ testonly = invoker.testonly
+ }
+ if (defined(invoker.visibility)) {
+ visibility = invoker.visibility
+ }
}
} else {
source_set(target_name) {
@@ -578,32 +629,84 @@
# See above call.
set_sources_assignment_filter([])
- if (defined(invoker.all_dependent_configs)) { all_dependent_configs = invoker.all_dependent_configs }
- if (defined(invoker.allow_circular_includes_from)) { allow_circular_includes_from = invoker.allow_circular_includes_from }
- if (defined(invoker.cflags)) { cflags = invoker.cflags }
- if (defined(invoker.cflags_c)) { cflags_c = invoker.cflags_c }
- if (defined(invoker.cflags_cc)) { cflags_cc = invoker.cflags_cc }
- if (defined(invoker.cflags_objc)) { cflags_objc = invoker.cflags_objc }
- if (defined(invoker.cflags_objcc)) { cflags_objcc = invoker.cflags_objcc }
- if (defined(invoker.check_includes)) { check_includes = invoker.check_includes }
- if (defined(invoker.data)) { data = invoker.data }
- if (defined(invoker.datadeps)) { datadeps = invoker.datadeps }
- if (defined(invoker.defines)) { defines = invoker.defines }
- if (defined(invoker.deps)) { deps = invoker.deps }
- if (defined(invoker.direct_dependent_configs)) { direct_dependent_configs = invoker.direct_dependent_configs }
- if (defined(invoker.forward_dependent_configs_from)) { forward_dependent_configs_from = invoker.forward_dependent_configs_from }
- if (defined(invoker.include_dirs)) { include_dirs = invoker.include_dirs }
- if (defined(invoker.ldflags)) { ldflags = invoker.ldflags }
- if (defined(invoker.lib_dirs)) { lib_dirs = invoker.lib_dirs }
- if (defined(invoker.libs)) { libs = invoker.libs }
- if (defined(invoker.output_extension)) { output_extension = invoker.output_extension }
- if (defined(invoker.output_name)) { output_name = invoker.output_name }
- if (defined(invoker.public)) { public = invoker.public }
- if (defined(invoker.public_configs)) { public_configs = invoker.public_configs }
- if (defined(invoker.public_deps)) { public_deps = invoker.public_deps }
- if (defined(invoker.sources)) { sources = invoker.sources }
- if (defined(invoker.testonly)) { testonly = invoker.testonly }
- if (defined(invoker.visibility)) { visibility = invoker.visibility }
+ if (defined(invoker.all_dependent_configs)) {
+ all_dependent_configs = invoker.all_dependent_configs
+ }
+ if (defined(invoker.allow_circular_includes_from)) {
+ allow_circular_includes_from = invoker.allow_circular_includes_from
+ }
+ if (defined(invoker.cflags)) {
+ cflags = invoker.cflags
+ }
+ if (defined(invoker.cflags_c)) {
+ cflags_c = invoker.cflags_c
+ }
+ if (defined(invoker.cflags_cc)) {
+ cflags_cc = invoker.cflags_cc
+ }
+ if (defined(invoker.cflags_objc)) {
+ cflags_objc = invoker.cflags_objc
+ }
+ if (defined(invoker.cflags_objcc)) {
+ cflags_objcc = invoker.cflags_objcc
+ }
+ if (defined(invoker.check_includes)) {
+ check_includes = invoker.check_includes
+ }
+ if (defined(invoker.data)) {
+ data = invoker.data
+ }
+ if (defined(invoker.datadeps)) {
+ datadeps = invoker.datadeps
+ }
+ if (defined(invoker.defines)) {
+ defines = invoker.defines
+ }
+ if (defined(invoker.deps)) {
+ deps = invoker.deps
+ }
+ if (defined(invoker.direct_dependent_configs)) {
+ direct_dependent_configs = invoker.direct_dependent_configs
+ }
+ if (defined(invoker.forward_dependent_configs_from)) {
+ forward_dependent_configs_from = invoker.forward_dependent_configs_from
+ }
+ if (defined(invoker.include_dirs)) {
+ include_dirs = invoker.include_dirs
+ }
+ if (defined(invoker.ldflags)) {
+ ldflags = invoker.ldflags
+ }
+ if (defined(invoker.lib_dirs)) {
+ lib_dirs = invoker.lib_dirs
+ }
+ if (defined(invoker.libs)) {
+ libs = invoker.libs
+ }
+ if (defined(invoker.output_extension)) {
+ output_extension = invoker.output_extension
+ }
+ if (defined(invoker.output_name)) {
+ output_name = invoker.output_name
+ }
+ if (defined(invoker.public)) {
+ public = invoker.public
+ }
+ if (defined(invoker.public_configs)) {
+ public_configs = invoker.public_configs
+ }
+ if (defined(invoker.public_deps)) {
+ public_deps = invoker.public_deps
+ }
+ if (defined(invoker.sources)) {
+ sources = invoker.sources
+ }
+ if (defined(invoker.testonly)) {
+ testonly = invoker.testonly
+ }
+ if (defined(invoker.visibility)) {
+ visibility = invoker.visibility
+ }
}
}
}
@@ -628,31 +731,81 @@
testonly = true
- if (defined(invoker.all_dependent_configs)) { all_dependent_configs = invoker.all_dependent_configs }
- if (defined(invoker.allow_circular_includes_from)) { allow_circular_includes_from = invoker.allow_circular_includes_from }
- if (defined(invoker.cflags)) { cflags = invoker.cflags }
- if (defined(invoker.cflags_c)) { cflags_c = invoker.cflags_c }
- if (defined(invoker.cflags_cc)) { cflags_cc = invoker.cflags_cc }
- if (defined(invoker.cflags_objc)) { cflags_objc = invoker.cflags_objc }
- if (defined(invoker.cflags_objcc)) { cflags_objcc = invoker.cflags_objcc }
- if (defined(invoker.check_includes)) { check_includes = invoker.check_includes }
- if (defined(invoker.data)) { data = invoker.data }
- if (defined(invoker.datadeps)) { datadeps = invoker.datadeps }
- if (defined(invoker.defines)) { defines = invoker.defines }
- if (defined(invoker.deps)) { deps = invoker.deps }
- if (defined(invoker.direct_dependent_configs)) { direct_dependent_configs = invoker.direct_dependent_configs }
- if (defined(invoker.forward_dependent_configs_from)) { forward_dependent_configs_from = invoker.forward_dependent_configs_from }
- if (defined(invoker.include_dirs)) { include_dirs = invoker.include_dirs }
- if (defined(invoker.ldflags)) { ldflags = invoker.ldflags }
- if (defined(invoker.lib_dirs)) { lib_dirs = invoker.lib_dirs }
- if (defined(invoker.libs)) { libs = invoker.libs }
- if (defined(invoker.output_extension)) { output_extension = invoker.output_extension }
- if (defined(invoker.output_name)) { output_name = invoker.output_name }
- if (defined(invoker.public)) { public = invoker.public }
- if (defined(invoker.public_configs)) { public_configs = invoker.public_configs }
- if (defined(invoker.public_deps)) { public_deps = invoker.public_deps }
- if (defined(invoker.sources)) { sources = invoker.sources }
- if (defined(invoker.visibility)) { visibility = invoker.visibility }
+ if (defined(invoker.all_dependent_configs)) {
+ all_dependent_configs = invoker.all_dependent_configs
+ }
+ if (defined(invoker.allow_circular_includes_from)) {
+ allow_circular_includes_from = invoker.allow_circular_includes_from
+ }
+ if (defined(invoker.cflags)) {
+ cflags = invoker.cflags
+ }
+ if (defined(invoker.cflags_c)) {
+ cflags_c = invoker.cflags_c
+ }
+ if (defined(invoker.cflags_cc)) {
+ cflags_cc = invoker.cflags_cc
+ }
+ if (defined(invoker.cflags_objc)) {
+ cflags_objc = invoker.cflags_objc
+ }
+ if (defined(invoker.cflags_objcc)) {
+ cflags_objcc = invoker.cflags_objcc
+ }
+ if (defined(invoker.check_includes)) {
+ check_includes = invoker.check_includes
+ }
+ if (defined(invoker.data)) {
+ data = invoker.data
+ }
+ if (defined(invoker.datadeps)) {
+ datadeps = invoker.datadeps
+ }
+ if (defined(invoker.defines)) {
+ defines = invoker.defines
+ }
+ if (defined(invoker.deps)) {
+ deps = invoker.deps
+ }
+ if (defined(invoker.direct_dependent_configs)) {
+ direct_dependent_configs = invoker.direct_dependent_configs
+ }
+ if (defined(invoker.forward_dependent_configs_from)) {
+ forward_dependent_configs_from = invoker.forward_dependent_configs_from
+ }
+ if (defined(invoker.include_dirs)) {
+ include_dirs = invoker.include_dirs
+ }
+ if (defined(invoker.ldflags)) {
+ ldflags = invoker.ldflags
+ }
+ if (defined(invoker.lib_dirs)) {
+ lib_dirs = invoker.lib_dirs
+ }
+ if (defined(invoker.libs)) {
+ libs = invoker.libs
+ }
+ if (defined(invoker.output_extension)) {
+ output_extension = invoker.output_extension
+ }
+ if (defined(invoker.output_name)) {
+ output_name = invoker.output_name
+ }
+ if (defined(invoker.public)) {
+ public = invoker.public
+ }
+ if (defined(invoker.public_configs)) {
+ public_configs = invoker.public_configs
+ }
+ if (defined(invoker.public_deps)) {
+ public_deps = invoker.public_deps
+ }
+ if (defined(invoker.sources)) {
+ sources = invoker.sources
+ }
+ if (defined(invoker.visibility)) {
+ visibility = invoker.visibility
+ }
}
} else {
executable(target_name) {
@@ -665,37 +818,88 @@
testonly = true
- if (defined(invoker.all_dependent_configs)) { all_dependent_configs = invoker.all_dependent_configs }
- if (defined(invoker.allow_circular_includes_from)) { allow_circular_includes_from = invoker.allow_circular_includes_from }
- if (defined(invoker.cflags)) { cflags = invoker.cflags }
- if (defined(invoker.cflags_c)) { cflags_c = invoker.cflags_c }
- if (defined(invoker.cflags_cc)) { cflags_cc = invoker.cflags_cc }
- if (defined(invoker.cflags_objc)) { cflags_objc = invoker.cflags_objc }
- if (defined(invoker.cflags_objcc)) { cflags_objcc = invoker.cflags_objcc }
- if (defined(invoker.check_includes)) { check_includes = invoker.check_includes }
- if (defined(invoker.data)) { data = invoker.data }
- if (defined(invoker.datadeps)) { datadeps = invoker.datadeps }
- if (defined(invoker.defines)) { defines = invoker.defines }
+ if (defined(invoker.all_dependent_configs)) {
+ all_dependent_configs = invoker.all_dependent_configs
+ }
+ if (defined(invoker.allow_circular_includes_from)) {
+ allow_circular_includes_from = invoker.allow_circular_includes_from
+ }
+ if (defined(invoker.cflags)) {
+ cflags = invoker.cflags
+ }
+ if (defined(invoker.cflags_c)) {
+ cflags_c = invoker.cflags_c
+ }
+ if (defined(invoker.cflags_cc)) {
+ cflags_cc = invoker.cflags_cc
+ }
+ if (defined(invoker.cflags_objc)) {
+ cflags_objc = invoker.cflags_objc
+ }
+ if (defined(invoker.cflags_objcc)) {
+ cflags_objcc = invoker.cflags_objcc
+ }
+ if (defined(invoker.check_includes)) {
+ check_includes = invoker.check_includes
+ }
+ if (defined(invoker.data)) {
+ data = invoker.data
+ }
+ if (defined(invoker.datadeps)) {
+ datadeps = invoker.datadeps
+ }
+ if (defined(invoker.defines)) {
+ defines = invoker.defines
+ }
+
# All shared libraries must have the sanitizer deps to properly link in
# asan mode (this target will be empty in other cases).
if (defined(invoker.deps)) {
deps = invoker.deps + [ "//build/config/sanitizers:deps" ]
} else {
- deps = [ "//build/config/sanitizers:deps" ]
+ deps = [
+ "//build/config/sanitizers:deps",
+ ]
}
- if (defined(invoker.direct_dependent_configs)) { direct_dependent_configs = invoker.direct_dependent_configs }
- if (defined(invoker.forward_dependent_configs_from)) { forward_dependent_configs_from = invoker.forward_dependent_configs_from }
- if (defined(invoker.include_dirs)) { include_dirs = invoker.include_dirs }
- if (defined(invoker.ldflags)) { ldflags = invoker.ldflags }
- if (defined(invoker.lib_dirs)) { lib_dirs = invoker.lib_dirs }
- if (defined(invoker.libs)) { libs = invoker.libs }
- if (defined(invoker.output_extension)) { output_extension = invoker.output_extension }
- if (defined(invoker.output_name)) { output_name = invoker.output_name }
- if (defined(invoker.public)) { public = invoker.public }
- if (defined(invoker.public_configs)) { public_configs = invoker.public_configs }
- if (defined(invoker.public_deps)) { public_deps = invoker.public_deps }
- if (defined(invoker.sources)) { sources = invoker.sources }
- if (defined(invoker.visibility)) { visibility = invoker.visibility }
+ if (defined(invoker.direct_dependent_configs)) {
+ direct_dependent_configs = invoker.direct_dependent_configs
+ }
+ if (defined(invoker.forward_dependent_configs_from)) {
+ forward_dependent_configs_from = invoker.forward_dependent_configs_from
+ }
+ if (defined(invoker.include_dirs)) {
+ include_dirs = invoker.include_dirs
+ }
+ if (defined(invoker.ldflags)) {
+ ldflags = invoker.ldflags
+ }
+ if (defined(invoker.lib_dirs)) {
+ lib_dirs = invoker.lib_dirs
+ }
+ if (defined(invoker.libs)) {
+ libs = invoker.libs
+ }
+ if (defined(invoker.output_extension)) {
+ output_extension = invoker.output_extension
+ }
+ if (defined(invoker.output_name)) {
+ output_name = invoker.output_name
+ }
+ if (defined(invoker.public)) {
+ public = invoker.public
+ }
+ if (defined(invoker.public_configs)) {
+ public_configs = invoker.public_configs
+ }
+ if (defined(invoker.public_deps)) {
+ public_deps = invoker.public_deps
+ }
+ if (defined(invoker.sources)) {
+ sources = invoker.sources
+ }
+ if (defined(invoker.visibility)) {
+ visibility = invoker.visibility
+ }
}
}
}
diff --git a/build/config/allocator.gni b/build/config/allocator.gni
index 2d2fed1..9fcfe49 100644
--- a/build/config/allocator.gni
+++ b/build/config/allocator.gni
@@ -1,7 +1,7 @@
# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-
+
# TODO(GYP): Make tcmalloc work on win.
if (is_android || cpu_arch == "mipsel" || is_mac || is_asan || is_win) {
_default_allocator = "none"
diff --git a/build/config/android/BUILD.gn b/build/config/android/BUILD.gn
index 2528c18..0cc38b7 100644
--- a/build/config/android/BUILD.gn
+++ b/build/config/android/BUILD.gn
@@ -13,9 +13,11 @@
# Need to get some linker flags out of the sysroot.
sysroot_ld_path = rebase_path("//build/config/linux/sysroot_ld_path.py")
ldflags += [ exec_script(sysroot_ld_path,
- [ rebase_path("//build/linux/sysroot_ld_path.sh"), sysroot ],
- "value")
- ]
+ [
+ rebase_path("//build/linux/sysroot_ld_path.sh"),
+ sysroot,
+ ],
+ "value") ]
}
}
diff --git a/build/config/android/config.gni b/build/config/android/config.gni
index ce9a175..e2bd165 100644
--- a/build/config/android/config.gni
+++ b/build/config/android/config.gni
@@ -5,9 +5,10 @@
# This file contains common system config stuff for the Android build.
if (is_android) {
- has_chrome_android_internal = exec_script("//build/dir_exists.py",
- [ rebase_path("//clank", root_build_dir) ],
- "string") == "True"
+ has_chrome_android_internal =
+ exec_script("//build/dir_exists.py",
+ [ rebase_path("//clank", root_build_dir) ],
+ "string") == "True"
if (has_chrome_android_internal) {
import("//clank/config.gni")
@@ -27,7 +28,8 @@
# when this is unset, but builds using the normal chromium build system.
is_android_webview_build = false
- android_default_keystore_path = "//build/android/ant/chromium-debug.keystore"
+ android_default_keystore_path =
+ "//build/android/ant/chromium-debug.keystore"
android_default_keystore_name = "chromiumdebugkey"
android_default_keystore_password = "chromium"
@@ -37,23 +39,6 @@
android_chrome_build_id = "\"\""
}
- # ABI ------------------------------------------------------------------------
-
- if (cpu_arch == "x86") {
- android_app_abi = "x86"
- } else if (cpu_arch == "arm") {
- import("//build/config/arm.gni")
- if (arm_version < 7) {
- android_app_abi = "armeabi"
- } else {
- android_app_abi = "armeabi-v7a"
- }
- } else if (cpu_arch == "mipsel") {
- android_app_abi = "mips"
- } else {
- assert(false, "Unknown Android ABI: " + cpu_arch)
- }
-
# Host stuff -----------------------------------------------------------------
# Defines the name the Android build gives to the current host CPU
@@ -89,7 +74,8 @@
android_sdk = "${android_sdk_root}/platforms/android-${android_sdk_version}"
android_sdk_tools = "${android_sdk_root}/tools"
- android_sdk_build_tools = "${android_sdk_root}/build-tools/$android_sdk_build_tools_version"
+ android_sdk_build_tools =
+ "${android_sdk_root}/build-tools/$android_sdk_build_tools_version"
# Path to the SDK's android.jar
android_sdk_jar = "$android_sdk/android.jar"
@@ -99,16 +85,22 @@
# Subdirectories inside android_ndk_root that contain the sysroot for the
# associated platform.
_android_api_level = 14
- x86_android_sysroot_subdir = "platforms/android-${_android_api_level}/arch-x86"
- arm_android_sysroot_subdir = "platforms/android-${_android_api_level}/arch-arm"
- mips_android_sysroot_subdir = "platforms/android-${_android_api_level}/arch-mips"
+ x86_android_sysroot_subdir =
+ "platforms/android-${_android_api_level}/arch-x86"
+ arm_android_sysroot_subdir =
+ "platforms/android-${_android_api_level}/arch-arm"
+ mips_android_sysroot_subdir =
+ "platforms/android-${_android_api_level}/arch-mips"
# Toolchain root directory for each build. The actual binaries are inside
# a "bin" directory inside of these.
_android_toolchain_version = "4.9"
- x86_android_toolchain_root = "$android_ndk_root/toolchains/x86-${_android_toolchain_version}/prebuilt/${android_host_os}-${android_host_arch}"
- arm_android_toolchain_root = "$android_ndk_root/toolchains/arm-linux-androideabi-${_android_toolchain_version}/prebuilt/${android_host_os}-${android_host_arch}"
- mips_android_toolchain_root = "$android_ndk_root/toolchains/mipsel-linux-android-${_android_toolchain_version}/prebuilt/${android_host_os}-${android_host_arch}"
+ x86_android_toolchain_root =
+ "$android_ndk_root/toolchains/x86-${_android_toolchain_version}/prebuilt/${android_host_os}-${android_host_arch}"
+ arm_android_toolchain_root =
+ "$android_ndk_root/toolchains/arm-linux-androideabi-${_android_toolchain_version}/prebuilt/${android_host_os}-${android_host_arch}"
+ mips_android_toolchain_root =
+ "$android_ndk_root/toolchains/mipsel-linux-android-${_android_toolchain_version}/prebuilt/${android_host_os}-${android_host_arch}"
# Location of libgcc. This is only needed for the current GN toolchain, so we
# only need to define the current one, rather than one for every platform
@@ -118,24 +110,19 @@
_binary_prefix = "i686-linux-android"
android_toolchain_root = "$x86_android_toolchain_root"
android_libgcc_file =
- "$android_toolchain_root/lib/gcc/i686-linux-android/${_android_toolchain_version}/libgcc.a"
+ "$android_toolchain_root/lib/gcc/i686-linux-android/${_android_toolchain_version}/libgcc.a"
} else if (cpu_arch == "arm") {
android_prebuilt_arch = "android-arm"
_binary_prefix = "arm-linux-androideabi"
android_toolchain_root = "$arm_android_toolchain_root"
- if (arm_use_thumb) {
- android_libgcc_file =
- "$android_toolchain_root/lib/gcc/arm-linux-androideabi/${_android_toolchain_version}/thumb/libgcc.a"
- } else {
- android_libgcc_file =
+ android_libgcc_file =
"$android_toolchain_root/lib/gcc/arm-linux-androideabi/${_android_toolchain_version}/libgcc.a"
- }
} else if (cpu_arch == "mipsel") {
android_prebuilt_arch = "android-mips"
_binary_prefix = "mipsel-linux-android"
android_toolchain_root = "$mips_android_toolchain_root"
android_libgcc_file =
- "$android_toolchain_root/lib/gcc/mipsel-linux-android/${_android_toolchain_version}/libgcc.a"
+ "$android_toolchain_root/lib/gcc/mipsel-linux-android/${_android_toolchain_version}/libgcc.a"
} else {
assert(false, "Need android libgcc support for your target arch.")
}
@@ -143,7 +130,8 @@
android_tool_prefix = "$android_toolchain_root/bin/$_binary_prefix-"
android_readelf = "${android_tool_prefix}readelf"
android_objcopy = "${android_tool_prefix}objcopy"
- android_gdbserver = "$android_ndk_root/prebuilt/$android_prebuilt_arch/gdbserver/gdbserver"
+ android_gdbserver =
+ "$android_ndk_root/prebuilt/$android_prebuilt_arch/gdbserver/gdbserver"
# stlport stuff --------------------------------------------------------------
@@ -152,6 +140,23 @@
} else {
android_stlport_library = "stlport_static"
}
+
+ # ABI ------------------------------------------------------------------------
+
+ if (cpu_arch == "x86") {
+ android_app_abi = "x86"
+ } else if (cpu_arch == "arm") {
+ import("//build/config/arm.gni")
+ if (arm_version < 7) {
+ android_app_abi = "armeabi"
+ } else {
+ android_app_abi = "armeabi-v7a"
+ }
+ } else if (cpu_arch == "mipsel") {
+ android_app_abi = "mips"
+ } else {
+ assert(false, "Unknown Android ABI: " + cpu_arch)
+ }
} else {
if (!defined(is_android_webview_build)) {
is_android_webview_build = false
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni
index 0568527..41fd75f 100644
--- a/build/config/android/internal_rules.gni
+++ b/build/config/android/internal_rules.gni
@@ -6,16 +6,18 @@
assert(is_android)
-
rebased_android_sdk = rebase_path(android_sdk, root_build_dir)
rebased_android_sdk_root = rebase_path(android_sdk_root, root_build_dir)
-rebased_android_sdk_build_tools = rebase_path(android_sdk_build_tools, root_build_dir)
+rebased_android_sdk_build_tools =
+ rebase_path(android_sdk_build_tools, root_build_dir)
android_sdk_jar = "$android_sdk/android.jar"
rebased_android_sdk_jar = rebase_path(android_sdk_jar, root_build_dir)
template("android_lint") {
- if (defined(invoker.testonly)) { testonly = invoker.testonly }
+ if (defined(invoker.testonly)) {
+ testonly = invoker.testonly
+ }
jar_path = invoker.jar_path
android_manifest = invoker.android_manifest
@@ -28,35 +30,41 @@
config_path = base_path + "/config.xml"
suppressions_file = "//build/android/lint/suppressions.xml"
inputs = [
- suppressions_file,
- android_manifest,
- jar_path,
- ] + java_files
+ suppressions_file,
+ android_manifest,
+ jar_path,
+ ] + java_files
outputs = [
config_path,
- result_path
+ result_path,
]
rebased_java_files = rebase_path(java_files, root_build_dir)
args = [
"--lint-path=$rebased_android_sdk_root/tools/lint",
- "--config-path", rebase_path(suppressions_file, root_build_dir),
- "--manifest-path", rebase_path(android_manifest, root_build_dir),
+ "--config-path",
+ rebase_path(suppressions_file, root_build_dir),
+ "--manifest-path",
+ rebase_path(android_manifest, root_build_dir),
"--product-dir=.",
- "--jar-path", rebase_path(jar_path, root_build_dir),
- "--processed-config-path", rebase_path(config_path, root_build_dir),
- "--result-path", rebase_path(result_path, root_build_dir),
+ "--jar-path",
+ rebase_path(jar_path, root_build_dir),
+ "--processed-config-path",
+ rebase_path(config_path, root_build_dir),
+ "--result-path",
+ rebase_path(result_path, root_build_dir),
"--java-files=$rebased_java_files",
"--enable",
]
}
}
-
template("dex") {
- if (defined(invoker.testonly)) { testonly = invoker.testonly }
+ if (defined(invoker.testonly)) {
+ testonly = invoker.testonly
+ }
assert(defined(invoker.sources))
assert(defined(invoker.output))
@@ -64,7 +72,10 @@
script = "//build/android/gyp/dex.py"
depfile = "$target_gen_dir/$target_name.d"
sources = invoker.sources
- outputs = [depfile, invoker.output]
+ outputs = [
+ depfile,
+ invoker.output,
+ ]
if (defined(invoker.inputs)) {
inputs = invoker.inputs
}
@@ -76,15 +87,16 @@
rebased_output = rebase_path(invoker.output, root_build_dir)
args = [
- "--depfile", rebase_path(depfile, root_build_dir),
- "--android-sdk-tools", rebased_android_sdk_build_tools,
- "--dex-path", rebased_output,
+ "--depfile",
+ rebase_path(depfile, root_build_dir),
+ "--android-sdk-tools",
+ rebased_android_sdk_build_tools,
+ "--dex-path",
+ rebased_output,
]
if (defined(invoker.no_locals) && invoker.no_locals) {
- args += [
- "--no-locals=1"
- ]
+ args += [ "--no-locals=1" ]
}
if (defined(invoker.args)) {
@@ -95,11 +107,12 @@
}
}
-
# Creates a zip archive of the inputs.
# If base_dir is provided, the archive paths will be relative to it.
template("zip") {
- if (defined(invoker.testonly)) { testonly = invoker.testonly }
+ if (defined(invoker.testonly)) {
+ testonly = invoker.testonly
+ }
assert(defined(invoker.inputs))
assert(defined(invoker.output))
@@ -112,22 +125,23 @@
inputs = invoker.inputs
outputs = [
depfile,
- invoker.output
+ invoker.output,
]
args = [
- "--depfile", rebase_path(depfile, root_build_dir),
+ "--depfile",
+ rebase_path(depfile, root_build_dir),
"--inputs=$rebase_inputs",
"--output=$rebase_output",
]
if (defined(invoker.base_dir)) {
args += [
- "--base-dir", rebase_path(invoker.base_dir, root_build_dir)
+ "--base-dir",
+ rebase_path(invoker.base_dir, root_build_dir),
]
}
}
}
-
# Write the target's .build_config file. This is a json file that contains a
# dictionary of information about how to build this target (things that
# require knowledge about this target's dependencies and cannot be calculated
@@ -138,7 +152,9 @@
# See build/android/gyp/write_build_config.py and
# build/android/gyp/util/build_utils.py:ExpandFileArgs
template("write_build_config") {
- if (defined(invoker.testonly)) { testonly = invoker.testonly }
+ if (defined(invoker.testonly)) {
+ testonly = invoker.testonly
+ }
assert(defined(invoker.type))
assert(defined(invoker.build_config))
@@ -146,7 +162,8 @@
type = invoker.type
build_config = invoker.build_config
- assert(type == "android_apk" || type == "java_library" || type == "android_resources")
+ assert(type == "android_apk" || type == "java_library" ||
+ type == "android_resources")
action(target_name) {
script = "//build/android/gyp/write_build_config.py"
@@ -168,29 +185,33 @@
outputs = [
depfile,
- build_config
+ build_config,
]
args = [
- "--type", type,
- "--depfile", rebase_path(depfile, root_build_dir),
+ "--type",
+ type,
+ "--depfile",
+ rebase_path(depfile, root_build_dir),
"--possible-deps-configs=$rebase_possible_deps_configs",
- "--build-config", rebase_path(build_config, root_build_dir),
+ "--build-config",
+ rebase_path(build_config, root_build_dir),
]
is_java_library = type == "java_library"
is_apk = type == "android_apk"
is_android_resources = type == "android_resources"
- supports_android = (is_apk || is_android_resources ||
- (is_java_library && defined(invoker.supports_android) &&
- invoker.supports_android))
- requires_android = (is_apk || is_android_resources ||
- (is_java_library && defined(invoker.requires_android) &&
- invoker.requires_android))
+ supports_android = is_apk || is_android_resources ||
+ (is_java_library && defined(invoker.supports_android) &&
+ invoker.supports_android)
+ requires_android = is_apk || is_android_resources ||
+ (is_java_library && defined(invoker.requires_android) &&
+ invoker.requires_android)
- assert(!requires_android || supports_android, "requires_android requires" +
- " supports_android")
+ assert(!requires_android || supports_android,
+ "requires_android requires" + " supports_android")
+
# Mark these variables as used.
assert(is_java_library || true)
assert(is_apk || true)
@@ -198,13 +219,15 @@
if (is_java_library || is_apk) {
args += [
- "--jar-path", rebase_path(invoker.jar_path, root_build_dir),
+ "--jar-path",
+ rebase_path(invoker.jar_path, root_build_dir),
]
}
if (is_apk || (is_java_library && supports_android)) {
args += [
- "--dex-path", rebase_path(invoker.dex_path, root_build_dir),
+ "--dex-path",
+ rebase_path(invoker.dex_path, root_build_dir),
]
}
if (supports_android) {
@@ -221,19 +244,20 @@
if (is_android_resources || is_apk) {
assert(defined(invoker.resources_zip))
args += [
- "--resources-zip", rebase_path(invoker.resources_zip, root_build_dir),
+ "--resources-zip",
+ rebase_path(invoker.resources_zip, root_build_dir),
]
if (defined(invoker.android_manifest)) {
- inputs += [
- invoker.android_manifest
- ]
+ inputs += [ invoker.android_manifest ]
args += [
- "--android-manifest", rebase_path(invoker.android_manifest, root_build_dir),
+ "--android-manifest",
+ rebase_path(invoker.android_manifest, root_build_dir),
]
}
if (defined(invoker.custom_package)) {
args += [
- "--package-name", invoker.custom_package
+ "--package-name",
+ invoker.custom_package,
]
}
}
@@ -251,15 +275,17 @@
if (defined(invoker.srcjar)) {
args += [
- "--srcjar", rebase_path(invoker.srcjar, root_build_dir)
+ "--srcjar",
+ rebase_path(invoker.srcjar, root_build_dir),
]
}
}
}
-
template("process_java_prebuilt") {
- if (defined(invoker.testonly)) { testonly = invoker.testonly }
+ if (defined(invoker.testonly)) {
+ testonly = invoker.testonly
+ }
_input_jar_path = invoker.input_jar_path
_output_jar_path = invoker.output_jar_path
@@ -287,19 +313,27 @@
_output_jar_path,
]
args = [
- "--depfile", rebase_path(depfile, root_build_dir),
- "--proguard-path", rebase_path(_proguard_jar_path, root_build_dir),
- "--input-path", rebase_path(_input_jar_path, root_build_dir),
- "--output-path", rebase_path(_output_jar_path, root_build_dir),
- "--proguard-config", rebase_path(_proguard_config_path, root_build_dir),
- "--classpath", rebased_android_sdk_jar,
+ "--depfile",
+ rebase_path(depfile, root_build_dir),
+ "--proguard-path",
+ rebase_path(_proguard_jar_path, root_build_dir),
+ "--input-path",
+ rebase_path(_input_jar_path, root_build_dir),
+ "--output-path",
+ rebase_path(_output_jar_path, root_build_dir),
+ "--proguard-config",
+ rebase_path(_proguard_config_path, root_build_dir),
+ "--classpath",
+ rebased_android_sdk_jar,
"--classpath=@FileArg($_rebased_build_config:javac:classpath)",
]
}
} else {
copy("${target_name}__copy_jar") {
- sources = [_input_jar_path]
- outputs = [_output_jar_path]
+ sources = [
+ _input_jar_path,
+ ]
+ outputs = [ _output_jar_path ]
}
}
@@ -309,28 +343,34 @@
outputs = [
depfile,
_jar_toc_path,
- _jar_toc_path + ".md5.stamp"
+ _jar_toc_path + ".md5.stamp",
]
- inputs = [ _output_jar_path ]
+ inputs = [
+ _output_jar_path,
+ ]
args = [
- "--depfile", rebase_path(depfile, root_build_dir),
- "--jar-path", rebase_path(_output_jar_path, root_build_dir),
- "--toc-path", rebase_path(_jar_toc_path, root_build_dir),
+ "--depfile",
+ rebase_path(depfile, root_build_dir),
+ "--jar-path",
+ rebase_path(_output_jar_path, root_build_dir),
+ "--toc-path",
+ rebase_path(_jar_toc_path, root_build_dir),
]
}
group(target_name) {
deps = [
- ":${target_name}__jar_toc"
+ ":${target_name}__jar_toc",
]
}
}
-
# Packages resources, assets, dex, and native libraries into an apk. Signs and
# zipaligns the apk.
template("create_apk") {
- if (defined(invoker.testonly)) { testonly = invoker.testonly }
+ if (defined(invoker.testonly)) {
+ testonly = invoker.testonly
+ }
_android_manifest = invoker.android_manifest
_base_path = invoker.base_path
@@ -349,7 +389,7 @@
_native_libs_dir = "//build/android/empty/res"
if (defined(invoker.native_libs_dir)) {
- _native_libs_dir = invoker.native_libs_dir
+ _native_libs_dir = invoker.native_libs_dir
}
_asset_location = "//build/android/empty/res"
@@ -364,8 +404,8 @@
_resource_packaged_apk_path = _base_apk_path + ".ap_"
_packaged_apk_path = _base_apk_path + ".unfinished.apk"
- _shared_resources = defined(invoker.shared_resources) && invoker.shared_resources
-
+ _shared_resources =
+ defined(invoker.shared_resources) && invoker.shared_resources
_configuration_name = "Release"
if (is_debug) {
@@ -381,28 +421,35 @@
_android_manifest,
_resources_zip,
]
- outputs = [depfile, _resource_packaged_apk_path]
+ outputs = [
+ depfile,
+ _resource_packaged_apk_path,
+ ]
- _rebased_resources_zips = [rebase_path(_resources_zip, root_build_dir)]
+ _rebased_resources_zips = [ rebase_path(_resources_zip, root_build_dir) ]
args = [
- "--depfile", rebase_path(depfile, root_build_dir),
- "--android-sdk", rebased_android_sdk,
- "--android-sdk-tools", rebased_android_sdk_build_tools,
-
- "--configuration-name=$_configuration_name",
-
- "--android-manifest", rebase_path(_android_manifest, root_build_dir),
- "--version-code", _version_code,
- "--version-name", _version_name,
-
- "--asset-dir", rebase_path(_asset_location, root_build_dir),
- "--resource-zips=$_rebased_resources_zips",
-
- "--apk-path", rebase_path(_resource_packaged_apk_path, root_build_dir),
- ]
+ "--depfile",
+ rebase_path(depfile, root_build_dir),
+ "--android-sdk",
+ rebased_android_sdk,
+ "--android-sdk-tools",
+ rebased_android_sdk_build_tools,
+ "--configuration-name=$_configuration_name",
+ "--android-manifest",
+ rebase_path(_android_manifest, root_build_dir),
+ "--version-code",
+ _version_code,
+ "--version-name",
+ _version_name,
+ "--asset-dir",
+ rebase_path(_asset_location, root_build_dir),
+ "--resource-zips=$_rebased_resources_zips",
+ "--apk-path",
+ rebase_path(_resource_packaged_apk_path, root_build_dir),
+ ]
if (_shared_resources) {
- args += ["--shared-resources"]
+ args += [ "--shared-resources" ]
}
}
@@ -415,7 +462,7 @@
inputs = [
_dex_path,
_resource_packaged_apk_path,
- _ant_script
+ _ant_script,
]
outputs = [
@@ -424,13 +471,14 @@
]
_rebased_emma_jar = ""
- _rebased_resource_packaged_apk_path = rebase_path(
- _resource_packaged_apk_path, root_build_dir)
+ _rebased_resource_packaged_apk_path =
+ rebase_path(_resource_packaged_apk_path, root_build_dir)
_rebased_packaged_apk_path = rebase_path(_packaged_apk_path, root_build_dir)
_rebased_native_libs_dir = rebase_path(_native_libs_dir, root_build_dir)
_rebased_dex_path = rebase_path(_dex_path, root_build_dir)
args = [
- "--depfile", rebase_path(depfile, root_build_dir),
+ "--depfile",
+ rebase_path(depfile, root_build_dir),
"--",
"-quiet",
"-DANDROID_SDK_ROOT=$rebased_android_sdk_root",
@@ -443,9 +491,9 @@
"-DEMMA_INSTRUMENT=0",
"-DEMMA_DEVICE_JAR=$_rebased_emma_jar",
"-DDEX_FILE_PATH=$_rebased_dex_path",
-
"-Dbasedir=.",
- "-buildfile", rebase_path(_ant_script, root_build_dir)
+ "-buildfile",
+ rebase_path(_ant_script, root_build_dir),
]
}
@@ -453,40 +501,57 @@
script = "//build/android/gyp/finalize_apk.py"
depfile = "$target_gen_dir/$target_name.d"
- sources = [_packaged_apk_path]
- inputs = [_keystore_path]
- outputs = [depfile, _final_apk_path]
+ sources = [
+ _packaged_apk_path,
+ ]
+ inputs = [
+ _keystore_path,
+ ]
+ outputs = [
+ depfile,
+ _final_apk_path,
+ ]
args = [
- "--depfile", rebase_path(depfile, root_build_dir),
- "--zipalign-path", rebase_path(zipalign_path, root_build_dir),
- "--unsigned-apk-path", rebase_path(_packaged_apk_path, root_build_dir),
- "--final-apk-path", rebase_path(_final_apk_path, root_build_dir),
- "--key-path", rebase_path(_keystore_path, root_build_dir),
- "--key-name", _keystore_name,
- "--key-passwd", _keystore_password,
+ "--depfile",
+ rebase_path(depfile, root_build_dir),
+ "--zipalign-path",
+ rebase_path(zipalign_path, root_build_dir),
+ "--unsigned-apk-path",
+ rebase_path(_packaged_apk_path, root_build_dir),
+ "--final-apk-path",
+ rebase_path(_final_apk_path, root_build_dir),
+ "--key-path",
+ rebase_path(_keystore_path, root_build_dir),
+ "--key-name",
+ _keystore_name,
+ "--key-passwd",
+ _keystore_password,
]
if (_load_library_from_apk) {
_rezip_jar_path = "$root_build_dir/lib.java/rezip_apk.jar"
- inputs += [
- _rezip_jar_path
- ]
+ inputs += [ _rezip_jar_path ]
args += [
"--load-library-from-zip-file=1",
- "--rezip-apk-jar-path", rebase_path(_rezip_jar_path, root_build_dir)
+ "--rezip-apk-jar-path",
+ rebase_path(_rezip_jar_path, root_build_dir),
]
}
}
group(target_name) {
- deps = [":${target_name}__finalize"]
+ deps = [
+ ":${target_name}__finalize",
+ ]
}
}
template("java_prebuilt_impl") {
- if (defined(invoker.testonly)) { testonly = invoker.testonly }
- _supports_android = (
- defined(invoker.supports_android) && invoker.supports_android)
+ if (defined(invoker.testonly)) {
+ testonly = invoker.testonly
+ }
+ _supports_android =
+ defined(invoker.supports_android) && invoker.supports_android
assert(defined(invoker.jar_path))
_base_path = "${target_gen_dir}/$target_name"
@@ -500,13 +565,12 @@
_final_deps = []
_template_name = target_name
-
_final_deps += [ ":${_template_name}__build_config" ]
write_build_config("${_template_name}__build_config") {
type = "java_library"
supports_android = _supports_android
- requires_android = (defined(invoker.requires_android) &&
- invoker.requires_android)
+ requires_android =
+ defined(invoker.requires_android) && invoker.requires_android
deps = []
if (defined(invoker.deps)) {
@@ -534,7 +598,9 @@
if (_supports_android) {
_final_deps += [ ":${_template_name}__dex" ]
dex("${_template_name}__dex") {
- sources = [_jar_path]
+ sources = [
+ _jar_path,
+ ]
output = _dex_path
}
}
@@ -544,7 +610,6 @@
}
}
-
# Compiles and jars a set of java files.
#
# Outputs:
@@ -561,7 +626,9 @@
# jar_path: Use this to explicitly set the output jar path. Defaults to
# "${target_gen_dir}/${target_name}.jar.
template("compile_java") {
- if (defined(invoker.testonly)) { testonly = invoker.testonly }
+ if (defined(invoker.testonly)) {
+ testonly = invoker.testonly
+ }
assert(defined(invoker.java_files))
assert(defined(invoker.build_config))
@@ -597,6 +664,7 @@
_dep_name = get_label_info(dep, "name")
_java_srcjars += [ "$_dep_gen_dir/$_dep_name.srcjar" ]
}
+
# Mark srcjar_deps as used.
assert(_srcjar_deps == [] || true)
@@ -617,7 +685,7 @@
outputs = [
depfile,
_intermediate_jar_path,
- _intermediate_jar_path + ".md5.stamp"
+ _intermediate_jar_path + ".md5.stamp",
]
sources = _java_files + _java_srcjars
inputs = _system_jars + [ _build_config ]
@@ -657,12 +725,14 @@
}
}
-
template("java_library_impl") {
- if (defined(invoker.testonly)) { testonly = invoker.testonly }
+ if (defined(invoker.testonly)) {
+ testonly = invoker.testonly
+ }
- assert(defined(invoker.java_files) || defined(invoker.DEPRECATED_java_in_dir)
- || defined(invoker.srcjars) || defined(invoker.srcjar_deps))
+ assert(
+ defined(invoker.java_files) || defined(invoker.DEPRECATED_java_in_dir) ||
+ defined(invoker.srcjars) || defined(invoker.srcjar_deps))
_base_path = "$target_gen_dir/$target_name"
_jar_path = _base_path + ".jar"
if (defined(invoker.jar_path)) {
@@ -676,10 +746,10 @@
_final_datadeps = invoker.datadeps
}
- _supports_android = (defined(invoker.supports_android) &&
- invoker.supports_android)
- _requires_android = (defined(invoker.requires_android) &&
- invoker.requires_android)
+ _supports_android =
+ defined(invoker.supports_android) && invoker.supports_android
+ _requires_android =
+ defined(invoker.requires_android) && invoker.requires_android
if (_supports_android) {
_dex_path = _base_path + ".dex.jar"
@@ -697,8 +767,8 @@
type = "java_library"
supports_android = _supports_android
requires_android = _requires_android
- bypass_platform_checks = (defined(invoker.bypass_platform_checks) &&
- invoker.bypass_platform_checks)
+ bypass_platform_checks = defined(invoker.bypass_platform_checks) &&
+ invoker.bypass_platform_checks
deps = []
if (defined(invoker.deps)) {
@@ -734,21 +804,20 @@
} else if (defined(invoker.DEPRECATED_java_in_dir)) {
_src_dir = invoker.DEPRECATED_java_in_dir + "/src"
_src_dir_exists = exec_script("//build/dir_exists.py",
- [ rebase_path(_src_dir, root_build_dir) ],
- "string")
+ [ rebase_path(_src_dir, root_build_dir) ],
+ "string")
assert(_src_dir_exists == "False",
- "In GN, java_in_dir should be the fully specified java directory " +
- "(i.e. including the trailing \"/src\")")
+ "In GN, java_in_dir should be the fully specified java directory " +
+ "(i.e. including the trailing \"/src\")")
_java_files_build_rel = exec_script(
- "//build/android/gyp/find.py",
- [
- "--pattern",
- "*.java",
- rebase_path(invoker.DEPRECATED_java_in_dir, root_build_dir)
- ],
- "list lines"
- )
+ "//build/android/gyp/find.py",
+ [
+ "--pattern",
+ "*.java",
+ rebase_path(invoker.DEPRECATED_java_in_dir, root_build_dir),
+ ],
+ "list lines")
_java_files = rebase_path(_java_files_build_rel, ".", root_build_dir)
}
assert(_java_files != [] || _srcjar_deps != [] || _srcjars != [])
@@ -763,10 +832,18 @@
chromium_code = _chromium_code
android = _requires_android
- if (defined(invoker.jar_excluded_patterns)) { jar_excluded_patterns = invoker.jar_excluded_patterns }
- if (defined(invoker.proguard_preprocess)) { proguard_preprocess = invoker.proguard_preprocess }
- if (defined(invoker.proguard_config)) { proguard_config = invoker.proguard_config }
- if (defined(invoker.dist_jar_path)) { dist_jar_path = invoker.dist_jar_path }
+ if (defined(invoker.jar_excluded_patterns)) {
+ jar_excluded_patterns = invoker.jar_excluded_patterns
+ }
+ if (defined(invoker.proguard_preprocess)) {
+ proguard_preprocess = invoker.proguard_preprocess
+ }
+ if (defined(invoker.proguard_config)) {
+ proguard_config = invoker.proguard_config
+ }
+ if (defined(invoker.dist_jar_path)) {
+ dist_jar_path = invoker.dist_jar_path
+ }
}
if (defined(invoker.main_class)) {
@@ -775,18 +852,24 @@
script = "//build/android/gyp/create_java_binary_script.py"
depfile = "$target_gen_dir/$target_name.d"
java_script = "$root_build_dir/bin/$_template_name"
- inputs = [ _build_config ]
+ inputs = [
+ _build_config,
+ ]
outputs = [
depfile,
java_script,
]
_rebased_build_config = rebase_path(_build_config, root_build_dir)
args = [
- "--depfile", rebase_path(depfile, root_build_dir),
- "--output", rebase_path(java_script, root_build_dir),
+ "--depfile",
+ rebase_path(depfile, root_build_dir),
+ "--output",
+ rebase_path(java_script, root_build_dir),
"--classpath=@FileArg($_rebased_build_config:java:full_classpath)",
- "--jar-path", rebase_path(_jar_path, root_build_dir),
- "--main-class", invoker.main_class,
+ "--jar-path",
+ rebase_path(_jar_path, root_build_dir),
+ "--main-class",
+ invoker.main_class,
]
}
}
@@ -808,21 +891,39 @@
_final_deps += [ ":${_template_name}__dex" ]
dex("${_template_name}__dex") {
- sources = [_jar_path]
+ sources = [
+ _jar_path,
+ ]
output = _dex_path
}
+
+ if (defined(invoker.standalone_dex_path)) {
+ _final_deps += [ ":${_template_name}__standalone_dex" ]
+ _rebased_build_config = rebase_path(_build_config, root_build_dir)
+ dex("${_template_name}__standalone_dex") {
+ sources = [_jar_path]
+ inputs = [_build_config]
+ output = invoker.standalone_dex_path
+ dex_arg_key = "${_rebased_build_config}:final_dex:dependency_dex_files"
+ args = [ "--inputs=@FileArg($dex_arg_key)" ]
+ }
+ }
}
group(target_name) {
+ if (defined(invoker.visibility)) {
+ visibility = invoker.visibility
+ }
deps = _final_deps
datadeps = _final_datadeps
}
}
-
# Runs process_resources.py
template("process_resources") {
- if (defined(invoker.testonly)) { testonly = invoker.testonly }
+ if (defined(invoker.testonly)) {
+ testonly = invoker.testonly
+ }
zip_path = invoker.zip_path
srcjar_path = invoker.srcjar_path
@@ -845,11 +946,9 @@
srcjar_path,
]
- sources_build_rel = exec_script(
- "//build/android/gyp/find.py",
- rebase_path(resource_dirs, root_build_dir),
- "list lines"
- )
+ sources_build_rel = exec_script("//build/android/gyp/find.py",
+ rebase_path(resource_dirs, root_build_dir),
+ "list lines")
sources = rebase_path(sources_build_rel, ".", root_build_dir)
inputs = [
@@ -860,15 +959,19 @@
rebase_resource_dirs = rebase_path(resource_dirs, root_build_dir)
rebase_build_config = rebase_path(build_config, root_build_dir)
args = [
- "--depfile", rebase_path(depfile, root_build_dir),
- "--android-sdk", rebase_path(android_sdk, root_build_dir),
- "--android-sdk-tools", rebase_path(android_sdk_build_tools, root_build_dir),
- "--android-manifest", rebase_path(android_manifest, root_build_dir),
-
+ "--depfile",
+ rebase_path(depfile, root_build_dir),
+ "--android-sdk",
+ rebase_path(android_sdk, root_build_dir),
+ "--android-sdk-tools",
+ rebase_path(android_sdk_build_tools, root_build_dir),
+ "--android-manifest",
+ rebase_path(android_manifest, root_build_dir),
"--resource-dirs=$rebase_resource_dirs",
- "--srcjar-out", rebase_path(srcjar_path, root_build_dir),
- "--resource-zip-out", rebase_path(zip_path, root_build_dir),
-
+ "--srcjar-out",
+ rebase_path(srcjar_path, root_build_dir),
+ "--resource-zip-out",
+ rebase_path(zip_path, root_build_dir),
"--dependencies-res-zips=@FileArg($rebase_build_config:resources:dependency_zips)",
"--extra-res-packages=@FileArg($rebase_build_config:resources:extra_package_names)",
]
@@ -879,24 +982,25 @@
if (defined(invoker.custom_package)) {
args += [
- "--custom-package", invoker.custom_package,
+ "--custom-package",
+ invoker.custom_package,
]
}
if (defined(invoker.v14_verify_only) && invoker.v14_verify_only) {
- args += ["--v14-verify-only"]
+ args += [ "--v14-verify-only" ]
}
- if (defined(invoker.shared_resources) &&
- invoker.shared_resources) {
- args += ["--shared-resources"]
+ if (defined(invoker.shared_resources) && invoker.shared_resources) {
+ args += [ "--shared-resources" ]
}
if (defined(invoker.all_resources_zip_path)) {
all_resources_zip = invoker.all_resources_zip_path
outputs += [ all_resources_zip ]
args += [
- "--all-resources-zip-out", rebase_path(all_resources_zip, root_build_dir)
+ "--all-resources-zip-out",
+ rebase_path(all_resources_zip, root_build_dir),
]
}
@@ -907,12 +1011,16 @@
}
template("copy_ex") {
- if (defined(invoker.testonly)) { testonly = invoker.testonly }
+ if (defined(invoker.testonly)) {
+ testonly = invoker.testonly
+ }
action(target_name) {
script = "//build/android/gyp/copy_ex.py"
- if (defined(invoker.deps)) { deps = invoker.deps }
+ if (defined(invoker.deps)) {
+ deps = invoker.deps
+ }
sources = []
if (defined(invoker.sources)) {
@@ -925,19 +1033,19 @@
}
depfile = "$target_gen_dir/$target_name.d"
- outputs = [
- depfile,
- ]
+ outputs = [ depfile ]
args = [
- "--depfile", rebase_path(depfile, root_build_dir),
- "--dest", rebase_path(invoker.dest, root_build_dir),
+ "--depfile",
+ rebase_path(depfile, root_build_dir),
+ "--dest",
+ rebase_path(invoker.dest, root_build_dir),
]
rebased_sources = rebase_path(sources, root_build_dir)
args += [ "--files=$rebased_sources" ]
if (defined(invoker.clear_dir) && invoker.clear_dir) {
- args += ["--clear"]
+ args += [ "--clear" ]
}
if (defined(invoker.args)) {
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni
index 938a090..d1342ac 100644
--- a/build/config/android/rules.gni
+++ b/build/config/android/rules.gni
@@ -30,7 +30,9 @@
# jni_package = "foo"
# }
template("generate_jni") {
- if (defined(invoker.testonly)) { testonly = invoker.testonly }
+ if (defined(invoker.testonly)) {
+ testonly = invoker.testonly
+ }
assert(defined(invoker.sources))
assert(defined(invoker.jni_package))
@@ -46,23 +48,29 @@
script = "//base/android/jni_generator/jni_generator.py"
depfile = "$target_gen_dir/$target_name.{{source_name_part}}.d"
sources = invoker.sources
- inputs = [ jni_generator_include ]
+ inputs = [
+ jni_generator_include,
+ ]
outputs = [
depfile,
- "${jni_output_dir}/{{source_name_part}}_jni.h"
+ "${jni_output_dir}/{{source_name_part}}_jni.h",
]
args = [
- "--depfile", rebase_path(depfile, root_build_dir),
+ "--depfile",
+ rebase_path(depfile, root_build_dir),
"--input_file={{source}}",
"--optimize_generation=1",
"--ptr_type=long",
- "--output_dir", rebase_path(jni_output_dir, root_build_dir),
- "--includes", rebase_path(jni_generator_include, "//"),
+ "--output_dir",
+ rebase_path(jni_output_dir, root_build_dir),
+ "--includes",
+ rebase_path(jni_generator_include, "//"),
]
if (defined(invoker.jni_generator_jarjar_file)) {
args += [
- "--jarjar", rebase_path(jni_generator_jarjar_file, root_build_dir),
+ "--jarjar",
+ rebase_path(jni_generator_jarjar_file, root_build_dir),
]
}
}
@@ -78,7 +86,9 @@
}
group(target_name) {
- deps = [ ":$foreach_target_name" ]
+ deps = [
+ ":$foreach_target_name",
+ ]
public_configs = [ ":jni_includes_${target_name}" ]
if (defined(invoker.deps)) {
@@ -88,11 +98,12 @@
public_deps = invoker.public_deps
}
- if (defined(invoker.visibility)) { visibility = invoker.visibility }
+ if (defined(invoker.visibility)) {
+ visibility = invoker.visibility
+ }
}
}
-
# Declare a jni target for a prebuilt jar
#
# This target generates the native jni bindings for a set of classes in a .jar.
@@ -117,7 +128,9 @@
# jni_package = "foo"
# }
template("generate_jar_jni") {
- if (defined(invoker.testonly)) { testonly = invoker.testonly }
+ if (defined(invoker.testonly)) {
+ testonly = invoker.testonly
+ }
assert(defined(invoker.classes))
assert(defined(invoker.jni_package))
@@ -139,8 +152,7 @@
jni_actions = []
foreach(class, invoker.classes) {
_classname_list = []
- _classname_list = process_file_template(
- [class], "{{source_name_part}}")
+ _classname_list = process_file_template([ class ], "{{source_name_part}}")
classname = _classname_list[0]
jni_target_name = "${target_name}__jni_${classname}"
jni_actions += [ ":$jni_target_name" ]
@@ -153,17 +165,22 @@
]
outputs = [
depfile,
- "${jni_output_dir}/${classname}_jni.h"
+ "${jni_output_dir}/${classname}_jni.h",
]
args = [
- "--depfile", rebase_path(depfile, root_build_dir),
- "--jar_file", rebase_path(jar_file, root_build_dir),
- "--input_file", class,
+ "--depfile",
+ rebase_path(depfile, root_build_dir),
+ "--jar_file",
+ rebase_path(jar_file, root_build_dir),
+ "--input_file",
+ class,
"--optimize_generation=1",
"--ptr_type=long",
- "--output_dir", rebase_path(jni_output_dir, root_build_dir),
- "--includes", rebase_path(jni_generator_include, root_build_dir),
+ "--output_dir",
+ rebase_path(jni_output_dir, root_build_dir),
+ "--includes",
+ rebase_path(jni_generator_include, root_build_dir),
]
}
}
@@ -184,7 +201,6 @@
}
}
-
# Declare a target for c-preprocessor-generated java files
#
# NOTE: For generating Java conterparts to enums prefer using the java_cpp_enum
@@ -221,7 +237,9 @@
# include_path = "android/java/templates"
# }
template("java_cpp_template") {
- if (defined(invoker.testonly)) { testonly = invoker.testonly }
+ if (defined(invoker.testonly)) {
+ testonly = invoker.testonly
+ }
assert(defined(invoker.sources))
package_name = invoker.package_name + ""
@@ -241,24 +259,31 @@
sources = invoker.sources
- gen_dir = "${target_gen_dir}/${target_name}/java_cpp_template/${package_name}"
+ gen_dir =
+ "${target_gen_dir}/${target_name}/java_cpp_template/${package_name}"
gcc_template_output_pattern = "${gen_dir}/{{source_name_part}}.java"
outputs = [
depfile,
- gcc_template_output_pattern
+ gcc_template_output_pattern,
]
args = [
- "--depfile", rebase_path(depfile, root_build_dir),
- "--include-path", rebase_path(include_path, root_build_dir),
- "--output", rebase_path(gen_dir, root_build_dir) + "/{{source_name_part}}.java",
+ "--depfile",
+ rebase_path(depfile, root_build_dir),
+ "--include-path",
+ rebase_path(include_path, root_build_dir),
+ "--output",
+ rebase_path(gen_dir, root_build_dir) + "/{{source_name_part}}.java",
"--template={{source}}",
]
if (defined(invoker.defines)) {
foreach(def, invoker.defines) {
- args += ["--defines", def]
+ args += [
+ "--defines",
+ def,
+ ]
}
}
}
@@ -275,7 +300,7 @@
group(target_name) {
deps = [
- ":${target_name}__zip_srcjar"
+ ":${target_name}__zip_srcjar",
]
}
}
@@ -308,7 +333,9 @@
# ]
# }
template("java_cpp_enum") {
- if (defined(invoker.testonly)) { testonly = invoker.testonly }
+ if (defined(invoker.testonly)) {
+ testonly = invoker.testonly
+ }
assert(defined(invoker.sources))
assert(defined(invoker.outputs))
@@ -317,21 +344,25 @@
sources = invoker.sources
script = "//build/android/gyp/java_cpp_enum.py"
gen_dir = "${target_gen_dir}/${target_name}/enums"
- outputs = get_path_info(
- rebase_path(invoker.outputs, ".", gen_dir), "abspath")
+ outputs =
+ get_path_info(rebase_path(invoker.outputs, ".", gen_dir), "abspath")
args = [
- "--output_dir", rebase_path(gen_dir, root_build_dir),
+ "--output_dir",
+ rebase_path(gen_dir, root_build_dir),
]
foreach(output, rebase_path(outputs, root_build_dir)) {
- args += ["--assert_file", output]
+ args += [
+ "--assert_file",
+ output,
+ ]
}
args += rebase_path(invoker.sources, root_build_dir)
}
generate_enum_outputs = get_target_outputs(":${target_name}__generate_enum")
- base_gen_dir = get_label_info(":${target_name}__generate_enum",
- "target_gen_dir")
+ base_gen_dir =
+ get_label_info(":${target_name}__generate_enum", "target_gen_dir")
srcjar_path = "${target_gen_dir}/${target_name}.srcjar"
zip("${target_name}__zip_srcjar") {
@@ -342,7 +373,7 @@
group(target_name) {
deps = [
- ":${target_name}__zip_srcjar"
+ ":${target_name}__zip_srcjar",
]
}
}
@@ -361,13 +392,17 @@
# output = "$target_gen_dir/AndroidManifest.xml"
# }
template("jinja_template") {
- if (defined(invoker.testonly)) { testonly = invoker.testonly }
+ if (defined(invoker.testonly)) {
+ testonly = invoker.testonly
+ }
assert(defined(invoker.input))
assert(defined(invoker.output))
action(target_name) {
- sources = [invoker.input]
+ sources = [
+ invoker.input,
+ ]
script = "//build/android/gyp/jinja_template.py"
depfile = "$target_gen_dir/$target_name.d"
@@ -377,13 +412,16 @@
]
args = [
- "--inputs", rebase_path(invoker.input, root_build_dir),
- "--output", rebase_path(invoker.output, root_build_dir),
- "--depfile", rebase_path(depfile, root_build_dir),
+ "--inputs",
+ rebase_path(invoker.input, root_build_dir),
+ "--output",
+ rebase_path(invoker.output, root_build_dir),
+ "--depfile",
+ rebase_path(depfile, root_build_dir),
]
if (defined(invoker.variables)) {
variables = invoker.variables
- args += ["--variables=${variables}" ]
+ args += [ "--variables=${variables}" ]
}
}
}
@@ -410,7 +448,9 @@
# variables = ["color=red"]
# }
template("jinja_template_resources") {
- if (defined(invoker.testonly)) { testonly = invoker.testonly }
+ if (defined(invoker.testonly)) {
+ testonly = invoker.testonly
+ }
assert(defined(invoker.resources))
assert(defined(invoker.res_dir))
@@ -438,13 +478,16 @@
rebased_resources = rebase_path(invoker.resources, root_build_dir)
args = [
"--inputs=${rebased_resources}",
- "--inputs-base-dir", rebase_path(invoker.res_dir, root_build_dir),
- "--outputs-zip", rebase_path(_resources_zip, root_build_dir),
- "--depfile", rebase_path(depfile, root_build_dir),
+ "--inputs-base-dir",
+ rebase_path(invoker.res_dir, root_build_dir),
+ "--outputs-zip",
+ rebase_path(_resources_zip, root_build_dir),
+ "--depfile",
+ rebase_path(depfile, root_build_dir),
]
if (defined(invoker.variables)) {
variables = invoker.variables
- args += ["--variables=${variables}" ]
+ args += [ "--variables=${variables}" ]
}
}
@@ -487,7 +530,9 @@
# custom_package = "org.chromium.foo"
# }
template("android_resources") {
- if (defined(invoker.testonly)) { testonly = invoker.testonly }
+ if (defined(invoker.testonly)) {
+ testonly = invoker.testonly
+ }
assert(defined(invoker.resource_dirs))
assert(defined(invoker.android_manifest) || defined(invoker.custom_package))
@@ -501,9 +546,15 @@
type = "android_resources"
resources_zip = zip_path
srcjar = srcjar_path
- if (defined(invoker.deps)) { deps = invoker.deps }
- if (defined(invoker.android_manifest)) { android_manifest = invoker.android_manifest }
- if (defined(invoker.custom_package)) { custom_package = invoker.custom_package }
+ if (defined(invoker.deps)) {
+ deps = invoker.deps
+ }
+ if (defined(invoker.android_manifest)) {
+ android_manifest = invoker.android_manifest
+ }
+ if (defined(invoker.custom_package)) {
+ custom_package = invoker.custom_package
+ }
}
android_manifest = "//build/android/AndroidManifest.xml"
@@ -534,7 +585,6 @@
}
}
-
# Declare a target that generates localized strings.xml from a .grd file.
#
# If this target is included in the deps of an android resources/library/apk,
@@ -550,7 +600,9 @@
# grd_file = "foo_strings.grd"
# }
template("java_strings_grd") {
- if (defined(invoker.testonly)) { testonly = invoker.testonly }
+ if (defined(invoker.testonly)) {
+ testonly = invoker.testonly
+ }
base_path = "$target_gen_dir/$target_name"
resources_zip = base_path + ".resources.zip"
@@ -570,7 +622,8 @@
grit_output_dir = "$target_gen_dir/$extra_output_path"
grit(grit_target_name) {
grit_flags = [
- "-E", "ANDROID_JAVA_TAGGED_ONLY=false",
+ "-E",
+ "ANDROID_JAVA_TAGGED_ONLY=false",
]
output_dir = grit_output_dir
resource_ids = ""
@@ -613,7 +666,9 @@
# ]
# }
template("java_strings_grd_prebuilt") {
- if (defined(invoker.testonly)) { testonly = invoker.testonly }
+ if (defined(invoker.testonly)) {
+ testonly = invoker.testonly
+ }
base_path = "$target_gen_dir/$target_name"
resources_zip = base_path + ".resources.zip"
@@ -673,21 +728,38 @@
# TODO(cjhopman): This should not act like a java_library for dependents (i.e.
# dependents shouldn't get the jar in their classpath, etc.).
java_library_impl(target_name) {
- if (defined(invoker.DEPRECATED_java_in_dir)) { DEPRECATED_java_in_dir = invoker.DEPRECATED_java_in_dir }
- if (defined(invoker.chromium_code)) { chromium_code = invoker.chromium_code }
- if (defined(invoker.datadeps)) { deps = invoker.datadeps }
- if (defined(invoker.deps)) { deps = invoker.deps }
- if (defined(invoker.java_files)) { java_files = invoker.java_files }
- if (defined(invoker.srcjar_deps)) { srcjar_deps = invoker.srcjar_deps }
- if (defined(invoker.srcjars)) { srcjars = invoker.srcjars }
- if (defined(invoker.bypass_platform_checks)) { bypass_platform_checks = invoker.bypass_platform_checks }
- if (defined(invoker.testonly)) { testonly = invoker.testonly }
+ if (defined(invoker.DEPRECATED_java_in_dir)) {
+ DEPRECATED_java_in_dir = invoker.DEPRECATED_java_in_dir
+ }
+ if (defined(invoker.chromium_code)) {
+ chromium_code = invoker.chromium_code
+ }
+ if (defined(invoker.datadeps)) {
+ deps = invoker.datadeps
+ }
+ if (defined(invoker.deps)) {
+ deps = invoker.deps
+ }
+ if (defined(invoker.java_files)) {
+ java_files = invoker.java_files
+ }
+ if (defined(invoker.srcjar_deps)) {
+ srcjar_deps = invoker.srcjar_deps
+ }
+ if (defined(invoker.srcjars)) {
+ srcjars = invoker.srcjars
+ }
+ if (defined(invoker.bypass_platform_checks)) {
+ bypass_platform_checks = invoker.bypass_platform_checks
+ }
+ if (defined(invoker.testonly)) {
+ testonly = invoker.testonly
+ }
main_class = invoker.main_class
}
}
-
# Declare an java library target
#
# Variables
@@ -739,19 +811,45 @@
# }
template("java_library") {
java_library_impl(target_name) {
- if (defined(invoker.DEPRECATED_java_in_dir)) { DEPRECATED_java_in_dir = invoker.DEPRECATED_java_in_dir }
- if (defined(invoker.chromium_code)) { chromium_code = invoker.chromium_code }
- if (defined(invoker.datadeps)) { deps = invoker.datadeps }
- if (defined(invoker.deps)) { deps = invoker.deps }
- if (defined(invoker.jar_excluded_patterns)) { jar_excluded_patterns = invoker.jar_excluded_patterns }
- if (defined(invoker.java_files)) { java_files = invoker.java_files }
- if (defined(invoker.proguard_config)) { proguard_config = invoker.proguard_config }
- if (defined(invoker.proguard_preprocess)) { proguard_preprocess = invoker.proguard_preprocess }
- if (defined(invoker.srcjar_deps)) { srcjar_deps = invoker.srcjar_deps }
- if (defined(invoker.srcjars)) { srcjars = invoker.srcjars }
- if (defined(invoker.bypass_platform_checks)) { bypass_platform_checks = invoker.bypass_platform_checks }
- if (defined(invoker.testonly)) { testonly = invoker.testonly }
- if (defined(invoker.jar_path)) { jar_path = invoker.jar_path }
+ if (defined(invoker.DEPRECATED_java_in_dir)) {
+ DEPRECATED_java_in_dir = invoker.DEPRECATED_java_in_dir
+ }
+ if (defined(invoker.chromium_code)) {
+ chromium_code = invoker.chromium_code
+ }
+ if (defined(invoker.datadeps)) {
+ deps = invoker.datadeps
+ }
+ if (defined(invoker.deps)) {
+ deps = invoker.deps
+ }
+ if (defined(invoker.jar_excluded_patterns)) {
+ jar_excluded_patterns = invoker.jar_excluded_patterns
+ }
+ if (defined(invoker.java_files)) {
+ java_files = invoker.java_files
+ }
+ if (defined(invoker.proguard_config)) {
+ proguard_config = invoker.proguard_config
+ }
+ if (defined(invoker.proguard_preprocess)) {
+ proguard_preprocess = invoker.proguard_preprocess
+ }
+ if (defined(invoker.srcjar_deps)) {
+ srcjar_deps = invoker.srcjar_deps
+ }
+ if (defined(invoker.srcjars)) {
+ srcjars = invoker.srcjars
+ }
+ if (defined(invoker.bypass_platform_checks)) {
+ bypass_platform_checks = invoker.bypass_platform_checks
+ }
+ if (defined(invoker.testonly)) {
+ testonly = invoker.testonly
+ }
+ if (defined(invoker.jar_path)) {
+ jar_path = invoker.jar_path
+ }
if (defined(invoker.supports_android) && invoker.supports_android) {
supports_android = true
@@ -759,7 +857,6 @@
}
}
-
# Declare an java library target for a prebuilt jar
#
# Variables
@@ -781,10 +878,18 @@
template("java_prebuilt") {
java_prebuilt_impl(target_name) {
jar_path = invoker.jar_path
- if (defined(invoker.testonly)) { testonly = invoker.testonly }
- if (defined(invoker.deps)) { deps = invoker.deps }
- if (defined(invoker.proguard_config)) { proguard_config = invoker.proguard_config }
- if (defined(invoker.proguard_preprocess)) { proguard_preprocess = invoker.proguard_preprocess }
+ if (defined(invoker.testonly)) {
+ testonly = invoker.testonly
+ }
+ if (defined(invoker.deps)) {
+ deps = invoker.deps
+ }
+ if (defined(invoker.proguard_config)) {
+ proguard_config = invoker.proguard_config
+ }
+ if (defined(invoker.proguard_preprocess)) {
+ proguard_preprocess = invoker.proguard_preprocess
+ }
}
}
@@ -815,6 +920,11 @@
# be used to remove unwanted parts of the library.
# proguard_config: Path to the proguard config for preprocessing.
#
+# dex_path: If set, the resulting .dex.jar file will be placed under this
+# path.
+# standalone_dex_path: If set, a standalone .dex.jar containing the code from
+# the library and all dependencies will be placed under this path.
+#
#
# Example
# android_library("foo_java") {
@@ -835,28 +945,62 @@
# }
template("android_library") {
assert(!defined(invoker.jar_path),
- "android_library does not support a custom jar path")
+ "android_library does not support a custom jar path")
java_library_impl(target_name) {
- if (defined(invoker.DEPRECATED_java_in_dir)) { DEPRECATED_java_in_dir = invoker.DEPRECATED_java_in_dir }
- if (defined(invoker.chromium_code)) { chromium_code = invoker.chromium_code }
- if (defined(invoker.datadeps)) { deps = invoker.datadeps }
- if (defined(invoker.deps)) { deps = invoker.deps }
- if (defined(invoker.jar_excluded_patterns)) { jar_excluded_patterns = invoker.jar_excluded_patterns }
- if (defined(invoker.java_files)) { java_files = invoker.java_files }
- if (defined(invoker.proguard_config)) { proguard_config = invoker.proguard_config }
- if (defined(invoker.proguard_preprocess)) { proguard_preprocess = invoker.proguard_preprocess }
- if (defined(invoker.srcjar_deps)) { srcjar_deps = invoker.srcjar_deps }
- if (defined(invoker.srcjars)) { srcjars = invoker.srcjars }
- if (defined(invoker.testonly)) { testonly = invoker.testonly }
- if (defined(invoker.dex_path)) { dex_path = invoker.dex_path }
+ if (defined(invoker.DEPRECATED_java_in_dir)) {
+ DEPRECATED_java_in_dir = invoker.DEPRECATED_java_in_dir
+ }
+ if (defined(invoker.chromium_code)) {
+ chromium_code = invoker.chromium_code
+ }
+ if (defined(invoker.datadeps)) {
+ deps = invoker.datadeps
+ }
+ if (defined(invoker.deps)) {
+ deps = invoker.deps
+ }
+ if (defined(invoker.jar_excluded_patterns)) {
+ jar_excluded_patterns = invoker.jar_excluded_patterns
+ }
+ if (defined(invoker.java_files)) {
+ java_files = invoker.java_files
+ }
+ if (defined(invoker.proguard_config)) {
+ proguard_config = invoker.proguard_config
+ }
+ if (defined(invoker.proguard_preprocess)) {
+ proguard_preprocess = invoker.proguard_preprocess
+ }
+ if (defined(invoker.srcjar_deps)) {
+ srcjar_deps = invoker.srcjar_deps
+ }
+ if (defined(invoker.srcjars)) {
+ srcjars = invoker.srcjars
+ }
+ if (defined(invoker.testonly)) {
+ testonly = invoker.testonly
+ }
+ if (defined(invoker.visibility)) {
+ visibility = invoker.visibility
+ }
+ if (defined(invoker.dex_path)) {
+ dex_path = invoker.dex_path
+ }
+ if (defined(invoker.standalone_dex_path)) {
+ standalone_dex_path = invoker.standalone_dex_path
+ }
supports_android = true
requires_android = true
- if (!defined(jar_excluded_patterns)) { jar_excluded_patterns = [] }
+ if (!defined(jar_excluded_patterns)) {
+ jar_excluded_patterns = []
+ }
jar_excluded_patterns += [
- "*/R.class", "*/R##*.class",
- "*/Manifest.class", "*/Manifest##*.class",
+ "*/R.class",
+ "*/R##*.class",
+ "*/Manifest.class",
+ "*/Manifest##*.class",
]
}
}
@@ -888,15 +1032,21 @@
jar_path = invoker.jar_path
supports_android = true
requires_android = true
- if (defined(invoker.testonly)) { testonly = invoker.testonly }
- if (defined(invoker.deps)) { deps = invoker.deps }
- if (defined(invoker.proguard_config)) { proguard_config = invoker.proguard_config }
- if (defined(invoker.proguard_preprocess)) { proguard_preprocess = invoker.proguard_preprocess }
+ if (defined(invoker.testonly)) {
+ testonly = invoker.testonly
+ }
+ if (defined(invoker.deps)) {
+ deps = invoker.deps
+ }
+ if (defined(invoker.proguard_config)) {
+ proguard_config = invoker.proguard_config
+ }
+ if (defined(invoker.proguard_preprocess)) {
+ proguard_preprocess = invoker.proguard_preprocess
+ }
}
}
-
-
# Declare an Android apk target
#
# This target creates an Android APK containing java code, resources, assets,
@@ -946,7 +1096,9 @@
# ]
# }
template("android_apk") {
- if (defined(invoker.testonly)) { testonly = invoker.testonly }
+ if (defined(invoker.testonly)) {
+ testonly = invoker.testonly
+ }
assert(defined(invoker.final_apk_path) || defined(invoker.apk_name))
gen_dir = "$target_gen_dir/$target_name"
@@ -963,10 +1115,10 @@
} else if (defined(invoker.apk_name)) {
_final_apk_path = "$root_build_dir/apks/" + invoker.apk_name + ".apk"
}
- _dist_jar_path_list = process_file_template(
- [ _final_apk_path ],
- "$root_build_dir/test.lib.java/{{source_name_part}}.jar"
- )
+ _dist_jar_path_list =
+ process_file_template(
+ [ _final_apk_path ],
+ "$root_build_dir/test.lib.java/{{source_name_part}}.jar")
_dist_jar_path = _dist_jar_path_list[0]
_native_libs = []
@@ -991,35 +1143,35 @@
if (defined(invoker.native_libs)) {
_use_chromium_linker = false
if (defined(invoker.use_chromium_linker)) {
- _use_chromium_linker = (invoker.use_chromium_linker &&
- chromium_linker_supported)
+ _use_chromium_linker =
+ invoker.use_chromium_linker && chromium_linker_supported
}
if (defined(invoker.load_library_from_apk) &&
invoker.load_library_from_apk) {
_load_library_from_apk = true
- assert(_use_chromium_linker, "Loading library from the apk requires use" +
- " of the Chromium linker.")
+ assert(_use_chromium_linker,
+ "Loading library from the apk requires use" +
+ " of the Chromium linker.")
}
_enable_relocation_packing = false
if (defined(invoker.enable_relocation_packing) &&
invoker.enable_relocation_packing) {
_enable_relocation_packing = relocation_packing_supported
- assert(_use_chromium_linker, "Relocation packing requires use of the" +
- " Chromium linker.")
+ assert(_use_chromium_linker,
+ "Relocation packing requires use of the" + " Chromium linker.")
}
_native_libs = process_file_template(
- invoker.native_libs,
- "$root_build_dir/lib.stripped/{{source_file_part}}")
+ invoker.native_libs,
+ "$root_build_dir/lib.stripped/{{source_file_part}}")
_native_libs_dir = base_path + "/libs"
if (_use_chromium_linker) {
- _native_libs += [
- "$root_build_dir/lib.stripped/libchromium_android_linker.so"
- ]
+ _native_libs +=
+ [ "$root_build_dir/lib.stripped/libchromium_android_linker.so" ]
}
_enable_relocation_packing = false
@@ -1046,16 +1198,16 @@
final_deps = []
- final_deps += [":${_template_name}__process_resources"]
+ final_deps += [ ":${_template_name}__process_resources" ]
process_resources("${_template_name}__process_resources") {
srcjar_path = "${target_gen_dir}/${target_name}.srcjar"
android_manifest = invoker.android_manifest
- resource_dirs = ["//build/android/ant/empty/res"]
+ resource_dirs = [ "//build/android/ant/empty/res" ]
zip_path = resources_zip_path
generate_constant_ids = true
build_config = _build_config
}
- _srcjar_deps += [":${_template_name}__process_resources"]
+ _srcjar_deps += [ ":${_template_name}__process_resources" ]
if (_native_libs != []) {
_enable_chromium_linker_tests = false
@@ -1076,17 +1228,17 @@
defines = [
"NATIVE_LIBRARIES_LIST=" +
- "@FileArg($_rebased_build_config:native:java_libraries_list)",
+ "@FileArg($_rebased_build_config:native:java_libraries_list)",
"NATIVE_LIBRARIES_VERSION_NUMBER=\"$_native_lib_version_name\"",
]
if (_use_chromium_linker) {
- defines += ["ENABLE_CHROMIUM_LINKER"]
+ defines += [ "ENABLE_CHROMIUM_LINKER" ]
}
if (_load_library_from_apk) {
- defines += ["ENABLE_CHROMIUM_LINKER_LIBRARY_IN_ZIP_FILE"]
+ defines += [ "ENABLE_CHROMIUM_LINKER_LIBRARY_IN_ZIP_FILE" ]
}
if (_enable_chromium_linker_tests) {
- defines += ["ENABLE_CHROMIUM_LINKER_TESTS"]
+ defines += [ "ENABLE_CHROMIUM_LINKER_TESTS" ]
}
}
_srcjar_deps += [ ":${_template_name}__native_libraries_java" ]
@@ -1112,37 +1264,46 @@
if (_dist_jar_path != "") {
final_deps += [ ":${_template_name}__create_dist_jar" ]
+
# TODO(cjhopman): This is only ever needed to calculate the list of tests to
# run. See build/android/pylib/instrumentation/test_jar.py. We should be
# able to just do that calculation at build time instead.
action("${_template_name}__create_dist_jar") {
script = "//build/android/gyp/create_dist_jar.py"
depfile = "$target_gen_dir/$target_name.d"
- inputs = [ _build_config ]
+ inputs = [
+ _build_config,
+ ]
outputs = [
depfile,
_dist_jar_path,
]
args = [
- "--depfile", rebase_path(depfile, root_build_dir),
- "--output", rebase_path(_dist_jar_path, root_build_dir),
+ "--depfile",
+ rebase_path(depfile, root_build_dir),
+ "--output",
+ rebase_path(_dist_jar_path, root_build_dir),
"--inputs=@FileArg($_rebased_build_config:dist_jar:dependency_jars)",
]
inputs += [ jar_path ]
_rebased_jar_path = rebase_path([ jar_path ], root_build_dir)
- args += [
- "--inputs=$_rebased_jar_path",
- ]
+ args += [ "--inputs=$_rebased_jar_path" ]
}
}
- final_deps += [":${_template_name}__final_dex"]
+ final_deps += [ ":${_template_name}__final_dex" ]
dex("${_template_name}__final_dex") {
- deps = [ ":${_template_name}__java" ]
- sources = [ jar_path ]
- inputs = [ _build_config ]
+ deps = [
+ ":${_template_name}__java",
+ ]
+ sources = [
+ jar_path,
+ ]
+ inputs = [
+ _build_config,
+ ]
output = final_dex_path
- dex_arg_key = "${_rebased_build_config}:apk_dex:dependency_dex_files"
+ dex_arg_key = "${_rebased_build_config}:final_dex:dependency_dex_files"
args = [ "--inputs=@FileArg($dex_arg_key)" ]
}
@@ -1151,11 +1312,9 @@
script = "//build/android/gyp/pack_arm_relocations.py"
packed_libraries_dir = "$_native_libs_dir/$android_app_abi"
depfile = "$target_gen_dir/$target_name.d"
- outputs = [
- depfile
- ]
+ outputs = [ depfile ]
inputs = [
- _build_config
+ _build_config,
]
deps = []
skip_packing_list = [
@@ -1166,35 +1325,36 @@
enable_packing_arg = 0
if (_enable_relocation_packing) {
enable_packing_arg = 1
- deps += [
- relocation_packer_target
- ]
+ deps += [ relocation_packer_target ]
}
args = [
- "--depfile", rebase_path(depfile, root_build_dir),
+ "--depfile",
+ rebase_path(depfile, root_build_dir),
"--enable-packing=$enable_packing_arg",
"--has-relocations-with-addends=$relocations_have_addends",
"--exclude-packing-list=$skip_packing_list",
- "--android-pack-relocations", rebase_path(relocation_packer_exe, root_build_dir),
- "--android-objcopy", rebase_path(android_objcopy, root_build_dir),
- "--stripped-libraries-dir", rebase_path(root_build_dir, root_build_dir),
- "--packed-libraries-dir", rebase_path(packed_libraries_dir, root_build_dir),
+ "--android-pack-relocations",
+ rebase_path(relocation_packer_exe, root_build_dir),
+ "--android-objcopy",
+ rebase_path(android_objcopy, root_build_dir),
+ "--stripped-libraries-dir",
+ rebase_path(root_build_dir, root_build_dir),
+ "--packed-libraries-dir",
+ rebase_path(packed_libraries_dir, root_build_dir),
"--libraries=@FileArg(${_rebased_build_config}:native:libraries)",
- "--clear-dir"
+ "--clear-dir",
]
if (is_debug) {
rebased_gdbserver = rebase_path([ android_gdbserver ], root_build_dir)
inputs += [ android_gdbserver ]
- args += [
- "--libraries=$rebased_gdbserver"
- ]
+ args += [ "--libraries=$rebased_gdbserver" ]
}
}
}
- final_deps += [":${_template_name}__create"]
+ final_deps += [ ":${_template_name}__create" ]
create_apk("${_template_name}__create") {
apk_path = _final_apk_path
android_manifest = invoker.android_manifest
@@ -1212,17 +1372,25 @@
version_name = invoker.version_name
}
- if (defined(invoker.asset_location)) {
- asset_location = invoker.asset_location
- }
-
keystore_name = _keystore_name
keystore_path = _keystore_path
keystore_password = _keystore_password
+ deps = []
+ if (defined(invoker.asset_location)) {
+ asset_location = invoker.asset_location
+
+ # We don't know the exact dependencies that create the assets in
+ # |asset_location|; we depend on all caller deps until a better solution
+ # is figured out (http://crbug.com/433330).
+ if (defined(invoker.deps)) {
+ deps += invoker.deps
+ }
+ }
+
if (_native_libs != []) {
native_libs_dir = _native_libs_dir
- deps = [":${_template_name}__prepare_native"]
+ deps += [ ":${_template_name}__prepare_native" ]
}
}
@@ -1235,7 +1403,6 @@
}
}
-
# Declare an Android gtest apk
#
# This target creates an Android apk for running gtest-based unittests.
@@ -1273,12 +1440,13 @@
android_apk(target_name) {
_apk_name = test_suite_name
final_apk_path = "$root_build_dir/${_apk_name}_apk/${_apk_name}-debug.apk"
- java_files = [
- "//testing/android/java/src/org/chromium/native_test/ChromeNativeTestActivity.java"
- ]
+ java_files =
+ [ "//testing/android/java/src/org/chromium/native_test/ChromeNativeTestActivity.java" ]
android_manifest = "//testing/android/java/AndroidManifest.xml"
native_libs = [ unittests_binary ]
- deps = [ "//base:base_java" ]
+ deps = [
+ "//base:base_java",
+ ]
if (defined(invoker.deps)) {
deps += invoker.deps
}
@@ -1309,7 +1477,9 @@
# ]
# }
template("android_aidl") {
- if (defined(invoker.testonly)) { testonly = invoker.testonly }
+ if (defined(invoker.testonly)) {
+ testonly = invoker.testonly
+ }
srcjar_path = "${target_gen_dir}/${target_name}.srcjar"
aidl_path = "${android_sdk_build_tools}/aidl"
@@ -1325,35 +1495,35 @@
imports += [ invoker.interface_file ]
}
- inputs = [
- aidl_path,
- ] + imports
+ inputs = [ aidl_path ] + imports
depfile = "${target_gen_dir}/${target_name}.d"
outputs = [
depfile,
- srcjar_path
+ srcjar_path,
]
rebased_imports = rebase_path(imports, root_build_dir)
args = [
- "--depfile", rebase_path(depfile, root_build_dir),
- "--aidl-path", rebase_path(aidl_path, root_build_dir),
+ "--depfile",
+ rebase_path(depfile, root_build_dir),
+ "--aidl-path",
+ rebase_path(aidl_path, root_build_dir),
"--imports=$rebased_imports",
- "--srcjar", rebase_path(srcjar_path, root_build_dir),
+ "--srcjar",
+ rebase_path(srcjar_path, root_build_dir),
]
if (defined(invoker.import_include) && invoker.import_include != "") {
# TODO(cjhopman): aidl supports creating a depfile. We should be able to
# switch to constructing a depfile for the overall action from that
# instead of having all the .java files in the include paths as inputs.
- rebased_import_includes = rebase_path(
- [invoker.import_include], root_build_dir)
+ rebased_import_includes =
+ rebase_path([ invoker.import_include ], root_build_dir)
args += [ "--includes=$rebased_import_includes" ]
- _java_files_build_rel = exec_script(
- "//build/android/gyp/find.py",
- rebase_path([invoker.import_include], root_build_dir),
- "list lines"
- )
+ _java_files_build_rel =
+ exec_script("//build/android/gyp/find.py",
+ rebase_path([ invoker.import_include ], root_build_dir),
+ "list lines")
_java_files = rebase_path(_java_files_build_rel, ".", root_build_dir)
inputs += _java_files
}
@@ -1382,14 +1552,17 @@
# binary = "$root_build_dir/exe.stripped/foo"
# }
template("create_native_executable_dist") {
- if (defined(invoker.testonly)) { testonly = invoker.testonly }
+ if (defined(invoker.testonly)) {
+ testonly = invoker.testonly
+ }
dist_dir = invoker.dist_dir
binary = invoker.binary
final_deps = []
template_name = target_name
- libraries_list = "${target_gen_dir}/${template_name}_library_dependencies.list"
+ libraries_list =
+ "${target_gen_dir}/${template_name}_library_dependencies.list"
# TODO(gyp)
#'dependencies': [
@@ -1411,11 +1584,15 @@
]
rebased_binaries = rebase_path([ binary ], root_build_dir)
args = [
- "--depfile", rebase_path(depfile, root_build_dir),
+ "--depfile",
+ rebase_path(depfile, root_build_dir),
"--input-libraries=$rebased_binaries",
- "--libraries-dir", rebase_path(stripped_libraries_dir, root_build_dir),
- "--output", rebase_path(libraries_list, root_build_dir),
- "--readelf", rebase_path(android_readelf, root_build_dir),
+ "--libraries-dir",
+ rebase_path(stripped_libraries_dir, root_build_dir),
+ "--output",
+ rebase_path(libraries_list, root_build_dir),
+ "--readelf",
+ rebase_path(android_readelf, root_build_dir),
]
}
@@ -1424,7 +1601,7 @@
clear_dir = true
inputs = [
binary,
- libraries_list
+ libraries_list,
]
dest = dist_dir
rebased_binaries_list = rebase_path([ binary ], root_build_dir)
@@ -1440,7 +1617,6 @@
}
}
-
# Compile a protocol buffer to java.
#
# This generates java files from protocol buffers and creates an Android library
@@ -1467,7 +1643,7 @@
srcjar_path = "$target_gen_dir/$target_name.srcjar"
script = "//build/protoc_java.py"
deps = [
- _protoc_dep
+ _protoc_dep,
]
sources = invoker.sources
depfile = "$target_gen_dir/$target_name.d"
@@ -1476,11 +1652,15 @@
srcjar_path,
]
args = [
- "--depfile", rebase_path(depfile, root_build_dir),
- "--protoc", rebase_path(_protoc_bin, root_build_dir),
- "--proto-path", rebase_path(_proto_path, root_build_dir),
- "--srcjar", rebase_path(srcjar_path, root_build_dir),
- ] + rebase_path(sources, root_build_dir)
+ "--depfile",
+ rebase_path(depfile, root_build_dir),
+ "--protoc",
+ rebase_path(_protoc_bin, root_build_dir),
+ "--proto-path",
+ rebase_path(_proto_path, root_build_dir),
+ "--srcjar",
+ rebase_path(srcjar_path, root_build_dir),
+ ] + rebase_path(sources, root_build_dir)
}
android_library(target_name) {
@@ -1494,7 +1674,9 @@
# TODO(GYP): implement this.
template("uiautomator_test") {
- if (defined(invoker.testonly)) { testonly = invoker.testonly }
+ if (defined(invoker.testonly)) {
+ testonly = invoker.testonly
+ }
assert(target_name != "")
assert(invoker.deps != [] || true)
group(target_name) {
diff --git a/build/config/arm.gni b/build/config/arm.gni
index 59de668..d942c3b 100644
--- a/build/config/arm.gni
+++ b/build/config/arm.gni
@@ -22,10 +22,8 @@
arm_use_neon = true
}
- assert(arm_float_abi == "" ||
- arm_float_abi == "hard" ||
- arm_float_abi == "soft" ||
- arm_float_abi == "softfp")
+ assert(arm_float_abi == "" || arm_float_abi == "hard" ||
+ arm_float_abi == "soft" || arm_float_abi == "softfp")
if (is_android) {
arm_use_neon = false
@@ -41,10 +39,10 @@
arm_float_abi = "softfp"
}
arm_fpu = "vfp"
+
# Thumb is a reduced instruction set available on some ARM processors that
# has increased code density.
arm_use_thumb = false
-
} else if (arm_version == 7) {
arm_arch = "armv7-a"
if (arm_tune == "") {
diff --git a/build/config/clang/BUILD.gn b/build/config/clang/BUILD.gn
index 00fb9e0..39fe251 100644
--- a/build/config/clang/BUILD.gn
+++ b/build/config/clang/BUILD.gn
@@ -7,23 +7,26 @@
config("find_bad_constructs") {
if (clang_use_chrome_plugins) {
cflags = [
- "-Xclang", "-load",
+ "-Xclang",
+ "-load",
"-Xclang",
]
if (is_mac || is_ios) {
cflags += [ rebase_path(
- "//third_party/llvm-build/Release+Asserts/lib/libFindBadConstructs.dylib",
- root_build_dir) ]
+ "//third_party/llvm-build/Release+Asserts/lib/libFindBadConstructs.dylib",
+ root_build_dir) ]
} else if (is_linux) {
cflags += [ rebase_path(
- "//third_party/llvm-build/Release+Asserts/lib/libFindBadConstructs.so",
- root_build_dir) ]
+ "//third_party/llvm-build/Release+Asserts/lib/libFindBadConstructs.so",
+ root_build_dir) ]
}
cflags += [
- "-Xclang", "-add-plugin",
- "-Xclang", "find-bad-constructs",
+ "-Xclang",
+ "-add-plugin",
+ "-Xclang",
+ "find-bad-constructs",
]
}
}
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index ae12eda..81269d6 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -10,6 +10,8 @@
import("//build/config/gcc/gcc_version.gni")
}
+import("//build/toolchain/ccache.gni")
+
declare_args() {
# Normally, Android builds are lightly optimized, even for debug builds, to
# keep binary size down. Setting this flag to true disables such optimization
@@ -20,6 +22,17 @@
# only two architectures that are currently checked in). Turn this off when
# you are using a custom toolchain and need to control -B in cflags.
linux_use_bundled_binutils = is_linux && cpu_arch == "x64"
+
+ # Compile in such a way as to enable profiling of the generated code. For
+ # example, don't omit the frame pointer and leave in symbols.
+ enable_profiling = false
+
+ # Compile in such a way as to make it possible for the profiler to unwind full
+ # stack frames. Setting this flag has a large effect on the performance of the
+ # generated code than just setting profiling, but gives the profiler more
+ # information to analyze.
+ # Requires profiling to be set to true.
+ enable_full_stack_frames_for_profiling = false
}
use_gold = is_linux && cpu_arch == "x64"
@@ -30,7 +43,7 @@
# with some utilities such as icecc and ccache. Requires gold and
# gcc >= 4.8 or clang.
# http://gcc.gnu.org/wiki/DebugFission
- use_debug_fission = use_gold && linux_use_bundled_binutils
+ use_debug_fission = use_gold && linux_use_bundled_binutils && !use_ccache
}
# default_include_dirs ---------------------------------------------------------
@@ -77,19 +90,16 @@
"/FS", # Preserve previous PDB behavior.
]
if (is_component_build) {
- cflags += [
- "/EHsc", # Assume C functions can't throw exceptions and don't catch
- # structured exceptions (only C++ ones).
- ]
+ cflags += [ "/EHsc" ] # Assume C functions can't throw exceptions and don't catch
+ # structured exceptions (only C++ ones).
}
} else {
# Common GCC compiler flags setup.
# --------------------------------
- cflags += [
- "-fno-strict-aliasing", # See http://crbug.com/32204
- ]
+ cflags += [ "-fno-strict-aliasing" ] # See http://crbug.com/32204
cflags_cc += [
"-fno-threadsafe-statics",
+
# Not exporting C++ inline functions can generally be applied anywhere
# so we do so here. Normal function visibility is controlled by
# //build/config/gcc:symbol_visibility_hidden.
@@ -100,7 +110,10 @@
if (is_mac) {
cflags += [ "-fstack-protector-all" ]
} else if (is_linux) {
- cflags += [ "-fstack-protector", "--param=ssp-buffer-size=4" ]
+ cflags += [
+ "-fstack-protector",
+ "--param=ssp-buffer-size=4",
+ ]
}
# Linker warnings.
@@ -142,11 +155,10 @@
# when turning clang on or off. (defines are passed via the command line,
# and build system rebuild things when their commandline changes). Nothing
# should ever read this define.
- defines += [
- "CR_CLANG_REVISION=" +
- exec_script(
- "//tools/clang/scripts/posix-print-revision.py", [], "value")
- ]
+ defines += [ "CR_CLANG_REVISION=" +
+ exec_script("//tools/clang/scripts/posix-print-revision.py",
+ [],
+ "value") ]
}
# Mac-specific compiler flags setup.
@@ -157,16 +169,22 @@
# CPU architecture.
if (cpu_arch == "x64") {
- common_mac_flags += [ "-arch", "x86_64" ]
+ common_mac_flags += [
+ "-arch",
+ "x86_64",
+ ]
} else if (cpu_arch == "x86") {
- common_mac_flags += [ "-arch", "i386" ]
+ common_mac_flags += [
+ "-arch",
+ "i386",
+ ]
}
cflags += common_mac_flags
# Without this, the constructors and destructors of a C++ object inside
# an Objective C struct won't be called, which is very bad.
- cflags_objcc = [ "-fobjc-call-cxx-cdtors", ]
+ cflags_objcc = [ "-fobjc-call-cxx-cdtors" ]
cflags_c += [ "-std=c99" ]
cflags_cc += [ "-std=gnu++11" ]
@@ -176,15 +194,35 @@
# Non-Mac Posix compiler flags setup.
# -----------------------------------
if (gcc_version >= 48) {
- cflags_cc += [
- "-std=gnu++11",
+ cflags_cc += [ "-std=gnu++11" ]
+ }
+
+ if (enable_profiling && !is_debug) {
+ # The GYP build spams this define into every compilation unit, as we do
+ # here, but it only appears to be used in base and a couple other places.
+ # TODO(abarth): Should we move this define closer to where it's used?
+ defines += [ "ENABLE_PROFILING" ]
+
+ cflags += [
+ "-fno-omit-frame-pointer",
+ "-g",
]
+
+ if (enable_full_stack_frames_for_profiling) {
+ cflags += [
+ "-fno-inline",
+ "-fno-optimize-sibling-calls",
+ ]
+ }
}
# CPU architecture. We may or may not be doing a cross compile now, so for
# simplicity we always explicitly set the architecture.
if (cpu_arch == "x64") {
- cflags += [ "-m64", "-march=x86-64", ]
+ cflags += [
+ "-m64",
+ "-march=x86-64",
+ ]
ldflags += [ "-m64" ]
} else if (cpu_arch == "x86") {
cflags += [ "-m32" ]
@@ -194,6 +232,7 @@
# Else building libyuv gives clang's register allocator issues,
# see llvm.org/PR15798 / crbug.com/233709
"-momit-leaf-frame-pointer",
+
# Align the stack on 16-byte boundaries, http://crbug.com/418554.
"-mstack-alignment=16",
"-mstackrealign",
@@ -225,6 +264,7 @@
# compiler (r5-r7). This can be verified using
# webkit_unit_tests' WTF.Checked_int8_t test.
"-fno-tree-sra",
+
# The following option is disabled to improve binary
# size and performance in gcc 4.9.
"-fno-caller-saves",
@@ -267,9 +307,7 @@
# ------------------------------------
if (is_linux) {
cflags += [ "-pthread" ]
- ldflags += [
- "-pthread",
- ]
+ ldflags += [ "-pthread" ]
}
if (use_gold) {
# Use gold for linking on 64-bit Linux only (on 32-bit it runs out of
@@ -308,12 +346,8 @@
# Clang-specific compiler flags setup.
# ------------------------------------
if (is_clang) {
- cflags += [
- "-fcolor-diagnostics",
- ]
- cflags_cc += [
- "-std=gnu++11",
- ]
+ cflags += [ "-fcolor-diagnostics" ]
+ cflags_cc += [ "-std=gnu++11" ]
}
# Android-specific flags setup.
@@ -326,9 +360,7 @@
]
if (!is_clang) {
# Clang doesn't support these flags.
- cflags += [
- "-finline-limit=64",
- ]
+ cflags += [ "-finline-limit=64" ]
}
if (is_android_webview_build) {
# Android predefines this as 1; undefine it here so Chromium can redefine
@@ -359,13 +391,14 @@
ldflags += [ "-fuse-ld=gold" ]
if (is_clang) {
# Let clang find the ld.gold in the NDK.
- ldflags += [ "--gcc-toolchain=" + rebase_path(android_toolchain_root,
- root_build_dir) ]
+ ldflags += [ "--gcc-toolchain=" +
+ rebase_path(android_toolchain_root, root_build_dir) ]
}
}
ldflags += [
"-Wl,--no-undefined",
+
# Don't export symbols from statically linked libraries.
"-Wl,--exclude-libs=ALL",
]
@@ -378,9 +411,7 @@
if (is_clang) {
if (cpu_arch == "arm") {
- cflags += [
- "-target arm-linux-androideabi",
- ]
+ cflags += [ "-target arm-linux-androideabi" ]
ldflags += [ "-target arm-linux-androideabi" ]
} else if (cpu_arch == "x86") {
cflags += [ "-target x86-linux-androideabi" ]
@@ -392,9 +423,7 @@
config("compiler_arm_fpu") {
if (cpu_arch == "arm" && !is_android_webview_build) {
- cflags = [
- "-mfpu=$arm_fpu",
- ]
+ cflags = [ "-mfpu=$arm_fpu" ]
}
}
@@ -481,15 +510,9 @@
# caution.
android_stlport_root = "$android_ndk_root/sources/cxx-stl/stlport"
- cflags += [
- "-isystem" + rebase_path("$android_stlport_root/stlport",
- root_build_dir)
- ]
- if (arm_use_thumb) {
- lib_dirs += [ "$android_stlport_root/libs/$android_app_abi/thumb" ]
- } else {
- lib_dirs += [ "$android_stlport_root/libs/$android_app_abi" ]
- }
+ cflags += [ "-isystem" +
+ rebase_path("$android_stlport_root/stlport", root_build_dir) ]
+ lib_dirs += [ "$android_stlport_root/libs/$android_app_abi" ]
if (component_mode == "shared_library") {
libs += [ "stlport_shared" ]
@@ -518,7 +541,6 @@
"dl",
"m",
]
-
}
}
@@ -529,9 +551,7 @@
config("chromium_code") {
if (is_win) {
- cflags = [
- "/W4", # Warning level 4.
- ]
+ cflags = [ "/W4" ] # Warning level 4.
} else {
cflags = [
"-Wall",
@@ -629,8 +649,7 @@
config("default_warnings") {
if (is_win) {
cflags = [
- "/WX", # Treat warnings as errors.
-
+ "/WX", # Treat warnings as errors.
# Warnings permanently disabled:
# TODO(GYP) The GYP build doesn't have this globally enabled but disabled
@@ -685,8 +704,6 @@
# have to turn off this warning (and be careful about how object
# destruction happens in such cases).
"/wd4611",
-
-
# Warnings to evaluate and possibly fix/reenable later:
"/wd4100", # Unreferenced formal function parameter.
@@ -713,9 +730,7 @@
cflags_cc = []
if (is_mac) {
- cflags += [
- "-Wnewline-eof",
- ]
+ cflags += [ "-Wnewline-eof" ]
}
if (is_clang) {
@@ -753,6 +768,7 @@
cflags_cc += [
# See comment for -Wno-c++11-narrowing.
"-Wno-narrowing",
+
# TODO(thakis): Remove, http://crbug.com/263960
"-Wno-literal-suffix",
]
@@ -779,6 +795,7 @@
# correctly when building with the Android build system.
# TODO(torne): Fix this in WebKit.
"-Wno-error=c++0x-compat",
+
# Other things unrelated to -Wextra:
"-Wno-non-virtual-dtor",
"-Wno-sign-promo",
@@ -789,9 +806,7 @@
# Don't warn about the "typedef 'foo' locally defined but not used"
# for gcc 4.8.
# TODO: remove this flag once all builds work. See crbug.com/227506
- cflags += [
- "-Wno-unused-local-typedefs",
- ]
+ cflags += [ "-Wno-unused-local-typedefs" ]
}
}
}
@@ -822,7 +837,7 @@
"/O2",
"/Ob2", # both explicit and auto inlining.
"/Oy-", # disable omitting frame pointers, must be after /o2.
- "/Os", # favor size over speed.
+ "/Os", # favor size over speed.
]
common_optimize_on_ldflags = []
} else {
@@ -830,6 +845,7 @@
# Don't emit the GCC version ident directives, they just end up in the
# .comment section taking up binary size.
"-fno-ident",
+
# Put data and code in their own sections, so that unused symbols
# can be removed at link time with --gc-sections.
"-fdata-sections",
@@ -850,9 +866,7 @@
if (is_mac) {
if (symbol_level == 2) {
# Mac dead code stripping requires symbols.
- common_optimize_on_ldflags += [
- "-Wl,-dead_strip",
- ]
+ common_optimize_on_ldflags += [ "-Wl,-dead_strip" ]
}
} else {
# Non-Mac Posix linker flags.
@@ -871,17 +885,11 @@
cflags = common_optimize_on_cflags
ldflags = common_optimize_on_ldflags
if (is_win) {
- cflags += [
- "/Os", # favor size over speed.
- ]
+ cflags += [ "/Os" ] # favor size over speed.
} else if (is_android || is_ios) {
- cflags += [
- "-Os", # Favor size over speed.
- ]
+ cflags += [ "-Os" ] # Favor size over speed.
} else {
- cflags += [
- "-O2",
- ]
+ cflags += [ "-O2" ]
}
}
@@ -917,32 +925,25 @@
cflags = common_optimize_on_cflags
ldflags = common_optimize_on_ldflags
if (is_win) {
- cflags -= [
- "/Os",
- ]
- cflags += [
- "/Ot", # Favor speed over size.
- ]
+ cflags -= [ "/Os" ]
+ cflags += [ "/Ot" ] # Favor speed over size.
if (is_official_build) {
# TODO(GYP): TODO(dpranke): Should these only be on in an official
# build, or on all the time? For now we'll require official build so
# that the compile is clean.
cflags += [
- "/GL", # Whole program optimization.
+ "/GL", # Whole program optimization.
+
# Disable Warning 4702 ("Unreachable code") for the WPO/PGO builds.
# Probably anything that this would catch that wouldn't be caught in a
# normal build isn't going to actually be a bug, so the incremental
# value of C4702 for PGO builds is likely very small.
"/wd4702",
]
- ldflags += [
- "/LTCG",
- ]
+ ldflags += [ "/LTCG" ]
}
} else {
- cflags += [
- "-O2",
- ]
+ cflags += [ "-O2" ]
}
}
@@ -950,7 +951,12 @@
config("symbols") {
if (is_win) {
- cflags = [ "/Zi" ] # Produce PDB file, no edit and continue.
+ import("//build/toolchain/goma.gni")
+ if (use_goma) {
+ cflags = [ "/Z7" ] # No PDB file
+ } else {
+ cflags = [ "/Zi" ] # Produce PDB file, no edit and continue.
+ }
ldflags = [ "/DEBUG" ]
} else {
cflags = [ "-g2" ]
diff --git a/build/config/features.gni b/build/config/features.gni
index 9953a0d..ac48896 100644
--- a/build/config/features.gni
+++ b/build/config/features.gni
@@ -75,7 +75,7 @@
# Do not disable seccomp_bpf anywhere without talking to
# security@chromium.org!
use_seccomp_bpf = (is_linux || is_android) &&
- (cpu_arch == "x86" || cpu_arch == "x64" || cpu_arch == "arm")
+ (cpu_arch == "x86" || cpu_arch == "x64" || cpu_arch == "arm")
# Enable notifications everywhere except iOS.
enable_notifications = !is_ios
@@ -83,18 +83,20 @@
# TODO(brettw) this should be moved to net and only dependents get this define.
disable_ftp_support = is_ios
-enable_web_speech = (!is_android && !is_ios)
+enable_web_speech = !is_android && !is_ios
use_dbus = is_linux
-enable_extensions = (!is_android && !is_ios)
+enable_extensions = !is_android && !is_ios
# Variable safe_browsing is used to control the build time configuration for
# safe browsing feature. Safe browsing can be compiled in 3 different levels: 0
# disables it, 1 enables it fully, and 2 enables only UI and reporting features
# without enabling phishing and malware detection. This is useful to integrate
# a third party phishing/malware detection to existing safe browsing logic.
-if (is_ios) {
+if (is_android) {
+ safe_browsing_mode = 2
+} else if (is_ios) {
safe_browsing_mode = 0
} else {
safe_browsing_mode = 1
@@ -129,7 +131,7 @@
enable_app_list = !is_ios && !is_android
enable_settings_app = enable_app_list && !is_chromeos
-enable_managed_users = !is_ios
+enable_supervised_users = !is_ios
enable_service_discovery = enable_mdns || is_mac
@@ -157,3 +159,8 @@
# system).
# TODO(GYP) also require !embedded to enable.
use_gconf = is_linux && !is_chromeos
+
+# Hangout services is an extension that adds extra features to Hangouts.
+# For official GYP builds, this flag is set, it will likely need to be
+# parameterized in the future for a similar use.
+enable_hangout_services_extension = false
diff --git a/build/config/gcc/BUILD.gn b/build/config/gcc/BUILD.gn
index 28502c2..c6cfe72 100644
--- a/build/config/gcc/BUILD.gn
+++ b/build/config/gcc/BUILD.gn
@@ -23,7 +23,6 @@
ldflags = [
# Want to pass "\$". GN will re-escape as required for ninja.
"-Wl,-rpath=\$ORIGIN/",
-
"-Wl,-rpath-link=",
# Newer binutils don't set DT_RPATH unless you disable "new" dtags
diff --git a/build/config/gcc/gcc_version.gni b/build/config/gcc/gcc_version.gni
index 1ff464a..2ecc54a 100644
--- a/build/config/gcc/gcc_version.gni
+++ b/build/config/gcc/gcc_version.gni
@@ -11,11 +11,21 @@
}
} else if (current_toolchain == "//build/toolchain/cros:target") {
# TODO(benchan): Generalize the check for platforms other than Chrome OS.
- gcc_version = exec_script("../../compiler_version.py", [ "target", "compiler" ], "value")
+ gcc_version = exec_script("../../compiler_version.py",
+ [
+ "target",
+ "compiler",
+ ],
+ "value")
} else if (current_toolchain == "//build/toolchain/linux:x64" ||
current_toolchain == "//build/toolchain/linux:x86") {
# These are both the same and just use the default gcc on the system.
- gcc_version = exec_script("../../compiler_version.py", [ "host", "compiler" ], "value")
+ gcc_version = exec_script("../../compiler_version.py",
+ [
+ "host",
+ "compiler",
+ ],
+ "value")
} else {
gcc_version = 0
}
diff --git a/build/config/ios/BUILD.gn b/build/config/ios/BUILD.gn
index 0886be4..471f28a 100644
--- a/build/config/ios/BUILD.gn
+++ b/build/config/ios/BUILD.gn
@@ -6,7 +6,10 @@
import("//build/config/ios/ios_sdk.gni")
config("sdk") {
- common_flags = [ "-isysroot", sysroot ]
+ common_flags = [
+ "-isysroot",
+ sysroot,
+ ]
cflags = common_flags
ldflags = common_flags
diff --git a/build/config/ios/ios_sdk.gni b/build/config/ios/ios_sdk.gni
index 6b81a03..cb2708b 100644
--- a/build/config/ios/ios_sdk.gni
+++ b/build/config/ios/ios_sdk.gni
@@ -25,6 +25,6 @@
_ios_sdk_to_query = "iphoneos"
}
_ios_sdk_result =
- exec_script("ios_sdk.py", [ _ios_sdk_to_query ], "list lines")
+ exec_script("ios_sdk.py", [ _ios_sdk_to_query ], "list lines")
ios_sdk_path = _ios_sdk_result[0]
}
diff --git a/build/config/linux/BUILD.gn b/build/config/linux/BUILD.gn
index 758f42a..e132116 100644
--- a/build/config/linux/BUILD.gn
+++ b/build/config/linux/BUILD.gn
@@ -8,6 +8,11 @@
import("//build/config/ui.gni")
import("//tools/generate_library_loader/generate_library_loader.gni")
+gypi_values = exec_script("//build/gypi_to_gn.py",
+ [ rebase_path("../../linux/system.gyp") ],
+ "scope",
+ [ "../../linux/system.gyp" ])
+
config("sdk") {
if (sysroot != "") {
cflags = [ "--sysroot=" + sysroot ]
@@ -15,9 +20,12 @@
# Need to get some linker flags out of the sysroot.
ldflags += [ exec_script("sysroot_ld_path.py",
- [ rebase_path("//build/linux/sysroot_ld_path.sh", root_build_dir),
- sysroot ],
- "value") ]
+ [
+ rebase_path("//build/linux/sysroot_ld_path.sh",
+ root_build_dir),
+ sysroot,
+ ],
+ "value") ]
}
# Set here because OS_CHROMEOS cannot be autodetected in build_config.h like
@@ -36,7 +44,12 @@
}
pkg_config("glib") {
- packages = [ "glib-2.0", "gmodule-2.0", "gobject-2.0", "gthread-2.0" ]
+ packages = [
+ "glib-2.0",
+ "gmodule-2.0",
+ "gobject-2.0",
+ "gthread-2.0",
+ ]
}
pkg_config("pangocairo") {
@@ -47,10 +60,6 @@
packages = [ "pangoft2" ]
}
-pkg_config("udev") {
- packages = [ "libudev" ]
-}
-
# Note: if your target also depends on //dbus, you don't need to add this
# config (it will get added automatically if you depend on //dbus).
pkg_config("dbus") {
@@ -140,24 +149,13 @@
header = "<brlapi.h>"
config = ":brlapi_config"
- functions = [
- "brlapi_getHandleSize",
- "brlapi_error_location",
- "brlapi_strerror",
- "brlapi__acceptKeys",
- "brlapi__openConnection",
- "brlapi__closeConnection",
- "brlapi__getDisplaySize",
- "brlapi__enterTtyModeWithPath",
- "brlapi__leaveTtyMode",
- "brlapi__writeDots",
- "brlapi__readKey",
- ]
+ functions = gypi_values.libbrlapi_functions
}
}
pkg_config("gio_config") {
packages = [ "gio-2.0" ]
+
# glib >=2.40 deprecate g_settings_list_schemas in favor of
# g_settings_schema_source_list_schemas. This function is not available on
# earlier versions that we still need to support (specifically, 2.32), so
@@ -165,8 +163,11 @@
# TODO(mgiuca): Remove this suppression when we drop support for Ubuntu 13.10
# (saucy) and earlier. Update the code to use
# g_settings_schema_source_list_schemas instead.
- defines = [ "USE_GIO", "GLIB_DISABLE_DEPRECATION_WARNINGS" ]
-
+ defines = [
+ "USE_GIO",
+ "GLIB_DISABLE_DEPRECATION_WARNINGS",
+ ]
+
# TODO(brettw) Theoretically I think ignore_libs should be set so that we
# don't link directly to GIO and use the loader generated below. But the gio
# target in GYP doesn't make any sense to me and appears to link directly to
@@ -183,15 +184,7 @@
header = "<gio/gio.h>"
config = ":gio_config"
- functions = [
- "g_settings_new",
- "g_settings_get_child",
- "g_settings_get_string",
- "g_settings_get_boolean",
- "g_settings_get_int",
- "g_settings_get_strv",
- "g_settings_list_schemas",
- ]
+ functions = gypi_values.libgio_functions
}
# This generates a target named "libpci".
@@ -201,14 +194,34 @@
output_cc = "libpci_loader.cc"
header = "<pci/pci.h>"
- functions = [
- "pci_alloc",
- "pci_init",
- "pci_cleanup",
- "pci_scan_bus",
- "pci_fill_info",
- "pci_lookup_name",
- ]
+ functions = gypi_values.libpci_functions
}
# Looking for libspeechd? Use //third_party/speech-dispatcher
+
+# This generates a target named "udev0_loader".
+generate_library_loader("udev0_loader") {
+ name = "LibUdev0Loader"
+ output_h = "libudev0.h"
+ output_cc = "libudev0_loader.cc"
+ header = "\"third_party/libudev/libudev0.h\""
+
+ functions = gypi_values.libudev_functions
+}
+
+# This generates a target named "udev1_loader".
+generate_library_loader("udev1_loader") {
+ name = "LibUdev1Loader"
+ output_h = "libudev1.h"
+ output_cc = "libudev1_loader.cc"
+ header = "\"third_party/libudev/libudev1.h\""
+
+ functions = gypi_values.libudev_functions
+}
+
+group("udev") {
+ deps = [
+ ":udev0_loader",
+ ":udev1_loader",
+ ]
+}
diff --git a/build/config/linux/pkg_config.gni b/build/config/linux/pkg_config.gni
index 687afc5..631d60a 100644
--- a/build/config/linux/pkg_config.gni
+++ b/build/config/linux/pkg_config.gni
@@ -39,16 +39,24 @@
# need to invoke it manually.
if (sysroot != "") {
# Pass the sysroot if we're using one (it requires the CPU arch also).
- pkg_config_args = ["-s", sysroot, "-a", cpu_arch]
+ pkg_config_args = [
+ "-s",
+ sysroot,
+ "-a",
+ cpu_arch,
+ ]
} else if (pkg_config != "") {
- pkg_config_args = ["-p", pkg_config]
+ pkg_config_args = [
+ "-p",
+ pkg_config,
+ ]
} else {
pkg_config_args = []
}
template("pkg_config") {
assert(defined(invoker.packages),
- "Variable |packages| must be defined to be a list in pkg_config.")
+ "Variable |packages| must be defined to be a list in pkg_config.")
config(target_name) {
args = pkg_config_args + invoker.packages
if (defined(invoker.extra_args)) {
diff --git a/build/config/mac/BUILD.gn b/build/config/mac/BUILD.gn
index 2ebf458..9288add 100644
--- a/build/config/mac/BUILD.gn
+++ b/build/config/mac/BUILD.gn
@@ -6,8 +6,9 @@
config("sdk") {
common_flags = [
- "-isysroot", sysroot,
- "-mmacosx-version-min=10.6"
+ "-isysroot",
+ sysroot,
+ "-mmacosx-version-min=10.6",
]
cflags = common_flags
@@ -19,8 +20,10 @@
ldflags = [
"-Wl,-search_paths_first",
"-L.",
+
# Path for loading shared libraries for unbundled binaries.
"-Wl,-rpath,@loader_path/.",
+
# Path for loading shared libraries for bundled binaries. Get back from
# Binary.app/Contents/MacOS.
"-Wl,-rpath,@loader_path/../../..",
@@ -29,7 +32,5 @@
# On Mac, this is used only for executables.
config("mac_executable_flags") {
- ldflags = [
- "-Wl,-pie", # Position independent.
- ]
+ ldflags = [ "-Wl,-pie" ] # Position independent.
}
diff --git a/build/config/mac/mac_sdk.gni b/build/config/mac/mac_sdk.gni
index aa03332..44995a3 100644
--- a/build/config/mac/mac_sdk.gni
+++ b/build/config/mac/mac_sdk.gni
@@ -14,10 +14,15 @@
find_sdk_args = [ "--print_sdk_path" ]
if (is_chrome_branded && is_official_build) {
- find_sdk_args += [ "--verify", mac_sdk_min, "--sdk_path=" + mac_sdk_path ]
+ find_sdk_args += [
+ "--verify",
+ mac_sdk_min,
+ "--sdk_path=" + mac_sdk_path,
+ ]
} else {
find_sdk_args += [ mac_sdk_min ]
}
+
# The tool will print the SDK path on the first line, and the version on the
# second line.
find_sdk_lines =
diff --git a/build/config/sanitizers/BUILD.gn b/build/config/sanitizers/BUILD.gn
index 6012b48..63728d9 100644
--- a/build/config/sanitizers/BUILD.gn
+++ b/build/config/sanitizers/BUILD.gn
@@ -8,17 +8,24 @@
group("deps") {
if (is_asan) {
public_configs = [ ":sanitizer_options_link_helper" ]
- deps = [ ":options_sources" ]
+ deps = [
+ ":options_sources",
+ ]
}
}
config("sanitizer_options_link_helper") {
- ldflags = [ "-Wl,-u_sanitizer_options_link_helper", "-fsanitize=address" ]
+ ldflags = [
+ "-Wl,-u_sanitizer_options_link_helper",
+ "-fsanitize=address",
+ ]
}
source_set("options_sources") {
visibility = [ ":deps" ]
- sources = [ "//build/sanitizers/sanitizer_options.cc" ]
+ sources = [
+ "//build/sanitizers/sanitizer_options.cc",
+ ]
if (is_tsan) {
sources += [ "//build/sanitizers/tsan_suppressions.cc" ]
diff --git a/build/config/win/BUILD.gn b/build/config/win/BUILD.gn
index f623064..bc2ea88 100644
--- a/build/config/win/BUILD.gn
+++ b/build/config/win/BUILD.gn
@@ -122,9 +122,7 @@
# to have a separate config for it. Remove this config from your target to
# get the "bloaty and accomodating" version of windows.h.
config("lean_and_mean") {
- defines = [
- "WIN32_LEAN_AND_MEAN",
- ]
+ defines = [ "WIN32_LEAN_AND_MEAN" ]
}
# Nominmax --------------------------------------------------------------------
@@ -134,7 +132,5 @@
# For such targets, this config can be removed.
config("nominmax") {
- defines = [
- "NOMINMAX",
- ]
+ defines = [ "NOMINMAX" ]
}
diff --git a/build/get_landmines.py b/build/get_landmines.py
index 2c3b3d7..74d9561 100755
--- a/build/get_landmines.py
+++ b/build/get_landmines.py
@@ -62,6 +62,7 @@
print 'Delete stale generated .java files yet again. crbug.com/349592'
print 'Clobber to delete incompatible object binary format with NDK r10c'
print 'Clobber to fix missing NaCl gyp dependencies (crbug.com/427427).'
+ print 'Another clobber for missing NaCl gyp deps (crbug.com/427427).'
def main():
diff --git a/build/go/rules.gni b/build/go/rules.gni
index 55dd386..d4b1f50 100644
--- a/build/go/rules.gni
+++ b/build/go/rules.gni
@@ -40,23 +40,24 @@
]
script = "//build/go/go.py"
outputs = [ "${target_out_dir}/${target_name}" ]
+
# Since go test does not permit specifying an output directory or output
# binary name, we create a temporary build directory, and the python
# script will later identify the output, copy it to the target location,
# and clean up the temporary build directory.
build_dir = "${target_out_dir}/${target_name}_build"
args = [
- "--",
- "${go_build_tool}",
- rebase_path(build_dir, root_build_dir),
- rebase_path(target_out_dir, root_build_dir) + "/${target_name}",
- rebase_path("//", root_build_dir),
- "-I" + rebase_path("//"),
- " -L" + rebase_path(target_out_dir) +
- " -l" + static_library_name +
- " -lstdc++ -lpthread -lm -lglib-2.0",
- "test", "-c",
- ] + rebase_path(invoker.sources, build_dir)
+ "--",
+ "${go_build_tool}",
+ rebase_path(build_dir, root_build_dir),
+ rebase_path(target_out_dir, root_build_dir) + "/${target_name}",
+ rebase_path("//", root_build_dir),
+ "-I" + rebase_path("//"),
+ " -L" + rebase_path(target_out_dir) + " -l" + static_library_name +
+ " -lstdc++ -lpthread -lm -lglib-2.0",
+ "test",
+ "-c",
+ ] + rebase_path(invoker.sources, build_dir)
}
}
@@ -74,24 +75,27 @@
}
action(target_name) {
- deps = [ ":$static_library_name" ]
+ deps = [
+ ":$static_library_name",
+ ]
script = "//build/go/go.py"
outputs = [ "${target_out_dir}/${target_name}" ]
+
# Since go test does not permit specifying an output directory or output
# binary name, we create a temporary build directory, and the python
# script will later identify the output, copy it to the target location,
# and clean up the temporary build directory.
build_dir = "${target_out_dir}/${target_name}_build"
args = [
- "--",
- "CGO_ENABLED=1 GOOS=android GOARCH=arm GOARM=7 ${go_build_tool}",
- rebase_path(build_dir, root_build_dir),
- rebase_path(target_out_dir, root_build_dir) + "/${target_name}",
- rebase_path("//", root_build_dir),
- "-I" + rebase_path("//"),
- " -L" + rebase_path(target_out_dir) +
- " -l" + static_library_name + "",
- "build -ldflags=-shared",
- ] + rebase_path(invoker.sources, build_dir)
+ "--",
+ "CGO_ENABLED=1 GOOS=android GOARCH=arm GOARM=7 ${go_build_tool}",
+ rebase_path(build_dir, root_build_dir),
+ rebase_path(target_out_dir, root_build_dir) + "/${target_name}",
+ rebase_path("//", root_build_dir),
+ "-I" + rebase_path("//"),
+ " -L" + rebase_path(target_out_dir) + " -l" + static_library_name +
+ "",
+ "build -ldflags=-shared",
+ ] + rebase_path(invoker.sources, build_dir)
}
-}
\ No newline at end of file
+}
diff --git a/build/install-build-deps-android.sh b/build/install-build-deps-android.sh
index e740910..1fcf4fb 100755
--- a/build/install-build-deps-android.sh
+++ b/build/install-build-deps-android.sh
@@ -19,7 +19,9 @@
# Install first the default Linux build deps.
"$(dirname "${BASH_SOURCE[0]}")/install-build-deps.sh" \
- --no-syms --no-arm --no-chromeos-fonts --no-nacl --no-prompt "$@"
+ --no-syms --lib32 --no-arm --no-chromeos-fonts --no-nacl --no-prompt "$@"
+
+lsb_release=$(lsb_release --codename --short)
# The temporary directory used to store output of update-java-alternatives
TEMPDIR=$(mktemp -d)
@@ -31,8 +33,6 @@
}
trap cleanup EXIT
-sudo apt-get update
-
# Fix deps
sudo apt-get -f install
@@ -44,13 +44,13 @@
# common
sudo apt-get -y install lighttpd python-pexpect xvfb x11-utils
-# Few binaries in the Android SDK require 32-bit libraries on the host.
-sudo apt-get -y install lib32z1 g++-multilib
-
-# On Trusty-based systems you can't compile V8's mksnapshot without this one.
-# It is compiled for the host, using the -m32 flag, so it needs some 32 bit
-# development support. It seems harmless on older Linux releases.
-sudo apt-get -y install linux-libc-dev:i386
+# Some binaries in the Android SDK require 32-bit libraries on the host.
+# See https://developer.android.com/sdk/installing/index.html?pkg=tools
+if [[ $lsb_release == "precise" ]]; then
+ sudo apt-get -y install ia32-libs
+else
+ sudo apt-get -y install libncurses5:i386 libstdc++6:i386 zlib1g:i386
+fi
sudo apt-get -y install ant
diff --git a/build/install-build-deps.sh b/build/install-build-deps.sh
index 3093505..d1d844a 100755
--- a/build/install-build-deps.sh
+++ b/build/install-build-deps.sh
@@ -12,6 +12,7 @@
echo "Usage: $0 [--options]"
echo "Options:"
echo "--[no-]syms: enable or disable installation of debugging symbols"
+ echo "--lib32: enable installation of 32-bit libraries, e.g. for V8 snapshot"
echo "--[no-]arm: enable or disable installation of arm cross toolchain"
echo "--[no-]chromeos-fonts: enable or disable installation of Chrome OS"\
"fonts"
@@ -44,9 +45,7 @@
case "$1" in
--syms) do_inst_syms=1;;
--no-syms) do_inst_syms=0;;
- # TODO(phajdan.jr): Remove the lib32 flags when nothing else refers to them.
--lib32) do_inst_lib32=1;;
- --no-lib32) do_inst_lib32=0;;
--arm) do_inst_arm=1;;
--no-arm) do_inst_arm=0;;
--chromeos-fonts) do_inst_chromeos_fonts=1;;
@@ -63,6 +62,10 @@
shift
done
+if test "$do_inst_arm" = "1"; then
+ do_inst_lib32=1
+fi
+
# Check for lsb_release command in $PATH
if ! which lsb_release > /dev/null; then
echo "ERROR: lsb_release not found in \$PATH" >&2
@@ -70,10 +73,10 @@
fi
lsb_release=$(lsb_release --codename --short)
-ubuntu_codenames="(precise|quantal|raring|saucy|trusty)"
+ubuntu_codenames="(precise|quantal|raring|saucy|trusty|utopic)"
if [ 0 -eq "${do_unsupported-0}" ] && [ 0 -eq "${do_quick_check-0}" ] ; then
if [[ ! $lsb_release =~ $ubuntu_codenames ]]; then
- echo "ERROR: Only Ubuntu 12.04 (precise) through 14.04 (trusty) are"\
+ echo "ERROR: Only Ubuntu 12.04 (precise) through 14.10 (utopic) are"\
"currently supported" >&2
exit 1
fi
@@ -137,11 +140,13 @@
libxrandr2-dbg libxrender1-dbg libxtst6-dbg zlib1g-dbg
libstdc++6-4.6-dbg"
+# 32-bit libraries needed e.g. to compile V8 snapshot for Android or armhf
+lib32_list="linux-libc-dev:i386"
+
# arm cross toolchain packages needed to build chrome on armhf
arm_list="libc6-dev-armhf-cross
linux-libc-dev-armhf-cross
- g++-arm-linux-gnueabihf
- linux-libc-dev:i386"
+ g++-arm-linux-gnueabihf"
# Packages to build NaCl, its toolchains, and its ports.
naclports_list="ant autoconf bison cmake gawk intltool xutils-dev xsltproc"
@@ -207,6 +212,19 @@
lib_list="$lib_list appmenu-gtk"
fi
+# When cross building for arm/Android on 64-bit systems the host binaries
+# that are part of v8 need to be compiled with -m32 which means
+# that basic multilib support is needed.
+if file /sbin/init | grep -q 'ELF 64-bit'; then
+ # gcc-multilib conflicts with the arm cross compiler (at least in trusty) but
+ # g++-X.Y-multilib gives us the 32-bit support that we need. Find out the
+ # appropriate value of X and Y by seeing what version the current
+ # distribution's g++-multilib package depends on.
+ multilib_package=$(apt-cache depends g++-multilib --important | \
+ grep -E --color=never --only-matching '\bg\+\+-[0-9.]+-multilib\b')
+ lib32_list="$lib32_list $multilib_package"
+fi
+
# Waits for the user to press 'Y' or 'N'. Either uppercase of lowercase is
# accepted. Returns 0 for 'Y' and 1 for 'N'. If an optional parameter has
# been provided to yes_no(), the function also accepts RETURN as a user input.
@@ -265,17 +283,11 @@
dbg_list=
fi
-# When cross building for arm on 64-bit systems the host binaries
-# that are part of v8 need to be compiled with -m32 which means
-# that basic multilib support is needed.
-if file /sbin/init | grep -q 'ELF 64-bit'; then
- if [ "$lsb_release" = "trusty" ]; then
- # gcc-multilib conflicts with the arm cross compiler in trusty but
- # g++-4.8-multilib gives us the 32-bit support that we need.
- arm_list="$arm_list g++-4.8-multilib"
- else
- arm_list="$arm_list g++-multilib"
- fi
+if test "$do_inst_lib32" = "1" ; then
+ echo "Including 32-bit libraries for ARM/Android."
+else
+ echo "Skipping 32-bit libraries for ARM/Android."
+ lib32_list=
fi
if test "$do_inst_arm" = "1" ; then
@@ -293,8 +305,8 @@
fi
packages="$(
- echo "${dev_list} ${lib_list} ${dbg_list} ${arm_list} ${nacl_list}" |
- tr " " "\n" | sort -u | tr "\n" " "
+ echo "${dev_list} ${lib_list} ${dbg_list} ${lib32_list} ${arm_list}"\
+ "${nacl_list}" | tr " " "\n" | sort -u | tr "\n" " "
)"
if [ 1 -eq "${do_quick_check-0}" ] ; then
@@ -333,6 +345,11 @@
exit 0
fi
+if test "$do_inst_lib32" = "1" || test "$do_inst_nacl" = "1"; then
+ if [[ ! $lsb_release =~ (precise|quantal|raring) ]]; then
+ sudo dpkg --add-architecture i386
+ fi
+fi
sudo apt-get update
# We initially run "apt-get" with the --reinstall option and parse its output.
diff --git a/build/ios/grit_whitelist.txt b/build/ios/grit_whitelist.txt
index aa579ce..6fbe58d 100644
--- a/build/ios/grit_whitelist.txt
+++ b/build/ios/grit_whitelist.txt
@@ -154,6 +154,7 @@
IDS_AUTOFILL_FIELD_LABEL_STATE
IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE
IDS_AUTOFILL_OPTIONS_POPUP
+IDS_AUTOFILL_SCAN_CREDIT_CARD
IDS_AUTOFILL_WARNING_FORM_DISABLED
IDS_AUTOFILL_WARNING_INSECURE_CONNECTION
IDS_AUTOLOGIN_INFOBAR_CANCEL_BUTTON
diff --git a/build/java_prebuilt.gypi b/build/java_prebuilt.gypi
index a3a8cc0..8efc4ef 100644
--- a/build/java_prebuilt.gypi
+++ b/build/java_prebuilt.gypi
@@ -27,6 +27,7 @@
'intermediate_dir': '<(SHARED_INTERMEDIATE_DIR)/<(_target_name)',
'android_jar': '<(android_sdk)/android.jar',
'input_jars_paths': [ '<(android_jar)' ],
+ 'neverlink%': 0,
'proguard_config%': '',
'proguard_preprocess%': '0',
'variables': {
@@ -46,7 +47,13 @@
'all_dependent_settings': {
'variables': {
'input_jars_paths': ['<(dex_input_jar_path)'],
- 'library_dexed_jars_paths': ['<(dex_path)'],
+ 'conditions': [
+ ['neverlink == 1', {
+ 'library_dexed_jars_paths': [],
+ }, {
+ 'library_dexed_jars_paths': ['<(dex_path)'],
+ }],
+ ],
},
},
'conditions' : [
@@ -76,18 +83,20 @@
},
],
}],
- ],
- 'actions': [
- {
- 'action_name': 'dex_<(_target_name)',
- 'message': 'Dexing <(_target_name) jar',
- 'variables': {
- 'dex_input_paths': [
- '<(dex_input_jar_path)',
- ],
- 'output_path': '<(dex_path)',
- },
- 'includes': [ 'android/dex_action.gypi' ],
- },
+ ['neverlink == 0', {
+ 'actions': [
+ {
+ 'action_name': 'dex_<(_target_name)',
+ 'message': 'Dexing <(_target_name) jar',
+ 'variables': {
+ 'dex_input_paths': [
+ '<(dex_input_jar_path)',
+ ],
+ 'output_path': '<(dex_path)',
+ },
+ 'includes': [ 'android/dex_action.gypi' ],
+ },
+ ],
+ }],
],
}
diff --git a/build/json_schema_api.gni b/build/json_schema_api.gni
index 5857739..dd8ab92 100644
--- a/build/json_schema_api.gni
+++ b/build/json_schema_api.gni
@@ -57,8 +57,8 @@
schemas = defined(invoker.schemas) && invoker.schemas
bundle = defined(invoker.bundle) && invoker.bundle
- bundle_registration = defined(invoker.bundle_registration) &&
- invoker.bundle_registration
+ bundle_registration =
+ defined(invoker.bundle_registration) && invoker.bundle_registration
schema_include_rules = ""
if (defined(invoker.schema_include_rules)) {
@@ -108,11 +108,15 @@
"--destdir=" + rebase_path(root_gen_dir, root_build_dir),
"--namespace=$root_namespace",
"--generator=cpp",
- "--include-rules=$schema_include_rules" ]
+ "--include-rules=$schema_include_rules",
+ ]
if (defined(invoker.visibility)) {
# If visibility is restricted, add our own target to it.
- visibility = [ invoker.visibility, target_visibility ]
+ visibility = [
+ invoker.visibility,
+ target_visibility,
+ ]
}
}
}
@@ -120,7 +124,7 @@
if (bundle) {
uncompiled_sources = []
if (defined(invoker.uncompiled_sources)) {
- uncompiled_sources = invoker.uncompiled_sources
+ uncompiled_sources = invoker.uncompiled_sources
}
bundle_generator_schema_name = target_name + "_bundle_generator_schema"
@@ -132,28 +136,28 @@
"$target_gen_dir/generated_schemas.h",
]
args = [
- "--root=" + rebase_path("//", root_build_dir),
- "--destdir=" + rebase_path(root_gen_dir, root_build_dir),
- "--namespace=$root_namespace",
- "--generator=cpp-bundle-schema",
- "--include-rules=$schema_include_rules" ]
- + rebase_path(sources, root_build_dir)
- + rebase_path(uncompiled_sources, root_build_dir)
+ "--root=" + rebase_path("//", root_build_dir),
+ "--destdir=" + rebase_path(root_gen_dir, root_build_dir),
+ "--namespace=$root_namespace",
+ "--generator=cpp-bundle-schema",
+ "--include-rules=$schema_include_rules",
+ ] + rebase_path(sources, root_build_dir) +
+ rebase_path(uncompiled_sources, root_build_dir)
}
}
if (bundle_registration) {
uncompiled_sources = []
if (defined(invoker.uncompiled_sources)) {
- uncompiled_sources = invoker.uncompiled_sources
+ uncompiled_sources = invoker.uncompiled_sources
}
assert(defined(invoker.impl_dir),
"\"impl_dir\" must be defined for the $target_name template.")
impl_dir = invoker.impl_dir
- bundle_generator_registration_name = target_name +
- "_bundle_generator_registration"
+ bundle_generator_registration_name =
+ target_name + "_bundle_generator_registration"
action(bundle_generator_registration_name) {
script = compiler_script
inputs = compiler_sources + sources + uncompiled_sources
@@ -162,14 +166,14 @@
"$root_gen_dir/$impl_dir/generated_api_registration.h",
]
args = [
- "--root=" + rebase_path("//", root_build_dir),
- "--destdir=" + rebase_path(root_gen_dir, root_build_dir),
- "--namespace=$root_namespace",
- "--generator=cpp-bundle-registration",
- "--impl-dir=" + rebase_path(impl_dir, "//"),
- "--include-rules=$schema_include_rules" ]
- + rebase_path(sources, root_build_dir)
- + rebase_path(uncompiled_sources, root_build_dir)
+ "--root=" + rebase_path("//", root_build_dir),
+ "--destdir=" + rebase_path(root_gen_dir, root_build_dir),
+ "--namespace=$root_namespace",
+ "--generator=cpp-bundle-registration",
+ "--impl-dir=" + rebase_path(impl_dir, "//"),
+ "--include-rules=$schema_include_rules",
+ ] + rebase_path(sources, root_build_dir) +
+ rebase_path(uncompiled_sources, root_build_dir)
}
}
diff --git a/build/landmine_utils.py b/build/landmine_utils.py
index 9b667d0..6d18b6d 100644
--- a/build/landmine_utils.py
+++ b/build/landmine_utils.py
@@ -33,7 +33,7 @@
@memoize()
def IsLinux():
- return sys.platform.startswith(('linux', 'freebsd'))
+ return sys.platform.startswith(('linux', 'freebsd', 'openbsd'))
@memoize()
diff --git a/build/linux/system.gyp b/build/linux/system.gyp
index 3e88093..cd0288b 100644
--- a/build/linux/system.gyp
+++ b/build/linux/system.gyp
@@ -20,6 +20,69 @@
'linux_link_libpci%': 0,
'linux_link_libspeechd%': 0,
'linux_link_libbrlapi%': 0,
+
+ # Used below for the various libraries. In this scope for sharing with GN.
+ 'libbrlapi_functions': [
+ 'brlapi_getHandleSize',
+ 'brlapi_error_location',
+ 'brlapi_strerror',
+ 'brlapi__acceptKeys',
+ 'brlapi__openConnection',
+ 'brlapi__closeConnection',
+ 'brlapi__getDisplaySize',
+ 'brlapi__enterTtyModeWithPath',
+ 'brlapi__leaveTtyMode',
+ 'brlapi__writeDots',
+ 'brlapi__readKey',
+ ],
+ 'libgio_functions': [
+ 'g_settings_new',
+ 'g_settings_get_child',
+ 'g_settings_get_string',
+ 'g_settings_get_boolean',
+ 'g_settings_get_int',
+ 'g_settings_get_strv',
+ 'g_settings_list_schemas',
+ ],
+ 'libpci_functions': [
+ 'pci_alloc',
+ 'pci_init',
+ 'pci_cleanup',
+ 'pci_scan_bus',
+ 'pci_fill_info',
+ 'pci_lookup_name',
+ ],
+ 'libudev_functions': [
+ 'udev_device_get_action',
+ 'udev_device_get_devnode',
+ 'udev_device_get_parent',
+ 'udev_device_get_parent_with_subsystem_devtype',
+ 'udev_device_get_property_value',
+ 'udev_device_get_subsystem',
+ 'udev_device_get_sysattr_value',
+ 'udev_device_get_sysname',
+ 'udev_device_get_syspath',
+ 'udev_device_new_from_devnum',
+ 'udev_device_new_from_syspath',
+ 'udev_device_unref',
+ 'udev_enumerate_add_match_subsystem',
+ 'udev_enumerate_get_list_entry',
+ 'udev_enumerate_new',
+ 'udev_enumerate_scan_devices',
+ 'udev_enumerate_unref',
+ 'udev_list_entry_get_next',
+ 'udev_list_entry_get_name',
+ 'udev_monitor_enable_receiving',
+ 'udev_monitor_filter_add_match_subsystem_devtype',
+ 'udev_monitor_get_fd',
+ 'udev_monitor_new_from_netlink',
+ 'udev_monitor_receive_device',
+ 'udev_monitor_unref',
+ 'udev_new',
+ 'udev_set_log_fn',
+ 'udev_set_log_priority',
+ 'udev_unref',
+ ],
},
'conditions': [
[ 'chromeos==0 and use_ozone==0', {
@@ -445,22 +508,67 @@
'targets': [
{
'target_name': 'udev',
- 'type': 'none',
+ 'type': 'static_library',
'conditions': [
['_toolset=="target"', {
- 'direct_dependent_settings': {
- 'cflags': [
- '<!@(<(pkg-config) --cflags libudev)'
- ],
- },
- 'link_settings': {
- 'ldflags': [
- '<!@(<(pkg-config) --libs-only-L --libs-only-other libudev)',
- ],
- 'libraries': [
- '<!@(<(pkg-config) --libs-only-l libudev)',
- ],
- },
+ 'include_dirs': [
+ '../..',
+ ],
+ 'hard_dependency': 1,
+ 'actions': [
+ {
+ 'variables': {
+ 'output_h': '<(SHARED_INTERMEDIATE_DIR)/library_loaders/libudev0.h',
+ 'output_cc': '<(INTERMEDIATE_DIR)/libudev0_loader.cc',
+ 'generator': '../../tools/generate_library_loader/generate_library_loader.py',
+ },
+ 'action_name': 'generate_libudev0_loader',
+ 'inputs': [
+ '<(generator)',
+ ],
+ 'outputs': [
+ '<(output_h)',
+ '<(output_cc)',
+ ],
+ 'action': ['python',
+ '<(generator)',
+ '--name', 'LibUdev0Loader',
+ '--output-h', '<(output_h)',
+ '--output-cc', '<(output_cc)',
+ '--header', '"third_party/libudev/libudev0.h"',
+ '--link-directly=0',
+ '<@(libudev_functions)',
+ ],
+ 'message': 'Generating libudev0 library loader',
+ 'process_outputs_as_sources': 1,
+ },
+ {
+ 'variables': {
+ 'output_h': '<(SHARED_INTERMEDIATE_DIR)/library_loaders/libudev1.h',
+ 'output_cc': '<(INTERMEDIATE_DIR)/libudev1_loader.cc',
+ 'generator': '../../tools/generate_library_loader/generate_library_loader.py',
+ },
+ 'action_name': 'generate_libudev1_loader',
+ 'inputs': [
+ '<(generator)',
+ ],
+ 'outputs': [
+ '<(output_h)',
+ '<(output_cc)',
+ ],
+ 'action': ['python',
+ '<(generator)',
+ '--name', 'LibUdev1Loader',
+ '--output-h', '<(output_h)',
+ '--output-cc', '<(output_cc)',
+ '--header', '"third_party/libudev/libudev1.h"',
+ '--link-directly=0',
+ '<@(libudev_functions)',
+ ],
+ 'message': 'Generating libudev1 library loader',
+ 'process_outputs_as_sources': 1,
+ },
+ ],
}],
],
},
@@ -520,12 +628,7 @@
# and get it fixed so that we don't need --use-extern-c.
'--use-extern-c',
'--link-directly=<(linux_link_libpci)',
- 'pci_alloc',
- 'pci_init',
- 'pci_cleanup',
- 'pci_scan_bus',
- 'pci_fill_info',
- 'pci_lookup_name',
+ '<@(libpci_functions)',
],
'message': 'Generating libpci library loader',
'process_outputs_as_sources': 1,
@@ -706,13 +809,7 @@
'--output-cc', '<(output_cc)',
'--header', '<gio/gio.h>',
'--link-directly=<(linux_link_gsettings)',
- 'g_settings_new',
- 'g_settings_get_child',
- 'g_settings_get_string',
- 'g_settings_get_boolean',
- 'g_settings_get_int',
- 'g_settings_get_strv',
- 'g_settings_list_schemas',
+ '<@(libgio_functions)',
],
'message': 'Generating libgio library loader',
'process_outputs_as_sources': 1,
@@ -882,17 +979,7 @@
'--output-cc', '<(output_cc)',
'--header', '<brlapi.h>',
'--link-directly=<(linux_link_libbrlapi)',
- 'brlapi_getHandleSize',
- 'brlapi_error_location',
- 'brlapi_strerror',
- 'brlapi__acceptKeys',
- 'brlapi__openConnection',
- 'brlapi__closeConnection',
- 'brlapi__getDisplaySize',
- 'brlapi__enterTtyModeWithPath',
- 'brlapi__leaveTtyMode',
- 'brlapi__writeDots',
- 'brlapi__readKey',
+ '<@(libbrlapi_functions)',
],
'message': 'Generating libbrlapi library loader',
'process_outputs_as_sources': 1,
diff --git a/build/sanitizers/tsan_suppressions.cc b/build/sanitizers/tsan_suppressions.cc
index 09cf522..49e860d 100644
--- a/build/sanitizers/tsan_suppressions.cc
+++ b/build/sanitizers/tsan_suppressions.cc
@@ -169,10 +169,6 @@
"race:PrepareTextureMailbox\n"
"race:cc::LayerTreeHost::PaintLayerContents\n"
-// http://crbug.com/328804
-"race:v8::internal::Heap::SetStackLimits\n"
-"race:ScavengePointer\n"
-
// http://crbug.com/328826
"race:gLCDOrder\n"
"race:gLCDOrientation\n"
diff --git a/build/secondary/testing/BUILD.gn b/build/secondary/testing/BUILD.gn
index 2cafa68..fc50637 100644
--- a/build/secondary/testing/BUILD.gn
+++ b/build/secondary/testing/BUILD.gn
@@ -7,5 +7,7 @@
"gmock_mutant.h", # gMock helpers
]
- deps = [ "//base" ]
+ deps = [
+ "//base",
+ ]
}
diff --git a/build/secondary/testing/gmock/BUILD.gn b/build/secondary/testing/gmock/BUILD.gn
index a0dbad7..4ec6224 100644
--- a/build/secondary/testing/gmock/BUILD.gn
+++ b/build/secondary/testing/gmock/BUILD.gn
@@ -24,6 +24,7 @@
"include/gmock/internal/gmock-generated-internal-utils.h",
"include/gmock/internal/gmock-internal-utils.h",
"include/gmock/internal/gmock-port.h",
+
#"src/gmock-all.cc", # Not needed by our build.
"src/gmock-cardinalities.cc",
"src/gmock-internal-utils.cc",
@@ -44,6 +45,10 @@
static_library("gmock_main") {
# TODO http://crbug.com/412064 enable this flag all the time.
testonly = !is_component_build
- sources = [ "src/gmock_main.cc" ]
- deps = [ ":gmock" ]
+ sources = [
+ "src/gmock_main.cc",
+ ]
+ deps = [
+ ":gmock",
+ ]
}
diff --git a/build/secondary/testing/gtest/BUILD.gn b/build/secondary/testing/gtest/BUILD.gn
index f50afb6..96f4112 100644
--- a/build/secondary/testing/gtest/BUILD.gn
+++ b/build/secondary/testing/gtest/BUILD.gn
@@ -9,10 +9,10 @@
]
defines = [
-
# In order to allow regex matches in gtest to be shared between Windows
# and other systems, we tell gtest to always use it's internal engine.
"GTEST_HAS_POSIX_RE=0",
+
# Chrome doesn't support / require C++11, yet.
"GTEST_LANG_CXX11=0",
]
@@ -81,6 +81,7 @@
"include/gtest/internal/gtest-string.h",
"include/gtest/internal/gtest-tuple.h",
"include/gtest/internal/gtest-type-util.h",
+
#"gtest/src/gtest-all.cc", # Not needed by our build.
"src/gtest-death-test.cc",
"src/gtest-filepath.cc",
@@ -115,6 +116,10 @@
source_set("gtest_main") {
# TODO http://crbug.com/412064 enable this flag all the time.
testonly = !is_component_build
- sources = [ "src/gtest_main.cc" ]
- deps = [ ":gtest" ]
+ sources = [
+ "src/gtest_main.cc",
+ ]
+ deps = [
+ ":gtest",
+ ]
}
diff --git a/build/secondary/third_party/android_tools/BUILD.gn b/build/secondary/third_party/android_tools/BUILD.gn
index 14e6c07..0df6545 100644
--- a/build/secondary/third_party/android_tools/BUILD.gn
+++ b/build/secondary/third_party/android_tools/BUILD.gn
@@ -11,7 +11,9 @@
# This is the GN version of
# //build/android/cpufeatures.gypi:cpufeatures
source_set("cpu_features") {
- sources = [ "ndk/sources/android/cpufeatures/cpu-features.c" ]
+ sources = [
+ "ndk/sources/android/cpufeatures/cpu-features.c",
+ ]
public_configs = [ ":cpu_features_include" ]
configs -= [ "//build/config/compiler:chromium_code" ]
@@ -27,27 +29,29 @@
}
android_java_prebuilt("android_support_v13_java") {
- jar_path = "$android_sdk_root/extras/android/support/v13/android-support-v13.jar"
+ jar_path =
+ "$android_sdk_root/extras/android/support/v13/android-support-v13.jar"
}
android_resources("android_support_v7_appcompat_resources") {
v14_verify_only = true
- resource_dirs = [
- "$android_sdk_root/extras/android/support/v7/appcompat/res"
- ]
+ resource_dirs =
+ [ "$android_sdk_root/extras/android/support/v7/appcompat/res" ]
custom_package = "android.support.v7.appcompat"
}
android_java_prebuilt("android_support_v7_appcompat_java") {
- deps = [ ":android_support_v7_appcompat_resources" ]
- jar_path = "$android_sdk_root/extras/android/support/v7/appcompat/libs/android-support-v7-appcompat.jar"
+ deps = [
+ ":android_support_v7_appcompat_resources",
+ ]
+ jar_path =
+ "$android_sdk_root/extras/android/support/v7/appcompat/libs/android-support-v7-appcompat.jar"
}
android_resources("android_support_v7_mediarouter_resources") {
v14_verify_only = true
- resource_dirs = [
- "$android_sdk_root/extras/android/support/v7/mediarouter/res"
- ]
+ resource_dirs =
+ [ "$android_sdk_root/extras/android/support/v7/mediarouter/res" ]
deps = [
":android_support_v7_appcompat_resources",
]
@@ -59,5 +63,6 @@
":android_support_v7_mediarouter_resources",
":android_support_v7_appcompat_java",
]
- jar_path = "$android_sdk_root/extras/android/support/v7/mediarouter/libs/android-support-v7-mediarouter.jar"
+ jar_path =
+ "$android_sdk_root/extras/android/support/v7/mediarouter/libs/android-support-v7-mediarouter.jar"
}
diff --git a/build/secondary/third_party/cacheinvalidation/src/google/cacheinvalidation/BUILD.gn b/build/secondary/third_party/cacheinvalidation/src/google/cacheinvalidation/BUILD.gn
index 2dc1b99..3bbb844 100644
--- a/build/secondary/third_party/cacheinvalidation/src/google/cacheinvalidation/BUILD.gn
+++ b/build/secondary/third_party/cacheinvalidation/src/google/cacheinvalidation/BUILD.gn
@@ -25,4 +25,3 @@
proto_out_dir = "google/cacheinvalidation"
}
-
diff --git a/build/secondary/third_party/freetype/BUILD.gn b/build/secondary/third_party/freetype/BUILD.gn
index 2b96239..2181d87 100644
--- a/build/secondary/third_party/freetype/BUILD.gn
+++ b/build/secondary/third_party/freetype/BUILD.gn
@@ -39,9 +39,7 @@
"DARWIN_NO_CARBON",
]
- include_dirs = [
- "build",
- ]
+ include_dirs = [ "build" ]
public_configs = [ ":freetype_config" ]
diff --git a/build/secondary/third_party/icu/BUILD.gn b/build/secondary/third_party/icu/BUILD.gn
index 865a5e4..b618673 100644
--- a/build/secondary/third_party/icu/BUILD.gn
+++ b/build/secondary/third_party/icu/BUILD.gn
@@ -224,9 +224,7 @@
"source/i18n/zrule.cpp",
"source/i18n/ztrans.cpp",
]
- defines = [
- "U_I18N_IMPLEMENTATION",
- ]
+ defines = [ "U_I18N_IMPLEMENTATION" ]
deps = [
":icuuc",
]
@@ -259,6 +257,7 @@
cflags += [
"-Wno-header-hygiene",
+
# Looks like a real issue, see http://crbug.com/114660
"-Wno-return-type-c-linkage",
]
@@ -439,9 +438,7 @@
"source/common/uvectr64.cpp",
"source/common/wintz.c",
]
- defines = [
- "U_COMMON_IMPLEMENTATION",
- ]
+ defines = [ "U_COMMON_IMPLEMENTATION" ]
deps = [
":icudata",
]
@@ -475,9 +472,13 @@
} else {
copy("icudata") {
if (is_android) {
- sources = [ "android/icudtl.dat" ]
+ sources = [
+ "android/icudtl.dat",
+ ]
} else {
- sources = [ "source/data/in/icudtl.dat" ]
+ sources = [
+ "source/data/in/icudtl.dat",
+ ]
}
outputs = [ "$root_out_dir/icudtl.dat" ]
@@ -487,7 +488,9 @@
if (is_win) {
# On Windows the target DLL is pre-built so just use a copy rule.
copy("icudata") {
- sources = [ "windows/icudt.dll" ]
+ sources = [
+ "windows/icudt.dll",
+ ]
outputs = [ "$root_out_dir/icudt.dll" ]
}
} else {
@@ -497,11 +500,17 @@
# TODO(GYP): Gyp has considerations here for QNX and for the host toolchain
# that have not been ported over.
if (is_linux) {
- sources = [ "linux/icudtl_dat.S" ]
+ sources = [
+ "linux/icudtl_dat.S",
+ ]
} else if (is_mac) {
- sources = [ "mac/icudtl_dat.S" ]
+ sources = [
+ "mac/icudtl_dat.S",
+ ]
} else if (is_android) {
- sources = [ "android/icudtl_dat.S" ]
+ sources = [
+ "android/icudtl_dat.S",
+ ]
} else {
assert(false, "No icu data for this platform")
}
diff --git a/build/secondary/third_party/leveldatabase/BUILD.gn b/build/secondary/third_party/leveldatabase/BUILD.gn
index 3653a98..67cda92 100644
--- a/build/secondary/third_party/leveldatabase/BUILD.gn
+++ b/build/secondary/third_party/leveldatabase/BUILD.gn
@@ -70,6 +70,7 @@
"src/include/leveldb/write_batch.h",
"src/port/port.h",
"src/port/port_example.h",
+
#"src/port/port_posix.cc", # We use the chromium port instead of this.
#"src/port/port_posix.h",
"src/table/block.cc",
@@ -205,7 +206,7 @@
test("leveldb_crc32c_test") {
sources = [
- "src/util/crc32c_test.cc"
+ "src/util/crc32c_test.cc",
]
configs -= [ "//build/config/compiler:chromium_code" ]
configs += [ "//build/config/compiler:no_chromium_code" ]
diff --git a/build/secondary/third_party/libjpeg_turbo/BUILD.gn b/build/secondary/third_party/libjpeg_turbo/BUILD.gn
index 4dbca97..82472e7 100644
--- a/build/secondary/third_party/libjpeg_turbo/BUILD.gn
+++ b/build/secondary/third_party/libjpeg_turbo/BUILD.gn
@@ -10,106 +10,92 @@
}
if (cpu_arch == "x86" || cpu_arch == "x64") {
+ import("//third_party/yasm/yasm_assemble.gni")
-import("//third_party/yasm/yasm_assemble.gni")
+ yasm_assemble("simd_asm") {
+ defines = []
-yasm_assemble("simd_asm") {
- defines = []
-
- if (cpu_arch == "x86") {
- sources = [
- "simd/jccolmmx.asm",
- "simd/jccolss2.asm",
- "simd/jcgrammx.asm",
- "simd/jcgrass2.asm",
- "simd/jcqnt3dn.asm",
- "simd/jcqntmmx.asm",
- "simd/jcqnts2f.asm",
- "simd/jcqnts2i.asm",
- "simd/jcqntsse.asm",
- "simd/jcsammmx.asm",
- "simd/jcsamss2.asm",
- "simd/jdcolmmx.asm",
- "simd/jdcolss2.asm",
- "simd/jdmermmx.asm",
- "simd/jdmerss2.asm",
- "simd/jdsammmx.asm",
- "simd/jdsamss2.asm",
- "simd/jf3dnflt.asm",
- "simd/jfmmxfst.asm",
- "simd/jfmmxint.asm",
- "simd/jfss2fst.asm",
- "simd/jfss2int.asm",
- "simd/jfsseflt.asm",
- "simd/ji3dnflt.asm",
- "simd/jimmxfst.asm",
- "simd/jimmxint.asm",
- "simd/jimmxred.asm",
- "simd/jiss2flt.asm",
- "simd/jiss2fst.asm",
- "simd/jiss2int.asm",
- "simd/jiss2red.asm",
- "simd/jisseflt.asm",
- "simd/jsimdcpu.asm",
- ]
- defines += [
- "__x86__",
- ]
- } else if (cpu_arch == "x64") {
- sources = [
- "simd/jccolss2-64.asm",
- "simd/jcgrass2-64.asm",
- "simd/jcqnts2f-64.asm",
- "simd/jcqnts2i-64.asm",
- "simd/jcsamss2-64.asm",
- "simd/jdcolss2-64.asm",
- "simd/jdmerss2-64.asm",
- "simd/jdsamss2-64.asm",
- "simd/jfss2fst-64.asm",
- "simd/jfss2int-64.asm",
- "simd/jfsseflt-64.asm",
- "simd/jiss2flt-64.asm",
- "simd/jiss2fst-64.asm",
- "simd/jiss2int-64.asm",
- "simd/jiss2red-64.asm",
- ]
- defines += [
- "__x86_64__",
- ]
- }
-
- if (is_win) {
- defines += [
- "MSVC",
- ]
- include_dirs = [ "win" ]
if (cpu_arch == "x86") {
- defines += [
- "WIN32",
+ sources = [
+ "simd/jccolmmx.asm",
+ "simd/jccolss2.asm",
+ "simd/jcgrammx.asm",
+ "simd/jcgrass2.asm",
+ "simd/jcqnt3dn.asm",
+ "simd/jcqntmmx.asm",
+ "simd/jcqnts2f.asm",
+ "simd/jcqnts2i.asm",
+ "simd/jcqntsse.asm",
+ "simd/jcsammmx.asm",
+ "simd/jcsamss2.asm",
+ "simd/jdcolmmx.asm",
+ "simd/jdcolss2.asm",
+ "simd/jdmermmx.asm",
+ "simd/jdmerss2.asm",
+ "simd/jdsammmx.asm",
+ "simd/jdsamss2.asm",
+ "simd/jf3dnflt.asm",
+ "simd/jfmmxfst.asm",
+ "simd/jfmmxint.asm",
+ "simd/jfss2fst.asm",
+ "simd/jfss2int.asm",
+ "simd/jfsseflt.asm",
+ "simd/ji3dnflt.asm",
+ "simd/jimmxfst.asm",
+ "simd/jimmxint.asm",
+ "simd/jimmxred.asm",
+ "simd/jiss2flt.asm",
+ "simd/jiss2fst.asm",
+ "simd/jiss2int.asm",
+ "simd/jiss2red.asm",
+ "simd/jisseflt.asm",
+ "simd/jsimdcpu.asm",
]
- } else {
- defines += [
- "WIN64",
+ defines += [ "__x86__" ]
+ } else if (cpu_arch == "x64") {
+ sources = [
+ "simd/jccolss2-64.asm",
+ "simd/jcgrass2-64.asm",
+ "simd/jcqnts2f-64.asm",
+ "simd/jcqnts2i-64.asm",
+ "simd/jcsamss2-64.asm",
+ "simd/jdcolss2-64.asm",
+ "simd/jdmerss2-64.asm",
+ "simd/jdsamss2-64.asm",
+ "simd/jfss2fst-64.asm",
+ "simd/jfss2int-64.asm",
+ "simd/jfsseflt-64.asm",
+ "simd/jiss2flt-64.asm",
+ "simd/jiss2fst-64.asm",
+ "simd/jiss2int-64.asm",
+ "simd/jiss2red-64.asm",
]
+ defines += [ "__x86_64__" ]
}
- } else if (is_mac) {
- defines += [
- "MACHO",
- ]
- include_dirs = [ "mac" ]
- } else if (is_linux) {
- defines += [
- "ELF",
- ]
- include_dirs = [ "linux" ]
- }
-}
+ if (is_win) {
+ defines += [ "MSVC" ]
+ include_dirs = [ "win" ]
+ if (cpu_arch == "x86") {
+ defines += [ "WIN32" ]
+ } else {
+ defines += [ "WIN64" ]
+ }
+ } else if (is_mac) {
+ defines += [ "MACHO" ]
+ include_dirs = [ "mac" ]
+ } else if (is_linux) {
+ defines += [ "ELF" ]
+ include_dirs = [ "linux" ]
+ }
+ }
}
source_set("simd") {
if (cpu_arch == "x86") {
- deps = [ ":simd_asm" ]
+ deps = [
+ ":simd_asm",
+ ]
sources = [
"simd/jsimd_i386.c",
]
@@ -117,7 +103,9 @@
cflags = [ "/wd4245" ]
}
} else if (cpu_arch == "x64") {
- deps = [ ":simd_asm" ]
+ deps = [
+ ":simd_asm",
+ ]
sources = [
"simd/jsimd_x86_64.c",
]
@@ -128,7 +116,9 @@
"simd/jsimd_arm_neon.S",
]
} else {
- sources = [ "jsimd_none.c" ]
+ sources = [
+ "jsimd_none.c",
+ ]
}
}
@@ -212,7 +202,9 @@
if (is_msan || is_linux) {
sources += [ "jsimd_none.c" ]
} else {
- deps = [ ":simd" ]
+ deps = [
+ ":simd",
+ ]
}
# TODO(GYP): Compile the .asm files with YASM as GYP does.
diff --git a/build/secondary/third_party/libsrtp/BUILD.gn b/build/secondary/third_party/libsrtp/BUILD.gn
index b0e0a91..506d19f 100644
--- a/build/secondary/third_party/libsrtp/BUILD.gn
+++ b/build/secondary/third_party/libsrtp/BUILD.gn
@@ -38,6 +38,7 @@
defines += [
"INLINE=__inline",
"HAVE_BYTESWAP_METHODS_H",
+
# All Windows architectures are this way.
"SIZEOF_UNSIGNED_LONG=4",
"SIZEOF_UNSIGNED_LONG_LONG=8",
@@ -67,7 +68,10 @@
if (use_system_libsrtp) {
group("libsrtp") {
- public_configs = [ ":libsrtp_config", ":system_libsrtp_config" ]
+ public_configs = [
+ ":libsrtp_config",
+ ":system_libsrtp_config",
+ ]
libs = [ "-lsrtp" ]
}
} else {
@@ -118,7 +122,6 @@
# sources
"srtp/srtp/ekt.c",
"srtp/srtp/srtp.c",
-
"srtp/crypto/cipher/aes.c",
"srtp/crypto/cipher/aes_cbc.c",
"srtp/crypto/cipher/aes_icm.c",
@@ -154,7 +157,9 @@
executable("rdbx_driver") {
configs -= [ "//build/config/compiler:chromium_code" ]
configs += [ "//build/config/compiler:no_chromium_code" ]
- deps = [ ":libsrtp" ]
+ deps = [
+ ":libsrtp",
+ ]
sources = [
"srtp/include/getopt_s.h",
"srtp/test/getopt_s.c",
@@ -165,7 +170,9 @@
executable("srtp_driver") {
configs -= [ "//build/config/compiler:chromium_code" ]
configs += [ "//build/config/compiler:no_chromium_code" ]
- deps = [ ":libsrtp" ]
+ deps = [
+ ":libsrtp",
+ ]
sources = [
"srtp/include/getopt_s.h",
"srtp/include/srtp_priv.h",
@@ -177,7 +184,9 @@
executable("roc_driver") {
configs -= [ "//build/config/compiler:chromium_code" ]
configs += [ "//build/config/compiler:no_chromium_code" ]
- deps = [ ":libsrtp" ]
+ deps = [
+ ":libsrtp",
+ ]
sources = [
"srtp/crypto/include/rdbx.h",
"srtp/include/ut_sim.h",
@@ -188,7 +197,9 @@
executable("replay_driver") {
configs -= [ "//build/config/compiler:chromium_code" ]
configs += [ "//build/config/compiler:no_chromium_code" ]
- deps = [ ":libsrtp" ]
+ deps = [
+ ":libsrtp",
+ ]
sources = [
"srtp/crypto/include/rdbx.h",
"srtp/include/ut_sim.h",
@@ -199,7 +210,9 @@
executable("rtpw") {
configs -= [ "//build/config/compiler:chromium_code" ]
configs += [ "//build/config/compiler:no_chromium_code" ]
- deps = [ ":libsrtp" ]
+ deps = [
+ ":libsrtp",
+ ]
sources = [
"srtp/include/getopt_s.h",
"srtp/include/rtp.h",
@@ -220,7 +233,9 @@
executable("srtp_test_cipher_driver") {
configs -= [ "//build/config/compiler:chromium_code" ]
configs += [ "//build/config/compiler:no_chromium_code" ]
- deps = [ ":libsrtp" ]
+ deps = [
+ ":libsrtp",
+ ]
sources = [
"srtp/crypto/test/cipher_driver.c",
]
@@ -229,7 +244,9 @@
executable("srtp_test_datatypes_driver") {
configs -= [ "//build/config/compiler:chromium_code" ]
configs += [ "//build/config/compiler:no_chromium_code" ]
- deps = [ ":libsrtp" ]
+ deps = [
+ ":libsrtp",
+ ]
sources = [
"srtp/crypto/test/datatypes_driver.c",
]
@@ -238,7 +255,9 @@
executable("srtp_test_stat_driver") {
configs -= [ "//build/config/compiler:chromium_code" ]
configs += [ "//build/config/compiler:no_chromium_code" ]
- deps = [ ":libsrtp" ]
+ deps = [
+ ":libsrtp",
+ ]
sources = [
"srtp/crypto/test/stat_driver.c",
]
@@ -247,7 +266,9 @@
executable("srtp_test_sha1_driver") {
configs -= [ "//build/config/compiler:chromium_code" ]
configs += [ "//build/config/compiler:no_chromium_code" ]
- deps = [ ":libsrtp" ]
+ deps = [
+ ":libsrtp",
+ ]
sources = [
"srtp/crypto/test/sha1_driver.c",
]
@@ -256,7 +277,9 @@
executable("srtp_test_kernel_driver") {
configs -= [ "//build/config/compiler:chromium_code" ]
configs += [ "//build/config/compiler:no_chromium_code" ]
- deps = [ ":libsrtp" ]
+ deps = [
+ ":libsrtp",
+ ]
sources = [
"srtp/crypto/test/kernel_driver.c",
]
@@ -265,7 +288,9 @@
executable("srtp_test_aes_calc") {
configs -= [ "//build/config/compiler:chromium_code" ]
configs += [ "//build/config/compiler:no_chromium_code" ]
- deps = [ ":libsrtp" ]
+ deps = [
+ ":libsrtp",
+ ]
sources = [
"srtp/crypto/test/aes_calc.c",
]
@@ -274,7 +299,9 @@
executable("srtp_test_rand_gen") {
configs -= [ "//build/config/compiler:chromium_code" ]
configs += [ "//build/config/compiler:no_chromium_code" ]
- deps = [ ":libsrtp" ]
+ deps = [
+ ":libsrtp",
+ ]
sources = [
"srtp/crypto/test/rand_gen.c",
]
@@ -283,7 +310,9 @@
executable("srtp_test_env") {
configs -= [ "//build/config/compiler:chromium_code" ]
configs += [ "//build/config/compiler:no_chromium_code" ]
- deps = [ ":libsrtp" ]
+ deps = [
+ ":libsrtp",
+ ]
sources = [
"srtp/crypto/test/env.c",
]
diff --git a/build/secondary/third_party/nss/BUILD.gn b/build/secondary/third_party/nss/BUILD.gn
index a285ca1..768a85d 100644
--- a/build/secondary/third_party/nss/BUILD.gn
+++ b/build/secondary/third_party/nss/BUILD.gn
@@ -14,7 +14,10 @@
# platform and build config.
pkg_config("system_nss_no_ssl_config") {
packages = [ "nss" ]
- extra_args = [ "-v", "-lssl3" ]
+ extra_args = [
+ "-v",
+ "-lssl3",
+ ]
}
} else {
include_nss_root_certs = is_ios
@@ -207,9 +210,7 @@
public_configs = [ ":nspr_config" ]
- configs -= [
- "//build/config/compiler:chromium_code",
- ]
+ configs -= [ "//build/config/compiler:chromium_code" ]
if (is_win) {
configs -= [
"//build/config/win:unicode", # Requires 8-bit mode.
@@ -224,9 +225,7 @@
"FORCE_PR_LOG",
]
- include_dirs = [
- "nspr/pr/include/private",
- ]
+ include_dirs = [ "nspr/pr/include/private" ]
if (is_win) {
cflags = [
@@ -314,9 +313,7 @@
}
if (is_mac) {
- defines += [
- "HAVE_CRT_EXTERNS_H",
- ]
+ defines += [ "HAVE_CRT_EXTERNS_H" ]
libs = [
"CoreFoundation.framework",
"CoreServices.framework",
@@ -328,14 +325,16 @@
# nspr uses a bunch of deprecated functions (NSLinkModule etc) in
# prlink.c on mac.
"-Wno-deprecated-declarations",
+
# nspr passes "const char*" through "void*".
"-Wno-incompatible-pointer-types",
+
# nspr passes "int*" through "unsigned int*".
"-Wno-pointer-sign",
-
- "-Wno-incompatible-pointer-types",
- "-Wno-pointer-sign",
]
+
+ # nspr uses assert(!"foo") instead of assert(false && "foo").
+ configs -= [ "//build/config/clang:extra_warnings" ]
}
}
@@ -348,7 +347,9 @@
"nss/lib/nss/nssver.c",
]
- public_deps = [ ":nss_static" ]
+ public_deps = [
+ ":nss_static",
+ ]
if (include_nss_root_certs) {
public_deps += [ ":nssckbi" ]
@@ -359,9 +360,8 @@
ldflags = [ "-all_load" ]
} else if (is_win) {
# Pass the def file to the linker.
- ldflags = [
- "/DEF:" + rebase_path("nss/exports_win.def", root_build_dir)
- ]
+ ldflags =
+ [ "/DEF:" + rebase_path("nss/exports_win.def", root_build_dir) ]
}
}
}
@@ -429,14 +429,10 @@
"nss/lib/ckfw/wrap.c",
]
- configs -= [
- "//build/config/compiler:chromium_code"
- ]
+ configs -= [ "//build/config/compiler:chromium_code" ]
if (is_win) {
- configs -= [
- "//build/config/win:unicode", # Requires 8-bit mode.
- ]
+ configs -= [ "//build/config/win:unicode" ] # Requires 8-bit mode.
}
configs += [ "//build/config/compiler:no_chromium_code" ]
@@ -870,22 +866,21 @@
# NOTE: mpi_arm.c can be used directly on Linux. mpi_arm.c will need
# to be excluded conditionally if we start to build NSS on Linux.
"nss/lib/freebl/mpi/mpi_arm.c",
+
# primes.c is included by mpprime.c.
"nss/lib/freebl/mpi/primes.c",
+
# unix_rand.c and win_rand.c are included by sysrand.c.
"nss/lib/freebl/unix_rand.c",
"nss/lib/freebl/win_rand.c",
+
# debug_module.c is included by pk11load.c.
"nss/lib/pk11wrap/debug_module.c",
]
- configs -= [
- "//build/config/compiler:chromium_code"
- ]
+ configs -= [ "//build/config/compiler:chromium_code" ]
if (is_win) {
- configs -= [
- "//build/config/win:unicode", # Requires 8-bit mode.
- ]
+ configs -= [ "//build/config/win:unicode" ] # Requires 8-bit mode.
}
configs += [ "//build/config/compiler:no_chromium_code" ]
public_configs = [ ":nss_static_config" ]
@@ -1112,9 +1107,7 @@
}
if (is_mac || is_ios) {
- sources -= [
- "nss/lib/freebl/mpi/mpi_amd64.c",
- ]
+ sources -= [ "nss/lib/freebl/mpi/mpi_amd64.c" ]
cflags += [
"-include",
rebase_path("//third_party/nss/nss/lib/freebl/nss_build_config_mac.h",
@@ -1159,10 +1152,7 @@
"USE_HW_AES",
"INTEL_GCM",
]
- sources -= [
- "nss/lib/freebl/mpi/mpi_amd64.c",
- ]
-
+ sources -= [ "nss/lib/freebl/mpi/mpi_amd64.c" ]
} else if (cpu_arch == "x64") {
sources -= [
"nss/lib/freebl/intel-aes-x86-masm.asm",
@@ -1191,12 +1181,16 @@
cflags += [
# nss doesn"t explicitly cast between different enum types.
"-Wno-conversion",
+
# nss passes "const char*" through "void*".
"-Wno-incompatible-pointer-types",
+
# nss prefers `a && b || c` over `(a && b) || c`.
"-Wno-logical-op-parentheses",
+
# nss doesn"t use exhaustive switches on enums
"-Wno-switch",
+
# nss has some `unsigned < 0` checks.
"-Wno-tautological-compare",
]
@@ -1215,4 +1209,3 @@
}
}
} # Windows/Mac/iOS.
-
diff --git a/build/secondary/third_party/openmax_dl/dl/BUILD.gn b/build/secondary/third_party/openmax_dl/dl/BUILD.gn
index 158e3f8..40c1513 100644
--- a/build/secondary/third_party/openmax_dl/dl/BUILD.gn
+++ b/build/secondary/third_party/openmax_dl/dl/BUILD.gn
@@ -19,8 +19,7 @@
# Enable run-time NEON selection.
defines = [ "DL_ARM_NEON_OPTIONAL" ]
}
- }
- else if (cpu_arch == "arm64") {
+ } else if (cpu_arch == "arm64") {
# Enable build-time NEON selection.
defines = [ "DL_ARM_NEON" ]
}
@@ -40,9 +39,7 @@
defines = []
if (openmax_big_float_fft) {
- defines += [
- "BIG_FFT_TABLE",
- ]
+ defines += [ "BIG_FFT_TABLE" ]
}
if (cpu_arch == "arm" || cpu_arch == "arm64") {
@@ -63,14 +60,10 @@
if (cpu_arch == "arm") {
if (arm_use_neon || is_android) {
- deps += [
- ":openmax_dl_armv7"
- ]
+ deps += [ ":openmax_dl_armv7" ]
}
configs -= [ "//build/config/compiler:compiler_arm_fpu" ]
- cflags += [
- "-mfpu=neon"
- ]
+ cflags += [ "-mfpu=neon" ]
if (arm_use_neon || is_android) {
sources += [
@@ -95,10 +88,12 @@
"sp/src/arm/neon/armSP_FFT_CToC_SC32_Radix8_fs_unsafe_s.S",
"sp/src/arm/neon/omxSP_FFTFwd_CToC_SC32_Sfs_s.S",
"sp/src/arm/neon/omxSP_FFTInv_CToC_SC32_Sfs_s.S",
+
# Real 32-bit fixed-point FFT
"sp/src/arm/neon/armSP_FFTInv_CCSToR_S32_preTwiddleRadix2_unsafe_s.S",
"sp/src/arm/neon/omxSP_FFTFwd_RToCCS_S32_Sfs_s.S",
"sp/src/arm/neon/omxSP_FFTInv_CCSToR_S32_Sfs_s.S",
+
# Complex 16-bit fixed-point FFT
"sp/src/arm/neon/armSP_FFTInv_CCSToR_S16_preTwiddleRadix2_unsafe_s.S",
"sp/src/arm/neon/armSP_FFT_CToC_SC16_Radix2_fs_unsafe_s.S",
@@ -111,11 +106,13 @@
"sp/src/arm/neon/armSP_FFT_CToC_SC16_Radix8_fs_unsafe_s.S",
"sp/src/arm/neon/omxSP_FFTFwd_CToC_SC16_Sfs_s.S",
"sp/src/arm/neon/omxSP_FFTInv_CToC_SC16_Sfs_s.S",
+
# Real 16-bit fixed-point FFT
"sp/src/arm/neon/omxSP_FFTFwd_RToCCS_S16_Sfs_s.S",
"sp/src/arm/neon/omxSP_FFTInv_CCSToR_S16_Sfs_s.S",
"sp/src/arm/neon/omxSP_FFTFwd_RToCCS_S16S32_Sfs_s.S",
"sp/src/arm/neon/omxSP_FFTInv_CCSToR_S32S16_Sfs_s.S",
+
# Complex floating-point FFT
"sp/src/arm/neon/armSP_FFT_CToC_FC32_Radix2_fs_unsafe_s.S",
"sp/src/arm/neon/armSP_FFT_CToC_FC32_Radix2_ls_unsafe_s.S",
@@ -126,6 +123,7 @@
"sp/src/arm/neon/armSP_FFT_CToC_FC32_Radix8_fs_unsafe_s.S",
"sp/src/arm/neon/omxSP_FFTFwd_CToC_FC32_Sfs_s.S",
"sp/src/arm/neon/omxSP_FFTInv_CToC_FC32_Sfs_s.S",
+
# Real floating-point FFT
"sp/src/arm/neon/armSP_FFTInv_CCSToR_F32_preTwiddleRadix2_unsafe_s.S",
"sp/src/arm/neon/omxSP_FFTFwd_RToCCS_F32_Sfs_s.S",
@@ -135,9 +133,7 @@
}
if (cpu_arch == "ia32" || cpu_arch == "x64") {
- cflags += [
- "-msse2"
- ]
+ cflags += [ "-msse2" ]
sources += [
# Real 32-bit floating-point FFT.
@@ -185,6 +181,7 @@
"sp/src/arm/arm64/armSP_FFT_CToC_FC32_Radix8_fs_s.S",
"sp/src/arm/arm64/omxSP_FFTInv_CToC_FC32.c",
"sp/src/arm/arm64/omxSP_FFTFwd_CToC_FC32.c",
+
# Real floating-point FFT
"sp/src/arm/arm64/armSP_FFTInv_CCSToR_F32_preTwiddleRadix2_s.S",
"sp/src/arm/arm64/omxSP_FFTFwd_RToCCS_F32.c",
@@ -193,12 +190,8 @@
]
}
if (cpu_arch == "mipsel") {
- cflags += [
- "-std=c99",
- ]
- sources -= [
- "sp/src/armSP_FFT_F32TwiddleTable.c",
- ]
+ cflags += [ "-std=c99" ]
+ sources -= [ "sp/src/armSP_FFT_F32TwiddleTable.c" ]
sources += [
"sp/api/mipsSP.h",
@@ -236,6 +229,7 @@
"sp/src/arm/armv7/armSP_FFT_CToC_FC32_Radix8_fs_unsafe_s.S",
"sp/src/arm/armv7/omxSP_FFTInv_CToC_FC32_Sfs_s.S",
"sp/src/arm/armv7/omxSP_FFTFwd_CToC_FC32_Sfs_s.S",
+
# Real floating-point FFT
"sp/src/arm/armv7/armSP_FFTInv_CCSToR_F32_preTwiddleRadix2_unsafe_s.S",
"sp/src/arm/armv7/omxSP_FFTFwd_RToCCS_F32_Sfs_s.S",
@@ -243,8 +237,11 @@
]
if (is_android) {
# We only do run-time NEON detection on Android.
- deps = [ "//third_party/android_tools:cpu_features" ]
+ deps = [
+ "//third_party/android_tools:cpu_features",
+ ]
libs = [ "log" ]
+
# Detection routine
sources += [ "sp/src/arm/detect.c" ]
}
diff --git a/build/secondary/third_party/sfntly/BUILD.gn b/build/secondary/third_party/sfntly/BUILD.gn
index 74107af..a4dbd23 100644
--- a/build/secondary/third_party/sfntly/BUILD.gn
+++ b/build/secondary/third_party/sfntly/BUILD.gn
@@ -125,5 +125,7 @@
configs -= [ "//build/config/compiler:chromium_code" ]
configs += [ "//build/config/compiler:no_chromium_code" ]
- deps = [ "//third_party/icu:icuuc" ]
+ deps = [
+ "//third_party/icu:icuuc",
+ ]
}
diff --git a/build/secondary/tools/grit/BUILD.gn b/build/secondary/tools/grit/BUILD.gn
index f954537..dee3d06 100644
--- a/build/secondary/tools/grit/BUILD.gn
+++ b/build/secondary/tools/grit/BUILD.gn
@@ -9,7 +9,9 @@
depfile = "$target_out_dir/grit_sources.d"
script = "//build/secondary/tools/grit/stamp_grit_sources.py"
- inputs = [ "grit.py" ]
+ inputs = [
+ "grit.py",
+ ]
# Note that we can't call this "grit_sources.stamp" because that file is
# implicitly created by GN for script actions.
@@ -18,6 +20,6 @@
args = [
rebase_path("//tools/grit", root_build_dir),
rebase_path(outputs[0], root_build_dir),
- rebase_path(depfile, root_build_dir)
+ rebase_path(depfile, root_build_dir),
]
}
diff --git a/build/secondary/tools/grit/grit_rule.gni b/build/secondary/tools/grit/grit_rule.gni
index 8726927..9010abc 100644
--- a/build/secondary/tools/grit/grit_rule.gni
+++ b/build/secondary/tools/grit/grit_rule.gni
@@ -71,130 +71,215 @@
# # You can also put deps here if the grit source depends on generated
# # files.
# }
-import ("//build/config/crypto.gni")
-import ("//build/config/features.gni")
-import ("//build/config/ui.gni")
+import("//build/config/crypto.gni")
+import("//build/config/features.gni")
+import("//build/config/ui.gni")
grit_defines = []
# Mac and iOS want Title Case strings.
use_titlecase_in_grd_files = is_mac || is_ios
if (use_titlecase_in_grd_files) {
- grit_defines += [ "-D", "use_titlecase" ]
+ grit_defines += [
+ "-D",
+ "use_titlecase",
+ ]
}
if (is_chrome_branded) {
grit_defines += [
- "-D", "_google_chrome",
- "-E", "CHROMIUM_BUILD=google_chrome",
+ "-D",
+ "_google_chrome",
+ "-E",
+ "CHROMIUM_BUILD=google_chrome",
]
} else {
grit_defines += [
- "-D", "_chromium",
- "-E", "CHROMIUM_BUILD=chromium",
+ "-D",
+ "_chromium",
+ "-E",
+ "CHROMIUM_BUILD=chromium",
]
}
if (is_chromeos) {
grit_defines += [
- "-D", "chromeos",
- "-D", "scale_factors=2x"
+ "-D",
+ "chromeos",
+ "-D",
+ "scale_factors=2x",
]
}
if (is_desktop_linux) {
- grit_defines += [ "-D", "desktop_linux" ]
+ grit_defines += [
+ "-D",
+ "desktop_linux",
+ ]
}
if (toolkit_views) {
- grit_defines += [ "-D", "toolkit_views" ]
+ grit_defines += [
+ "-D",
+ "toolkit_views",
+ ]
}
if (use_aura) {
- grit_defines += [ "-D", "use_aura" ]
+ grit_defines += [
+ "-D",
+ "use_aura",
+ ]
}
if (use_ash) {
- grit_defines += [ "-D", "use_ash" ]
+ grit_defines += [
+ "-D",
+ "use_ash",
+ ]
}
if (use_nss_certs) {
- grit_defines += [ "-D", "use_nss" ]
+ grit_defines += [
+ "-D",
+ "use_nss",
+ ]
}
if (use_ozone) {
- grit_defines += [ "-D", "use_ozone" ]
+ grit_defines += [
+ "-D",
+ "use_ozone",
+ ]
}
if (enable_image_loader_extension) {
- grit_defines += [ "-D", "image_loader_extension" ]
+ grit_defines += [
+ "-D",
+ "image_loader_extension",
+ ]
}
if (enable_remoting) {
- grit_defines += [ "-D", "remoting" ]
+ grit_defines += [
+ "-D",
+ "remoting",
+ ]
}
if (is_android) {
grit_defines += [
- "-t", "android",
- "-E", "ANDROID_JAVA_TAGGED_ONLY=true",
+ "-t",
+ "android",
+ "-E",
+ "ANDROID_JAVA_TAGGED_ONLY=true",
]
}
if (is_mac || is_ios) {
- grit_defines += [ "-D", "scale_factors=2x" ]
+ grit_defines += [
+ "-D",
+ "scale_factors=2x",
+ ]
}
if (is_ios) {
grit_defines += [
- "-t", "ios",
+ "-t",
+ "ios",
+
# iOS uses a whitelist to filter resources.
- "-w", rebase_path("//build/ios/grit_whitelist.txt", root_build_dir),
+ "-w",
+ rebase_path("//build/ios/grit_whitelist.txt", root_build_dir),
]
}
if (enable_extensions) {
- grit_defines += [ "-D", "enable_extensions" ]
+ grit_defines += [
+ "-D",
+ "enable_extensions",
+ ]
}
if (enable_plugins) {
- grit_defines += [ "-D", "enable_plugins" ]
+ grit_defines += [
+ "-D",
+ "enable_plugins",
+ ]
}
if (enable_basic_printing || enable_print_preview) {
- grit_defines += [ "-D", "enable_printing" ]
+ grit_defines += [
+ "-D",
+ "enable_printing",
+ ]
if (enable_print_preview) {
- grit_defines += [ "-D", "enable_print_preview" ]
+ grit_defines += [
+ "-D",
+ "enable_print_preview",
+ ]
}
}
if (enable_themes) {
- grit_defines += [ "-D", "enable_themes" ]
+ grit_defines += [
+ "-D",
+ "enable_themes",
+ ]
}
if (enable_app_list) {
- grit_defines += [ "-D", "enable_app_list" ]
+ grit_defines += [
+ "-D",
+ "enable_app_list",
+ ]
}
if (enable_settings_app) {
- grit_defines += [ "-D", "enable_settings_app" ]
+ grit_defines += [
+ "-D",
+ "enable_settings_app",
+ ]
}
if (enable_google_now) {
- grit_defines += [ "-D", "enable_google_now" ]
+ grit_defines += [
+ "-D",
+ "enable_google_now",
+ ]
}
+
# Note: use_concatenated_impulse_responses is omitted. It is never used and
# should probably be removed from GYP build.
if (enable_webrtc) {
- grit_defines += [ "-D", "enable_webrtc" ]
+ grit_defines += [
+ "-D",
+ "enable_webrtc",
+ ]
}
-# Note: enable_hangout_services_extension is omitted. It is never set in the
-# GYP build. Need to figure out what it's for.
+if (enable_hangout_services_extension) {
+ grit_defines += [
+ "-D",
+ "enable_hangout_services_extension",
+ ]
+}
if (enable_task_manager) {
- grit_defines += [ "-D", "enable_task_manager" ]
+ grit_defines += [
+ "-D",
+ "enable_task_manager",
+ ]
}
if (enable_notifications) {
- grit_defines += [ "-D", "enable_notifications" ]
+ grit_defines += [
+ "-D",
+ "enable_notifications",
+ ]
}
if (enable_wifi_bootstrapping) {
- grit_defines += [ "-D", "enable_wifi_bootstrapping" ]
+ grit_defines += [
+ "-D",
+ "enable_wifi_bootstrapping",
+ ]
}
if (enable_service_discovery) {
- grit_defines += [ "-D", "enable_service_discovery" ]
+ grit_defines += [
+ "-D",
+ "enable_service_discovery",
+ ]
}
grit_resource_id_file = "//tools/gritsettings/resource_ids"
@@ -248,12 +333,10 @@
"$target_out_dir/${grit_output_name}_expected_outputs.txt"
write_file(asserted_list_file,
rebase_path(invoker.outputs, root_build_dir, output_dir))
- assert_files_flags += [
- "--assert-file-list=" + rebase_path(asserted_list_file, root_build_dir),
- ]
- grit_outputs = get_path_info(
- rebase_path(invoker.outputs, ".", output_dir),
- "abspath")
+ assert_files_flags += [ "--assert-file-list=" +
+ rebase_path(asserted_list_file, root_build_dir) ]
+ grit_outputs =
+ get_path_info(rebase_path(invoker.outputs, ".", output_dir), "abspath")
# The config and the action below get this visibility son only the generated
# source set can depend on them. The variable "target_name" will get
@@ -281,21 +364,32 @@
depfile = "$output_dir/${grit_output_name}.d"
args = [
- "-i", source_path, "build",
+ "-i",
+ source_path,
+ "build",
]
if (resource_ids != "") {
- args += [ "-f", resource_ids ]
+ args += [
+ "-f",
+ resource_ids,
+ ]
}
args += [
- "-o", rebased_output_dir,
- "--depdir", ".",
- "--depfile", rebase_path(depfile, root_build_dir),
- ] + grit_defines
+ "-o",
+ rebased_output_dir,
+ "--depdir",
+ ".",
+ "--depfile",
+ rebase_path(depfile, root_build_dir),
+ ] + grit_defines
# Add extra defines with -D flags.
if (defined(invoker.defines)) {
- foreach (i, invoker.defines) {
- args += [ "-D", i ]
+ foreach(i, invoker.defines) {
+ args += [
+ "-D",
+ i,
+ ]
}
}
@@ -312,7 +406,9 @@
visibility = target_visibility + invoker.visibility
}
- deps = [ "//tools/grit:grit_sources" ]
+ deps = [
+ "//tools/grit:grit_sources",
+ ]
if (defined(invoker.deps)) {
deps += invoker.deps
}
@@ -327,7 +423,9 @@
# Deps set on the template invocation will go on the grit script running
# target rather than this library.
- deps = [ ":$grit_custom_target" ]
+ deps = [
+ ":$grit_custom_target",
+ ]
public_configs = [ ":$grit_config" ]
if (defined(invoker.public_configs)) {
diff --git a/build/toolchain/android/BUILD.gn b/build/toolchain/android/BUILD.gn
index 9ae2218..e074333 100644
--- a/build/toolchain/android/BUILD.gn
+++ b/build/toolchain/android/BUILD.gn
@@ -3,6 +3,7 @@
# found in the LICENSE file.
import("//build/config/sysroot.gni") # Imports android/config.gni.
+import("//build/toolchain/ccache.gni")
import("//build/toolchain/clang.gni")
import("//build/toolchain/goma.gni")
import("//build/toolchain/gcc_toolchain.gni")
@@ -23,8 +24,8 @@
gcc_toolchain(target_name) {
# Make our manually injected libs relative to the build dir.
android_ndk_lib = rebase_path(
- invoker.android_ndk_sysroot + "/" + invoker.android_ndk_lib_dir,
- root_build_dir)
+ invoker.android_ndk_sysroot + "/" + invoker.android_ndk_lib_dir,
+ root_build_dir)
libs_section_prefix = "$android_ndk_lib/crtbegin_dynamic.o"
libs_section_postfix = "$android_ndk_lib/crtend_android.o"
@@ -36,13 +37,16 @@
tool_prefix = rebase_path(invoker.tool_prefix, root_build_dir)
if (use_goma) {
- goma_prefix = "$goma_dir/gomacc "
+ assert(!use_ccache, "Goma and ccache can't be used together.")
+ compiler_prefix = "$goma_dir/gomacc "
+ } else if (use_ccache) {
+ compiler_prefix = "ccache "
} else {
- goma_prefix = ""
+ compiler_prefix = ""
}
- cc = goma_prefix + tool_prefix + "gcc"
- cxx = goma_prefix + tool_prefix + "g++"
+ cc = compiler_prefix + tool_prefix + "gcc"
+ cxx = compiler_prefix + tool_prefix + "g++"
ar = tool_prefix + "ar"
ld = cxx
@@ -59,8 +63,10 @@
android_strip = "${tool_prefix}strip"
mkdir_command = "mkdir -p lib.stripped"
- strip_command = "$android_strip --strip-unneeded -o $temp_stripped_soname $soname"
- replace_command = "if ! cmp -s $temp_stripped_soname $stripped_soname; then mv $temp_stripped_soname $stripped_soname; fi"
+ strip_command =
+ "$android_strip --strip-unneeded -o $temp_stripped_soname $soname"
+ replace_command =
+ "if ! cmp -s $temp_stripped_soname $stripped_soname; then mv $temp_stripped_soname $stripped_soname; fi"
postsolink = "$mkdir_command && $strip_command && $replace_command"
solink_outputs = [ stripped_soname ]
diff --git a/build/toolchain/ccache.gni b/build/toolchain/ccache.gni
new file mode 100644
index 0000000..806e079
--- /dev/null
+++ b/build/toolchain/ccache.gni
@@ -0,0 +1,25 @@
+# Copyright (c) 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# Defines the configuration of ccache - a c/c++ compiler cache which can
+# greatly reduce recompilation times.
+#
+# TIPS:
+#
+# Set clang_use_chrome_plugins=false if using ccache 3.1.9 or earlier, since
+# these versions don't support -Xclang. (3.1.10 and later will silently
+# ignore -Xclang, so it doesn't matter if you disable clang_use_chrome_plugins
+# or not).
+#
+# Use ccache 3.2 or later to avoid clang unused argument warnings:
+# https://bugzilla.samba.org/show_bug.cgi?id=8118
+#
+# To avoid -Wparentheses-equality clang warnings, at some cost in terms of
+# speed, you can do:
+# export CCACHE_CPP2=yes
+
+declare_args() {
+ # Set to true to enable ccache. Probably doesn't work on windows.
+ use_ccache = false
+}
diff --git a/build/toolchain/gcc_toolchain.gni b/build/toolchain/gcc_toolchain.gni
index e415459..4a4ef45 100644
--- a/build/toolchain/gcc_toolchain.gni
+++ b/build/toolchain/gcc_toolchain.gni
@@ -84,33 +84,33 @@
tool("cc") {
depfile = "{{output}}.d"
- command = "$cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}"
+ command =
+ "$cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}"
depsformat = "gcc"
description = "CC {{output}}"
- outputs = [
- "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o",
- ]
+ outputs =
+ [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ]
}
tool("cxx") {
depfile = "{{output}}.d"
- command = "$cxx -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} -c {{source}} -o {{output}}"
+ command =
+ "$cxx -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} -c {{source}} -o {{output}}"
depsformat = "gcc"
description = "CXX {{output}}"
- outputs = [
- "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o",
- ]
+ outputs =
+ [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ]
}
tool("asm") {
# For GCC we can just use the C compiler to compile assembly.
depfile = "{{output}}.d"
- command = "$cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}"
+ command =
+ "$cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}"
depsformat = "gcc"
description = "ASM {{output}}"
- outputs = [
- "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o",
- ]
+ outputs =
+ [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ]
}
tool("alink") {
@@ -118,9 +118,8 @@
command = "rm -f {{output}} && $ar rcs {{output}} @$rspfile"
description = "AR {{output}}"
rspfile_content = "{{inputs}}"
- outputs = [
- "{{target_out_dir}}/{{target_output_name}}{{output_extension}}"
- ]
+ outputs =
+ [ "{{target_out_dir}}/{{target_output_name}}{{output_extension}}" ]
default_output_extension = ".a"
output_prefix = "lib"
}
@@ -136,15 +135,19 @@
# existing .TOC file, overwrite it, otherwise, don't change it.
tocfile = sofile + ".TOC"
temporary_tocname = sofile + ".tmp"
- link_command = "$ld -shared {{ldflags}} -o $sofile -Wl,-soname=$soname @$rspfile"
- toc_command = "{ readelf -d $sofile | grep SONAME ; nm -gD -f p $soname | cut -f1-2 -d' '; } > $temporary_tocname"
- replace_command = "if ! cmp -s $temporary_tocname $tocfile; then mv $temporary_tocname $tocfile; fi"
+ link_command =
+ "$ld -shared {{ldflags}} -o $sofile -Wl,-soname=$soname @$rspfile"
+ toc_command =
+ "{ readelf -d $sofile | grep SONAME ; nm -gD -f p $soname | cut -f1-2 -d' '; } > $temporary_tocname"
+ replace_command =
+ "if ! cmp -s $temporary_tocname $tocfile; then mv $temporary_tocname $tocfile; fi"
command = "$link_command && $toc_command && $replace_command"
if (defined(invoker.postsolink)) {
command += " && " + invoker.postsolink
}
- rspfile_content = "-Wl,--whole-archive {{inputs}} {{solibs}} -Wl,--no-whole-archive $solink_libs_section_prefix {{libs}} $solink_libs_section_postfix"
+ rspfile_content =
+ "-Wl,--whole-archive {{inputs}} {{solibs}} -Wl,--no-whole-archive $solink_libs_section_prefix {{libs}} $solink_libs_section_postfix"
description = "SOLINK $sofile"
@@ -176,7 +179,8 @@
tool("link") {
outfile = "{{root_out_dir}}/{{target_output_name}}{{output_extension}}"
rspfile = "$outfile.rsp"
- command = "$ld {{ldflags}} -o $outfile -Wl,--start-group @$rspfile {{solibs}} -Wl,--end-group $libs_section_prefix {{libs}} $libs_section_postfix"
+ command =
+ "$ld {{ldflags}} -o $outfile -Wl,--start-group @$rspfile {{solibs}} -Wl,--end-group $libs_section_prefix {{libs}} $libs_section_postfix"
if (defined(invoker.postlink)) {
command += " && " + invoker.postlink
}
@@ -194,7 +198,8 @@
}
tool("copy") {
- command = "ln -f {{source}} {{output}} 2>/dev/null || (rm -rf {{output}} && cp -af {{source}} {{output}})"
+ command =
+ "ln -f {{source}} {{output}} 2>/dev/null || (rm -rf {{output}} && cp -af {{source}} {{output}})"
description = "COPY {{source}} {{output}}"
}
diff --git a/build/toolchain/linux/BUILD.gn b/build/toolchain/linux/BUILD.gn
index a98ea53..1d17772 100644
--- a/build/toolchain/linux/BUILD.gn
+++ b/build/toolchain/linux/BUILD.gn
@@ -3,19 +3,23 @@
# found in the LICENSE file.
import("//build/config/sysroot.gni")
+import("//build/toolchain/ccache.gni")
import("//build/toolchain/clang.gni")
import("//build/toolchain/gcc_toolchain.gni")
import("//build/toolchain/goma.gni")
if (use_goma) {
- goma_prefix = "$goma_dir/gomacc "
+ assert(!use_ccache, "Goma and ccache can't be used together.")
+ compiler_prefix = "$goma_dir/gomacc "
+} else if (use_ccache) {
+ compiler_prefix = "ccache "
} else {
- goma_prefix = ""
+ compiler_prefix = ""
}
gcc_toolchain("arm") {
- cc = "${goma_prefix}arm-linux-gnueabi-gcc"
- cxx = "${goma_prefix}arm-linux-gnueabi-g++"
+ cc = "${compiler_prefix}arm-linux-gnueabi-gcc"
+ cxx = "${compiler_prefix}arm-linux-gnueabi-g++"
ar = "arm-linux-gnueabi-ar"
ld = cxx
@@ -33,8 +37,8 @@
prefix = rebase_path("//third_party/llvm-build/Release+Asserts/bin",
root_build_dir)
}
- cc = "${goma_prefix}$prefix/clang"
- cxx = "${goma_prefix}$prefix/clang++"
+ cc = "${compiler_prefix}$prefix/clang"
+ cxx = "${compiler_prefix}$prefix/clang++"
ar = "ar"
ld = cxx
@@ -45,8 +49,8 @@
}
gcc_toolchain("x86") {
- cc = "${goma_prefix}gcc"
- cxx = "$goma_prefix}g++"
+ cc = "${compiler_prefix}gcc"
+ cxx = "$compiler_prefix}g++"
ar = "ar"
ld = cxx
@@ -64,8 +68,8 @@
prefix = rebase_path("//third_party/llvm-build/Release+Asserts/bin",
root_build_dir)
}
- cc = "${goma_prefix}$prefix/clang"
- cxx = "${goma_prefix}$prefix/clang++"
+ cc = "${compiler_prefix}$prefix/clang"
+ cxx = "${compiler_prefix}$prefix/clang++"
ar = "ar"
ld = cxx
@@ -76,8 +80,8 @@
}
gcc_toolchain("x64") {
- cc = "${goma_prefix}gcc"
- cxx = "${goma_prefix}g++"
+ cc = "${compiler_prefix}gcc"
+ cxx = "${compiler_prefix}g++"
ar = "ar"
ld = cxx
diff --git a/build/toolchain/mac/BUILD.gn b/build/toolchain/mac/BUILD.gn
index b1cd36b..052e76c 100644
--- a/build/toolchain/mac/BUILD.gn
+++ b/build/toolchain/mac/BUILD.gn
@@ -28,7 +28,7 @@
# This will copy the gyp-mac-tool to the build directory. We pass in the source
# file of the win tool.
gyp_mac_tool_source =
- rebase_path("//tools/gyp/pylib/gyp/mac_tool.py", root_build_dir)
+ rebase_path("//tools/gyp/pylib/gyp/mac_tool.py", root_build_dir)
exec_script("setup_toolchain.py", [ gyp_mac_tool_source ])
# Shared toolchain definition. Invocations should set toolchain_os to set the
@@ -57,61 +57,61 @@
tool("cc") {
depfile = "{{output}}.d"
- command = "$cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}"
+ command =
+ "$cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}"
depsformat = "gcc"
description = "CC {{output}}"
- outputs = [
- "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o",
- ]
+ outputs =
+ [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ]
}
tool("cxx") {
depfile = "{{output}}.d"
- command = "$cxx -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} -c {{source}} -o {{output}}"
+ command =
+ "$cxx -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} -c {{source}} -o {{output}}"
depsformat = "gcc"
description = "CXX {{output}}"
- outputs = [
- "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o",
- ]
+ outputs =
+ [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ]
}
tool("asm") {
# For GCC we can just use the C compiler to compile assembly.
depfile = "{{output}}.d"
- command = "$cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}"
+ command =
+ "$cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}"
depsformat = "gcc"
description = "ASM {{output}}"
- outputs = [
- "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o",
- ]
+ outputs =
+ [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ]
}
tool("objc") {
depfile = "{{output}}.d"
- command = "$cxx -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} {{cflags_objc}} -c {{source}} -o {{output}}"
+ command =
+ "$cxx -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} {{cflags_objc}} -c {{source}} -o {{output}}"
depsformat = "gcc"
description = "OBJC {{output}}"
- outputs = [
- "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o",
- ]
+ outputs =
+ [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ]
}
tool("objcxx") {
depfile = "{{output}}.d"
- command = "$cxx -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} {{cflags_objcc}} -c {{source}} -o {{output}}"
+ command =
+ "$cxx -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} {{cflags_objcc}} -c {{source}} -o {{output}}"
depsformat = "gcc"
description = "OBJCXX {{output}}"
- outputs = [
- "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o",
- ]
+ outputs =
+ [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ]
}
tool("alink") {
- command = "rm -f {{output}} && ./gyp-mac-tool filter-libtool libtool -static -o {{output}} {{inputs}}"
+ command =
+ "rm -f {{output}} && ./gyp-mac-tool filter-libtool libtool -static -o {{output}} {{inputs}}"
description = "LIBTOOL-STATIC {{output}}"
- outputs = [
- "{{target_out_dir}}/{{target_output_name}}{{output_extension}}"
- ]
+ outputs =
+ [ "{{target_out_dir}}/{{target_output_name}}{{output_extension}}" ]
default_output_extension = ".a"
output_prefix = "lib"
}
@@ -131,12 +131,17 @@
tocname = dylib + ".TOC"
temporary_tocname = dylib + ".tmp"
- does_reexport_command = "[ ! -e $dylib -o ! -e $tocname ] || otool -l $dylib | grep -q LC_REEXPORT_DYLIB"
- link_command = "$ld -shared {{ldflags}} -o $dylib -Wl,-filelist,$rspfile {{solibs}} {{libs}}"
- replace_command = "if ! cmp -s $temporary_tocname $tocname; then mv $temporary_tocname $tocname"
- extract_toc_command = "{ otool -l $dylib | grep LC_ID_DYLIB -A 5; nm -gP $dylib | cut -f1-2 -d' ' | grep -v U\$\$; true; }"
+ does_reexport_command =
+ "[ ! -e $dylib -o ! -e $tocname ] || otool -l $dylib | grep -q LC_REEXPORT_DYLIB"
+ link_command =
+ "$ld -shared {{ldflags}} -o $dylib -Wl,-filelist,$rspfile {{solibs}} {{libs}}"
+ replace_command =
+ "if ! cmp -s $temporary_tocname $tocname; then mv $temporary_tocname $tocname"
+ extract_toc_command =
+ "{ otool -l $dylib | grep LC_ID_DYLIB -A 5; nm -gP $dylib | cut -f1-2 -d' ' | grep -v U\$\$; true; }"
- command = "if $does_reexport_command ; then $link_command && $extract_toc_command > $tocname; else $link_command && $extract_toc_command > $temporary_tocname && $replace_command ; fi; fi"
+ command =
+ "if $does_reexport_command ; then $link_command && $extract_toc_command > $tocname; else $link_command && $extract_toc_command > $temporary_tocname && $replace_command ; fi; fi"
rspfile_content = "{{inputs_newline}}"
@@ -167,7 +172,8 @@
tool("link") {
outfile = "{{root_out_dir}}/{{target_output_name}}{{output_extension}}"
rspfile = "$outfile.rsp"
- command = "$ld {{ldflags}} -o $outfile -Wl,-filelist,$rspfile {{solibs}} {{libs}}"
+ command =
+ "$ld {{ldflags}} -o $outfile -Wl,-filelist,$rspfile {{solibs}} {{libs}}"
description = "LINK $outfile"
rspfile_content = "{{inputs_newline}}"
outputs = [ outfile ]
@@ -179,7 +185,8 @@
}
tool("copy") {
- command = "ln -f {{source}} {{output}} 2>/dev/null || (rm -rf {{output}} && cp -af {{source}} {{output}})"
+ command =
+ "ln -f {{source}} {{output}} 2>/dev/null || (rm -rf {{output}} && cp -af {{source}} {{output}})"
description = "COPY {{source}} {{output}}"
}
diff --git a/build/toolchain/nacl/BUILD.gn b/build/toolchain/nacl/BUILD.gn
index 8c76f5a..bea30e0 100644
--- a/build/toolchain/nacl/BUILD.gn
+++ b/build/toolchain/nacl/BUILD.gn
@@ -9,14 +9,16 @@
ld = toolprefix + "g++"
tool("cc") {
- command = "$cc -MMD -MF \$out.d \$defines \$includes \$cflags \$cflags_c -c \$in -o \$out"
+ command =
+ "$cc -MMD -MF \$out.d \$defines \$includes \$cflags \$cflags_c -c \$in -o \$out"
description = "CC(NaCl x86 Newlib) \$out"
depfile = "\$out.d"
depsformat = "gcc"
}
tool("cxx") {
# cflags_pch_cc
- command = "$cxx -MMD -MF \$out.d \$defines \$includes \$cflags \$cflags_cc -c \$in -o \$out"
+ command =
+ "$cxx -MMD -MF \$out.d \$defines \$includes \$cflags \$cflags_cc -c \$in -o \$out"
description = "CXX(NaCl x86 Newlib) \$out"
depfile = "\$out.d"
depsformat = "gcc"
@@ -26,14 +28,18 @@
description = "AR(NaCl x86 Newlib) \$out"
}
tool("solink") {
- command = "if [ ! -e \$lib -o ! -e \${lib}.TOC ]; then $ld -shared \$ldflags -o \$lib -Wl,-soname=\$soname -Wl,--whole-archive \$in \$solibs -Wl,--no-whole-archive \$libs && { readelf -d \${lib} | grep SONAME ; nm -gD -f p \${lib} | cut -f1-2 -d' '; } > \${lib}.TOC; else $ld -shared \$ldflags -o \$lib -Wl,-soname=\$soname -Wl,--whole-archive \$in \$solibs -Wl,--no-whole-archive \$libs && { readelf -d \${lib} | grep SONAME ; nm -gD -f p \${lib} | cut -f1-2 -d' '; } > \${lib}.tmp && if ! cmp -s \${lib}.tmp \${lib}.TOC; then mv \${lib}.tmp \${lib}.TOC ; fi; fi"
+ command =
+ "if [ ! -e \$lib -o ! -e \${lib}.TOC ]; then $ld -shared \$ldflags -o \$lib -Wl,-soname=\$soname -Wl,--whole-archive \$in \$solibs -Wl,--no-whole-archive \$libs && { readelf -d \${lib} | grep SONAME ; nm -gD -f p \${lib} | cut -f1-2 -d' '; } > \${lib}.TOC; else $ld -shared \$ldflags -o \$lib -Wl,-soname=\$soname -Wl,--whole-archive \$in \$solibs -Wl,--no-whole-archive \$libs && { readelf -d \${lib} | grep SONAME ; nm -gD -f p \${lib} | cut -f1-2 -d' '; } > \${lib}.tmp && if ! cmp -s \${lib}.tmp \${lib}.TOC; then mv \${lib}.tmp \${lib}.TOC ; fi; fi"
description = "SOLINK(NaCl x86 Newlib) \$lib"
+
#pool = "link_pool"
restat = "1"
}
tool("link") {
- command = "$ld \$ldflags -o \$out -Wl,--start-group \$in \$solibs -Wl,--end-group \$libs"
+ command =
+ "$ld \$ldflags -o \$out -Wl,--start-group \$in \$solibs -Wl,--end-group \$libs"
description = "LINK(NaCl x86 Newlib) \$out"
+
#pool = "link_pool"
}
diff --git a/build/toolchain/win/BUILD.gn b/build/toolchain/win/BUILD.gn
index 87bd254..1be1cf4 100644
--- a/build/toolchain/win/BUILD.gn
+++ b/build/toolchain/win/BUILD.gn
@@ -2,6 +2,15 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+declare_args() {
+ # Path to the directory containing the VC binaries for the right
+ # combination of host and target architectures. Currently only the
+ # 64-bit host toolchain is supported, with either 32-bit or 64-bit targets.
+ # If vc_bin_dir is not specified on the command line (and it normally
+ # isn't), we will dynamically determine the right value to use at runtime.
+ vc_bin_dir = ""
+}
+
import("//build/config/win/visual_studio_version.gni")
import("//build/toolchain/goma.gni")
@@ -13,15 +22,22 @@
# Its arguments are the VS path and the compiler wrapper tool. It will write
# "environment.x86" and "environment.x64" to the build directory and return a
# list to us.
-gyp_win_tool_path = rebase_path("//tools/gyp/pylib/gyp/win_tool.py",
- root_build_dir)
-exec_script("setup_toolchain.py",
- [
- visual_studio_path,
- gyp_win_tool_path,
- windows_sdk_path,
- visual_studio_runtime_dirs
- ])
+gyp_win_tool_path =
+ rebase_path("//tools/gyp/pylib/gyp/win_tool.py", root_build_dir)
+
+toolchain_data = exec_script("setup_toolchain.py",
+ [
+ visual_studio_path,
+ gyp_win_tool_path,
+ windows_sdk_path,
+ visual_studio_runtime_dirs,
+ cpu_arch,
+ ],
+ "scope")
+
+if (vc_bin_dir == "") {
+ vc_bin_dir = toolchain_data.vc_bin_dir
+}
# This value will be inherited in the toolchain below.
concurrent_links = exec_script("../get_concurrent_links.py", [], "value")
@@ -41,62 +57,75 @@
} else {
configuration = "Release"
}
- exec_script("../../vs_toolchain.py", ["copy_dlls",
- rebase_path(root_build_dir),
- configuration,
- invoker.cpu_arch])
+ exec_script("../../vs_toolchain.py",
+ [
+ "copy_dlls",
+ rebase_path(root_build_dir),
+ configuration,
+ invoker.cpu_arch,
+ ])
+
+ if (use_goma) {
+ goma_prefix = "$goma_dir/gomacc.exe "
+ } else {
+ goma_prefix = ""
+ }
+
+ cl = "${goma_prefix}\"${vc_bin_dir}/cl.exe\""
toolchain(target_name) {
# Make these apply to all tools below.
lib_switch = ""
- lib_dir_switch="/LIBPATH:"
+ lib_dir_switch = "/LIBPATH:"
tool("cc") {
rspfile = "{{output}}.rsp"
pdbname = "{{target_out_dir}}/{{target_output_name}}_c.pdb"
- command = "ninja -t msvc -e $env -- cl.exe /nologo /showIncludes /FC @$rspfile /c {{source}} /Fo{{output}} /Fd$pdbname"
+ command =
+ "ninja -t msvc -e $env -- $cl /nologo /showIncludes /FC @$rspfile /c {{source}} /Fo{{output}} /Fd$pdbname"
depsformat = "msvc"
description = "CC {{output}}"
- outputs = [
- "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj",
- ]
+ outputs =
+ [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj" ]
rspfile_content = "{{defines}} {{include_dirs}} {{cflags}} {{cflags_c}}"
}
tool("cxx") {
rspfile = "{{output}}.rsp"
+
# The PDB name needs to be different between C and C++ compiled files.
pdbname = "{{target_out_dir}}/{{target_output_name}}_cc.pdb"
- command = "ninja -t msvc -e $env -- cl.exe /nologo /showIncludes /FC @$rspfile /c {{source}} /Fo{{output}} /Fd$pdbname"
+ command =
+ "ninja -t msvc -e $env -- $cl /nologo /showIncludes /FC @$rspfile /c {{source}} /Fo{{output}} /Fd$pdbname"
depsformat = "msvc"
description = "CXX {{output}}"
- outputs = [
- "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj",
- ]
+ outputs =
+ [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj" ]
rspfile_content = "{{defines}} {{include_dirs}} {{cflags}} {{cflags_c}}"
}
tool("rc") {
- command = "$python_path gyp-win-tool rc-wrapper $env rc.exe {{defines}} {{include_dirs}} /fo{{output}} {{source}}"
- outputs = [
- "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.res",
- ]
+ command =
+ "$python_path gyp-win-tool rc-wrapper $env rc.exe {{defines}} {{include_dirs}} /fo{{output}} {{source}}"
+ outputs =
+ [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.res" ]
description = "RC {{output}}"
}
tool("asm") {
# TODO(brettw): "/safeseh" assembler argument is hardcoded here. Extract
# assembler flags to a variable like cflags. crbug.com/418613
- command = "$python_path gyp-win-tool asm-wrapper $env ml.exe {{defines}} {{include_dirs}} /safeseh /c /Fo {{output}} {{source}}"
+ command =
+ "$python_path gyp-win-tool asm-wrapper $env ml.exe {{defines}} {{include_dirs}} /safeseh /c /Fo {{output}} {{source}}"
description = "ASM {{output}}"
- outputs = [
- "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj",
- ]
+ outputs =
+ [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj" ]
}
tool("alink") {
rspfile = "{{output}}.rsp"
- command = "$python_path gyp-win-tool link-wrapper $env False lib.exe /nologo /ignore:4221 /OUT:{{output}} @$rspfile"
+ command =
+ "$python_path gyp-win-tool link-wrapper $env False lib.exe /nologo /ignore:4221 /OUT:{{output}} @$rspfile"
description = "LIB {{output}}"
outputs = [
# Ignore {{output_extension}} and always use .lib, there's no reason to
@@ -104,6 +133,7 @@
"{{target_out_dir}}/{{target_output_name}}.lib",
]
default_output_extension = ".lib"
+
# The use of inputs_newline is to work around a fixed per-line buffer
# size in the linker.
rspfile_content = "{{inputs_newline}}"
@@ -111,10 +141,12 @@
tool("solink") {
dllname = "{{root_out_dir}}/{{target_output_name}}{{output_extension}}" # e.g. foo.dll
- libname = "{{root_out_dir}}/{{target_output_name}}{{output_extension}}.lib" # e.g. foo.dll.lib
+ libname =
+ "{{root_out_dir}}/{{target_output_name}}{{output_extension}}.lib" # e.g. foo.dll.lib
rspfile = "${dllname}.rsp"
- link_command = "$python_path gyp-win-tool link-wrapper $env False link.exe /nologo /IMPLIB:$libname /DLL /OUT:$dllname /PDB:${dllname}.pdb @$rspfile"
+ link_command =
+ "$python_path gyp-win-tool link-wrapper $env False link.exe /nologo /IMPLIB:$libname /DLL /OUT:$dllname /PDB:${dllname}.pdb @$rspfile"
# TODO(brettw) support manifests
#manifest_command = "$python_path gyp-win-tool manifest-wrapper $env mt.exe -nologo -manifest $manifests -out:${dllname}.manifest"
@@ -129,6 +161,7 @@
]
link_output = libname
depend_output = libname
+
# The use of inputs_newline is to work around a fixed per-line buffer
# size in the linker.
rspfile_content = "{{libs}} {{solibs}} {{inputs_newline}} {{ldflags}}"
@@ -137,7 +170,8 @@
tool("link") {
rspfile = "{{output}}.rsp"
- link_command = "$python_path gyp-win-tool link-wrapper $env False link.exe /nologo /OUT:{{output}} /PDB:{{output}}.pdb @$rspfile"
+ link_command =
+ "$python_path gyp-win-tool link-wrapper $env False link.exe /nologo /OUT:{{output}} /PDB:{{output}}.pdb @$rspfile"
# TODO(brettw) support manifests
#manifest_command = "$python_path gyp-win-tool manifest-wrapper $env mt.exe -nologo -manifest $manifests -out:{{output}}.manifest"
@@ -146,9 +180,9 @@
default_output_extension = ".exe"
description = "LINK {{output}}"
- outputs = [
- "{{root_out_dir}}/{{target_output_name}}{{output_extension}}",
- ]
+ outputs =
+ [ "{{root_out_dir}}/{{target_output_name}}{{output_extension}}" ]
+
# The use of inputs_newline is to work around a fixed per-line buffer
# size in the linker.
rspfile_content = "{{inputs_newline}} {{libs}} {{solibs}} {{ldflags}}"
@@ -160,7 +194,8 @@
}
tool("copy") {
- command = "$python_path gyp-win-tool recursive-mirror {{source}} {{output}}"
+ command =
+ "$python_path gyp-win-tool recursive-mirror {{source}} {{output}}"
description = "COPY {{source}} {{output}}"
}
diff --git a/build/toolchain/win/midl.gni b/build/toolchain/win/midl.gni
index 7f068d0..9fda96b 100644
--- a/build/toolchain/win/midl.gni
+++ b/build/toolchain/win/midl.gni
@@ -67,7 +67,8 @@
}
args = [
- "midl-wrapper", win_tool_arch,
+ "midl-wrapper",
+ win_tool_arch,
rebase_path(out_dir, root_build_dir),
type_library_file,
header_file,
@@ -75,13 +76,18 @@
interface_identifier_file,
proxy_file,
"{{source}}",
- "/char", "signed",
- "/env", idl_target_platform,
+ "/char",
+ "signed",
+ "/env",
+ idl_target_platform,
"/Oicf",
]
foreach(include, system_include_dirs) {
- args += [ "/I", include ]
+ args += [
+ "/I",
+ include,
+ ]
}
}
@@ -91,10 +97,11 @@
}
# We only compile the IID files from the IDL tool rather than all outputs.
- sources = process_file_template(
- invoker.sources,
- [ "$out_dir/$interface_identifier_file" ])
+ sources = process_file_template(invoker.sources,
+ [ "$out_dir/$interface_identifier_file" ])
- deps = [ ":$action_name" ]
+ deps = [
+ ":$action_name",
+ ]
}
}
diff --git a/build/toolchain/win/setup_toolchain.py b/build/toolchain/win/setup_toolchain.py
index 42c3af1..6b7ea7a 100644
--- a/build/toolchain/win/setup_toolchain.py
+++ b/build/toolchain/win/setup_toolchain.py
@@ -98,20 +98,26 @@
def main():
- if len(sys.argv) != 5:
+ if len(sys.argv) != 6:
print('Usage setup_toolchain.py '
- '<visual studio path> <win tool path> <win sdk path> <runtime dirs>')
+ '<visual studio path> <win tool path> <win sdk path> '
+ '<runtime dirs> <cpu_arch>')
sys.exit(2)
vs_path = sys.argv[1]
tool_source = sys.argv[2]
win_sdk_path = sys.argv[3]
runtime_dirs = sys.argv[4]
+ cpu_arch = sys.argv[5]
_CopyTool(tool_source)
archs = ('x86', 'x64')
+ assert cpu_arch in archs
+ vc_bin_dir = ''
+
# TODO(scottmg|goma): Do we need an equivalent of
# ninja_use_custom_environment_files?
+
for arch in archs:
# Extract environment variables for subprocesses.
args = _SetupScript(arch, win_sdk_path)
@@ -122,6 +128,12 @@
env = _ExtractImportantEnvironment(variables)
env['PATH'] = runtime_dirs + ';' + env['PATH']
+ if arch == cpu_arch:
+ for path in env['PATH'].split(os.pathsep):
+ if os.path.exists(os.path.join(path, 'cl.exe')):
+ vc_bin_dir = os.path.realpath(path)
+ break
+
# TODO(scottmg|thakis|dpranke): Is there an equivalent to
# msvs_system_include_dirs that we need to inject into INCLUDE here?
@@ -129,6 +141,9 @@
with open('environment.' + arch, 'wb') as f:
f.write(env_block)
+ assert vc_bin_dir
+ print 'vc_bin_dir = "%s"' % vc_bin_dir
+
if __name__ == '__main__':
main()
diff --git a/build/util/BUILD.gn b/build/util/BUILD.gn
index 320c5ee..3fc7757 100644
--- a/build/util/BUILD.gn
+++ b/build/util/BUILD.gn
@@ -6,15 +6,20 @@
script = "version.py"
lastchange_file = "LASTCHANGE.blink"
+
# TODO(brettw) move from content to this directory.
template_file = "//content/webkit_version.h.in"
- inputs = [ lastchange_file, template_file ]
+ inputs = [
+ lastchange_file,
+ template_file,
+ ]
output_file = "$root_gen_dir/webkit_version.h"
outputs = [ output_file ]
args = [
- "-f", rebase_path(lastchange_file, root_build_dir),
+ "-f",
+ rebase_path(lastchange_file, root_build_dir),
rebase_path(template_file, root_build_dir),
rebase_path(output_file, root_build_dir),
]
diff --git a/build/util/version.gypi b/build/util/version.gypi
index b05b415..327a5c2 100644
--- a/build/util/version.gypi
+++ b/build/util/version.gypi
@@ -14,8 +14,6 @@
'lastchange_path': '<(lastchange_path)',
'version_full':
'<!(python <(version_py_path) -f <(version_path) -t "@MAJOR@.@MINOR@.@BUILD@.@PATCH@")',
- 'version_libchrome_short':
- '<!(python <(version_py_path) -f <(version_path) -t "@BUILD@.@PATCH@")',
'version_mac_dylib':
'<!(python <(version_py_path) -f <(version_path) -t "@BUILD@.@PATCH_HI@.@PATCH_LO@" -e "PATCH_HI=int(PATCH)/256" -e "PATCH_LO=int(PATCH)%256")',
}, # variables
diff --git a/cc/BUILD.gn b/cc/BUILD.gn
index 6d5fec4..7e66bd9 100644
--- a/cc/BUILD.gn
+++ b/cc/BUILD.gn
@@ -323,10 +323,24 @@
"resources/bitmap_raster_worker_pool.h",
"resources/bitmap_skpicture_content_layer_updater.cc",
"resources/bitmap_skpicture_content_layer_updater.h",
+ "resources/clip_display_item.cc",
+ "resources/clip_display_item.h",
"resources/content_layer_updater.cc",
"resources/content_layer_updater.h",
+ "resources/display_item.cc",
+ "resources/display_item.h",
+ "resources/display_item_list.cc",
+ "resources/display_item_list.h",
+ "resources/display_list_raster_source.cc",
+ "resources/display_list_raster_source.h",
+ "resources/display_list_recording_source.cc",
+ "resources/display_list_recording_source.h",
+ "resources/drawing_display_item.cc",
+ "resources/drawing_display_item.h",
"resources/eviction_tile_priority_queue.cc",
"resources/eviction_tile_priority_queue.h",
+ "resources/filter_display_item.cc",
+ "resources/filter_display_item.h",
"resources/gpu_raster_worker_pool.cc",
"resources/gpu_raster_worker_pool.h",
"resources/image_layer_updater.cc",
@@ -366,6 +380,8 @@
"resources/raster_buffer.cc",
"resources/raster_buffer.h",
"resources/raster_source.h",
+ "resources/raster_source_helper.cc",
+ "resources/raster_source_helper.h",
"resources/raster_tile_priority_queue.cc",
"resources/raster_tile_priority_queue.h",
"resources/raster_worker_pool.cc",
@@ -417,8 +433,14 @@
"resources/tile_manager.h",
"resources/tile_priority.cc",
"resources/tile_priority.h",
+ "resources/tiling_set_eviction_queue.cc",
+ "resources/tiling_set_eviction_queue.h",
"resources/transferable_resource.cc",
"resources/transferable_resource.h",
+ "resources/transform_display_item.cc",
+ "resources/transform_display_item.h",
+ "resources/transparency_display_item.cc",
+ "resources/transparency_display_item.h",
"resources/ui_resource_bitmap.cc",
"resources/ui_resource_bitmap.h",
"resources/ui_resource_client.h",
@@ -482,6 +504,7 @@
deps = [
"//base",
"//base/third_party/dynamic_annotations",
+ "//cc/surfaces:surface_id",
"//gpu",
"//gpu/command_buffer/client:gles2_interface",
"//gpu/command_buffer/client:gpu_memory_buffer_manager",
@@ -635,6 +658,7 @@
]
deps = [
"//base",
+ "//base/test:test_support",
"//base/third_party/dynamic_annotations",
"//gpu/command_buffer/client:gles2_c_lib",
"//gpu/command_buffer/client:gles2_implementation",
@@ -720,6 +744,7 @@
"quads/draw_quad_unittest.cc",
"quads/list_container_unittest.cc",
"quads/render_pass_unittest.cc",
+ "resources/display_item_list_unittest.cc",
"resources/layer_quad_unittest.cc",
"resources/picture_layer_tiling_set_unittest.cc",
"resources/picture_layer_tiling_unittest.cc",
@@ -786,6 +811,7 @@
":test_support",
"//base/test:test_support",
"//cc/surfaces",
+ "//cc/surfaces:surface_id",
"//gpu",
"//gpu:test_support",
"//gpu/command_buffer/client:gles2_interface",
@@ -795,6 +821,8 @@
"//ui/events:events_base",
"//ui/gfx",
"//ui/gfx/geometry",
+ "//ui/gfx:test_support",
+ "//ui/gl",
]
}
@@ -818,6 +846,7 @@
":cc",
":test_support",
"//base",
+ "//base/test:test_support",
"//gpu",
"//gpu:test_support",
"//gpu/command_buffer/common:gles2_utils",
@@ -827,5 +856,6 @@
"//testing/perf",
"//ui/gfx",
"//ui/gfx/geometry",
+ "//ui/gl",
]
}
diff --git a/cc/base/rolling_time_delta_history.cc b/cc/base/rolling_time_delta_history.cc
index 0f95cc5..db04f58 100644
--- a/cc/base/rolling_time_delta_history.cc
+++ b/cc/base/rolling_time_delta_history.cc
@@ -26,10 +26,6 @@
chronological_sample_deque_.push_back(it);
}
-size_t RollingTimeDeltaHistory::SampleCount() {
- return sample_set_.size();
-}
-
void RollingTimeDeltaHistory::Clear() {
chronological_sample_deque_.clear();
sample_set_.clear();
diff --git a/cc/base/rolling_time_delta_history.h b/cc/base/rolling_time_delta_history.h
index 603c813..e51fb86 100644
--- a/cc/base/rolling_time_delta_history.h
+++ b/cc/base/rolling_time_delta_history.h
@@ -23,8 +23,6 @@
void InsertSample(base::TimeDelta time);
- size_t SampleCount();
-
void Clear();
// Returns the smallest sample that is greater than or equal to the specified
diff --git a/cc/blink/BUILD.gn b/cc/blink/BUILD.gn
index fac991b..138be59 100644
--- a/cc/blink/BUILD.gn
+++ b/cc/blink/BUILD.gn
@@ -33,6 +33,8 @@
"web_compositor_support_impl.h",
"web_content_layer_impl.cc",
"web_content_layer_impl.h",
+ "web_display_item_list_impl.cc",
+ "web_display_item_list_impl.h",
"web_external_bitmap_impl.cc",
"web_external_bitmap_impl.h",
"web_external_texture_layer_impl.cc",
diff --git a/cc/blink/cc_blink.gyp b/cc/blink/cc_blink.gyp
index d9f19ea..892082c 100644
--- a/cc/blink/cc_blink.gyp
+++ b/cc/blink/cc_blink.gyp
@@ -36,6 +36,8 @@
'web_compositor_support_impl.h',
'web_content_layer_impl.cc',
'web_content_layer_impl.h',
+ 'web_display_item_list_impl.cc',
+ 'web_display_item_list_impl.h',
'web_external_bitmap_impl.cc',
'web_external_bitmap_impl.h',
'web_external_texture_layer_impl.cc',
diff --git a/cc/blink/web_compositor_support_impl.cc b/cc/blink/web_compositor_support_impl.cc
index ae098fc..042908c 100644
--- a/cc/blink/web_compositor_support_impl.cc
+++ b/cc/blink/web_compositor_support_impl.cc
@@ -9,6 +9,7 @@
#include "cc/animation/transform_operations.h"
#include "cc/blink/web_animation_impl.h"
#include "cc/blink/web_content_layer_impl.h"
+#include "cc/blink/web_display_item_list_impl.h"
#include "cc/blink/web_external_texture_layer_impl.h"
#include "cc/blink/web_filter_animation_curve_impl.h"
#include "cc/blink/web_filter_operations_impl.h"
@@ -27,6 +28,9 @@
using blink::WebCompositorAnimationCurve;
using blink::WebContentLayer;
using blink::WebContentLayerClient;
+#if WEB_DISPLAY_ITEM_LIST_IS_DEFINED
+using blink::WebDisplayItemList;
+#endif
using blink::WebExternalTextureLayer;
using blink::WebExternalTextureLayerClient;
using blink::WebFilterAnimationCurve;
@@ -91,6 +95,12 @@
is_left_side_vertical_scrollbar);
}
+#if WEB_DISPLAY_ITEM_LIST_IS_DEFINED
+WebDisplayItemList* WebCompositorSupportImpl::createDisplayItemList() {
+ return new WebDisplayItemListImpl();
+}
+#endif
+
WebCompositorAnimation* WebCompositorSupportImpl::createAnimation(
const blink::WebCompositorAnimationCurve& curve,
blink::WebCompositorAnimation::TargetProperty target,
diff --git a/cc/blink/web_compositor_support_impl.h b/cc/blink/web_compositor_support_impl.h
index 0f6371a..1c5198c 100644
--- a/cc/blink/web_compositor_support_impl.h
+++ b/cc/blink/web_compositor_support_impl.h
@@ -10,6 +10,7 @@
#include "cc/blink/cc_blink_export.h"
#include "third_party/WebKit/public/platform/WebCompositorAnimationCurve.h"
#include "third_party/WebKit/public/platform/WebCompositorSupport.h"
+#include "third_party/WebKit/public/platform/WebContentLayerClient.h"
#include "third_party/WebKit/public/platform/WebLayer.h"
#include "third_party/WebKit/public/platform/WebTransformOperations.h"
@@ -41,6 +42,9 @@
int thumb_thickness,
int track_start,
bool is_left_side_vertical_scrollbar);
+#if WEB_DISPLAY_ITEM_LIST_IS_DEFINED
+ virtual blink::WebDisplayItemList* createDisplayItemList();
+#endif
virtual blink::WebCompositorAnimation* createAnimation(
const blink::WebCompositorAnimationCurve& curve,
blink::WebCompositorAnimation::TargetProperty target,
diff --git a/cc/blink/web_content_layer_impl.cc b/cc/blink/web_content_layer_impl.cc
index d0a4cca..9757ff3 100644
--- a/cc/blink/web_content_layer_impl.cc
+++ b/cc/blink/web_content_layer_impl.cc
@@ -4,6 +4,7 @@
#include "cc/blink/web_content_layer_impl.h"
+#include "cc/blink/web_display_item_list_impl.h"
#include "cc/layers/content_layer.h"
#include "cc/layers/picture_layer.h"
#include "third_party/WebKit/public/platform/WebContentLayerClient.h"
@@ -63,6 +64,25 @@
: blink::WebContentLayerClient::GraphicsContextDisabled);
}
+scoped_refptr<cc::DisplayItemList>
+WebContentLayerImpl::PaintContentsToDisplayList(
+ const gfx::Rect& clip,
+ ContentLayerClient::GraphicsContextStatus graphics_context_status) {
+ if (!client_)
+ return cc::DisplayItemList::Create();
+
+ WebDisplayItemListImpl list;
+#if WEB_DISPLAY_ITEM_LIST_IS_DEFINED
+ bool can_use_lcd_text = true;
+ client_->paintContents(
+ &list, clip, can_use_lcd_text,
+ graphics_context_status == ContentLayerClient::GRAPHICS_CONTEXT_ENABLED
+ ? blink::WebContentLayerClient::GraphicsContextEnabled
+ : blink::WebContentLayerClient::GraphicsContextDisabled);
+#endif
+ return list.ToDisplayItemList();
+}
+
bool WebContentLayerImpl::FillsBoundsCompletely() const {
return false;
}
diff --git a/cc/blink/web_content_layer_impl.h b/cc/blink/web_content_layer_impl.h
index 2966bd4..148f4fc 100644
--- a/cc/blink/web_content_layer_impl.h
+++ b/cc/blink/web_content_layer_impl.h
@@ -40,6 +40,9 @@
const gfx::Rect& clip,
ContentLayerClient::GraphicsContextStatus
graphics_context_status) override;
+ scoped_refptr<cc::DisplayItemList> PaintContentsToDisplayList(
+ const gfx::Rect& clip,
+ GraphicsContextStatus graphics_context_status) override;
bool FillsBoundsCompletely() const override;
scoped_ptr<WebLayerImpl> layer_;
@@ -47,9 +50,6 @@
bool draws_content_;
private:
- bool can_use_lcd_text_;
- bool ignore_lcd_text_change_;
-
DISALLOW_COPY_AND_ASSIGN(WebContentLayerImpl);
};
diff --git a/cc/blink/web_display_item_list_impl.cc b/cc/blink/web_display_item_list_impl.cc
new file mode 100644
index 0000000..4ba3431
--- /dev/null
+++ b/cc/blink/web_display_item_list_impl.cc
@@ -0,0 +1,90 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "cc/blink/web_display_item_list_impl.h"
+
+#include <vector>
+
+#include "cc/blink/web_blend_mode.h"
+#include "cc/resources/clip_display_item.h"
+#include "cc/resources/drawing_display_item.h"
+#include "cc/resources/filter_display_item.h"
+#include "cc/resources/transform_display_item.h"
+#include "cc/resources/transparency_display_item.h"
+#include "skia/ext/refptr.h"
+#include "third_party/WebKit/public/platform/WebFloatRect.h"
+#include "third_party/WebKit/public/platform/WebRect.h"
+#include "third_party/skia/include/core/SkImageFilter.h"
+#include "third_party/skia/include/core/SkPicture.h"
+#include "third_party/skia/include/utils/SkMatrix44.h"
+#include "ui/gfx/transform.h"
+
+namespace cc_blink {
+
+WebDisplayItemListImpl::WebDisplayItemListImpl()
+ : display_item_list_(cc::DisplayItemList::Create()) {
+}
+
+scoped_refptr<cc::DisplayItemList> WebDisplayItemListImpl::ToDisplayItemList() {
+ return display_item_list_;
+}
+
+void WebDisplayItemListImpl::appendDrawingItem(
+ SkPicture* picture,
+ const blink::WebFloatPoint& location) {
+ display_item_list_->AppendItem(
+ cc::DrawingDisplayItem::Create(skia::SharePtr(picture), location));
+}
+
+void WebDisplayItemListImpl::appendClipItem(
+ const blink::WebRect& clip_rect,
+ const blink::WebVector<SkRRect>& rounded_clip_rects) {
+ std::vector<SkRRect> rounded_rects;
+ for (size_t i = 0; i < rounded_clip_rects.size(); ++i) {
+ rounded_rects.push_back(rounded_clip_rects[i]);
+ }
+ display_item_list_->AppendItem(
+ cc::ClipDisplayItem::Create(clip_rect, rounded_rects));
+}
+
+void WebDisplayItemListImpl::appendEndClipItem() {
+ display_item_list_->AppendItem(cc::EndClipDisplayItem::Create());
+}
+
+void WebDisplayItemListImpl::appendTransformItem(const SkMatrix44& matrix) {
+ gfx::Transform transform;
+ transform.matrix() = matrix;
+ display_item_list_->AppendItem(cc::TransformDisplayItem::Create(transform));
+}
+
+void WebDisplayItemListImpl::appendTransparencyItem(
+ float opacity,
+ blink::WebBlendMode blend_mode) {
+ display_item_list_->AppendItem(cc::TransparencyDisplayItem::Create(
+ opacity, BlendModeToSkia(blend_mode)));
+}
+
+void WebDisplayItemListImpl::appendEndTransformItem() {
+ display_item_list_->AppendItem(cc::EndTransformDisplayItem::Create());
+}
+
+void WebDisplayItemListImpl::appendEndTransparencyItem() {
+ display_item_list_->AppendItem(cc::EndTransparencyDisplayItem::Create());
+}
+
+void WebDisplayItemListImpl::appendFilterItem(
+ SkImageFilter* filter,
+ const blink::WebFloatRect& bounds) {
+ display_item_list_->AppendItem(
+ cc::FilterDisplayItem::Create(skia::SharePtr(filter), bounds));
+}
+
+void WebDisplayItemListImpl::appendEndFilterItem() {
+ display_item_list_->AppendItem(cc::EndFilterDisplayItem::Create());
+}
+
+WebDisplayItemListImpl::~WebDisplayItemListImpl() {
+}
+
+} // namespace cc_blink
diff --git a/cc/blink/web_display_item_list_impl.h b/cc/blink/web_display_item_list_impl.h
new file mode 100644
index 0000000..4725498
--- /dev/null
+++ b/cc/blink/web_display_item_list_impl.h
@@ -0,0 +1,63 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CC_BLINK_WEB_DISPLAY_ITEM_LIST_IMPL_H_
+#define CC_BLINK_WEB_DISPLAY_ITEM_LIST_IMPL_H_
+
+#include "base/memory/ref_counted.h"
+#include "cc/blink/cc_blink_export.h"
+#include "cc/resources/display_item_list.h"
+#include "third_party/WebKit/public/platform/WebBlendMode.h"
+#include "third_party/WebKit/public/platform/WebContentLayerClient.h"
+#include "third_party/WebKit/public/platform/WebFloatPoint.h"
+#include "third_party/WebKit/public/platform/WebVector.h"
+
+#if WEB_DISPLAY_ITEM_LIST_IS_DEFINED
+#include "third_party/WebKit/public/platform/WebDisplayItemList.h"
+#endif
+
+class SkImageFilter;
+class SkMatrix44;
+class SkPicture;
+class SkRRect;
+
+namespace cc_blink {
+
+#if WEB_DISPLAY_ITEM_LIST_IS_DEFINED
+class WebDisplayItemListImpl : public blink::WebDisplayItemList {
+#else
+class WebDisplayItemListImpl {
+#endif
+
+ public:
+ CC_BLINK_EXPORT WebDisplayItemListImpl();
+ virtual ~WebDisplayItemListImpl();
+
+ scoped_refptr<cc::DisplayItemList> ToDisplayItemList();
+
+ // blink::WebDisplayItemList implementation.
+ virtual void appendDrawingItem(SkPicture* picture,
+ const blink::WebFloatPoint& location);
+ virtual void appendClipItem(
+ const blink::WebRect& clip_rect,
+ const blink::WebVector<SkRRect>& rounded_clip_rects);
+ virtual void appendEndClipItem();
+ virtual void appendTransformItem(const SkMatrix44& matrix);
+ virtual void appendEndTransformItem();
+ virtual void appendTransparencyItem(float opacity,
+ blink::WebBlendMode blend_mode);
+ virtual void appendEndTransparencyItem();
+ virtual void appendFilterItem(SkImageFilter* filter,
+ const blink::WebFloatRect& bounds);
+ virtual void appendEndFilterItem();
+
+ private:
+ scoped_refptr<cc::DisplayItemList> display_item_list_;
+
+ DISALLOW_COPY_AND_ASSIGN(WebDisplayItemListImpl);
+};
+
+} // namespace cc_blink
+
+#endif // CC_BLINK_WEB_DISPLAY_ITEM_LIST_IMPL_H_
diff --git a/cc/cc.gyp b/cc/cc.gyp
index 046d43c..3374251 100644
--- a/cc/cc.gyp
+++ b/cc/cc.gyp
@@ -358,10 +358,24 @@
'resources/bitmap_raster_worker_pool.h',
'resources/bitmap_skpicture_content_layer_updater.cc',
'resources/bitmap_skpicture_content_layer_updater.h',
+ 'resources/clip_display_item.cc',
+ 'resources/clip_display_item.h',
'resources/content_layer_updater.cc',
'resources/content_layer_updater.h',
+ 'resources/display_item.cc',
+ 'resources/display_item.h',
+ 'resources/display_item_list.cc',
+ 'resources/display_item_list.h',
+ 'resources/display_list_raster_source.cc',
+ 'resources/display_list_raster_source.h',
+ 'resources/display_list_recording_source.cc',
+ 'resources/display_list_recording_source.h',
+ 'resources/drawing_display_item.cc',
+ 'resources/drawing_display_item.h',
'resources/eviction_tile_priority_queue.cc',
'resources/eviction_tile_priority_queue.h',
+ 'resources/filter_display_item.cc',
+ 'resources/filter_display_item.h',
'resources/gpu_raster_worker_pool.cc',
'resources/gpu_raster_worker_pool.h',
'resources/image_layer_updater.cc',
@@ -401,6 +415,8 @@
'resources/raster_buffer.cc',
'resources/raster_buffer.h',
'resources/raster_source.h',
+ 'resources/raster_source_helper.cc',
+ 'resources/raster_source_helper.h',
'resources/raster_tile_priority_queue.cc',
'resources/raster_tile_priority_queue.h',
'resources/raster_worker_pool.cc',
@@ -453,8 +469,14 @@
'resources/tile_manager.h',
'resources/tile_priority.cc',
'resources/tile_priority.h',
+ 'resources/tiling_set_eviction_queue.cc',
+ 'resources/tiling_set_eviction_queue.h',
'resources/transferable_resource.cc',
'resources/transferable_resource.h',
+ 'resources/transform_display_item.cc',
+ 'resources/transform_display_item.h',
+ 'resources/transparency_display_item.cc',
+ 'resources/transparency_display_item.h',
'resources/ui_resource_bitmap.cc',
'resources/ui_resource_bitmap.h',
'resources/ui_resource_client.h',
diff --git a/cc/cc_tests.gyp b/cc/cc_tests.gyp
index d4a031f..d0b1000 100644
--- a/cc/cc_tests.gyp
+++ b/cc/cc_tests.gyp
@@ -74,6 +74,7 @@
'quads/draw_quad_unittest.cc',
'quads/list_container_unittest.cc',
'quads/render_pass_unittest.cc',
+ 'resources/display_item_list_unittest.cc',
'resources/layer_quad_unittest.cc',
'resources/picture_layer_tiling_set_unittest.cc',
'resources/picture_layer_tiling_unittest.cc',
diff --git a/cc/debug/rasterize_and_record_benchmark.cc b/cc/debug/rasterize_and_record_benchmark.cc
index a2052ab..41d6210 100644
--- a/cc/debug/rasterize_and_record_benchmark.cc
+++ b/cc/debug/rasterize_and_record_benchmark.cc
@@ -18,6 +18,7 @@
#include "cc/resources/picture_pile.h"
#include "cc/trees/layer_tree_host.h"
#include "cc/trees/layer_tree_host_common.h"
+#include "third_party/skia/include/utils/SkPictureUtils.h"
#include "ui/gfx/geometry/rect.h"
namespace cc {
@@ -64,6 +65,7 @@
DCHECK(!results_.get());
results_ = make_scoped_ptr(new base::DictionaryValue);
results_->SetInteger("pixels_recorded", record_results_.pixels_recorded);
+ results_->SetInteger("picture_memory_usage", record_results_.bytes_used);
for (int i = 0; i < Picture::RECORDING_MODE_COUNT; i++) {
std::string name = base::StringPrintf("record_time%s_ms", kModeSuffixes[i]);
@@ -119,6 +121,7 @@
Picture::RecordingMode mode =
static_cast<Picture::RecordingMode>(mode_index);
base::TimeDelta min_time = base::TimeDelta::Max();
+ size_t memory_used = 0;
// Parameters for LapTimer.
const int kTimeLimitMillis = 1;
@@ -131,18 +134,21 @@
LapTimer timer(kWarmupRuns,
base::TimeDelta::FromMilliseconds(kTimeLimitMillis),
kTimeCheckInterval);
+ scoped_refptr<Picture> picture;
do {
- scoped_refptr<Picture> picture = Picture::Create(
- visible_content_rect, painter, tile_grid_info, false, mode);
+ picture = Picture::Create(visible_content_rect, painter, tile_grid_info,
+ false, mode);
timer.NextLap();
} while (!timer.HasTimeLimitExpired());
base::TimeDelta duration =
base::TimeDelta::FromMillisecondsD(timer.MsPerLap());
if (duration < min_time)
min_time = duration;
+ memory_used = picture->ApproximateMemoryUsage();
}
if (mode == Picture::RECORD_NORMALLY) {
+ record_results_.bytes_used += memory_used;
record_results_.pixels_recorded +=
visible_content_rect.width() * visible_content_rect.height();
}
@@ -151,7 +157,8 @@
}
RasterizeAndRecordBenchmark::RecordResults::RecordResults()
- : pixels_recorded(0) {}
+ : pixels_recorded(0), bytes_used(0) {
+}
RasterizeAndRecordBenchmark::RecordResults::~RecordResults() {}
diff --git a/cc/debug/rasterize_and_record_benchmark.h b/cc/debug/rasterize_and_record_benchmark.h
index 68d5d05..8a23292 100644
--- a/cc/debug/rasterize_and_record_benchmark.h
+++ b/cc/debug/rasterize_and_record_benchmark.h
@@ -46,6 +46,7 @@
~RecordResults();
int pixels_recorded;
+ size_t bytes_used;
base::TimeDelta total_best_time[Picture::RECORDING_MODE_COUNT];
};
diff --git a/cc/debug/rasterize_and_record_benchmark_impl.cc b/cc/debug/rasterize_and_record_benchmark_impl.cc
index e276a41..c1fc809 100644
--- a/cc/debug/rasterize_and_record_benchmark_impl.cc
+++ b/cc/debug/rasterize_and_record_benchmark_impl.cc
@@ -173,6 +173,8 @@
scoped_ptr<base::DictionaryValue> result(new base::DictionaryValue());
result->SetDouble("rasterize_time_ms",
rasterize_results_.total_best_time.InMillisecondsF());
+ result->SetDouble("total_pictures_in_pile_size",
+ rasterize_results_.total_memory_usage);
result->SetInteger("pixels_rasterized", rasterize_results_.pixels_rasterized);
result->SetInteger("pixels_rasterized_with_non_solid_color",
rasterize_results_.pixels_rasterized_with_non_solid_color);
@@ -263,16 +265,22 @@
rasterize_results_.pixels_rasterized += tile_size;
rasterize_results_.total_best_time += min_time;
}
+
+ const RasterSource* layer_raster_source = layer->GetRasterSource();
+ rasterize_results_.total_memory_usage +=
+ layer_raster_source->GetPictureMemoryUsage();
}
RasterizeAndRecordBenchmarkImpl::RasterizeResults::RasterizeResults()
: pixels_rasterized(0),
pixels_rasterized_with_non_solid_color(0),
pixels_rasterized_as_opaque(0),
+ total_memory_usage(0),
total_layers(0),
total_picture_layers(0),
total_picture_layers_with_no_content(0),
- total_picture_layers_off_screen(0) {}
+ total_picture_layers_off_screen(0) {
+}
RasterizeAndRecordBenchmarkImpl::RasterizeResults::~RasterizeResults() {}
diff --git a/cc/debug/rasterize_and_record_benchmark_impl.h b/cc/debug/rasterize_and_record_benchmark_impl.h
index c0f26fd..7ca471a 100644
--- a/cc/debug/rasterize_and_record_benchmark_impl.h
+++ b/cc/debug/rasterize_and_record_benchmark_impl.h
@@ -41,6 +41,7 @@
int pixels_rasterized_with_non_solid_color;
int pixels_rasterized_as_opaque;
base::TimeDelta total_best_time;
+ int total_memory_usage;
int total_layers;
int total_picture_layers;
int total_picture_layers_with_no_content;
diff --git a/cc/layers/content_layer_client.h b/cc/layers/content_layer_client.h
index ea22e97..c8d3a7e 100644
--- a/cc/layers/content_layer_client.h
+++ b/cc/layers/content_layer_client.h
@@ -6,6 +6,7 @@
#define CC_LAYERS_CONTENT_LAYER_CLIENT_H_
#include "cc/base/cc_export.h"
+#include "cc/resources/display_item_list.h"
class SkCanvas;
@@ -27,6 +28,10 @@
const gfx::Rect& clip,
GraphicsContextStatus gc_status) = 0;
+ virtual scoped_refptr<DisplayItemList> PaintContentsToDisplayList(
+ const gfx::Rect& clip,
+ GraphicsContextStatus gc_status) = 0;
+
// If true the layer may skip clearing the background before rasterizing,
// because it will cover any uncleared data with content.
virtual bool FillsBoundsCompletely() const = 0;
diff --git a/cc/layers/picture_image_layer.cc b/cc/layers/picture_image_layer.cc
index dba506e..5d76618 100644
--- a/cc/layers/picture_image_layer.cc
+++ b/cc/layers/picture_image_layer.cc
@@ -60,6 +60,13 @@
canvas->drawBitmap(bitmap_, 0, 0);
}
+scoped_refptr<DisplayItemList> PictureImageLayer::PaintContentsToDisplayList(
+ const gfx::Rect& clip,
+ GraphicsContextStatus gc_status) {
+ NOTIMPLEMENTED();
+ return DisplayItemList::Create();
+}
+
bool PictureImageLayer::FillsBoundsCompletely() const {
return false;
}
diff --git a/cc/layers/picture_image_layer.h b/cc/layers/picture_image_layer.h
index 3f8d68d..57c7de2 100644
--- a/cc/layers/picture_image_layer.h
+++ b/cc/layers/picture_image_layer.h
@@ -27,6 +27,9 @@
SkCanvas* canvas,
const gfx::Rect& clip,
ContentLayerClient::GraphicsContextStatus gc_status) override;
+ scoped_refptr<DisplayItemList> PaintContentsToDisplayList(
+ const gfx::Rect& clip,
+ GraphicsContextStatus gc_status) override;
bool FillsBoundsCompletely() const override;
protected:
diff --git a/cc/layers/picture_layer.cc b/cc/layers/picture_layer.cc
index d734538..55241d0 100644
--- a/cc/layers/picture_layer.cc
+++ b/cc/layers/picture_layer.cc
@@ -7,6 +7,7 @@
#include "base/auto_reset.h"
#include "cc/layers/content_layer_client.h"
#include "cc/layers/picture_layer_impl.h"
+#include "cc/resources/display_list_recording_source.h"
#include "cc/resources/picture_pile.h"
#include "cc/trees/layer_tree_impl.h"
#include "third_party/skia/include/core/SkPictureRecorder.h"
@@ -20,7 +21,6 @@
PictureLayer::PictureLayer(ContentLayerClient* client)
: client_(client),
- recording_source_(new PicturePile),
instrumentation_object_tracker_(id()),
update_source_frame_number_(-1),
can_use_lcd_text_for_update_(true),
@@ -79,6 +79,13 @@
void PictureLayer::SetLayerTreeHost(LayerTreeHost* host) {
Layer::SetLayerTreeHost(host);
if (host) {
+ if (!recording_source_) {
+ if (host->settings().use_display_lists) {
+ recording_source_.reset(new DisplayListRecordingSource);
+ } else {
+ recording_source_.reset(new PicturePile);
+ }
+ }
recording_source_->SetMinContentsScale(
host->settings().minimum_contents_scale);
recording_source_->SetTileGridSize(host->settings().default_tile_grid_size);
diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc
index 0eb9621..1827bea 100644
--- a/cc/layers/picture_layer_impl.cc
+++ b/cc/layers/picture_layer_impl.cc
@@ -98,6 +98,14 @@
layer_tree_impl()->UnregisterPictureLayerImpl(this);
}
+scoped_ptr<TilingSetEvictionQueue> PictureLayerImpl::CreateEvictionQueue(
+ TreePriority tree_priority) {
+ if (!tilings_)
+ return make_scoped_ptr(new TilingSetEvictionQueue());
+ return make_scoped_ptr(
+ new TilingSetEvictionQueue(tilings_.get(), tree_priority));
+}
+
const char* PictureLayerImpl::LayerTypeAsString() const {
return "cc::PictureLayerImpl";
}
@@ -1475,158 +1483,4 @@
}
}
-PictureLayerImpl::LayerEvictionTileIterator::LayerEvictionTileIterator()
- : layer_(nullptr),
- tree_priority_(SAME_PRIORITY_FOR_BOTH_TREES),
- current_category_(PictureLayerTiling::EVENTUALLY),
- current_tiling_range_type_(PictureLayerTilingSet::HIGHER_THAN_HIGH_RES),
- current_tiling_(0u) {
-}
-
-PictureLayerImpl::LayerEvictionTileIterator::LayerEvictionTileIterator(
- PictureLayerImpl* layer,
- TreePriority tree_priority)
- : layer_(layer),
- tree_priority_(tree_priority),
- current_category_(PictureLayerTiling::EVENTUALLY),
- current_tiling_range_type_(PictureLayerTilingSet::HIGHER_THAN_HIGH_RES),
- current_tiling_(0u) {
- // Early out if the layer has no tilings.
- if (!layer_->tilings_ || !layer_->tilings_->num_tilings())
- return;
-
- current_tiling_ = CurrentTilingRange().start - 1u;
- do {
- if (!AdvanceToNextTiling())
- break;
-
- current_iterator_ = PictureLayerTiling::TilingEvictionTileIterator(
- layer_->tilings_->tiling_at(CurrentTilingIndex()),
- tree_priority,
- current_category_);
- } while (!current_iterator_);
-}
-
-PictureLayerImpl::LayerEvictionTileIterator::~LayerEvictionTileIterator() {
-}
-
-Tile* PictureLayerImpl::LayerEvictionTileIterator::operator*() {
- DCHECK(*this);
- return *current_iterator_;
-}
-
-const Tile* PictureLayerImpl::LayerEvictionTileIterator::operator*() const {
- DCHECK(*this);
- return *current_iterator_;
-}
-
-PictureLayerImpl::LayerEvictionTileIterator&
-PictureLayerImpl::LayerEvictionTileIterator::
-operator++() {
- DCHECK(*this);
- ++current_iterator_;
- while (!current_iterator_) {
- if (!AdvanceToNextTiling())
- break;
-
- current_iterator_ = PictureLayerTiling::TilingEvictionTileIterator(
- layer_->tilings_->tiling_at(CurrentTilingIndex()),
- tree_priority_,
- current_category_);
- }
- return *this;
-}
-
-PictureLayerImpl::LayerEvictionTileIterator::operator bool() const {
- return !!current_iterator_;
-}
-
-bool PictureLayerImpl::LayerEvictionTileIterator::AdvanceToNextCategory() {
- switch (current_category_) {
- case PictureLayerTiling::EVENTUALLY:
- current_category_ =
- PictureLayerTiling::EVENTUALLY_AND_REQUIRED_FOR_ACTIVATION;
- return true;
- case PictureLayerTiling::EVENTUALLY_AND_REQUIRED_FOR_ACTIVATION:
- current_category_ = PictureLayerTiling::SOON;
- return true;
- case PictureLayerTiling::SOON:
- current_category_ = PictureLayerTiling::SOON_AND_REQUIRED_FOR_ACTIVATION;
- return true;
- case PictureLayerTiling::SOON_AND_REQUIRED_FOR_ACTIVATION:
- current_category_ = PictureLayerTiling::NOW;
- return true;
- case PictureLayerTiling::NOW:
- current_category_ = PictureLayerTiling::NOW_AND_REQUIRED_FOR_ACTIVATION;
- return true;
- case PictureLayerTiling::NOW_AND_REQUIRED_FOR_ACTIVATION:
- return false;
- }
- NOTREACHED();
- return false;
-}
-
-bool
-PictureLayerImpl::LayerEvictionTileIterator::AdvanceToNextTilingRangeType() {
- switch (current_tiling_range_type_) {
- case PictureLayerTilingSet::HIGHER_THAN_HIGH_RES:
- current_tiling_range_type_ = PictureLayerTilingSet::LOWER_THAN_LOW_RES;
- return true;
- case PictureLayerTilingSet::LOWER_THAN_LOW_RES:
- current_tiling_range_type_ =
- PictureLayerTilingSet::BETWEEN_HIGH_AND_LOW_RES;
- return true;
- case PictureLayerTilingSet::BETWEEN_HIGH_AND_LOW_RES:
- current_tiling_range_type_ = PictureLayerTilingSet::LOW_RES;
- return true;
- case PictureLayerTilingSet::LOW_RES:
- current_tiling_range_type_ = PictureLayerTilingSet::HIGH_RES;
- return true;
- case PictureLayerTilingSet::HIGH_RES:
- if (!AdvanceToNextCategory())
- return false;
-
- current_tiling_range_type_ = PictureLayerTilingSet::HIGHER_THAN_HIGH_RES;
- return true;
- }
- NOTREACHED();
- return false;
-}
-
-bool PictureLayerImpl::LayerEvictionTileIterator::AdvanceToNextTiling() {
- DCHECK_NE(current_tiling_, CurrentTilingRange().end);
- ++current_tiling_;
- while (current_tiling_ == CurrentTilingRange().end) {
- if (!AdvanceToNextTilingRangeType())
- return false;
-
- current_tiling_ = CurrentTilingRange().start;
- }
- return true;
-}
-
-PictureLayerTilingSet::TilingRange
-PictureLayerImpl::LayerEvictionTileIterator::CurrentTilingRange() const {
- return layer_->tilings_->GetTilingRange(current_tiling_range_type_);
-}
-
-size_t PictureLayerImpl::LayerEvictionTileIterator::CurrentTilingIndex() const {
- DCHECK_NE(current_tiling_, CurrentTilingRange().end);
- switch (current_tiling_range_type_) {
- case PictureLayerTilingSet::HIGHER_THAN_HIGH_RES:
- case PictureLayerTilingSet::LOW_RES:
- case PictureLayerTilingSet::HIGH_RES:
- return current_tiling_;
- // Tilings in the following ranges are accessed in reverse order.
- case PictureLayerTilingSet::BETWEEN_HIGH_AND_LOW_RES:
- case PictureLayerTilingSet::LOWER_THAN_LOW_RES: {
- PictureLayerTilingSet::TilingRange tiling_range = CurrentTilingRange();
- size_t current_tiling_range_offset = current_tiling_ - tiling_range.start;
- return tiling_range.end - 1 - current_tiling_range_offset;
- }
- }
- NOTREACHED();
- return 0;
-}
-
} // namespace cc
diff --git a/cc/layers/picture_layer_impl.h b/cc/layers/picture_layer_impl.h
index 9a77546..52d8433 100644
--- a/cc/layers/picture_layer_impl.h
+++ b/cc/layers/picture_layer_impl.h
@@ -15,6 +15,7 @@
#include "cc/resources/picture_layer_tiling.h"
#include "cc/resources/picture_layer_tiling_set.h"
#include "cc/resources/picture_pile_impl.h"
+#include "cc/resources/tiling_set_eviction_queue.h"
#include "skia/ext/refptr.h"
#include "third_party/skia/include/core/SkPicture.h"
@@ -67,40 +68,14 @@
PictureLayerTiling::TilingRasterTileIterator iterators_[NUM_ITERATORS];
};
- class CC_EXPORT LayerEvictionTileIterator {
- public:
- LayerEvictionTileIterator();
- LayerEvictionTileIterator(PictureLayerImpl* layer,
- TreePriority tree_priority);
- ~LayerEvictionTileIterator();
-
- Tile* operator*();
- const Tile* operator*() const;
- LayerEvictionTileIterator& operator++();
- operator bool() const;
-
- private:
- bool AdvanceToNextCategory();
- bool AdvanceToNextTilingRangeType();
- bool AdvanceToNextTiling();
-
- PictureLayerTilingSet::TilingRange CurrentTilingRange() const;
- size_t CurrentTilingIndex() const;
-
- PictureLayerImpl* layer_;
- TreePriority tree_priority_;
-
- PictureLayerTiling::EvictionCategory current_category_;
- PictureLayerTilingSet::TilingRangeType current_tiling_range_type_;
- size_t current_tiling_;
- PictureLayerTiling::TilingEvictionTileIterator current_iterator_;
- };
-
static scoped_ptr<PictureLayerImpl> Create(LayerTreeImpl* tree_impl, int id) {
return make_scoped_ptr(new PictureLayerImpl(tree_impl, id));
}
~PictureLayerImpl() override;
+ scoped_ptr<TilingSetEvictionQueue> CreateEvictionQueue(
+ TreePriority tree_priority);
+
// LayerImpl overrides.
const char* LayerTypeAsString() const override;
scoped_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl) override;
@@ -154,6 +129,9 @@
bool AllTilesRequiredForActivationAreReadyToDraw() const;
bool AllTilesRequiredForDrawAreReadyToDraw() const;
+ // Used for benchmarking
+ const RasterSource* GetRasterSource() const { return raster_source_.get(); }
+
protected:
friend class LayerRasterTileIterator;
using TileRequirementCheck = bool (PictureLayerTiling::*)(const Tile*) const;
diff --git a/cc/layers/picture_layer_impl_perftest.cc b/cc/layers/picture_layer_impl_perftest.cc
index 1f98a68..bfb5703 100644
--- a/cc/layers/picture_layer_impl_perftest.cc
+++ b/cc/layers/picture_layer_impl_perftest.cc
@@ -115,7 +115,7 @@
true);
}
- void RunEvictionIteratorConstructAndIterateTest(
+ void RunEvictionQueueConstructAndIterateTest(
const std::string& test_name,
int num_tiles,
const gfx::Size& viewport_size) {
@@ -129,12 +129,12 @@
timer_.Reset();
do {
int count = num_tiles;
- PictureLayerImpl::LayerEvictionTileIterator it(
- pending_layer_, priorities[priority_count]);
+ scoped_ptr<TilingSetEvictionQueue> queue =
+ pending_layer_->CreateEvictionQueue(priorities[priority_count]);
while (count--) {
- ASSERT_TRUE(it) << "count: " << count;
- ASSERT_TRUE(*it != nullptr) << "count: " << count;
- ++it;
+ ASSERT_TRUE(!queue->IsEmpty()) << "count: " << count;
+ ASSERT_TRUE(queue->Top() != nullptr) << "count: " << count;
+ queue->Pop();
}
priority_count = (priority_count + 1) % arraysize(priorities);
timer_.NextLap();
@@ -148,8 +148,8 @@
true);
}
- void RunEvictionIteratorConstructTest(const std::string& test_name,
- const gfx::Rect& viewport) {
+ void RunEvictionQueueConstructTest(const std::string& test_name,
+ const gfx::Rect& viewport) {
host_impl_.SetViewportSize(viewport.size());
pending_layer_->SetScrollOffset(
gfx::ScrollOffset(viewport.x(), viewport.y()));
@@ -161,8 +161,8 @@
int priority_count = 0;
timer_.Reset();
do {
- PictureLayerImpl::LayerEvictionTileIterator it(
- pending_layer_, priorities[priority_count]);
+ scoped_ptr<TilingSetEvictionQueue> queue =
+ pending_layer_->CreateEvictionQueue(priorities[priority_count]);
priority_count = (priority_count + 1) % arraysize(priorities);
timer_.NextLap();
} while (!timer_.HasTimeLimitExpired());
@@ -225,6 +225,7 @@
gfx::Rect(9999, 0, 100, 100));
}
+// TODO(e_hakkinen): Rename these tests once the perf numbers are in.
TEST_F(PictureLayerImplPerfTest, LayerEvictionTileIteratorConstructAndIterate) {
SetupPendingTree(gfx::Size(10000, 10000), gfx::Size(256, 256));
@@ -240,16 +241,17 @@
ASSERT_TRUE(host_impl_.tile_manager() != nullptr);
host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(all_tiles);
- RunEvictionIteratorConstructAndIterateTest(
+ RunEvictionQueueConstructAndIterateTest(
"32_100x100", 32, gfx::Size(100, 100));
- RunEvictionIteratorConstructAndIterateTest(
+ RunEvictionQueueConstructAndIterateTest(
"32_500x500", 32, gfx::Size(500, 500));
- RunEvictionIteratorConstructAndIterateTest(
+ RunEvictionQueueConstructAndIterateTest(
"64_100x100", 64, gfx::Size(100, 100));
- RunEvictionIteratorConstructAndIterateTest(
+ RunEvictionQueueConstructAndIterateTest(
"64_500x500", 64, gfx::Size(500, 500));
}
+// TODO(e_hakkinen): Rename these tests once the perf numbers are in.
TEST_F(PictureLayerImplPerfTest, LayerEvictionTileIteratorConstruct) {
SetupPendingTree(gfx::Size(10000, 10000), gfx::Size(256, 256));
@@ -265,11 +267,9 @@
ASSERT_TRUE(host_impl_.tile_manager() != nullptr);
host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(all_tiles);
- RunEvictionIteratorConstructTest("0_0_100x100", gfx::Rect(0, 0, 100, 100));
- RunEvictionIteratorConstructTest("5000_0_100x100",
- gfx::Rect(5000, 0, 100, 100));
- RunEvictionIteratorConstructTest("9999_0_100x100",
- gfx::Rect(9999, 0, 100, 100));
+ RunEvictionQueueConstructTest("0_0_100x100", gfx::Rect(0, 0, 100, 100));
+ RunEvictionQueueConstructTest("5000_0_100x100", gfx::Rect(5000, 0, 100, 100));
+ RunEvictionQueueConstructTest("9999_0_100x100", gfx::Rect(9999, 0, 100, 100));
}
} // namespace
diff --git a/cc/layers/picture_layer_impl_unittest.cc b/cc/layers/picture_layer_impl_unittest.cc
index 246e625..ce66675 100644
--- a/cc/layers/picture_layer_impl_unittest.cc
+++ b/cc/layers/picture_layer_impl_unittest.cc
@@ -330,7 +330,7 @@
base::TimeTicks time_ticks;
time_ticks += base::TimeDelta::FromMilliseconds(1);
host_impl_.SetCurrentBeginFrameArgs(
- CreateBeginFrameArgsForTesting(time_ticks));
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
gfx::Size tile_size(100, 100);
gfx::Size layer_bounds(400, 400);
@@ -347,7 +347,7 @@
time_ticks += base::TimeDelta::FromMilliseconds(200);
host_impl_.SetCurrentBeginFrameArgs(
- CreateBeginFrameArgsForTesting(time_ticks));
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
// Update tiles with viewport for tile priority as (0, 0, 100, 100) and the
// identify transform for tile priority.
@@ -385,7 +385,7 @@
// should be (200, 200, 100, 100) applied with the said transform.
time_ticks += base::TimeDelta::FromMilliseconds(200);
host_impl_.SetCurrentBeginFrameArgs(
- CreateBeginFrameArgsForTesting(time_ticks));
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
viewport_rect_for_tile_priority = gfx::Rect(200, 200, 100, 100);
transform_for_tile_priority.Translate(100, 100);
@@ -426,7 +426,7 @@
base::TimeTicks time_ticks;
time_ticks += base::TimeDelta::FromMilliseconds(1);
host_impl_.SetCurrentBeginFrameArgs(
- CreateBeginFrameArgsForTesting(time_ticks));
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
gfx::Size tile_size(100, 100);
gfx::Size layer_bounds(400, 400);
@@ -468,7 +468,7 @@
// Should update viewport and transform, but not update visible rect.
time_ticks += base::TimeDelta::FromMilliseconds(200);
host_impl_.SetCurrentBeginFrameArgs(
- CreateBeginFrameArgsForTesting(time_ticks));
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
resourceless_software_draw = true;
viewport = gfx::ScaleToEnclosingRect(viewport, 2);
transform.Translate(1.f, 1.f);
@@ -492,7 +492,7 @@
// Keep expanded viewport but mark it valid. Should update tile viewport.
time_ticks += base::TimeDelta::FromMilliseconds(200);
host_impl_.SetCurrentBeginFrameArgs(
- CreateBeginFrameArgsForTesting(time_ticks));
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
resourceless_software_draw = false;
host_impl_.SetExternalDrawConstraints(transform,
viewport,
@@ -1561,7 +1561,7 @@
base::TimeTicks time_ticks;
time_ticks += base::TimeDelta::FromMilliseconds(1);
host_impl_.SetCurrentBeginFrameArgs(
- CreateBeginFrameArgsForTesting(time_ticks));
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
pending_layer_->UpdateTiles(Occlusion(), resourceless_software_draw);
EXPECT_EQ(HIGH_RESOLUTION, tiling->resolution());
@@ -1589,7 +1589,7 @@
base::TimeTicks time_ticks;
time_ticks += base::TimeDelta::FromMilliseconds(1);
host_impl_.SetCurrentBeginFrameArgs(
- CreateBeginFrameArgsForTesting(time_ticks));
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
gfx::Size tile_size(100, 100);
gfx::Size layer_bounds(400, 400);
@@ -1625,7 +1625,7 @@
pending_layer_->draw_properties().visible_content_rect = visible_content_rect;
time_ticks += base::TimeDelta::FromMilliseconds(200);
host_impl_.SetCurrentBeginFrameArgs(
- CreateBeginFrameArgsForTesting(time_ticks));
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
pending_layer_->UpdateTiles(Occlusion(), resourceless_software_draw);
// Intersect the two rects. Any tile outside should not be required for
@@ -1678,7 +1678,7 @@
base::TimeTicks time_ticks;
time_ticks += base::TimeDelta::FromMilliseconds(1);
host_impl_.SetCurrentBeginFrameArgs(
- CreateBeginFrameArgsForTesting(time_ticks));
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
gfx::Size tile_size(100, 100);
gfx::Size layer_bounds(200, 200);
@@ -1714,7 +1714,7 @@
base::TimeTicks time_ticks;
time_ticks += base::TimeDelta::FromMilliseconds(1);
host_impl_.SetCurrentBeginFrameArgs(
- CreateBeginFrameArgsForTesting(time_ticks));
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
gfx::Size tile_size(100, 100);
gfx::Size layer_bounds(200, 200);
@@ -1745,7 +1745,7 @@
base::TimeTicks time_ticks;
time_ticks += base::TimeDelta::FromMilliseconds(1);
host_impl_.SetCurrentBeginFrameArgs(
- CreateBeginFrameArgsForTesting(time_ticks));
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
gfx::Size tile_size(100, 100);
gfx::Size layer_bounds(200, 200);
@@ -1779,7 +1779,7 @@
base::TimeTicks time_ticks;
time_ticks += base::TimeDelta::FromMilliseconds(1);
host_impl_.SetCurrentBeginFrameArgs(
- CreateBeginFrameArgsForTesting(time_ticks));
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
gfx::Size tile_size(100, 100);
gfx::Size layer_bounds(200, 200);
@@ -1822,7 +1822,7 @@
base::TimeTicks time_ticks;
time_ticks += base::TimeDelta::FromMilliseconds(1);
host_impl_.SetCurrentBeginFrameArgs(
- CreateBeginFrameArgsForTesting(time_ticks));
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
gfx::Size tile_size(100, 100);
gfx::Size layer_bounds(200, 200);
@@ -1890,6 +1890,9 @@
TEST_F(PictureLayerImplTest, HighResRequiredWhenUnsharedActiveAllReady) {
gfx::Size layer_bounds(400, 400);
gfx::Size tile_size(100, 100);
+
+ host_impl_.SetViewportSize(layer_bounds);
+
SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size);
// No tiles shared.
@@ -1911,6 +1914,9 @@
TEST_F(PictureLayerImplTest, HighResRequiredWhenMissingHighResFlagOn) {
gfx::Size layer_bounds(400, 400);
gfx::Size tile_size(100, 100);
+
+ host_impl_.SetViewportSize(layer_bounds);
+
SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size);
// All tiles shared (no invalidation).
@@ -1935,6 +1941,9 @@
TEST_F(PictureLayerImplTest, AllHighResRequiredEvenIfShared) {
gfx::Size layer_bounds(400, 400);
gfx::Size tile_size(100, 100);
+
+ host_impl_.SetViewportSize(layer_bounds);
+
SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size);
CreateHighLowResAndSetAllTilesVisible();
@@ -2009,6 +2018,9 @@
TEST_F(PictureLayerImplTest, HighResRequiredIfActiveCantHaveTiles) {
gfx::Size layer_bounds(400, 400);
gfx::Size tile_size(100, 100);
+
+ host_impl_.SetViewportSize(layer_bounds);
+
scoped_refptr<FakePicturePileImpl> pending_pile =
FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
scoped_refptr<FakePicturePileImpl> active_pile =
@@ -2767,7 +2779,7 @@
base::TimeTicks time_ticks;
time_ticks += base::TimeDelta::FromMilliseconds(1);
host_impl_.SetCurrentBeginFrameArgs(
- CreateBeginFrameArgsForTesting(time_ticks));
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
gfx::Size tile_size(100, 100);
gfx::Size layer_bounds(1000, 1000);
@@ -2837,7 +2849,7 @@
// No NOW tiles.
time_ticks += base::TimeDelta::FromMilliseconds(200);
host_impl_.SetCurrentBeginFrameArgs(
- CreateBeginFrameArgsForTesting(time_ticks));
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
pending_layer_->draw_properties().visible_content_rect =
gfx::Rect(1100, 1100, 500, 500);
@@ -2868,7 +2880,7 @@
time_ticks += base::TimeDelta::FromMilliseconds(200);
host_impl_.SetCurrentBeginFrameArgs(
- CreateBeginFrameArgsForTesting(time_ticks));
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
pending_layer_->draw_properties().visible_content_rect =
gfx::Rect(0, 0, 500, 500);
@@ -2903,7 +2915,7 @@
EXPECT_EQ(0u, high_res_tile_count);
}
-TEST_F(PictureLayerImplTest, LayerEvictionTileIterator) {
+TEST_F(PictureLayerImplTest, TilingSetEvictionQueue) {
gfx::Size tile_size(100, 100);
gfx::Size layer_bounds(1000, 1000);
@@ -2964,14 +2976,10 @@
EXPECT_GT(number_of_marked_tiles, 1u);
EXPECT_GT(number_of_unmarked_tiles, 1u);
- // Empty iterator.
- PictureLayerImpl::LayerEvictionTileIterator it;
- EXPECT_FALSE(it);
-
// Tiles don't have resources yet.
- it = PictureLayerImpl::LayerEvictionTileIterator(
- pending_layer_, SAME_PRIORITY_FOR_BOTH_TREES);
- EXPECT_FALSE(it);
+ scoped_ptr<TilingSetEvictionQueue> queue =
+ pending_layer_->CreateEvictionQueue(SAME_PRIORITY_FOR_BOTH_TREES);
+ EXPECT_TRUE(queue->IsEmpty());
host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(all_tiles);
@@ -2980,11 +2988,9 @@
size_t scale_index = 0;
bool reached_visible = false;
Tile* last_tile = nullptr;
- for (it = PictureLayerImpl::LayerEvictionTileIterator(
- pending_layer_, SAME_PRIORITY_FOR_BOTH_TREES);
- it;
- ++it) {
- Tile* tile = *it;
+ queue = pending_layer_->CreateEvictionQueue(SAME_PRIORITY_FOR_BOTH_TREES);
+ while (!queue->IsEmpty()) {
+ Tile* tile = queue->Top();
if (!last_tile)
last_tile = tile;
@@ -3022,6 +3028,7 @@
}
last_tile = tile;
+ queue->Pop();
}
EXPECT_TRUE(reached_visible);
@@ -3029,8 +3036,8 @@
scale_index = 0;
bool reached_required = false;
- for (; it; ++it) {
- Tile* tile = *it;
+ while (!queue->IsEmpty()) {
+ Tile* tile = queue->Top();
EXPECT_TRUE(tile);
TilePriority priority = tile->priority(PENDING_TREE);
@@ -3051,6 +3058,7 @@
EXPECT_FLOAT_EQ(tile->contents_scale(), expected_scales[scale_index]);
unique_tiles.insert(tile);
+ queue->Pop();
}
EXPECT_TRUE(reached_required);
@@ -3155,6 +3163,8 @@
gfx::Size tile_size(100, 100);
gfx::Size layer_bounds(1000, 1000);
+ host_impl_.SetViewportSize(layer_bounds);
+
SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size);
// Make sure some tiles are not shared.
@@ -3182,6 +3192,8 @@
gfx::Size tile_size(100, 100);
gfx::Size layer_bounds(1000, 1000);
+ host_impl_.SetViewportSize(layer_bounds);
+
SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size);
// Make sure some tiles are not shared.
@@ -3205,6 +3217,8 @@
gfx::Size tile_size(100, 100);
gfx::Size layer_bounds(1000, 1000);
+ host_impl_.SetViewportSize(layer_bounds);
+
SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size);
// Make sure some tiles are not shared.
@@ -3229,6 +3243,8 @@
gfx::Size tile_size(100, 100);
gfx::Size layer_bounds(1000, 1000);
+ host_impl_.SetViewportSize(layer_bounds);
+
SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size);
// Make sure some tiles are not shared.
@@ -3316,6 +3332,9 @@
TEST_F(NoLowResPictureLayerImplTest, AllHighResRequiredEvenIfShared) {
gfx::Size layer_bounds(400, 400);
gfx::Size tile_size(100, 100);
+
+ host_impl_.SetViewportSize(layer_bounds);
+
SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size);
CreateHighLowResAndSetAllTilesVisible();
@@ -3374,7 +3393,7 @@
base::TimeTicks time_ticks;
time_ticks += base::TimeDelta::FromMilliseconds(1);
host_impl_.SetCurrentBeginFrameArgs(
- CreateBeginFrameArgsForTesting(time_ticks));
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
gfx::Size tile_size(100, 100);
gfx::Size layer_bounds(400, 400);
@@ -3416,7 +3435,7 @@
// Should update viewport and transform, but not update visible rect.
time_ticks += base::TimeDelta::FromMilliseconds(200);
host_impl_.SetCurrentBeginFrameArgs(
- CreateBeginFrameArgsForTesting(time_ticks));
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
resourceless_software_draw = true;
viewport = gfx::ScaleToEnclosingRect(viewport, 2);
transform.Translate(1.f, 1.f);
@@ -3440,7 +3459,7 @@
// Keep expanded viewport but mark it valid. Should update tile viewport.
time_ticks += base::TimeDelta::FromMilliseconds(200);
host_impl_.SetCurrentBeginFrameArgs(
- CreateBeginFrameArgsForTesting(time_ticks));
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
resourceless_software_draw = false;
host_impl_.SetExternalDrawConstraints(transform,
viewport,
@@ -3677,6 +3696,8 @@
gfx::Size tile_size(400, 400);
gfx::Size layer_bounds(1000, 2000);
+ host_impl_.SetViewportSize(layer_bounds);
+
scoped_refptr<FakePicturePileImpl> pending_pile =
FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
scoped_refptr<FakePicturePileImpl> active_pile =
@@ -3841,12 +3862,10 @@
size_t occluded_tile_count = 0u;
Tile* last_tile = nullptr;
- for (PictureLayerImpl::LayerEvictionTileIterator it =
- PictureLayerImpl::LayerEvictionTileIterator(layer,
- tree_priority);
- it;
- ++it) {
- Tile* tile = *it;
+ scoped_ptr<TilingSetEvictionQueue> queue =
+ layer->CreateEvictionQueue(tree_priority);
+ while (!queue->IsEmpty()) {
+ Tile* tile = queue->Top();
if (!last_tile)
last_tile = tile;
@@ -3874,6 +3893,7 @@
}
}
last_tile = tile;
+ queue->Pop();
}
EXPECT_EQ(expected_occluded_tile_count[priority_count],
occluded_tile_count);
@@ -3886,7 +3906,7 @@
base::TimeTicks time_ticks;
time_ticks += base::TimeDelta::FromMilliseconds(1);
host_impl_.SetCurrentBeginFrameArgs(
- CreateBeginFrameArgsForTesting(time_ticks));
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
gfx::Size tile_size(102, 102);
gfx::Size layer_bounds(1000, 1000);
@@ -3932,7 +3952,7 @@
time_ticks += base::TimeDelta::FromMilliseconds(200);
host_impl_.SetCurrentBeginFrameArgs(
- CreateBeginFrameArgsForTesting(time_ticks));
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
host_impl_.pending_tree()->UpdateDrawProperties();
unoccluded_tile_count = 0;
@@ -3956,7 +3976,7 @@
time_ticks += base::TimeDelta::FromMilliseconds(200);
host_impl_.SetCurrentBeginFrameArgs(
- CreateBeginFrameArgsForTesting(time_ticks));
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
host_impl_.pending_tree()->UpdateDrawProperties();
unoccluded_tile_count = 0;
@@ -3981,7 +4001,7 @@
base::TimeTicks time_ticks;
time_ticks += base::TimeDelta::FromMilliseconds(1);
host_impl_.SetCurrentBeginFrameArgs(
- CreateBeginFrameArgsForTesting(time_ticks));
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
gfx::Size tile_size(102, 102);
gfx::Size layer_bounds(1000, 1000);
@@ -4032,7 +4052,7 @@
time_ticks += base::TimeDelta::FromMilliseconds(200);
host_impl_.SetCurrentBeginFrameArgs(
- CreateBeginFrameArgsForTesting(time_ticks));
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
host_impl_.pending_tree()->UpdateDrawProperties();
for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) {
@@ -4072,7 +4092,7 @@
time_ticks += base::TimeDelta::FromMilliseconds(200);
host_impl_.SetCurrentBeginFrameArgs(
- CreateBeginFrameArgsForTesting(time_ticks));
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
host_impl_.pending_tree()->UpdateDrawProperties();
for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) {
@@ -4501,7 +4521,7 @@
base::TimeTicks time_ticks;
time_ticks += base::TimeDelta::FromMilliseconds(1);
host_impl_.SetCurrentBeginFrameArgs(
- CreateBeginFrameArgsForTesting(time_ticks));
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
gfx::Size tile_size(100, 100);
gfx::Size layer_bounds(200, 200);
@@ -4568,7 +4588,7 @@
base::TimeTicks time_ticks;
time_ticks += base::TimeDelta::FromMilliseconds(1);
host_impl_.SetCurrentBeginFrameArgs(
- CreateBeginFrameArgsForTesting(time_ticks));
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
gfx::Size tile_size(100, 100);
gfx::Size layer_bounds(200, 200);
@@ -4625,7 +4645,7 @@
base::TimeTicks time_ticks;
time_ticks += base::TimeDelta::FromMilliseconds(1);
host_impl_.SetCurrentBeginFrameArgs(
- CreateBeginFrameArgsForTesting(time_ticks));
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
gfx::Size tile_size(100, 100);
gfx::Size layer_bounds(400, 4000);
diff --git a/cc/layers/picture_layer_unittest.cc b/cc/layers/picture_layer_unittest.cc
index 3f81ef8..ac20e4c 100644
--- a/cc/layers/picture_layer_unittest.cc
+++ b/cc/layers/picture_layer_unittest.cc
@@ -24,6 +24,12 @@
SkCanvas* canvas,
const gfx::Rect& clip,
ContentLayerClient::GraphicsContextStatus gc_status) override {}
+ scoped_refptr<DisplayItemList> PaintContentsToDisplayList(
+ const gfx::Rect& clip,
+ GraphicsContextStatus gc_status) override {
+ NOTIMPLEMENTED();
+ return DisplayItemList::Create();
+ }
bool FillsBoundsCompletely() const override { return false; };
};
@@ -73,6 +79,9 @@
TEST(PictureLayerTest, SuitableForGpuRasterization) {
MockContentLayerClient client;
scoped_refptr<PictureLayer> layer = PictureLayer::Create(&client);
+ FakeLayerTreeHostClient host_client(FakeLayerTreeHostClient::DIRECT_3D);
+ scoped_ptr<FakeLayerTreeHost> host = FakeLayerTreeHost::Create(&host_client);
+ host->SetRootLayer(layer);
RecordingSource* recording_source = layer->GetRecordingSourceForTesting();
// Layer is suitable for gpu rasterization by default.
diff --git a/cc/layers/tiled_layer_unittest.cc b/cc/layers/tiled_layer_unittest.cc
index 908d428..512fa51 100644
--- a/cc/layers/tiled_layer_unittest.cc
+++ b/cc/layers/tiled_layer_unittest.cc
@@ -261,6 +261,8 @@
};
TEST_F(TiledLayerTest, PushDirtyTiles) {
+ layer_tree_host_->SetViewportSize(gfx::Size(1000, 1000));
+
scoped_refptr<FakeTiledLayer> layer =
make_scoped_refptr(new FakeTiledLayer(resource_manager_.get()));
scoped_ptr<FakeTiledLayerImpl> layer_impl =
@@ -290,6 +292,8 @@
}
TEST_F(TiledLayerTest, Scale) {
+ layer_tree_host_->SetViewportSize(gfx::Size(1000, 1000));
+
layer_tree_host_->SetDeviceScaleFactor(1.5);
scoped_refptr<FakeTiledLayer> layer =
@@ -352,6 +356,8 @@
}
TEST_F(TiledLayerTest, PushDeletedTiles) {
+ layer_tree_host_->SetViewportSize(gfx::Size(1000, 1000));
+
scoped_refptr<FakeTiledLayer> layer =
make_scoped_refptr(new FakeTiledLayer(resource_manager_.get()));
scoped_ptr<FakeTiledLayerImpl> layer_impl =
@@ -1201,6 +1207,8 @@
}
TEST_F(TiledLayerTest, TilesPaintedWithoutOcclusion) {
+ layer_tree_host_->SetViewportSize(gfx::Size(1000, 1000));
+
scoped_refptr<FakeTiledLayer> layer =
make_scoped_refptr(new FakeTiledLayer(resource_manager_.get()));
RenderSurfaceLayerList render_surface_layer_list;
diff --git a/cc/output/begin_frame_args.cc b/cc/output/begin_frame_args.cc
index 0be9318..5744d9d 100644
--- a/cc/output/begin_frame_args.cc
+++ b/cc/output/begin_frame_args.cc
@@ -41,12 +41,19 @@
type(type) {
}
-BeginFrameArgs BeginFrameArgs::Create(base::TimeTicks frame_time,
+BeginFrameArgs BeginFrameArgs::Create(BeginFrameArgs::CreationLocation location,
+ base::TimeTicks frame_time,
base::TimeTicks deadline,
base::TimeDelta interval,
BeginFrameArgs::BeginFrameArgsType type) {
DCHECK_NE(type, BeginFrameArgs::INVALID);
+#ifdef NDEBUG
return BeginFrameArgs(frame_time, deadline, interval, type);
+#else
+ BeginFrameArgs args = BeginFrameArgs(frame_time, deadline, interval, type);
+ args.created_from = location;
+ return args;
+#endif
}
scoped_refptr<base::debug::ConvertableToTraceFormat> BeginFrameArgs::AsValue()
@@ -63,6 +70,9 @@
state->SetDouble("frame_time_us", frame_time.ToInternalValue());
state->SetDouble("deadline_us", deadline.ToInternalValue());
state->SetDouble("interval_us", interval.InMicroseconds());
+#ifndef NDEBUG
+ state->SetString("created_from", created_from.ToString());
+#endif
}
// This is a hard-coded deadline adjustment that assumes 60Hz, to be used in
diff --git a/cc/output/begin_frame_args.h b/cc/output/begin_frame_args.h
index 0be5241..ba29523 100644
--- a/cc/output/begin_frame_args.h
+++ b/cc/output/begin_frame_args.h
@@ -5,6 +5,7 @@
#ifndef CC_OUTPUT_BEGIN_FRAME_ARGS_H_
#define CC_OUTPUT_BEGIN_FRAME_ARGS_H_
+#include "base/location.h"
#include "base/memory/ref_counted.h"
#include "base/time/time.h"
#include "base/values.h"
@@ -17,6 +18,22 @@
}
}
+/**
+ * In debug builds we trace the creation origin of BeginFrameArgs objects. We
+ * reuse the tracked_objects::Location system to do that.
+ *
+ * However, in release builds we don't want this as it doubles the size of the
+ * BeginFrameArgs object. As well it adds a number of largish strings to the
+ * binary. Despite the argument being unused, most compilers are unable to
+ * optimise it away even when unused. Instead we use the BEGINFRAME_FROM_HERE
+ * macro to prevent the data even getting referenced.
+ */
+#ifdef NDEBUG
+#define BEGINFRAME_FROM_HERE nullptr
+#else
+#define BEGINFRAME_FROM_HERE FROM_HERE
+#endif
+
namespace cc {
struct CC_EXPORT BeginFrameArgs {
@@ -31,9 +48,18 @@
// Creates an invalid set of values.
BeginFrameArgs();
+#ifdef NDEBUG
+ typedef const void* CreationLocation;
+#else
+ typedef const tracked_objects::Location& CreationLocation;
+ tracked_objects::Location created_from;
+#endif
+
// You should be able to find all instances where a BeginFrame has been
// created by searching for "BeginFrameArgs::Create".
- static BeginFrameArgs Create(base::TimeTicks frame_time,
+ // The location argument should **always** be BEGINFRAME_FROM_HERE macro.
+ static BeginFrameArgs Create(CreationLocation location,
+ base::TimeTicks frame_time,
base::TimeTicks deadline,
base::TimeDelta interval,
BeginFrameArgsType type);
diff --git a/cc/output/begin_frame_args_unittest.cc b/cc/output/begin_frame_args_unittest.cc
index 9d77a45..877a857 100644
--- a/cc/output/begin_frame_args_unittest.cc
+++ b/cc/output/begin_frame_args_unittest.cc
@@ -15,26 +15,29 @@
TEST(BeginFrameArgsTest, Helpers) {
// Quick create methods work
- BeginFrameArgs args0 = CreateBeginFrameArgsForTesting();
+ BeginFrameArgs args0 = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE);
EXPECT_TRUE(args0.IsValid()) << args0;
- BeginFrameArgs args1 = CreateBeginFrameArgsForTesting(0, 0, -1);
+ BeginFrameArgs args1 =
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 0, -1);
EXPECT_FALSE(args1.IsValid()) << args1;
- BeginFrameArgs args2 = CreateBeginFrameArgsForTesting(1, 2, 3);
+ BeginFrameArgs args2 =
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 1, 2, 3);
EXPECT_TRUE(args2.IsValid()) << args2;
EXPECT_EQ(1, args2.frame_time.ToInternalValue());
EXPECT_EQ(2, args2.deadline.ToInternalValue());
EXPECT_EQ(3, args2.interval.ToInternalValue());
EXPECT_EQ(BeginFrameArgs::NORMAL, args2.type);
- BeginFrameArgs args3 = CreateExpiredBeginFrameArgsForTesting();
+ BeginFrameArgs args3 =
+ CreateExpiredBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE);
EXPECT_TRUE(args3.IsValid()) << args3;
EXPECT_GT(gfx::FrameTime::Now(), args3.deadline);
EXPECT_EQ(BeginFrameArgs::NORMAL, args3.type);
- BeginFrameArgs args4 =
- CreateBeginFrameArgsForTesting(1, 2, 3, BeginFrameArgs::MISSED);
+ BeginFrameArgs args4 = CreateBeginFrameArgsForTesting(
+ BEGINFRAME_FROM_HERE, 1, 2, 3, BeginFrameArgs::MISSED);
EXPECT_TRUE(args4.IsValid()) << args4;
EXPECT_EQ(1, args4.frame_time.ToInternalValue());
EXPECT_EQ(2, args4.deadline.ToInternalValue());
@@ -42,16 +45,19 @@
EXPECT_EQ(BeginFrameArgs::MISSED, args4.type);
// operator==
- EXPECT_EQ(CreateBeginFrameArgsForTesting(4, 5, 6),
- CreateBeginFrameArgsForTesting(4, 5, 6));
+ EXPECT_EQ(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 4, 5, 6),
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 4, 5, 6));
EXPECT_NONFATAL_FAILURE(
- EXPECT_EQ(CreateBeginFrameArgsForTesting(7, 8, 9, BeginFrameArgs::MISSED),
- CreateBeginFrameArgsForTesting(7, 8, 9)),
+ EXPECT_EQ(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 7, 8, 9,
+ BeginFrameArgs::MISSED),
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 7, 8, 9)),
"");
- EXPECT_NONFATAL_FAILURE(EXPECT_EQ(CreateBeginFrameArgsForTesting(4, 5, 6),
- CreateBeginFrameArgsForTesting(7, 8, 9)),
- "");
+
+ EXPECT_NONFATAL_FAILURE(
+ EXPECT_EQ(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 4, 5, 6),
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 7, 8, 9)),
+ "");
// operator<<
std::stringstream out1;
@@ -74,7 +80,7 @@
EXPECT_FALSE(args1.IsValid()) << args1;
BeginFrameArgs args2 = BeginFrameArgs::Create(
- base::TimeTicks::FromInternalValue(1),
+ BEGINFRAME_FROM_HERE, base::TimeTicks::FromInternalValue(1),
base::TimeTicks::FromInternalValue(2),
base::TimeDelta::FromInternalValue(3), BeginFrameArgs::NORMAL);
EXPECT_TRUE(args2.IsValid()) << args2;
@@ -84,5 +90,14 @@
EXPECT_EQ(BeginFrameArgs::NORMAL, args2.type) << args2;
}
+#ifndef NDEBUG
+TEST(BeginFrameArgsTest, Location) {
+ tracked_objects::Location expected_location = BEGINFRAME_FROM_HERE;
+
+ BeginFrameArgs args = CreateBeginFrameArgsForTesting(expected_location);
+ EXPECT_EQ(expected_location.ToString(), args.created_from.ToString());
+}
+#endif
+
} // namespace
} // namespace cc
diff --git a/cc/output/renderer_settings.cc b/cc/output/renderer_settings.cc
index bacde5b..2277af3 100644
--- a/cc/output/renderer_settings.cc
+++ b/cc/output/renderer_settings.cc
@@ -15,6 +15,7 @@
force_antialiasing(false),
force_blending_with_shaders(false),
partial_swap_enabled(false),
+ finish_rendering_on_resize(false),
should_clear_root_render_pass(true),
refresh_rate(60.0),
highp_threshold_min(0),
diff --git a/cc/output/renderer_settings.h b/cc/output/renderer_settings.h
index 748d230..6da0238 100644
--- a/cc/output/renderer_settings.h
+++ b/cc/output/renderer_settings.h
@@ -19,6 +19,7 @@
bool force_antialiasing;
bool force_blending_with_shaders;
bool partial_swap_enabled;
+ bool finish_rendering_on_resize;
bool should_clear_root_render_pass;
double refresh_rate;
int highp_threshold_min;
diff --git a/cc/quads/largest_draw_quad.cc b/cc/quads/largest_draw_quad.cc
index 55fcb22..6445204 100644
--- a/cc/quads/largest_draw_quad.cc
+++ b/cc/quads/largest_draw_quad.cc
@@ -6,15 +6,62 @@
#include <algorithm>
+#include "cc/quads/checkerboard_draw_quad.h"
+#include "cc/quads/debug_border_draw_quad.h"
+#include "cc/quads/io_surface_draw_quad.h"
+#include "cc/quads/picture_draw_quad.h"
#include "cc/quads/render_pass_draw_quad.h"
+#include "cc/quads/solid_color_draw_quad.h"
#include "cc/quads/stream_video_draw_quad.h"
+#include "cc/quads/surface_draw_quad.h"
+#include "cc/quads/texture_draw_quad.h"
+#include "cc/quads/tile_draw_quad.h"
+#include "cc/quads/yuv_video_draw_quad.h"
+
+namespace {
+const size_t kLargestDrawQuadSize =
+ sizeof(cc::RenderPassDrawQuad) > sizeof(cc::StreamVideoDrawQuad)
+ ? sizeof(cc::RenderPassDrawQuad)
+ : sizeof(cc::StreamVideoDrawQuad);
+} // namespace
namespace cc {
size_t LargestDrawQuadSize() {
- // The largest quad is either a RenderPassDrawQuad or a StreamVideoDrawQuad
- // depends on hardware structure.
- return std::max(sizeof(RenderPassDrawQuad), sizeof(StreamVideoDrawQuad));
+ // Currently the largest quad is either a RenderPassDrawQuad or a
+ // StreamVideoDrawQuad depends on hardware structure.
+
+ // Use compile assert to make sure largest is actually larger than all other
+ // type of draw quads.
+ COMPILE_ASSERT(sizeof(CheckerboardDrawQuad) <= kLargestDrawQuadSize,
+ "Largest Draw Quad size needs update. CheckerboardDrawQuad is "
+ "currently largest.");
+ COMPILE_ASSERT(sizeof(DebugBorderDrawQuad) <= kLargestDrawQuadSize,
+ "Largest Draw Quad size needs update. DebugBorderDrawQuad is "
+ "currently largest.");
+ COMPILE_ASSERT(sizeof(IOSurfaceDrawQuad) <= kLargestDrawQuadSize,
+ "Largest Draw Quad size needs update. IOSurfaceDrawQuad is "
+ "currently largest.");
+ COMPILE_ASSERT(sizeof(PictureDrawQuad) <= kLargestDrawQuadSize,
+ "Largest Draw Quad size needs update. PictureDrawQuad is "
+ "currently largest.");
+ COMPILE_ASSERT(sizeof(TextureDrawQuad) <= kLargestDrawQuadSize,
+ "Largest Draw Quad size needs update. TextureDrawQuad is "
+ "currently largest.");
+ COMPILE_ASSERT(sizeof(SolidColorDrawQuad) <= kLargestDrawQuadSize,
+ "Largest Draw Quad size needs update. SolidColorDrawQuad is "
+ "currently largest.");
+ COMPILE_ASSERT(sizeof(SurfaceDrawQuad) <= kLargestDrawQuadSize,
+ "Largest Draw Quad size needs update. SurfaceDrawQuad is "
+ "currently largest.");
+ COMPILE_ASSERT(sizeof(TileDrawQuad) <= kLargestDrawQuadSize,
+ "Largest Draw Quad size needs update. TileDrawQuad is "
+ "currently largest.");
+ COMPILE_ASSERT(sizeof(YUVVideoDrawQuad) <= kLargestDrawQuadSize,
+ "Largest Draw Quad size needs update. YUVVideoDrawQuad is "
+ "currently largest.");
+
+ return kLargestDrawQuadSize;
}
} // namespace cc
diff --git a/cc/resources/clip_display_item.cc b/cc/resources/clip_display_item.cc
new file mode 100644
index 0000000..731c605
--- /dev/null
+++ b/cc/resources/clip_display_item.cc
@@ -0,0 +1,74 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "cc/resources/clip_display_item.h"
+
+#include "third_party/skia/include/core/SkCanvas.h"
+
+namespace cc {
+
+ClipDisplayItem::ClipDisplayItem(gfx::Rect clip_rect,
+ const std::vector<SkRRect>& rounded_clip_rects)
+ : clip_rect_(clip_rect), rounded_clip_rects_(rounded_clip_rects) {
+}
+
+ClipDisplayItem::~ClipDisplayItem() {
+}
+
+void ClipDisplayItem::Raster(SkCanvas* canvas,
+ SkDrawPictureCallback* callback) const {
+ canvas->save();
+ canvas->clipRect(SkRect::MakeXYWH(clip_rect_.x(), clip_rect_.y(),
+ clip_rect_.width(), clip_rect_.height()));
+ for (size_t i = 0; i < rounded_clip_rects_.size(); ++i) {
+ if (rounded_clip_rects_[i].isRect()) {
+ canvas->clipRect(rounded_clip_rects_[i].rect());
+ } else {
+ bool antialiased = true;
+ canvas->clipRRect(rounded_clip_rects_[i], SkRegion::kIntersect_Op,
+ antialiased);
+ }
+ }
+}
+
+bool ClipDisplayItem::IsSuitableForGpuRasterization() const {
+ return true;
+}
+
+int ClipDisplayItem::ApproximateOpCount() const {
+ return 1;
+}
+
+size_t ClipDisplayItem::PictureMemoryUsage() const {
+ size_t total_size = sizeof(gfx::Rect);
+ for (size_t i = 0; i < rounded_clip_rects_.size(); ++i) {
+ total_size += sizeof(rounded_clip_rects_[i]);
+ }
+ return total_size;
+}
+
+EndClipDisplayItem::EndClipDisplayItem() {
+}
+
+EndClipDisplayItem::~EndClipDisplayItem() {
+}
+
+void EndClipDisplayItem::Raster(SkCanvas* canvas,
+ SkDrawPictureCallback* callback) const {
+ canvas->restore();
+}
+
+bool EndClipDisplayItem::IsSuitableForGpuRasterization() const {
+ return true;
+}
+
+int EndClipDisplayItem::ApproximateOpCount() const {
+ return 0;
+}
+
+size_t EndClipDisplayItem::PictureMemoryUsage() const {
+ return 0;
+}
+
+} // namespace cc
diff --git a/cc/resources/clip_display_item.h b/cc/resources/clip_display_item.h
new file mode 100644
index 0000000..55c1ffd
--- /dev/null
+++ b/cc/resources/clip_display_item.h
@@ -0,0 +1,66 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CC_RESOURCES_CLIP_DISPLAY_ITEM_H_
+#define CC_RESOURCES_CLIP_DISPLAY_ITEM_H_
+
+#include <vector>
+
+#include "base/memory/scoped_ptr.h"
+#include "cc/base/cc_export.h"
+#include "cc/resources/display_item.h"
+#include "third_party/skia/include/core/SkRRect.h"
+#include "ui/gfx/geometry/rect.h"
+
+class SkCanvas;
+class SkDrawPictureCallback;
+
+namespace cc {
+
+class CC_EXPORT ClipDisplayItem : public DisplayItem {
+ public:
+ virtual ~ClipDisplayItem();
+
+ static scoped_ptr<ClipDisplayItem> Create(
+ gfx::Rect clip_rect,
+ const std::vector<SkRRect>& rounded_clip_rects) {
+ return make_scoped_ptr(new ClipDisplayItem(clip_rect, rounded_clip_rects));
+ }
+
+ void Raster(SkCanvas* canvas, SkDrawPictureCallback* callback) const override;
+
+ bool IsSuitableForGpuRasterization() const override;
+ int ApproximateOpCount() const override;
+ size_t PictureMemoryUsage() const override;
+
+ protected:
+ ClipDisplayItem(gfx::Rect clip_rect,
+ const std::vector<SkRRect>& rounded_clip_rects);
+
+ private:
+ gfx::Rect clip_rect_;
+ std::vector<SkRRect> rounded_clip_rects_;
+};
+
+class CC_EXPORT EndClipDisplayItem : public DisplayItem {
+ public:
+ virtual ~EndClipDisplayItem();
+
+ static scoped_ptr<EndClipDisplayItem> Create() {
+ return make_scoped_ptr(new EndClipDisplayItem());
+ }
+
+ void Raster(SkCanvas* canvas, SkDrawPictureCallback* callback) const override;
+
+ bool IsSuitableForGpuRasterization() const override;
+ int ApproximateOpCount() const override;
+ size_t PictureMemoryUsage() const override;
+
+ protected:
+ EndClipDisplayItem();
+};
+
+} // namespace cc
+
+#endif // CC_RESOURCES_CLIP_DISPLAY_ITEM_H_
diff --git a/cc/resources/display_item.cc b/cc/resources/display_item.cc
new file mode 100644
index 0000000..33069a5
--- /dev/null
+++ b/cc/resources/display_item.cc
@@ -0,0 +1,12 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "cc/resources/display_item.h"
+
+namespace cc {
+
+DisplayItem::DisplayItem() {
+}
+
+} // namespace cc
diff --git a/cc/resources/display_item.h b/cc/resources/display_item.h
new file mode 100644
index 0000000..6f1b5f7
--- /dev/null
+++ b/cc/resources/display_item.h
@@ -0,0 +1,34 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CC_RESOURCES_DISPLAY_ITEM_H_
+#define CC_RESOURCES_DISPLAY_ITEM_H_
+
+#include "base/memory/scoped_ptr.h"
+#include "cc/base/cc_export.h"
+#include "ui/gfx/rect.h"
+
+class SkCanvas;
+class SkDrawPictureCallback;
+
+namespace cc {
+
+class CC_EXPORT DisplayItem {
+ public:
+ virtual ~DisplayItem() {}
+
+ virtual void Raster(SkCanvas* canvas,
+ SkDrawPictureCallback* callback) const = 0;
+
+ virtual bool IsSuitableForGpuRasterization() const = 0;
+ virtual int ApproximateOpCount() const = 0;
+ virtual size_t PictureMemoryUsage() const = 0;
+
+ protected:
+ DisplayItem();
+};
+
+} // namespace cc
+
+#endif // CC_RESOURCES_DISPLAY_ITEM_H_
diff --git a/cc/resources/display_item_list.cc b/cc/resources/display_item_list.cc
new file mode 100644
index 0000000..2ead28d
--- /dev/null
+++ b/cc/resources/display_item_list.cc
@@ -0,0 +1,79 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "cc/resources/display_item_list.h"
+
+#include "base/debug/trace_event.h"
+#include "base/debug/trace_event_argument.h"
+#include "third_party/skia/include/core/SkCanvas.h"
+
+namespace cc {
+
+DisplayItemList::DisplayItemList()
+ : is_suitable_for_gpu_rasterization_(true), approximate_op_count_(0) {
+}
+
+scoped_refptr<DisplayItemList> DisplayItemList::Create() {
+ return make_scoped_refptr(new DisplayItemList());
+}
+
+DisplayItemList::~DisplayItemList() {
+}
+
+void DisplayItemList::Raster(SkCanvas* canvas,
+ SkDrawPictureCallback* callback,
+ float contents_scale) const {
+ canvas->save();
+ canvas->scale(contents_scale, contents_scale);
+ for (size_t i = 0; i < items_.size(); ++i) {
+ items_[i]->Raster(canvas, callback);
+ }
+ canvas->restore();
+}
+
+void DisplayItemList::AppendItem(scoped_ptr<DisplayItem> item) {
+ is_suitable_for_gpu_rasterization_ &= item->IsSuitableForGpuRasterization();
+ approximate_op_count_ += item->ApproximateOpCount();
+ items_.push_back(item.Pass());
+}
+
+bool DisplayItemList::IsSuitableForGpuRasterization() const {
+ // This is more permissive than Picture's implementation, since none of the
+ // items might individually trigger a veto even though they collectively have
+ // enough "bad" operations that a corresponding Picture would get vetoed.
+ return is_suitable_for_gpu_rasterization_;
+}
+
+int DisplayItemList::ApproximateOpCount() const {
+ return approximate_op_count_;
+}
+
+size_t DisplayItemList::PictureMemoryUsage() const {
+ size_t total_size = 0;
+
+ for (const auto& item : items_) {
+ total_size += item->PictureMemoryUsage();
+ }
+
+ return total_size;
+}
+
+scoped_refptr<base::debug::ConvertableToTraceFormat> DisplayItemList::AsValue()
+ const {
+ scoped_refptr<base::debug::TracedValue> state =
+ new base::debug::TracedValue();
+
+ // TODO(ajuma): Include the value of each item.
+ state->SetInteger("length", items_.size());
+ return state;
+}
+
+void DisplayItemList::EmitTraceSnapshot() const {
+ TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(
+ TRACE_DISABLED_BY_DEFAULT("cc.debug") "," TRACE_DISABLED_BY_DEFAULT(
+ "devtools.timeline.picture"),
+ "cc::DisplayItemList", this, AsValue());
+}
+
+} // namespace cc
diff --git a/cc/resources/display_item_list.h b/cc/resources/display_item_list.h
new file mode 100644
index 0000000..10d052f
--- /dev/null
+++ b/cc/resources/display_item_list.h
@@ -0,0 +1,53 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CC_RESOURCES_DISPLAY_ITEM_LIST_H_
+#define CC_RESOURCES_DISPLAY_ITEM_LIST_H_
+
+#include "base/debug/trace_event.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_ptr.h"
+#include "cc/base/cc_export.h"
+#include "cc/base/scoped_ptr_vector.h"
+#include "cc/resources/display_item.h"
+#include "ui/gfx/rect.h"
+
+class SkCanvas;
+class SkDrawPictureCallback;
+
+namespace cc {
+
+class CC_EXPORT DisplayItemList
+ : public base::RefCountedThreadSafe<DisplayItemList> {
+ public:
+ static scoped_refptr<DisplayItemList> Create();
+
+ void Raster(SkCanvas* canvas,
+ SkDrawPictureCallback* callback,
+ float contents_scale) const;
+
+ void AppendItem(scoped_ptr<DisplayItem> item);
+
+ bool IsSuitableForGpuRasterization() const;
+ int ApproximateOpCount() const;
+ size_t PictureMemoryUsage() const;
+
+ scoped_refptr<base::debug::ConvertableToTraceFormat> AsValue() const;
+
+ void EmitTraceSnapshot() const;
+
+ private:
+ DisplayItemList();
+ ~DisplayItemList();
+ ScopedPtrVector<DisplayItem> items_;
+ bool is_suitable_for_gpu_rasterization_;
+ int approximate_op_count_;
+
+ friend class base::RefCountedThreadSafe<DisplayItemList>;
+ DISALLOW_COPY_AND_ASSIGN(DisplayItemList);
+};
+
+} // namespace cc
+
+#endif // CC_RESOURCES_DISPLAY_ITEM_LIST_H_
diff --git a/cc/resources/display_item_list_unittest.cc b/cc/resources/display_item_list_unittest.cc
new file mode 100644
index 0000000..d6455a2
--- /dev/null
+++ b/cc/resources/display_item_list_unittest.cc
@@ -0,0 +1,166 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "cc/resources/display_item_list.h"
+
+#include <vector>
+
+#include "cc/resources/clip_display_item.h"
+#include "cc/resources/drawing_display_item.h"
+#include "cc/resources/transform_display_item.h"
+#include "cc/test/skia_common.h"
+#include "skia/ext/refptr.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/skia/include/core/SkBitmap.h"
+#include "third_party/skia/include/core/SkCanvas.h"
+#include "third_party/skia/include/core/SkColor.h"
+#include "third_party/skia/include/core/SkPictureRecorder.h"
+#include "ui/gfx/skia_util.h"
+
+namespace cc {
+namespace {
+
+TEST(DisplayItemListTest, SingleDrawingItem) {
+ gfx::Rect layer_rect(100, 100);
+ SkPictureRecorder recorder;
+ skia::RefPtr<SkCanvas> canvas;
+ skia::RefPtr<SkPicture> picture;
+ SkPaint blue_paint;
+ blue_paint.setColor(SK_ColorBLUE);
+ SkPaint red_paint;
+ red_paint.setColor(SK_ColorRED);
+ unsigned char pixels[4 * 100 * 100] = {0};
+ scoped_refptr<DisplayItemList> list = DisplayItemList::Create();
+
+ canvas = skia::SharePtr(
+ recorder.beginRecording(layer_rect.width(), layer_rect.height()));
+ canvas->drawRectCoords(0.f, 0.f, 60.f, 60.f, red_paint);
+ canvas->drawRectCoords(50.f, 50.f, 75.f, 75.f, blue_paint);
+ picture = skia::AdoptRef(recorder.endRecording());
+ gfx::PointF offset(8.f, 9.f);
+ list->AppendItem(DrawingDisplayItem::Create(picture, offset));
+ DrawDisplayList(pixels, layer_rect, list);
+
+ SkBitmap expected_bitmap;
+ unsigned char expected_pixels[4 * 100 * 100] = {0};
+ SkImageInfo info =
+ SkImageInfo::MakeN32Premul(layer_rect.width(), layer_rect.height());
+ expected_bitmap.installPixels(info, expected_pixels, info.minRowBytes());
+ SkCanvas expected_canvas(expected_bitmap);
+ expected_canvas.clipRect(gfx::RectToSkRect(layer_rect));
+ expected_canvas.drawRectCoords(0.f + offset.x(), 0.f + offset.y(),
+ 60.f + offset.x(), 60.f + offset.y(),
+ red_paint);
+ expected_canvas.drawRectCoords(50.f + offset.x(), 50.f + offset.y(),
+ 75.f + offset.x(), 75.f + offset.y(),
+ blue_paint);
+
+ EXPECT_EQ(0, memcmp(pixels, expected_pixels, 4 * 100 * 100));
+}
+
+TEST(DisplayItemListTest, ClipItem) {
+ gfx::Rect layer_rect(100, 100);
+ SkPictureRecorder recorder;
+ skia::RefPtr<SkCanvas> canvas;
+ skia::RefPtr<SkPicture> picture;
+ SkPaint blue_paint;
+ blue_paint.setColor(SK_ColorBLUE);
+ SkPaint red_paint;
+ red_paint.setColor(SK_ColorRED);
+ unsigned char pixels[4 * 100 * 100] = {0};
+ scoped_refptr<DisplayItemList> list = DisplayItemList::Create();
+
+ canvas = skia::SharePtr(
+ recorder.beginRecording(layer_rect.width(), layer_rect.height()));
+ canvas->drawRectCoords(0.f, 0.f, 60.f, 60.f, red_paint);
+ picture = skia::AdoptRef(recorder.endRecording());
+ gfx::PointF first_offset(8.f, 9.f);
+ list->AppendItem(DrawingDisplayItem::Create(picture, first_offset));
+
+ gfx::Rect clip_rect(60, 60, 10, 10);
+ list->AppendItem(ClipDisplayItem::Create(clip_rect, std::vector<SkRRect>()));
+
+ canvas = skia::SharePtr(
+ recorder.beginRecording(layer_rect.width(), layer_rect.height()));
+ canvas->drawRectCoords(50.f, 50.f, 75.f, 75.f, blue_paint);
+ picture = skia::AdoptRef(recorder.endRecording());
+ gfx::PointF second_offset(2.f, 3.f);
+ list->AppendItem(DrawingDisplayItem::Create(picture, second_offset));
+
+ list->AppendItem(EndClipDisplayItem::Create());
+
+ DrawDisplayList(pixels, layer_rect, list);
+
+ SkBitmap expected_bitmap;
+ unsigned char expected_pixels[4 * 100 * 100] = {0};
+ SkImageInfo info =
+ SkImageInfo::MakeN32Premul(layer_rect.width(), layer_rect.height());
+ expected_bitmap.installPixels(info, expected_pixels, info.minRowBytes());
+ SkCanvas expected_canvas(expected_bitmap);
+ expected_canvas.clipRect(gfx::RectToSkRect(layer_rect));
+ expected_canvas.drawRectCoords(0.f + first_offset.x(), 0.f + first_offset.y(),
+ 60.f + first_offset.x(),
+ 60.f + first_offset.y(), red_paint);
+ expected_canvas.clipRect(gfx::RectToSkRect(clip_rect));
+ expected_canvas.drawRectCoords(
+ 50.f + second_offset.x(), 50.f + second_offset.y(),
+ 75.f + second_offset.x(), 75.f + second_offset.y(), blue_paint);
+
+ EXPECT_EQ(0, memcmp(pixels, expected_pixels, 4 * 100 * 100));
+}
+
+TEST(DisplayItemListTest, TransformItem) {
+ gfx::Rect layer_rect(100, 100);
+ SkPictureRecorder recorder;
+ skia::RefPtr<SkCanvas> canvas;
+ skia::RefPtr<SkPicture> picture;
+ SkPaint blue_paint;
+ blue_paint.setColor(SK_ColorBLUE);
+ SkPaint red_paint;
+ red_paint.setColor(SK_ColorRED);
+ unsigned char pixels[4 * 100 * 100] = {0};
+ scoped_refptr<DisplayItemList> list = DisplayItemList::Create();
+
+ canvas = skia::SharePtr(
+ recorder.beginRecording(layer_rect.width(), layer_rect.height()));
+ canvas->drawRectCoords(0.f, 0.f, 60.f, 60.f, red_paint);
+ picture = skia::AdoptRef(recorder.endRecording());
+ gfx::PointF first_offset(8.f, 9.f);
+ list->AppendItem(DrawingDisplayItem::Create(picture, first_offset));
+
+ gfx::Transform transform;
+ transform.Rotate(45.0);
+ list->AppendItem(TransformDisplayItem::Create(transform));
+
+ canvas = skia::SharePtr(
+ recorder.beginRecording(layer_rect.width(), layer_rect.height()));
+ canvas->drawRectCoords(50.f, 50.f, 75.f, 75.f, blue_paint);
+ picture = skia::AdoptRef(recorder.endRecording());
+ gfx::PointF second_offset(2.f, 3.f);
+ list->AppendItem(DrawingDisplayItem::Create(picture, second_offset));
+
+ list->AppendItem(EndTransformDisplayItem::Create());
+
+ DrawDisplayList(pixels, layer_rect, list);
+
+ SkBitmap expected_bitmap;
+ unsigned char expected_pixels[4 * 100 * 100] = {0};
+ SkImageInfo info =
+ SkImageInfo::MakeN32Premul(layer_rect.width(), layer_rect.height());
+ expected_bitmap.installPixels(info, expected_pixels, info.minRowBytes());
+ SkCanvas expected_canvas(expected_bitmap);
+ expected_canvas.clipRect(gfx::RectToSkRect(layer_rect));
+ expected_canvas.drawRectCoords(0.f + first_offset.x(), 0.f + first_offset.y(),
+ 60.f + first_offset.x(),
+ 60.f + first_offset.y(), red_paint);
+ expected_canvas.setMatrix(transform.matrix());
+ expected_canvas.drawRectCoords(
+ 50.f + second_offset.x(), 50.f + second_offset.y(),
+ 75.f + second_offset.x(), 75.f + second_offset.y(), blue_paint);
+
+ EXPECT_EQ(0, memcmp(pixels, expected_pixels, 4 * 100 * 100));
+}
+
+} // namespace
+} // namespace cc
diff --git a/cc/resources/display_list_raster_source.cc b/cc/resources/display_list_raster_source.cc
new file mode 100644
index 0000000..f3ff816
--- /dev/null
+++ b/cc/resources/display_list_raster_source.cc
@@ -0,0 +1,208 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "cc/resources/display_list_raster_source.h"
+
+#include "base/debug/trace_event.h"
+#include "cc/base/region.h"
+#include "cc/debug/debug_colors.h"
+#include "cc/resources/display_item_list.h"
+#include "cc/resources/raster_source_helper.h"
+#include "skia/ext/analysis_canvas.h"
+#include "third_party/skia/include/core/SkCanvas.h"
+#include "third_party/skia/include/core/SkPictureRecorder.h"
+#include "ui/gfx/geometry/rect_conversions.h"
+
+namespace {
+
+#ifdef NDEBUG
+const bool kDefaultClearCanvasSetting = false;
+#else
+const bool kDefaultClearCanvasSetting = true;
+#endif
+
+} // namespace
+
+namespace cc {
+
+scoped_refptr<DisplayListRasterSource> DisplayListRasterSource::Create() {
+ return make_scoped_refptr(new DisplayListRasterSource);
+}
+
+scoped_refptr<DisplayListRasterSource>
+DisplayListRasterSource::CreateFromDisplayListRecordingSource(
+ const DisplayListRecordingSource* other) {
+ return make_scoped_refptr(new DisplayListRasterSource(other));
+}
+
+DisplayListRasterSource::DisplayListRasterSource()
+ : background_color_(SK_ColorTRANSPARENT),
+ requires_clear_(true),
+ can_use_lcd_text_(true),
+ is_solid_color_(false),
+ solid_color_(SK_ColorTRANSPARENT),
+ clear_canvas_with_debug_color_(kDefaultClearCanvasSetting),
+ slow_down_raster_scale_factor_for_debug_(0),
+ should_attempt_to_use_distance_field_text_(false) {
+}
+
+DisplayListRasterSource::DisplayListRasterSource(
+ const DisplayListRecordingSource* other)
+ : display_list_(other->display_list_),
+ background_color_(SK_ColorTRANSPARENT),
+ requires_clear_(true),
+ can_use_lcd_text_(other->can_use_lcd_text_),
+ is_solid_color_(other->is_solid_color_),
+ solid_color_(other->solid_color_),
+ recorded_viewport_(other->recorded_viewport_),
+ size_(other->size_),
+ clear_canvas_with_debug_color_(kDefaultClearCanvasSetting),
+ slow_down_raster_scale_factor_for_debug_(
+ other->slow_down_raster_scale_factor_for_debug_),
+ should_attempt_to_use_distance_field_text_(false) {
+}
+
+DisplayListRasterSource::~DisplayListRasterSource() {
+}
+
+void DisplayListRasterSource::PlaybackToSharedCanvas(
+ SkCanvas* canvas,
+ const gfx::Rect& canvas_rect,
+ float contents_scale) const {
+ RasterCommon(canvas, NULL, canvas_rect, contents_scale, false);
+}
+
+void DisplayListRasterSource::RasterForAnalysis(skia::AnalysisCanvas* canvas,
+ const gfx::Rect& canvas_rect,
+ float contents_scale) const {
+ RasterCommon(canvas, canvas, canvas_rect, contents_scale, true);
+}
+
+void DisplayListRasterSource::PlaybackToCanvas(SkCanvas* canvas,
+ const gfx::Rect& canvas_rect,
+ float contents_scale) const {
+ RasterSourceHelper::PrepareForPlaybackToCanvas(
+ canvas, canvas_rect, gfx::Rect(size_), contents_scale, background_color_,
+ clear_canvas_with_debug_color_, requires_clear_);
+
+ RasterCommon(canvas, NULL, canvas_rect, contents_scale, false);
+}
+
+void DisplayListRasterSource::RasterCommon(SkCanvas* canvas,
+ SkDrawPictureCallback* callback,
+ const gfx::Rect& canvas_rect,
+ float contents_scale,
+ bool is_analysis) const {
+ canvas->translate(-canvas_rect.x(), -canvas_rect.y());
+ gfx::Rect content_rect =
+ gfx::ToEnclosingRect(gfx::ScaleRect(gfx::Rect(size_), contents_scale));
+ content_rect.Intersect(canvas_rect);
+
+ canvas->clipRect(gfx::RectToSkRect(content_rect), SkRegion::kIntersect_Op);
+
+ DCHECK(display_list_.get());
+ display_list_->Raster(canvas, callback, contents_scale);
+}
+
+skia::RefPtr<SkPicture> DisplayListRasterSource::GetFlattenedPicture() {
+ TRACE_EVENT0("cc", "DisplayListRasterSource::GetFlattenedPicture");
+
+ gfx::Rect display_list_rect(size_);
+ SkPictureRecorder recorder;
+ SkCanvas* canvas = recorder.beginRecording(display_list_rect.width(),
+ display_list_rect.height());
+ if (!display_list_rect.IsEmpty())
+ PlaybackToCanvas(canvas, display_list_rect, 1.0);
+ skia::RefPtr<SkPicture> picture = skia::AdoptRef(recorder.endRecording());
+
+ return picture;
+}
+
+size_t DisplayListRasterSource::GetPictureMemoryUsage() const {
+ return display_list_->PictureMemoryUsage();
+}
+
+void DisplayListRasterSource::PerformSolidColorAnalysis(
+ const gfx::Rect& content_rect,
+ float contents_scale,
+ RasterSource::SolidColorAnalysis* analysis) const {
+ DCHECK(analysis);
+ TRACE_EVENT0("cc", "DisplayListRasterSource::PerformSolidColorAnalysis");
+
+ gfx::Rect layer_rect =
+ gfx::ScaleToEnclosingRect(content_rect, 1.0f / contents_scale);
+
+ layer_rect.Intersect(gfx::Rect(size_));
+ skia::AnalysisCanvas canvas(layer_rect.width(), layer_rect.height());
+ RasterForAnalysis(&canvas, layer_rect, 1.0f);
+ analysis->is_solid_color = canvas.GetColorIfSolid(&analysis->solid_color);
+}
+
+void DisplayListRasterSource::GatherPixelRefs(
+ const gfx::Rect& content_rect,
+ float contents_scale,
+ std::vector<SkPixelRef*>* pixel_refs) const {
+ // TODO(ajuma): Implement this.
+}
+
+bool DisplayListRasterSource::CoversRect(const gfx::Rect& content_rect,
+ float contents_scale) const {
+ if (size_.IsEmpty())
+ return false;
+ gfx::Rect layer_rect =
+ gfx::ScaleToEnclosingRect(content_rect, 1.f / contents_scale);
+ layer_rect.Intersect(gfx::Rect(size_));
+
+ return recorded_viewport_.Contains(layer_rect);
+}
+
+gfx::Size DisplayListRasterSource::GetSize() const {
+ return size_;
+}
+
+bool DisplayListRasterSource::IsSolidColor() const {
+ return is_solid_color_;
+}
+
+SkColor DisplayListRasterSource::GetSolidColor() const {
+ DCHECK(IsSolidColor());
+ return solid_color_;
+}
+
+bool DisplayListRasterSource::HasRecordings() const {
+ return !!display_list_.get();
+}
+
+void DisplayListRasterSource::SetShouldAttemptToUseDistanceFieldText() {
+ should_attempt_to_use_distance_field_text_ = true;
+}
+
+void DisplayListRasterSource::SetBackgoundColor(SkColor background_color) {
+ background_color_ = background_color;
+}
+
+void DisplayListRasterSource::SetRequiresClear(bool requires_clear) {
+ requires_clear_ = requires_clear;
+}
+
+bool DisplayListRasterSource::ShouldAttemptToUseDistanceFieldText() const {
+ return should_attempt_to_use_distance_field_text_;
+}
+
+void DisplayListRasterSource::AsValueInto(
+ base::debug::TracedValue* array) const {
+ if (display_list_.get())
+ TracedValue::AppendIDRef(display_list_.get(), array);
+}
+
+void DisplayListRasterSource::DidBeginTracing() {
+ if (display_list_.get())
+ display_list_->EmitTraceSnapshot();
+}
+
+bool DisplayListRasterSource::CanUseLCDText() const {
+ return can_use_lcd_text_;
+}
+
+} // namespace cc
diff --git a/cc/resources/display_list_raster_source.h b/cc/resources/display_list_raster_source.h
new file mode 100644
index 0000000..8f1fd12
--- /dev/null
+++ b/cc/resources/display_list_raster_source.h
@@ -0,0 +1,94 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CC_RESOURCES_DISPLAY_LIST_RASTER_SOURCE_H_
+#define CC_RESOURCES_DISPLAY_LIST_RASTER_SOURCE_H_
+
+#include <vector>
+
+#include "base/memory/scoped_ptr.h"
+#include "cc/base/cc_export.h"
+#include "cc/debug/rendering_stats_instrumentation.h"
+#include "cc/resources/display_list_recording_source.h"
+#include "cc/resources/raster_source.h"
+#include "skia/ext/analysis_canvas.h"
+#include "skia/ext/refptr.h"
+#include "third_party/skia/include/core/SkPicture.h"
+
+namespace cc {
+class DisplayItemList;
+
+class CC_EXPORT DisplayListRasterSource : public RasterSource {
+ public:
+ static scoped_refptr<DisplayListRasterSource> Create();
+ static scoped_refptr<DisplayListRasterSource>
+ CreateFromDisplayListRecordingSource(const DisplayListRecordingSource* other);
+
+ // RasterSource overrides.
+ void PlaybackToCanvas(SkCanvas* canvas,
+ const gfx::Rect& canvas_rect,
+ float contents_scale) const override;
+ void PlaybackToSharedCanvas(SkCanvas* canvas,
+ const gfx::Rect& canvas_rect,
+ float contents_scale) const override;
+ void PerformSolidColorAnalysis(
+ const gfx::Rect& content_rect,
+ float contents_scale,
+ RasterSource::SolidColorAnalysis* analysis) const override;
+ bool IsSolidColor() const override;
+ SkColor GetSolidColor() const override;
+ gfx::Size GetSize() const override;
+ void GatherPixelRefs(const gfx::Rect& content_rect,
+ float contents_scale,
+ std::vector<SkPixelRef*>* pixel_refs) const override;
+ bool CoversRect(const gfx::Rect& content_rect,
+ float contents_scale) const override;
+ bool HasRecordings() const override;
+ void SetShouldAttemptToUseDistanceFieldText() override;
+ void SetBackgoundColor(SkColor background_color) override;
+ void SetRequiresClear(bool requires_clear) override;
+ bool ShouldAttemptToUseDistanceFieldText() const override;
+ void DidBeginTracing() override;
+ void AsValueInto(base::debug::TracedValue* array) const override;
+ skia::RefPtr<SkPicture> GetFlattenedPicture() override;
+ size_t GetPictureMemoryUsage() const override;
+ bool CanUseLCDText() const override;
+
+ protected:
+ DisplayListRasterSource();
+ explicit DisplayListRasterSource(const DisplayListRecordingSource* other);
+ ~DisplayListRasterSource() override;
+
+ scoped_refptr<DisplayItemList> display_list_;
+ SkColor background_color_;
+ bool requires_clear_;
+ bool can_use_lcd_text_;
+ bool is_solid_color_;
+ SkColor solid_color_;
+ gfx::Rect recorded_viewport_;
+ gfx::Size size_;
+ bool clear_canvas_with_debug_color_;
+ int slow_down_raster_scale_factor_for_debug_;
+
+ private:
+ // Called when analyzing a tile. We can use AnalysisCanvas as
+ // SkDrawPictureCallback, which allows us to early out from analysis.
+ void RasterForAnalysis(skia::AnalysisCanvas* canvas,
+ const gfx::Rect& canvas_rect,
+ float contents_scale) const;
+
+ void RasterCommon(SkCanvas* canvas,
+ SkDrawPictureCallback* callback,
+ const gfx::Rect& canvas_rect,
+ float contents_scale,
+ bool is_analysis) const;
+
+ bool should_attempt_to_use_distance_field_text_;
+
+ DISALLOW_COPY_AND_ASSIGN(DisplayListRasterSource);
+};
+
+} // namespace cc
+
+#endif // CC_RESOURCES_DISPLAY_LIST_RASTER_SOURCE_H_
diff --git a/cc/resources/display_list_recording_source.cc b/cc/resources/display_list_recording_source.cc
new file mode 100644
index 0000000..3c0e0e4
--- /dev/null
+++ b/cc/resources/display_list_recording_source.cc
@@ -0,0 +1,158 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "cc/resources/display_list_recording_source.h"
+
+#include <algorithm>
+
+#include "cc/base/region.h"
+#include "cc/layers/content_layer_client.h"
+#include "cc/resources/display_item_list.h"
+#include "cc/resources/display_list_raster_source.h"
+#include "skia/ext/analysis_canvas.h"
+
+namespace {
+
+// Layout pixel buffer around the visible layer rect to record. Any base
+// picture that intersects the visible layer rect expanded by this distance
+// will be recorded.
+const int kPixelDistanceToRecord = 8000;
+// We don't perform solid color analysis on images that have more than 10 skia
+// operations.
+const int kOpCountThatIsOkToAnalyze = 10;
+
+} // namespace
+
+namespace cc {
+
+DisplayListRecordingSource::DisplayListRecordingSource()
+ : slow_down_raster_scale_factor_for_debug_(0),
+ can_use_lcd_text_(true),
+ is_solid_color_(false),
+ solid_color_(SK_ColorTRANSPARENT),
+ pixel_record_distance_(kPixelDistanceToRecord),
+ is_suitable_for_gpu_rasterization_(true) {
+}
+
+DisplayListRecordingSource::~DisplayListRecordingSource() {
+}
+
+bool DisplayListRecordingSource::UpdateAndExpandInvalidation(
+ ContentLayerClient* painter,
+ Region* invalidation,
+ bool can_use_lcd_text,
+ const gfx::Size& layer_size,
+ const gfx::Rect& visible_layer_rect,
+ int frame_number,
+ Picture::RecordingMode recording_mode) {
+ bool updated = false;
+
+ if (size_ != layer_size) {
+ size_ = layer_size;
+ updated = true;
+ }
+
+ if (can_use_lcd_text_ != can_use_lcd_text) {
+ can_use_lcd_text_ = can_use_lcd_text;
+ invalidation->Union(gfx::Rect(GetSize()));
+ updated = true;
+ }
+
+ gfx::Rect old_recorded_viewport = recorded_viewport_;
+ recorded_viewport_ = visible_layer_rect;
+ recorded_viewport_.Inset(-pixel_record_distance_, -pixel_record_distance_);
+ recorded_viewport_.Intersect(gfx::Rect(GetSize()));
+
+ if (recorded_viewport_ != old_recorded_viewport) {
+ // Invalidate newly-exposed and no-longer-exposed areas.
+ Region newly_exposed_region(recorded_viewport_);
+ newly_exposed_region.Subtract(old_recorded_viewport);
+ invalidation->Union(newly_exposed_region);
+
+ Region no_longer_exposed_region(old_recorded_viewport);
+ no_longer_exposed_region.Subtract(recorded_viewport_);
+ invalidation->Union(no_longer_exposed_region);
+
+ updated = true;
+ }
+
+ if (!updated && !invalidation->Intersects(recorded_viewport_))
+ return false;
+
+ // TODO(ajuma): Does repeating this way really makes sense with display lists?
+ // With Blink caching recordings, repeated calls will not cause re-recording.
+ int repeat_count = std::max(1, slow_down_raster_scale_factor_for_debug_);
+ for (int i = 0; i < repeat_count; ++i) {
+ display_list_ = painter->PaintContentsToDisplayList(
+ recorded_viewport_, ContentLayerClient::GRAPHICS_CONTEXT_ENABLED);
+ }
+ is_suitable_for_gpu_rasterization_ =
+ display_list_->IsSuitableForGpuRasterization();
+
+ DetermineIfSolidColor();
+ display_list_->EmitTraceSnapshot();
+ return true;
+}
+
+gfx::Size DisplayListRecordingSource::GetSize() const {
+ return size_;
+}
+
+void DisplayListRecordingSource::SetEmptyBounds() {
+ size_ = gfx::Size();
+ Clear();
+}
+
+void DisplayListRecordingSource::SetMinContentsScale(float min_contents_scale) {
+}
+
+void DisplayListRecordingSource::SetTileGridSize(
+ const gfx::Size& tile_grid_size) {
+}
+
+void DisplayListRecordingSource::SetSlowdownRasterScaleFactor(int factor) {
+ slow_down_raster_scale_factor_for_debug_ = factor;
+}
+
+void DisplayListRecordingSource::SetUnsuitableForGpuRasterizationForTesting() {
+ is_suitable_for_gpu_rasterization_ = false;
+}
+
+bool DisplayListRecordingSource::IsSuitableForGpuRasterization() const {
+ return is_suitable_for_gpu_rasterization_;
+}
+
+scoped_refptr<RasterSource> DisplayListRecordingSource::CreateRasterSource()
+ const {
+ return scoped_refptr<RasterSource>(
+ DisplayListRasterSource::CreateFromDisplayListRecordingSource(this));
+}
+
+SkTileGridFactory::TileGridInfo
+DisplayListRecordingSource::GetTileGridInfoForTesting() const {
+ return SkTileGridFactory::TileGridInfo();
+}
+
+void DisplayListRecordingSource::DetermineIfSolidColor() {
+ DCHECK(display_list_.get());
+ is_solid_color_ = false;
+ solid_color_ = SK_ColorTRANSPARENT;
+
+ if (display_list_->ApproximateOpCount() > kOpCountThatIsOkToAnalyze)
+ return;
+
+ skia::AnalysisCanvas canvas(recorded_viewport_.width(),
+ recorded_viewport_.height());
+ canvas.translate(-recorded_viewport_.x(), -recorded_viewport_.y());
+ display_list_->Raster(&canvas, nullptr, 1.f);
+ is_solid_color_ = canvas.GetColorIfSolid(&solid_color_);
+}
+
+void DisplayListRecordingSource::Clear() {
+ recorded_viewport_ = gfx::Rect();
+ display_list_ = NULL;
+ is_solid_color_ = false;
+}
+
+} // namespace cc
diff --git a/cc/resources/display_list_recording_source.h b/cc/resources/display_list_recording_source.h
new file mode 100644
index 0000000..6bc8208
--- /dev/null
+++ b/cc/resources/display_list_recording_source.h
@@ -0,0 +1,64 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CC_RESOURCES_DISPLAY_LIST_RECORDING_SOURCE_H_
+#define CC_RESOURCES_DISPLAY_LIST_RECORDING_SOURCE_H_
+
+#include "base/memory/scoped_ptr.h"
+#include "cc/resources/recording_source.h"
+
+namespace cc {
+class DisplayItemList;
+class DisplayListRasterSource;
+
+class CC_EXPORT DisplayListRecordingSource : public RecordingSource {
+ public:
+ DisplayListRecordingSource();
+ ~DisplayListRecordingSource() override;
+
+ // RecordingSource overrides.
+ bool UpdateAndExpandInvalidation(
+ ContentLayerClient* painter,
+ Region* invalidation,
+ bool can_use_lcd_text,
+ const gfx::Size& layer_size,
+ const gfx::Rect& visible_layer_rect,
+ int frame_number,
+ Picture::RecordingMode recording_mode) override;
+ scoped_refptr<RasterSource> CreateRasterSource() const override;
+ gfx::Size GetSize() const final;
+ void SetEmptyBounds() override;
+ void SetMinContentsScale(float min_contents_scale) override;
+ void SetSlowdownRasterScaleFactor(int factor) override;
+ bool IsSuitableForGpuRasterization() const override;
+ void SetTileGridSize(const gfx::Size& tile_grid_size) override;
+ void SetUnsuitableForGpuRasterizationForTesting() override;
+ SkTileGridFactory::TileGridInfo GetTileGridInfoForTesting() const override;
+
+ protected:
+ void Clear();
+
+ gfx::Rect recorded_viewport_;
+ gfx::Size size_;
+ int slow_down_raster_scale_factor_for_debug_;
+ bool can_use_lcd_text_;
+ bool is_solid_color_;
+ SkColor solid_color_;
+ int pixel_record_distance_;
+
+ scoped_refptr<DisplayItemList> display_list_;
+
+ private:
+ friend class DisplayListRasterSource;
+
+ void DetermineIfSolidColor();
+
+ bool is_suitable_for_gpu_rasterization_;
+
+ DISALLOW_COPY_AND_ASSIGN(DisplayListRecordingSource);
+};
+
+} // namespace cc
+
+#endif // CC_RESOURCES_DISPLAY_LIST_RECORDING_SOURCE_H_
diff --git a/cc/resources/drawing_display_item.cc b/cc/resources/drawing_display_item.cc
new file mode 100644
index 0000000..9466d5c
--- /dev/null
+++ b/cc/resources/drawing_display_item.cc
@@ -0,0 +1,47 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "cc/resources/drawing_display_item.h"
+
+#include "base/logging.h"
+#include "third_party/skia/include/core/SkCanvas.h"
+#include "third_party/skia/include/core/SkMatrix.h"
+#include "third_party/skia/include/core/SkPicture.h"
+#include "third_party/skia/include/utils/SkPictureUtils.h"
+
+namespace cc {
+
+DrawingDisplayItem::DrawingDisplayItem(skia::RefPtr<SkPicture> picture,
+ gfx::PointF location)
+ : picture_(picture), location_(location) {
+}
+
+DrawingDisplayItem::~DrawingDisplayItem() {
+}
+
+void DrawingDisplayItem::Raster(SkCanvas* canvas,
+ SkDrawPictureCallback* callback) const {
+ canvas->save();
+ canvas->translate(location_.x(), location_.y());
+ if (callback)
+ picture_->draw(canvas, callback);
+ else
+ canvas->drawPicture(picture_.get());
+ canvas->restore();
+}
+
+bool DrawingDisplayItem::IsSuitableForGpuRasterization() const {
+ return picture_->suitableForGpuRasterization(NULL);
+}
+
+int DrawingDisplayItem::ApproximateOpCount() const {
+ return picture_->approximateOpCount() + sizeof(gfx::PointF);
+}
+
+size_t DrawingDisplayItem::PictureMemoryUsage() const {
+ DCHECK(picture_);
+ return SkPictureUtils::ApproximateBytesUsed(picture_.get());
+}
+
+} // namespace cc
diff --git a/cc/resources/drawing_display_item.h b/cc/resources/drawing_display_item.h
new file mode 100644
index 0000000..544e4eb
--- /dev/null
+++ b/cc/resources/drawing_display_item.h
@@ -0,0 +1,45 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CC_RESOURCES_DRAWING_DISPLAY_ITEM_H_
+#define CC_RESOURCES_DRAWING_DISPLAY_ITEM_H_
+
+#include "base/memory/scoped_ptr.h"
+#include "cc/base/cc_export.h"
+#include "cc/resources/display_item.h"
+#include "skia/ext/refptr.h"
+#include "ui/gfx/geometry/point_f.h"
+
+class SkCanvas;
+class SkDrawPictureCallback;
+class SkPicture;
+
+namespace cc {
+
+class CC_EXPORT DrawingDisplayItem : public DisplayItem {
+ public:
+ virtual ~DrawingDisplayItem();
+
+ static scoped_ptr<DrawingDisplayItem> Create(skia::RefPtr<SkPicture> picture,
+ gfx::PointF location) {
+ return make_scoped_ptr(new DrawingDisplayItem(picture, location));
+ }
+
+ void Raster(SkCanvas* canvas, SkDrawPictureCallback* callback) const override;
+
+ bool IsSuitableForGpuRasterization() const override;
+ int ApproximateOpCount() const override;
+ size_t PictureMemoryUsage() const override;
+
+ protected:
+ DrawingDisplayItem(skia::RefPtr<SkPicture> picture, gfx::PointF location);
+
+ private:
+ skia::RefPtr<SkPicture> picture_;
+ gfx::PointF location_;
+};
+
+} // namespace cc
+
+#endif // CC_RESOURCES_DRAWING_DISPLAY_ITEM_H_
diff --git a/cc/resources/eviction_tile_priority_queue.cc b/cc/resources/eviction_tile_priority_queue.cc
index 9f05e81..4d66987 100644
--- a/cc/resources/eviction_tile_priority_queue.cc
+++ b/cc/resources/eviction_tile_priority_queue.cc
@@ -14,8 +14,8 @@
: tree_priority_(tree_priority) {}
bool operator()(
- const EvictionTilePriorityQueue::PairedPictureLayerQueue* a,
- const EvictionTilePriorityQueue::PairedPictureLayerQueue* b) const {
+ const EvictionTilePriorityQueue::PairedTilingSetQueue* a,
+ const EvictionTilePriorityQueue::PairedTilingSetQueue* b) const {
// Note that in this function, we have to return true if and only if
// b is strictly lower priority than a. Note that for the sake of
// completeness, empty queue is considered to have lowest priority.
@@ -23,15 +23,15 @@
return b->IsEmpty() < a->IsEmpty();
WhichTree a_tree = a->NextTileIteratorTree(tree_priority_);
- const PictureLayerImpl::LayerEvictionTileIterator* a_iterator =
- a_tree == ACTIVE_TREE ? &a->active_iterator : &a->pending_iterator;
+ const TilingSetEvictionQueue* a_queue =
+ a_tree == ACTIVE_TREE ? a->active_queue.get() : a->pending_queue.get();
WhichTree b_tree = b->NextTileIteratorTree(tree_priority_);
- const PictureLayerImpl::LayerEvictionTileIterator* b_iterator =
- b_tree == ACTIVE_TREE ? &b->active_iterator : &b->pending_iterator;
+ const TilingSetEvictionQueue* b_queue =
+ b_tree == ACTIVE_TREE ? b->active_queue.get() : b->pending_queue.get();
- const Tile* a_tile = **a_iterator;
- const Tile* b_tile = **b_iterator;
+ const Tile* a_tile = a_queue->Top();
+ const Tile* b_tile = b_queue->Top();
const TilePriority& a_priority =
a_tile->priority_for_tree_priority(tree_priority_);
@@ -94,7 +94,7 @@
it != paired_layers.end();
++it) {
paired_queues_.push_back(
- make_scoped_ptr(new PairedPictureLayerQueue(*it, tree_priority_)));
+ make_scoped_ptr(new PairedTilingSetQueue(*it, tree_priority_)));
}
paired_queues_.make_heap(EvictionOrderComparator(tree_priority_));
@@ -117,94 +117,89 @@
DCHECK(!IsEmpty());
paired_queues_.pop_heap(EvictionOrderComparator(tree_priority_));
- PairedPictureLayerQueue* paired_queue = paired_queues_.back();
+ PairedTilingSetQueue* paired_queue = paired_queues_.back();
paired_queue->Pop(tree_priority_);
paired_queues_.push_heap(EvictionOrderComparator(tree_priority_));
}
-EvictionTilePriorityQueue::PairedPictureLayerQueue::PairedPictureLayerQueue() {
+EvictionTilePriorityQueue::PairedTilingSetQueue::PairedTilingSetQueue() {
}
-EvictionTilePriorityQueue::PairedPictureLayerQueue::PairedPictureLayerQueue(
+EvictionTilePriorityQueue::PairedTilingSetQueue::PairedTilingSetQueue(
const PictureLayerImpl::Pair& layer_pair,
- TreePriority tree_priority)
- : active_iterator(
- layer_pair.active
- ? PictureLayerImpl::LayerEvictionTileIterator(layer_pair.active,
- tree_priority)
- : PictureLayerImpl::LayerEvictionTileIterator()),
- pending_iterator(
- layer_pair.pending
- ? PictureLayerImpl::LayerEvictionTileIterator(layer_pair.pending,
- tree_priority)
- : PictureLayerImpl::LayerEvictionTileIterator()) {
+ TreePriority tree_priority) {
+ if (layer_pair.active)
+ active_queue = layer_pair.active->CreateEvictionQueue(tree_priority);
+ if (layer_pair.pending)
+ pending_queue = layer_pair.pending->CreateEvictionQueue(tree_priority);
}
-EvictionTilePriorityQueue::PairedPictureLayerQueue::~PairedPictureLayerQueue() {
+EvictionTilePriorityQueue::PairedTilingSetQueue::~PairedTilingSetQueue() {
}
-bool EvictionTilePriorityQueue::PairedPictureLayerQueue::IsEmpty() const {
- return !active_iterator && !pending_iterator;
+bool EvictionTilePriorityQueue::PairedTilingSetQueue::IsEmpty() const {
+ return (!active_queue || active_queue->IsEmpty()) &&
+ (!pending_queue || pending_queue->IsEmpty());
}
-Tile* EvictionTilePriorityQueue::PairedPictureLayerQueue::Top(
+Tile* EvictionTilePriorityQueue::PairedTilingSetQueue::Top(
TreePriority tree_priority) {
DCHECK(!IsEmpty());
WhichTree next_tree = NextTileIteratorTree(tree_priority);
- PictureLayerImpl::LayerEvictionTileIterator* next_iterator =
- next_tree == ACTIVE_TREE ? &active_iterator : &pending_iterator;
- DCHECK(*next_iterator);
+ TilingSetEvictionQueue* next_queue =
+ next_tree == ACTIVE_TREE ? active_queue.get() : pending_queue.get();
+ DCHECK(next_queue && !next_queue->IsEmpty());
- Tile* tile = **next_iterator;
+ Tile* tile = next_queue->Top();
DCHECK(std::find(returned_shared_tiles.begin(),
returned_shared_tiles.end(),
tile) == returned_shared_tiles.end());
return tile;
}
-void EvictionTilePriorityQueue::PairedPictureLayerQueue::Pop(
+void EvictionTilePriorityQueue::PairedTilingSetQueue::Pop(
TreePriority tree_priority) {
DCHECK(!IsEmpty());
WhichTree next_tree = NextTileIteratorTree(tree_priority);
- PictureLayerImpl::LayerEvictionTileIterator* next_iterator =
- next_tree == ACTIVE_TREE ? &active_iterator : &pending_iterator;
- DCHECK(*next_iterator);
- returned_shared_tiles.push_back(**next_iterator);
- ++(*next_iterator);
+ TilingSetEvictionQueue* next_queue =
+ next_tree == ACTIVE_TREE ? active_queue.get() : pending_queue.get();
+ DCHECK(next_queue && !next_queue->IsEmpty());
+ returned_shared_tiles.push_back(next_queue->Top());
+ next_queue->Pop();
if (IsEmpty())
return;
next_tree = NextTileIteratorTree(tree_priority);
- next_iterator =
- next_tree == ACTIVE_TREE ? &active_iterator : &pending_iterator;
+ next_queue =
+ next_tree == ACTIVE_TREE ? active_queue.get() : pending_queue.get();
while (std::find(returned_shared_tiles.begin(),
returned_shared_tiles.end(),
- **next_iterator) != returned_shared_tiles.end()) {
- ++(*next_iterator);
+ next_queue->Top()) != returned_shared_tiles.end()) {
+ next_queue->Pop();
if (IsEmpty())
break;
next_tree = NextTileIteratorTree(tree_priority);
- next_iterator =
- next_tree == ACTIVE_TREE ? &active_iterator : &pending_iterator;
+ next_queue =
+ next_tree == ACTIVE_TREE ? active_queue.get() : pending_queue.get();
}
}
WhichTree
-EvictionTilePriorityQueue::PairedPictureLayerQueue::NextTileIteratorTree(
+EvictionTilePriorityQueue::PairedTilingSetQueue::NextTileIteratorTree(
TreePriority tree_priority) const {
DCHECK(!IsEmpty());
// If we only have one iterator with tiles, return it.
- if (!active_iterator)
+ if (!active_queue || active_queue->IsEmpty())
return PENDING_TREE;
- if (!pending_iterator)
+ if (!pending_queue || pending_queue->IsEmpty())
return ACTIVE_TREE;
- const Tile* active_tile = *active_iterator;
- const Tile* pending_tile = *pending_iterator;
+ const Tile* active_tile = active_queue->Top();
+ const Tile* pending_tile = pending_queue->Top();
if (active_tile == pending_tile)
return ACTIVE_TREE;
diff --git a/cc/resources/eviction_tile_priority_queue.h b/cc/resources/eviction_tile_priority_queue.h
index e91f0d2..6f5d964 100644
--- a/cc/resources/eviction_tile_priority_queue.h
+++ b/cc/resources/eviction_tile_priority_queue.h
@@ -11,16 +11,17 @@
#include "cc/base/cc_export.h"
#include "cc/layers/picture_layer_impl.h"
#include "cc/resources/tile_priority.h"
+#include "cc/resources/tiling_set_eviction_queue.h"
namespace cc {
class CC_EXPORT EvictionTilePriorityQueue {
public:
- struct PairedPictureLayerQueue {
- PairedPictureLayerQueue();
- PairedPictureLayerQueue(const PictureLayerImpl::Pair& layer_pair,
- TreePriority tree_priority);
- ~PairedPictureLayerQueue();
+ struct PairedTilingSetQueue {
+ PairedTilingSetQueue();
+ PairedTilingSetQueue(const PictureLayerImpl::Pair& layer_pair,
+ TreePriority tree_priority);
+ ~PairedTilingSetQueue();
bool IsEmpty() const;
Tile* Top(TreePriority tree_priority);
@@ -28,8 +29,8 @@
WhichTree NextTileIteratorTree(TreePriority tree_priority) const;
- PictureLayerImpl::LayerEvictionTileIterator active_iterator;
- PictureLayerImpl::LayerEvictionTileIterator pending_iterator;
+ scoped_ptr<TilingSetEvictionQueue> active_queue;
+ scoped_ptr<TilingSetEvictionQueue> pending_queue;
// TODO(vmpstr): Investigate removing this.
std::vector<Tile*> returned_shared_tiles;
@@ -48,9 +49,9 @@
private:
// TODO(vmpstr): This is potentially unnecessary if it becomes the case that
- // PairedPictureLayerQueue is fast enough to copy. In that case, we can use
- // objects directly (ie std::vector<PairedPictureLayerQueue>).
- ScopedPtrVector<PairedPictureLayerQueue> paired_queues_;
+ // PairedTilingSetQueue is fast enough to copy. In that case, we can use
+ // objects directly (ie std::vector<PairedTilingSetQueue>).
+ ScopedPtrVector<PairedTilingSetQueue> paired_queues_;
TreePriority tree_priority_;
DISALLOW_COPY_AND_ASSIGN(EvictionTilePriorityQueue);
diff --git a/cc/resources/filter_display_item.cc b/cc/resources/filter_display_item.cc
new file mode 100644
index 0000000..63bfeee
--- /dev/null
+++ b/cc/resources/filter_display_item.cc
@@ -0,0 +1,75 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "cc/resources/filter_display_item.h"
+
+#include "third_party/skia/include/core/SkCanvas.h"
+#include "third_party/skia/include/core/SkImageFilter.h"
+#include "third_party/skia/include/core/SkPaint.h"
+#include "third_party/skia/include/core/SkXfermode.h"
+#include "ui/gfx/skia_util.h"
+
+namespace cc {
+
+FilterDisplayItem::FilterDisplayItem(skia::RefPtr<SkImageFilter> filter,
+ gfx::RectF bounds)
+ : filter_(filter), bounds_(bounds) {
+}
+
+FilterDisplayItem::~FilterDisplayItem() {
+}
+
+void FilterDisplayItem::Raster(SkCanvas* canvas,
+ SkDrawPictureCallback* callback) const {
+ canvas->save();
+ SkRect boundaries;
+ filter_->computeFastBounds(gfx::RectFToSkRect(bounds_), &boundaries);
+ canvas->translate(bounds_.x(), bounds_.y());
+ boundaries.offset(-bounds_.x(), -bounds_.y());
+
+ SkPaint paint;
+ paint.setXfermodeMode(SkXfermode::kSrcOver_Mode);
+ paint.setImageFilter(filter_.get());
+ canvas->saveLayer(&boundaries, &paint);
+
+ canvas->translate(-bounds_.x(), -bounds_.y());
+}
+
+bool FilterDisplayItem::IsSuitableForGpuRasterization() const {
+ return true;
+}
+
+int FilterDisplayItem::ApproximateOpCount() const {
+ return 1;
+}
+
+size_t FilterDisplayItem::PictureMemoryUsage() const {
+ return sizeof(skia::RefPtr<SkImageFilter>) + sizeof(gfx::RectF);
+}
+
+EndFilterDisplayItem::EndFilterDisplayItem() {
+}
+
+EndFilterDisplayItem::~EndFilterDisplayItem() {
+}
+
+void EndFilterDisplayItem::Raster(SkCanvas* canvas,
+ SkDrawPictureCallback* callback) const {
+ canvas->restore();
+ canvas->restore();
+}
+
+bool EndFilterDisplayItem::IsSuitableForGpuRasterization() const {
+ return true;
+}
+
+int EndFilterDisplayItem::ApproximateOpCount() const {
+ return 0;
+}
+
+size_t EndFilterDisplayItem::PictureMemoryUsage() const {
+ return 0;
+}
+
+} // namespace cc
diff --git a/cc/resources/filter_display_item.h b/cc/resources/filter_display_item.h
new file mode 100644
index 0000000..4c1b265
--- /dev/null
+++ b/cc/resources/filter_display_item.h
@@ -0,0 +1,64 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CC_RESOURCES_FILTER_DISPLAY_ITEM_H_
+#define CC_RESOURCES_FILTER_DISPLAY_ITEM_H_
+
+#include "base/memory/scoped_ptr.h"
+#include "cc/base/cc_export.h"
+#include "cc/resources/display_item.h"
+#include "skia/ext/refptr.h"
+#include "ui/gfx/geometry/rect_f.h"
+
+class SkCanvas;
+class SkDrawPictureCallback;
+class SkImageFilter;
+
+namespace cc {
+
+class CC_EXPORT FilterDisplayItem : public DisplayItem {
+ public:
+ virtual ~FilterDisplayItem();
+
+ static scoped_ptr<FilterDisplayItem> Create(
+ skia::RefPtr<SkImageFilter> filter,
+ gfx::RectF bounds) {
+ return make_scoped_ptr(new FilterDisplayItem(filter, bounds));
+ }
+
+ void Raster(SkCanvas* canvas, SkDrawPictureCallback* callback) const override;
+
+ bool IsSuitableForGpuRasterization() const override;
+ int ApproximateOpCount() const override;
+ size_t PictureMemoryUsage() const override;
+
+ protected:
+ FilterDisplayItem(skia::RefPtr<SkImageFilter> filter, gfx::RectF bounds);
+
+ private:
+ skia::RefPtr<SkImageFilter> filter_;
+ gfx::RectF bounds_;
+};
+
+class CC_EXPORT EndFilterDisplayItem : public DisplayItem {
+ public:
+ virtual ~EndFilterDisplayItem();
+
+ static scoped_ptr<EndFilterDisplayItem> Create() {
+ return make_scoped_ptr(new EndFilterDisplayItem());
+ }
+
+ void Raster(SkCanvas* canvas, SkDrawPictureCallback* callback) const override;
+
+ bool IsSuitableForGpuRasterization() const override;
+ int ApproximateOpCount() const override;
+ size_t PictureMemoryUsage() const override;
+
+ protected:
+ EndFilterDisplayItem();
+};
+
+} // namespace cc
+
+#endif // CC_RESOURCES_FILTER_DISPLAY_ITEM_H_
diff --git a/cc/resources/managed_tile_state.cc b/cc/resources/managed_tile_state.cc
index 2841711..a60c28af 100644
--- a/cc/resources/managed_tile_state.cc
+++ b/cc/resources/managed_tile_state.cc
@@ -12,38 +12,9 @@
namespace cc {
-std::string ManagedTileBinToString(ManagedTileBin bin) {
- switch (bin) {
- case NOW_AND_READY_TO_DRAW_BIN:
- return "NOW_AND_READY_TO_DRAW_BIN";
- case NOW_BIN:
- return "NOW_BIN";
- case SOON_BIN:
- return "SOON_BIN";
- case EVENTUALLY_AND_ACTIVE_BIN:
- return "EVENTUALLY_AND_ACTIVE_BIN";
- case EVENTUALLY_BIN:
- return "EVENTUALLY_BIN";
- case AT_LAST_AND_ACTIVE_BIN:
- return "AT_LAST_AND_ACTIVE_BIN";
- case AT_LAST_BIN:
- return "AT_LAST_BIN";
- case NEVER_BIN:
- return "NEVER_BIN";
- case NUM_BINS:
- NOTREACHED();
- return "Invalid Bin (NUM_BINS)";
- }
- return "Invalid Bin (UNKNOWN)";
-}
-
ManagedTileState::ManagedTileState()
- : bin(NEVER_BIN),
- resolution(NON_IDEAL_RESOLUTION),
- required_for_activation(false),
+ : resolution(NON_IDEAL_RESOLUTION),
priority_bin(TilePriority::EVENTUALLY),
- distance_to_visible(std::numeric_limits<float>::infinity()),
- visible_and_ready_to_draw(false),
scheduled_priority(0) {
}
@@ -77,12 +48,8 @@
state->SetBoolean("has_resource", has_resource);
state->SetBoolean("is_using_gpu_memory", is_using_gpu_memory);
- state->SetString("bin", ManagedTileBinToString(bin));
state->SetString("resolution", TileResolutionToString(resolution));
state->SetString("priority_bin", TilePriorityBinToString(priority_bin));
- state->SetDouble("distance_to_visible",
- MathUtil::AsFloatSafely(distance_to_visible));
- state->SetBoolean("required_for_activation", required_for_activation);
state->SetBoolean("is_solid_color",
draw_info.mode_ == DrawInfo::SOLID_COLOR_MODE);
state->SetBoolean("is_transparent",
diff --git a/cc/resources/managed_tile_state.h b/cc/resources/managed_tile_state.h
index 58b77c6..a0905c7 100644
--- a/cc/resources/managed_tile_state.h
+++ b/cc/resources/managed_tile_state.h
@@ -15,24 +15,6 @@
namespace cc {
-class TileManager;
-
-// Tile manager classifying tiles into a few basic bins:
-enum ManagedTileBin {
- NOW_AND_READY_TO_DRAW_BIN = 0, // Ready to draw and within viewport.
- NOW_BIN = 1, // Needed ASAP.
- SOON_BIN = 2, // Impl-side version of prepainting.
- EVENTUALLY_AND_ACTIVE_BIN = 3, // Nice to have, and has a task or resource.
- EVENTUALLY_BIN = 4, // Nice to have, if we've got memory and time.
- AT_LAST_AND_ACTIVE_BIN = 5, // Only do this after all other bins.
- AT_LAST_BIN = 6, // Only do this after all other bins.
- NEVER_BIN = 7, // Dont bother.
- NUM_BINS = 8
- // NOTE: Be sure to update ManagedTileBinAsValue and kBinPolicyMap when adding
- // or reordering fields.
-};
-scoped_ptr<base::Value> ManagedTileBinAsValue(ManagedTileBin bin);
-
// This is state that is specific to a tile that is
// managed by the TileManager.
class CC_EXPORT ManagedTileState {
@@ -107,13 +89,8 @@
DrawInfo draw_info;
scoped_refptr<RasterTask> raster_task;
- ManagedTileBin bin;
-
TileResolution resolution;
- bool required_for_activation;
TilePriority::PriorityBin priority_bin;
- float distance_to_visible;
- bool visible_and_ready_to_draw;
// Priority for this state from the last time we assigned memory.
unsigned scheduled_priority;
diff --git a/cc/resources/picture.cc b/cc/resources/picture.cc
index 9a45ad1..5b90571 100644
--- a/cc/resources/picture.cc
+++ b/cc/resources/picture.cc
@@ -25,6 +25,7 @@
#include "third_party/skia/include/core/SkPictureRecorder.h"
#include "third_party/skia/include/core/SkStream.h"
#include "third_party/skia/include/utils/SkNullCanvas.h"
+#include "third_party/skia/include/utils/SkPictureUtils.h"
#include "ui/gfx/codec/jpeg_codec.h"
#include "ui/gfx/codec/png_codec.h"
#include "ui/gfx/geometry/rect_conversions.h"
@@ -192,6 +193,11 @@
return picture_->approximateOpCount();
}
+size_t Picture::ApproximateMemoryUsage() const {
+ DCHECK(picture_);
+ return SkPictureUtils::ApproximateBytesUsed(picture_.get());
+}
+
bool Picture::HasText() const {
DCHECK(picture_);
return picture_->hasText();
diff --git a/cc/resources/picture.h b/cc/resources/picture.h
index 1677309..771d715 100644
--- a/cc/resources/picture.h
+++ b/cc/resources/picture.h
@@ -67,6 +67,7 @@
bool IsSuitableForGpuRasterization() const;
int ApproximateOpCount() const;
+ size_t ApproximateMemoryUsage() const;
bool HasText() const;
diff --git a/cc/resources/picture_layer_tiling.cc b/cc/resources/picture_layer_tiling.cc
index 9d8ea84..e9e3b86 100644
--- a/cc/resources/picture_layer_tiling.cc
+++ b/cc/resources/picture_layer_tiling.cc
@@ -1216,50 +1216,4 @@
return *this;
}
-PictureLayerTiling::TilingEvictionTileIterator::TilingEvictionTileIterator()
- : eviction_tiles_(NULL), current_eviction_tiles_index_(0u) {
-}
-
-PictureLayerTiling::TilingEvictionTileIterator::TilingEvictionTileIterator(
- PictureLayerTiling* tiling,
- TreePriority tree_priority,
- EvictionCategory category)
- : eviction_tiles_(tiling->GetEvictionTiles(tree_priority, category)),
- // Note: initializing to "0 - 1" works as overflow is well defined for
- // unsigned integers.
- current_eviction_tiles_index_(static_cast<size_t>(0) - 1) {
- DCHECK(eviction_tiles_);
- ++(*this);
-}
-
-PictureLayerTiling::TilingEvictionTileIterator::~TilingEvictionTileIterator() {
-}
-
-PictureLayerTiling::TilingEvictionTileIterator::operator bool() const {
- return eviction_tiles_ &&
- current_eviction_tiles_index_ != eviction_tiles_->size();
-}
-
-Tile* PictureLayerTiling::TilingEvictionTileIterator::operator*() {
- DCHECK(*this);
- return (*eviction_tiles_)[current_eviction_tiles_index_];
-}
-
-const Tile* PictureLayerTiling::TilingEvictionTileIterator::operator*() const {
- DCHECK(*this);
- return (*eviction_tiles_)[current_eviction_tiles_index_];
-}
-
-PictureLayerTiling::TilingEvictionTileIterator&
-PictureLayerTiling::TilingEvictionTileIterator::
-operator++() {
- DCHECK(*this);
- do {
- ++current_eviction_tiles_index_;
- } while (current_eviction_tiles_index_ != eviction_tiles_->size() &&
- !(*eviction_tiles_)[current_eviction_tiles_index_]->HasResources());
-
- return *this;
-}
-
} // namespace cc
diff --git a/cc/resources/picture_layer_tiling.h b/cc/resources/picture_layer_tiling.h
index e1ccde4..daa0485 100644
--- a/cc/resources/picture_layer_tiling.h
+++ b/cc/resources/picture_layer_tiling.h
@@ -118,24 +118,6 @@
TilingData::SpiralDifferenceIterator spiral_iterator_;
};
- class CC_EXPORT TilingEvictionTileIterator {
- public:
- TilingEvictionTileIterator();
- TilingEvictionTileIterator(PictureLayerTiling* tiling,
- TreePriority tree_priority,
- EvictionCategory category);
- ~TilingEvictionTileIterator();
-
- operator bool() const;
- const Tile* operator*() const;
- Tile* operator*();
- TilingEvictionTileIterator& operator++();
-
- private:
- const std::vector<Tile*>* eviction_tiles_;
- size_t current_eviction_tiles_index_;
- };
-
~PictureLayerTiling();
// Create a tiling with no tiles. CreateTiles must be called to add some.
@@ -299,7 +281,7 @@
protected:
friend class CoverageIterator;
friend class TilingRasterTileIterator;
- friend class TilingEvictionTileIterator;
+ friend class TilingSetEvictionQueue;
typedef std::pair<int, int> TileMapKey;
typedef base::hash_map<TileMapKey, scoped_refptr<Tile>> TileMap;
diff --git a/cc/resources/picture_layer_tiling_perftest.cc b/cc/resources/picture_layer_tiling_perftest.cc
index 55d495b..3944e46 100644
--- a/cc/resources/picture_layer_tiling_perftest.cc
+++ b/cc/resources/picture_layer_tiling_perftest.cc
@@ -178,98 +178,6 @@
true);
}
- void RunEvictionIteratorConstructTest(const std::string& test_name,
- const gfx::Rect& viewport) {
- gfx::Size bounds(viewport.size());
- picture_layer_tiling_ =
- PictureLayerTiling::Create(1, bounds, &picture_layer_tiling_client_);
- picture_layer_tiling_client_.set_tree(ACTIVE_TREE);
- picture_layer_tiling_->ComputeTilePriorityRects(viewport, 1.0f, 1.0,
- Occlusion());
-
- timer_.Reset();
- TreePriority priorities[] = {SAME_PRIORITY_FOR_BOTH_TREES,
- SMOOTHNESS_TAKES_PRIORITY,
- NEW_CONTENT_TAKES_PRIORITY};
- int priority_count = 0;
- do {
- PictureLayerTiling::TilingEvictionTileIterator it(
- picture_layer_tiling_.get(),
- priorities[priority_count],
- PictureLayerTiling::NOW);
- priority_count = (priority_count + 1) % arraysize(priorities);
- timer_.NextLap();
- } while (!timer_.HasTimeLimitExpired());
-
- perf_test::PrintResult("tiling_eviction_tile_iterator_construct",
- "",
- test_name,
- timer_.LapsPerSecond(),
- "runs/s",
- true);
- }
-
- void RunEvictionIteratorConstructAndIterateTest(const std::string& test_name,
- int num_tiles,
- const gfx::Rect& viewport) {
- gfx::Size bounds(10000, 10000);
- picture_layer_tiling_ =
- PictureLayerTiling::Create(1, bounds, &picture_layer_tiling_client_);
- picture_layer_tiling_client_.set_tree(ACTIVE_TREE);
- picture_layer_tiling_->ComputeTilePriorityRects(viewport, 1.0f, 1.0,
- Occlusion());
-
- TreePriority priorities[] = {SAME_PRIORITY_FOR_BOTH_TREES,
- SMOOTHNESS_TAKES_PRIORITY,
- NEW_CONTENT_TAKES_PRIORITY};
-
- // Ensure all tiles have resources.
- std::vector<Tile*> all_tiles = picture_layer_tiling_->AllTilesForTesting();
- for (std::vector<Tile*>::iterator tile_it = all_tiles.begin();
- tile_it != all_tiles.end();
- ++tile_it) {
- Tile* tile = *tile_it;
- ManagedTileState::DrawInfo& draw_info = tile->draw_info();
- draw_info.SetResourceForTesting(
- ScopedResource::Create(resource_provider_.get()).Pass());
- }
-
- int priority_count = 0;
- timer_.Reset();
- do {
- int count = num_tiles;
- PictureLayerTiling::TilingEvictionTileIterator it(
- picture_layer_tiling_.get(),
- priorities[priority_count],
- PictureLayerTiling::EVENTUALLY);
- while (count--) {
- ASSERT_TRUE(it) << "count: " << count;
- ASSERT_TRUE(*it != NULL) << "count: " << count;
- ++it;
- }
- priority_count = (priority_count + 1) % arraysize(priorities);
- timer_.NextLap();
- } while (!timer_.HasTimeLimitExpired());
-
- // Remove all resources from tiles to make sure the tile version destructor
- // doesn't complain.
- for (std::vector<Tile*>::iterator tile_it = all_tiles.begin();
- tile_it != all_tiles.end();
- ++tile_it) {
- Tile* tile = *tile_it;
- ManagedTileState::DrawInfo& draw_info = tile->draw_info();
- draw_info.SetResourceForTesting(nullptr);
- }
-
- perf_test::PrintResult(
- "tiling_eviction_tile_iterator_construct_and_iterate",
- "",
- test_name,
- timer_.LapsPerSecond(),
- "runs/s",
- true);
- }
-
private:
FakePictureLayerTilingClient picture_layer_tiling_client_;
scoped_ptr<PictureLayerTiling> picture_layer_tiling_;
@@ -333,27 +241,6 @@
"64_500x500", 64, gfx::Rect(0, 0, 500, 500));
}
-TEST_F(PictureLayerTilingPerfTest, TilingEvictionTileIteratorConstruct) {
- RunEvictionIteratorConstructTest("0_0_100x100", gfx::Rect(0, 0, 100, 100));
- RunEvictionIteratorConstructTest("50_0_100x100", gfx::Rect(50, 0, 100, 100));
- RunEvictionIteratorConstructTest("100_0_100x100",
- gfx::Rect(100, 0, 100, 100));
- RunEvictionIteratorConstructTest("150_0_100x100",
- gfx::Rect(150, 0, 100, 100));
-}
-
-TEST_F(PictureLayerTilingPerfTest,
- TilingEvictionTileIteratorConstructAndIterate) {
- RunEvictionIteratorConstructAndIterateTest(
- "32_100x100", 32, gfx::Rect(0, 0, 100, 100));
- RunEvictionIteratorConstructAndIterateTest(
- "32_500x500", 32, gfx::Rect(0, 0, 500, 500));
- RunEvictionIteratorConstructAndIterateTest(
- "64_100x100", 64, gfx::Rect(0, 0, 100, 100));
- RunEvictionIteratorConstructAndIterateTest(
- "64_500x500", 64, gfx::Rect(0, 0, 500, 500));
-}
-
} // namespace
} // namespace cc
diff --git a/cc/resources/picture_layer_tiling_unittest.cc b/cc/resources/picture_layer_tiling_unittest.cc
index b982dc1..9190b98 100644
--- a/cc/resources/picture_layer_tiling_unittest.cc
+++ b/cc/resources/picture_layer_tiling_unittest.cc
@@ -1247,102 +1247,6 @@
EXPECT_EQ(exists, tile != NULL) << geometry_rect.ToString();
}
-TEST(PictureLayerTilingTest, TilingEvictionTileIteratorStaticViewport) {
- FakeOutputSurfaceClient output_surface_client;
- scoped_ptr<FakeOutputSurface> output_surface = FakeOutputSurface::Create3d();
- CHECK(output_surface->BindToClient(&output_surface_client));
- TestSharedBitmapManager shared_bitmap_manager;
- scoped_ptr<ResourceProvider> resource_provider = ResourceProvider::Create(
- output_surface.get(), &shared_bitmap_manager, NULL, NULL, 0, false, 1);
-
- FakePictureLayerTilingClient client(resource_provider.get());
- scoped_ptr<TestablePictureLayerTiling> tiling;
-
- gfx::Rect viewport(50, 50, 100, 100);
- gfx::Size layer_bounds(2000, 2000);
-
- client.SetTileSize(gfx::Size(30, 30));
- client.set_tree(ACTIVE_TREE);
-
- tiling = TestablePictureLayerTiling::Create(1.0f, layer_bounds, &client);
- tiling->ComputeTilePriorityRects(viewport, 1.0f, 1.0, Occlusion());
- tiling->UpdateAllTilePrioritiesForTesting();
-
- PictureLayerTiling::TilingRasterTileIterator empty_iterator;
- EXPECT_FALSE(empty_iterator);
-
- std::vector<Tile*> all_tiles = tiling->AllTilesForTesting();
-
- PictureLayerTiling::TilingEvictionTileIterator it(
- tiling.get(), SMOOTHNESS_TAKES_PRIORITY, PictureLayerTiling::NOW);
-
- // Tiles don't have resources to evict.
- EXPECT_FALSE(it);
-
- // Sanity check.
- EXPECT_EQ(5184u, all_tiles.size());
-
- client.tile_manager()->InitializeTilesWithResourcesForTesting(all_tiles);
-
- std::set<Tile*> all_tiles_set(all_tiles.begin(), all_tiles.end());
-
- std::set<Tile*> eviction_tiles;
-
- it = PictureLayerTiling::TilingEvictionTileIterator(
- tiling.get(), SMOOTHNESS_TAKES_PRIORITY, PictureLayerTiling::EVENTUALLY);
- EXPECT_TRUE(it);
- for (; it; ++it) {
- Tile* tile = *it;
- EXPECT_TRUE(tile);
- EXPECT_EQ(TilePriority::EVENTUALLY,
- tile->priority(ACTIVE_TREE).priority_bin);
- EXPECT_FALSE(tile->required_for_activation());
- eviction_tiles.insert(tile);
- }
-
- it = PictureLayerTiling::TilingEvictionTileIterator(
- tiling.get(), SMOOTHNESS_TAKES_PRIORITY, PictureLayerTiling::SOON);
- EXPECT_TRUE(it);
- for (; it; ++it) {
- Tile* tile = *it;
- EXPECT_TRUE(tile);
- EXPECT_EQ(TilePriority::SOON, tile->priority(ACTIVE_TREE).priority_bin);
- EXPECT_FALSE(tile->required_for_activation());
- eviction_tiles.insert(tile);
- }
-
- it = PictureLayerTiling::TilingEvictionTileIterator(
- tiling.get(), SMOOTHNESS_TAKES_PRIORITY, PictureLayerTiling::NOW);
- EXPECT_TRUE(it);
- for (; it; ++it) {
- Tile* tile = *it;
- EXPECT_TRUE(tile);
- EXPECT_EQ(TilePriority::NOW, tile->priority(ACTIVE_TREE).priority_bin);
- EXPECT_FALSE(tile->required_for_activation());
- eviction_tiles.insert(tile);
- }
-
- it = PictureLayerTiling::TilingEvictionTileIterator(
- tiling.get(),
- SMOOTHNESS_TAKES_PRIORITY,
- PictureLayerTiling::NOW_AND_REQUIRED_FOR_ACTIVATION);
- EXPECT_FALSE(it);
-
- EXPECT_GT(all_tiles_set.size(), 0u);
- EXPECT_EQ(all_tiles_set, eviction_tiles);
-
- EXPECT_TRUE(tiling->eviction_tiles_cache_valid());
- tiling->RemoveTileAt(0, 0, nullptr);
- EXPECT_FALSE(tiling->eviction_tiles_cache_valid());
-
- it = PictureLayerTiling::TilingEvictionTileIterator(
- tiling.get(), SMOOTHNESS_TAKES_PRIORITY,
- PictureLayerTiling::NOW_AND_REQUIRED_FOR_ACTIVATION);
- EXPECT_TRUE(tiling->eviction_tiles_cache_valid());
- tiling->Reset();
- EXPECT_FALSE(tiling->eviction_tiles_cache_valid());
-}
-
TEST_F(PictureLayerTilingIteratorTest, TilesExist) {
gfx::Size layer_bounds(1099, 801);
Initialize(gfx::Size(100, 100), 1.f, layer_bounds);
diff --git a/cc/resources/picture_pile_impl.cc b/cc/resources/picture_pile_impl.cc
index 2655d24..5cd7bd6 100644
--- a/cc/resources/picture_pile_impl.cc
+++ b/cc/resources/picture_pile_impl.cc
@@ -4,11 +4,13 @@
#include <algorithm>
#include <limits>
+#include <set>
#include "base/debug/trace_event.h"
#include "cc/base/region.h"
#include "cc/debug/debug_colors.h"
#include "cc/resources/picture_pile_impl.h"
+#include "cc/resources/raster_source_helper.h"
#include "skia/ext/analysis_canvas.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkPictureRecorder.h"
@@ -87,62 +89,9 @@
void PicturePileImpl::PlaybackToCanvas(SkCanvas* canvas,
const gfx::Rect& canvas_rect,
float contents_scale) const {
- canvas->discard();
- if (clear_canvas_with_debug_color_) {
- // Any non-painted areas in the content bounds will be left in this color.
- canvas->clear(DebugColors::NonPaintedFillColor());
- }
-
- // If this picture has opaque contents, it is guaranteeing that it will
- // draw an opaque rect the size of the layer. If it is not, then we must
- // clear this canvas ourselves.
- if (requires_clear_) {
- TRACE_EVENT_INSTANT0("cc", "SkCanvas::clear", TRACE_EVENT_SCOPE_THREAD);
- // Clearing is about ~4x faster than drawing a rect even if the content
- // isn't covering a majority of the canvas.
- canvas->clear(SK_ColorTRANSPARENT);
- } else {
- // Even if completely covered, for rasterizations that touch the edge of the
- // layer, we also need to raster the background color underneath the last
- // texel (since the recording won't cover it) and outside the last texel
- // (due to linear filtering when using this texture).
- gfx::Rect content_tiling_rect = gfx::ToEnclosingRect(
- gfx::ScaleRect(gfx::Rect(tiling_.tiling_size()), contents_scale));
-
- // The final texel of content may only be partially covered by a
- // rasterization; this rect represents the content rect that is fully
- // covered by content.
- gfx::Rect deflated_content_tiling_rect = content_tiling_rect;
- deflated_content_tiling_rect.Inset(0, 0, 1, 1);
- if (!deflated_content_tiling_rect.Contains(canvas_rect)) {
- if (clear_canvas_with_debug_color_) {
- // Any non-painted areas outside of the content bounds are left in
- // this color. If this is seen then it means that cc neglected to
- // rerasterize a tile that used to intersect with the content rect
- // after the content bounds grew.
- canvas->save();
- canvas->translate(-canvas_rect.x(), -canvas_rect.y());
- canvas->clipRect(gfx::RectToSkRect(content_tiling_rect),
- SkRegion::kDifference_Op);
- canvas->drawColor(DebugColors::MissingResizeInvalidations(),
- SkXfermode::kSrc_Mode);
- canvas->restore();
- }
-
- // Drawing at most 2 x 2 x (canvas width + canvas height) texels is 2-3X
- // faster than clearing, so special case this.
- canvas->save();
- canvas->translate(-canvas_rect.x(), -canvas_rect.y());
- gfx::Rect inflated_content_tiling_rect = content_tiling_rect;
- inflated_content_tiling_rect.Inset(0, 0, -1, -1);
- canvas->clipRect(gfx::RectToSkRect(inflated_content_tiling_rect),
- SkRegion::kReplace_Op);
- canvas->clipRect(gfx::RectToSkRect(deflated_content_tiling_rect),
- SkRegion::kDifference_Op);
- canvas->drawColor(background_color_, SkXfermode::kSrc_Mode);
- canvas->restore();
- }
- }
+ RasterSourceHelper::PrepareForPlaybackToCanvas(
+ canvas, canvas_rect, gfx::Rect(tiling_.tiling_size()), contents_scale,
+ background_color_, clear_canvas_with_debug_color_, requires_clear_);
RasterCommon(canvas,
NULL,
@@ -319,6 +268,19 @@
return picture;
}
+size_t PicturePileImpl::GetPictureMemoryUsage() const {
+ // Place all pictures in a set to de-dupe.
+ size_t total_size = 0;
+ std::set<const Picture*> pictures_seen;
+ for (const auto& map_value : picture_map_) {
+ const Picture* picture = map_value.second.GetPicture();
+ if (picture && pictures_seen.insert(picture).second)
+ total_size += picture->ApproximateMemoryUsage();
+ }
+
+ return total_size;
+}
+
void PicturePileImpl::PerformSolidColorAnalysis(
const gfx::Rect& content_rect,
float contents_scale,
diff --git a/cc/resources/picture_pile_impl.h b/cc/resources/picture_pile_impl.h
index d7d0399..3e0dd78 100644
--- a/cc/resources/picture_pile_impl.h
+++ b/cc/resources/picture_pile_impl.h
@@ -67,6 +67,7 @@
void DidBeginTracing() override;
void AsValueInto(base::debug::TracedValue* array) const override;
skia::RefPtr<SkPicture> GetFlattenedPicture() override;
+ size_t GetPictureMemoryUsage() const override;
// Iterator used to return SkPixelRefs from this picture pile.
// Public for testing.
diff --git a/cc/resources/raster_source.h b/cc/resources/raster_source.h
index 3584436..88c9962 100644
--- a/cc/resources/raster_source.h
+++ b/cc/resources/raster_source.h
@@ -18,6 +18,8 @@
namespace cc {
+class Picture;
+
class CC_EXPORT RasterSource : public base::RefCountedThreadSafe<RasterSource> {
public:
struct CC_EXPORT SolidColorAnalysis {
@@ -92,6 +94,7 @@
virtual void DidBeginTracing() = 0;
virtual void AsValueInto(base::debug::TracedValue* array) const = 0;
virtual skia::RefPtr<SkPicture> GetFlattenedPicture() = 0;
+ virtual size_t GetPictureMemoryUsage() const = 0;
// Return true if LCD anti-aliasing may be used when rastering text.
virtual bool CanUseLCDText() const = 0;
diff --git a/cc/resources/raster_source_helper.cc b/cc/resources/raster_source_helper.cc
new file mode 100644
index 0000000..f7ef305
--- /dev/null
+++ b/cc/resources/raster_source_helper.cc
@@ -0,0 +1,81 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "cc/resources/raster_source_helper.h"
+
+#include "base/debug/trace_event.h"
+#include "cc/debug/debug_colors.h"
+#include "third_party/skia/include/core/SkCanvas.h"
+#include "ui/gfx/geometry/rect_conversions.h"
+#include "ui/gfx/skia_util.h"
+
+namespace cc {
+
+void RasterSourceHelper::PrepareForPlaybackToCanvas(
+ SkCanvas* canvas,
+ const gfx::Rect& canvas_rect,
+ const gfx::Rect& source_rect,
+ float contents_scale,
+ SkColor background_color,
+ bool clear_canvas_with_debug_color,
+ bool requires_clear) {
+ canvas->discard();
+ if (clear_canvas_with_debug_color) {
+ // Any non-painted areas in the content bounds will be left in this color.
+ canvas->clear(DebugColors::NonPaintedFillColor());
+ }
+
+ // If this raster source has opaque contents, it is guaranteeing that it will
+ // draw an opaque rect the size of the layer. If it is not, then we must
+ // clear this canvas ourselves.
+ if (requires_clear) {
+ TRACE_EVENT_INSTANT0("cc", "SkCanvas::clear", TRACE_EVENT_SCOPE_THREAD);
+ // Clearing is about ~4x faster than drawing a rect even if the content
+ // isn't covering a majority of the canvas.
+ canvas->clear(SK_ColorTRANSPARENT);
+ } else {
+ // Even if completely covered, for rasterizations that touch the edge of the
+ // layer, we also need to raster the background color underneath the last
+ // texel (since the recording won't cover it) and outside the last texel
+ // (due to linear filtering when using this texture).
+ gfx::Rect content_rect =
+ gfx::ToEnclosingRect(gfx::ScaleRect(source_rect, contents_scale));
+
+ // The final texel of content may only be partially covered by a
+ // rasterization; this rect represents the content rect that is fully
+ // covered by content.
+ gfx::Rect deflated_content_rect = content_rect;
+ deflated_content_rect.Inset(0, 0, 1, 1);
+ if (!deflated_content_rect.Contains(canvas_rect)) {
+ if (clear_canvas_with_debug_color) {
+ // Any non-painted areas outside of the content bounds are left in
+ // this color. If this is seen then it means that cc neglected to
+ // rerasterize a tile that used to intersect with the content rect
+ // after the content bounds grew.
+ canvas->save();
+ canvas->translate(-canvas_rect.x(), -canvas_rect.y());
+ canvas->clipRect(gfx::RectToSkRect(content_rect),
+ SkRegion::kDifference_Op);
+ canvas->drawColor(DebugColors::MissingResizeInvalidations(),
+ SkXfermode::kSrc_Mode);
+ canvas->restore();
+ }
+
+ // Drawing at most 2 x 2 x (canvas width + canvas height) texels is 2-3X
+ // faster than clearing, so special case this.
+ canvas->save();
+ canvas->translate(-canvas_rect.x(), -canvas_rect.y());
+ gfx::Rect inflated_content_rect = content_rect;
+ inflated_content_rect.Inset(0, 0, -1, -1);
+ canvas->clipRect(gfx::RectToSkRect(inflated_content_rect),
+ SkRegion::kReplace_Op);
+ canvas->clipRect(gfx::RectToSkRect(deflated_content_rect),
+ SkRegion::kDifference_Op);
+ canvas->drawColor(background_color, SkXfermode::kSrc_Mode);
+ canvas->restore();
+ }
+ }
+}
+
+} // namespace cc
diff --git a/cc/resources/raster_source_helper.h b/cc/resources/raster_source_helper.h
new file mode 100644
index 0000000..abdea3e
--- /dev/null
+++ b/cc/resources/raster_source_helper.h
@@ -0,0 +1,29 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CC_RESOURCES_RASTER_SOURCE_HELPER_H_
+#define CC_RESOURCES_RASTER_SOURCE_HELPER_H_
+
+#include "cc/base/cc_export.h"
+#include "third_party/skia/include/core/SkColor.h"
+#include "ui/gfx/geometry/rect.h"
+
+class SkCanvas;
+
+namespace cc {
+
+class CC_EXPORT RasterSourceHelper {
+ public:
+ static void PrepareForPlaybackToCanvas(SkCanvas* canvas,
+ const gfx::Rect& canvas_rect,
+ const gfx::Rect& source_rect,
+ float contents_scale,
+ SkColor background_color,
+ bool clear_canvas_with_debug_color,
+ bool requires_clear);
+};
+
+} // namespace cc
+
+#endif // CC_RESOURCES_RASTER_SOURCE_HELPER_H_
diff --git a/cc/resources/raster_worker_pool.cc b/cc/resources/raster_worker_pool.cc
index 4511f9d..ca951f6 100644
--- a/cc/resources/raster_worker_pool.cc
+++ b/cc/resources/raster_worker_pool.cc
@@ -206,6 +206,7 @@
case LUMINANCE_8:
case RGB_565:
case ETC1:
+ case RED_8:
return false;
}
NOTREACHED();
diff --git a/cc/resources/resource_format.cc b/cc/resources/resource_format.cc
index 6cd0a93..45581b8 100644
--- a/cc/resources/resource_format.cc
+++ b/cc/resources/resource_format.cc
@@ -17,6 +17,7 @@
case ALPHA_8:
case LUMINANCE_8:
case RGB_565:
+ case RED_8:
NOTREACHED();
break;
}
diff --git a/cc/resources/resource_format.h b/cc/resources/resource_format.h
index b51ac7c..d785ab7 100644
--- a/cc/resources/resource_format.h
+++ b/cc/resources/resource_format.h
@@ -19,7 +19,8 @@
LUMINANCE_8,
RGB_565,
ETC1,
- RESOURCE_FORMAT_MAX = ETC1,
+ RED_8,
+ RESOURCE_FORMAT_MAX = RED_8,
};
SkColorType ResourceFormatToSkColorType(ResourceFormat format);
diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc
index 636e797..fe7cc00 100644
--- a/cc/resources/resource_provider.cc
+++ b/cc/resources/resource_provider.cc
@@ -76,6 +76,7 @@
case LUMINANCE_8:
case RGB_565:
case ETC1:
+ case RED_8:
NOTREACHED();
break;
}
@@ -94,6 +95,7 @@
case LUMINANCE_8:
case RGB_565:
case ETC1:
+ case RED_8:
return false;
}
return false;
@@ -125,6 +127,7 @@
case LUMINANCE_8:
case RGB_565:
case ETC1:
+ case RED_8:
break;
}
NOTREACHED();
@@ -1216,6 +1219,7 @@
use_texture_format_bgra_(false),
use_texture_usage_hint_(false),
use_compressed_texture_etc1_(false),
+ yuv_resource_format_(LUMINANCE_8),
max_texture_size_(0),
best_texture_format_(RGBA_8888),
use_rgba_4444_texture_format_(use_rgba_4444_texture_format),
@@ -1254,6 +1258,7 @@
use_texture_format_bgra_ = caps.gpu.texture_format_bgra8888;
use_texture_usage_hint_ = caps.gpu.texture_usage;
use_compressed_texture_etc1_ = caps.gpu.texture_format_etc1;
+ yuv_resource_format_ = caps.gpu.texture_rg ? RED_8 : LUMINANCE_8;
use_sync_query_ = caps.gpu.sync_query;
GLES2Interface* gl = ContextGL();
diff --git a/cc/resources/resource_provider.h b/cc/resources/resource_provider.h
index bfd3ebb..3a8d2e0 100644
--- a/cc/resources/resource_provider.h
+++ b/cc/resources/resource_provider.h
@@ -99,6 +99,7 @@
return use_rgba_4444_texture_format_ ? RGBA_4444 : best_texture_format_;
}
ResourceFormat best_texture_format() const { return best_texture_format_; }
+ ResourceFormat yuv_resource_format() const { return yuv_resource_format_; }
bool use_sync_query() const { return use_sync_query_; }
size_t num_resources() const { return resources_.size(); }
@@ -578,6 +579,7 @@
bool use_texture_format_bgra_;
bool use_texture_usage_hint_;
bool use_compressed_texture_etc1_;
+ ResourceFormat yuv_resource_format_;
scoped_ptr<TextureUploader> texture_uploader_;
int max_texture_size_;
ResourceFormat best_texture_format_;
@@ -610,6 +612,7 @@
return 16;
case ALPHA_8:
case LUMINANCE_8:
+ case RED_8:
return 8;
case ETC1:
return 4;
@@ -621,13 +624,14 @@
inline GLenum GLDataType(ResourceFormat format) {
DCHECK_LE(format, RESOURCE_FORMAT_MAX);
static const unsigned format_gl_data_type[RESOURCE_FORMAT_MAX + 1] = {
- GL_UNSIGNED_BYTE, // RGBA_8888
- GL_UNSIGNED_SHORT_4_4_4_4, // RGBA_4444
- GL_UNSIGNED_BYTE, // BGRA_8888
- GL_UNSIGNED_BYTE, // ALPHA_8
- GL_UNSIGNED_BYTE, // LUMINANCE_8
- GL_UNSIGNED_SHORT_5_6_5, // RGB_565,
- GL_UNSIGNED_BYTE // ETC1
+ GL_UNSIGNED_BYTE, // RGBA_8888
+ GL_UNSIGNED_SHORT_4_4_4_4, // RGBA_4444
+ GL_UNSIGNED_BYTE, // BGRA_8888
+ GL_UNSIGNED_BYTE, // ALPHA_8
+ GL_UNSIGNED_BYTE, // LUMINANCE_8
+ GL_UNSIGNED_SHORT_5_6_5, // RGB_565,
+ GL_UNSIGNED_BYTE, // ETC1
+ GL_UNSIGNED_BYTE // RED_8
};
return format_gl_data_type[format];
}
@@ -635,13 +639,14 @@
inline GLenum GLDataFormat(ResourceFormat format) {
DCHECK_LE(format, RESOURCE_FORMAT_MAX);
static const unsigned format_gl_data_format[RESOURCE_FORMAT_MAX + 1] = {
- GL_RGBA, // RGBA_8888
- GL_RGBA, // RGBA_4444
- GL_BGRA_EXT, // BGRA_8888
- GL_ALPHA, // ALPHA_8
- GL_LUMINANCE, // LUMINANCE_8
- GL_RGB, // RGB_565
- GL_ETC1_RGB8_OES // ETC1
+ GL_RGBA, // RGBA_8888
+ GL_RGBA, // RGBA_4444
+ GL_BGRA_EXT, // BGRA_8888
+ GL_ALPHA, // ALPHA_8
+ GL_LUMINANCE, // LUMINANCE_8
+ GL_RGB, // RGB_565
+ GL_ETC1_RGB8_OES, // ETC1
+ GL_RED_EXT // RED_8
};
return format_gl_data_format[format];
}
diff --git a/cc/resources/shared_bitmap.cc b/cc/resources/shared_bitmap.cc
index 31cf245..1ac0323 100644
--- a/cc/resources/shared_bitmap.cc
+++ b/cc/resources/shared_bitmap.cc
@@ -10,25 +10,13 @@
namespace cc {
-SharedBitmap::SharedBitmap(
- base::SharedMemory* memory,
- const SharedBitmapId& id,
- const base::Callback<void(SharedBitmap* bitmap)>& free_callback)
- : memory_(memory),
- pixels_(static_cast<uint8*>(memory_->memory())),
- id_(id),
- free_callback_(free_callback) {
+SharedBitmap::SharedBitmap(uint8* pixels, const SharedBitmapId& id)
+ : pixels_(pixels), id_(id) {
}
-SharedBitmap::SharedBitmap(
- uint8* pixels,
- const SharedBitmapId& id,
- const base::Callback<void(SharedBitmap* bitmap)>& free_callback)
- : memory_(NULL), pixels_(pixels), id_(id), free_callback_(free_callback) {
+SharedBitmap::~SharedBitmap() {
}
-SharedBitmap::~SharedBitmap() { free_callback_.Run(this); }
-
// static
bool SharedBitmap::SizeInBytes(const gfx::Size& size, size_t* size_in_bytes) {
if (size.IsEmpty())
diff --git a/cc/resources/shared_bitmap.h b/cc/resources/shared_bitmap.h
index ca12710..bbf0823 100644
--- a/cc/resources/shared_bitmap.h
+++ b/cc/resources/shared_bitmap.h
@@ -6,8 +6,7 @@
#define CC_RESOURCES_SHARED_BITMAP_H_
#include "base/basictypes.h"
-#include "base/callback.h"
-#include "base/memory/shared_memory.h"
+#include "base/memory/scoped_ptr.h"
#include "cc/base/cc_export.h"
#include "gpu/command_buffer/common/mailbox.h"
#include "ui/gfx/geometry/size.h"
@@ -19,29 +18,15 @@
class CC_EXPORT SharedBitmap {
public:
- SharedBitmap(base::SharedMemory* memory,
- const SharedBitmapId& id,
- const base::Callback<void(SharedBitmap* bitmap)>& free_callback);
+ SharedBitmap(uint8* pixels, const SharedBitmapId& id);
- SharedBitmap(uint8* pixels,
- const SharedBitmapId& id,
- const base::Callback<void(SharedBitmap* bitmap)>& free_callback);
-
- ~SharedBitmap();
-
- bool operator<(const SharedBitmap& right) const {
- if (memory_ < right.memory_)
- return true;
- if (memory_ > right.memory_)
- return false;
- return id_ < right.id_;
- }
+ virtual ~SharedBitmap();
uint8* pixels() { return pixels_; }
- base::SharedMemory* memory() { return memory_; }
+ virtual base::SharedMemory* memory() = 0;
- SharedBitmapId id() { return id_; }
+ const SharedBitmapId& id() { return id_; }
// Returns true if the size is valid and false otherwise.
static bool SizeInBytes(const gfx::Size& size, size_t* size_in_bytes);
@@ -57,10 +42,8 @@
static SharedBitmapId GenerateId();
private:
- base::SharedMemory* memory_;
uint8* pixels_;
SharedBitmapId id_;
- base::Callback<void(SharedBitmap* bitmap)> free_callback_;
DISALLOW_COPY_AND_ASSIGN(SharedBitmap);
};
diff --git a/cc/resources/texture_uploader_unittest.cc b/cc/resources/texture_uploader_unittest.cc
index 7249172..b168962 100644
--- a/cc/resources/texture_uploader_unittest.cc
+++ b/cc/resources/texture_uploader_unittest.cc
@@ -111,6 +111,14 @@
EXPECT_EQ(static_cast<unsigned>(GL_UNSIGNED_BYTE), type);
bytes_per_pixel = 2;
break;
+ case GL_RED_EXT:
+ EXPECT_EQ(static_cast<unsigned>(GL_UNSIGNED_BYTE), type);
+ bytes_per_pixel = 1;
+ break;
+ case GL_RG_EXT:
+ EXPECT_EQ(static_cast<unsigned>(GL_UNSIGNED_BYTE), type);
+ bytes_per_pixel = 2;
+ break;
}
// If NULL, we aren't checking texture contents.
@@ -232,6 +240,15 @@
buffer[(i + 1) * 82 - 1] = 0x2;
}
UploadTexture(uploader.get(), LUMINANCE_8, gfx::Size(82, 86), buffer);
+
+ // Upload a tightly packed 82x86 RED texture.
+ memset(buffer, 0, sizeof(buffer));
+ for (int i = 0; i < 86; ++i) {
+ // Mark the beginning and end of each row, for the test.
+ buffer[i * 1 * 82] = 0x1;
+ buffer[(i + 1) * 82 - 1] = 0x2;
+ }
+ UploadTexture(uploader.get(), RED_8, gfx::Size(82, 86), buffer);
}
} // namespace
diff --git a/cc/resources/tile.h b/cc/resources/tile.h
index 042d5ae..a35cffe 100644
--- a/cc/resources/tile.h
+++ b/cc/resources/tile.h
@@ -15,6 +15,8 @@
namespace cc {
+class TileManager;
+
class CC_EXPORT Tile : public RefCountedManaged<Tile> {
public:
enum TileRasterFlags { USE_PICTURE_ANALYSIS = 1 << 0 };
diff --git a/cc/resources/tile_manager.cc b/cc/resources/tile_manager.cc
index d83b824..66f95da 100644
--- a/cc/resources/tile_manager.cc
+++ b/cc/resources/tile_manager.cc
@@ -239,9 +239,11 @@
task_runner_.get(),
base::Bind(&TileManager::CheckIfReadyToActivate,
base::Unretained(this))),
- ready_to_draw_check_notifier_(task_runner_.get(),
- base::Bind(&TileManager::CheckIfReadyToDraw,
- base::Unretained(this))) {
+ ready_to_draw_check_notifier_(
+ task_runner_.get(),
+ base::Bind(&TileManager::CheckIfReadyToDraw, base::Unretained(this))),
+ did_notify_ready_to_activate_(false),
+ did_notify_ready_to_draw_(false) {
rasterizer_->SetClient(this);
}
@@ -416,9 +418,12 @@
TileVector tiles_that_need_to_be_rasterized;
AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized);
- // Finally, schedule rasterizer tasks.
+ // Schedule rasterizer tasks.
ScheduleTasks(tiles_that_need_to_be_rasterized);
+ did_notify_ready_to_activate_ = false;
+ did_notify_ready_to_draw_ = false;
+
TRACE_EVENT_INSTANT1("cc",
"DidManage",
TRACE_EVENT_SCOPE_THREAD,
@@ -882,8 +887,13 @@
rasterizer_->CheckForCompletedTasks();
did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
- if (IsReadyToActivate())
- client_->NotifyReadyToActivate();
+ if (did_notify_ready_to_activate_)
+ return;
+ if (!IsReadyToActivate())
+ return;
+
+ client_->NotifyReadyToActivate();
+ did_notify_ready_to_activate_ = true;
}
void TileManager::CheckIfReadyToDraw() {
@@ -892,8 +902,13 @@
rasterizer_->CheckForCompletedTasks();
did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
- if (IsReadyToDraw())
- client_->NotifyReadyToDraw();
+ if (did_notify_ready_to_draw_)
+ return;
+ if (!IsReadyToDraw())
+ return;
+
+ client_->NotifyReadyToDraw();
+ did_notify_ready_to_draw_ = true;
}
TileManager::MemoryUsage::MemoryUsage() : memory_bytes_(0), resource_count_(0) {
diff --git a/cc/resources/tile_manager.h b/cc/resources/tile_manager.h
index e94fb7c..8d19520 100644
--- a/cc/resources/tile_manager.h
+++ b/cc/resources/tile_manager.h
@@ -162,6 +162,10 @@
return tiles;
}
+ void SetScheduledRasterTaskLimitForTesting(size_t limit) {
+ scheduled_raster_task_limit_ = limit;
+ }
+
protected:
TileManager(TileManagerClient* client,
const scoped_refptr<base::SequencedTaskRunner>& task_runner,
@@ -243,7 +247,7 @@
ResourcePool* resource_pool_;
Rasterizer* rasterizer_;
GlobalStateThatImpactsTilePriority global_state_;
- const size_t scheduled_raster_task_limit_;
+ size_t scheduled_raster_task_limit_;
typedef base::hash_map<Tile::Id, Tile*> TileMap;
TileMap tiles_;
@@ -282,6 +286,9 @@
EvictionTilePriorityQueue eviction_priority_queue_;
bool eviction_priority_queue_is_up_to_date_;
+ bool did_notify_ready_to_activate_;
+ bool did_notify_ready_to_draw_;
+
DISALLOW_COPY_AND_ASSIGN(TileManager);
};
diff --git a/cc/resources/tile_manager_perftest.cc b/cc/resources/tile_manager_perftest.cc
index 7b096bd..2204ab8 100644
--- a/cc/resources/tile_manager_perftest.cc
+++ b/cc/resources/tile_manager_perftest.cc
@@ -400,7 +400,8 @@
timer_.Reset();
bool resourceless_software_draw = false;
do {
- BeginFrameArgs args = CreateBeginFrameArgsForTesting();
+ BeginFrameArgs args =
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE);
host_impl_.UpdateCurrentBeginFrameArgs(args);
for (unsigned i = 0; i < layers.size(); ++i) {
layers[i]->UpdateTiles(Occlusion(), resourceless_software_draw);
diff --git a/cc/resources/tile_manager_unittest.cc b/cc/resources/tile_manager_unittest.cc
index 49a93d3..fdd876e 100644
--- a/cc/resources/tile_manager_unittest.cc
+++ b/cc/resources/tile_manager_unittest.cc
@@ -149,7 +149,9 @@
};
TEST_F(TileManagerTilePriorityQueueTest, RasterTilePriorityQueue) {
- SetupDefaultTrees(gfx::Size(1000, 1000));
+ const gfx::Size layer_bounds(1000, 1000);
+ host_impl_.SetViewportSize(layer_bounds);
+ SetupDefaultTrees(layer_bounds);
active_layer_->CreateDefaultTilingsAndTiles();
pending_layer_->CreateDefaultTilingsAndTiles();
@@ -391,7 +393,9 @@
}
TEST_F(TileManagerTilePriorityQueueTest, EvictionTilePriorityQueue) {
- SetupDefaultTrees(gfx::Size(1000, 1000));
+ const gfx::Size layer_bounds(1000, 1000);
+ host_impl_.SetViewportSize(layer_bounds);
+ SetupDefaultTrees(layer_bounds);
active_layer_->CreateDefaultTilingsAndTiles();
pending_layer_->CreateDefaultTilingsAndTiles();
@@ -560,6 +564,8 @@
gfx::Size tile_size(102, 102);
gfx::Size layer_bounds(1000, 1000);
+ host_impl_.SetViewportSize(layer_bounds);
+
scoped_refptr<FakePicturePileImpl> pending_pile =
FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
SetupPendingTree(pending_pile);
@@ -768,7 +774,9 @@
}
TEST_F(TileManagerTilePriorityQueueTest, RasterTilePriorityQueueEmptyLayers) {
- SetupDefaultTrees(gfx::Size(1000, 1000));
+ const gfx::Size layer_bounds(1000, 1000);
+ host_impl_.SetViewportSize(layer_bounds);
+ SetupDefaultTrees(layer_bounds);
active_layer_->CreateDefaultTilingsAndTiles();
pending_layer_->CreateDefaultTilingsAndTiles();
@@ -815,7 +823,9 @@
}
TEST_F(TileManagerTilePriorityQueueTest, EvictionTilePriorityQueueEmptyLayers) {
- SetupDefaultTrees(gfx::Size(1000, 1000));
+ const gfx::Size layer_bounds(1000, 1000);
+ host_impl_.SetViewportSize(layer_bounds);
+ SetupDefaultTrees(layer_bounds);
active_layer_->CreateDefaultTilingsAndTiles();
pending_layer_->CreateDefaultTilingsAndTiles();
diff --git a/cc/resources/tiling_set_eviction_queue.cc b/cc/resources/tiling_set_eviction_queue.cc
new file mode 100644
index 0000000..8c5ff52
--- /dev/null
+++ b/cc/resources/tiling_set_eviction_queue.cc
@@ -0,0 +1,197 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "cc/resources/tiling_set_eviction_queue.h"
+
+namespace cc {
+
+TilingSetEvictionQueue::TilingSetEvictionQueue()
+ : tiling_set_(nullptr),
+ tree_priority_(SAME_PRIORITY_FOR_BOTH_TREES),
+ current_category_(PictureLayerTiling::EVENTUALLY),
+ current_tiling_index_(0u),
+ current_tiling_range_type_(PictureLayerTilingSet::HIGHER_THAN_HIGH_RES),
+ current_eviction_tile_(nullptr),
+ eviction_tiles_(nullptr),
+ next_eviction_tile_index_(0u) {
+}
+
+TilingSetEvictionQueue::TilingSetEvictionQueue(
+ PictureLayerTilingSet* tiling_set,
+ TreePriority tree_priority)
+ : tiling_set_(tiling_set),
+ tree_priority_(tree_priority),
+ current_category_(PictureLayerTiling::EVENTUALLY),
+ current_tiling_index_(0u),
+ current_tiling_range_type_(PictureLayerTilingSet::HIGHER_THAN_HIGH_RES),
+ current_eviction_tile_(nullptr),
+ eviction_tiles_(nullptr),
+ next_eviction_tile_index_(0u) {
+ DCHECK(tiling_set_);
+
+ // Early out if the layer has no tilings.
+ if (!tiling_set_->num_tilings())
+ return;
+
+ current_tiling_index_ = CurrentTilingRange().start - 1u;
+ AdvanceToNextValidTiling();
+}
+
+TilingSetEvictionQueue::~TilingSetEvictionQueue() {
+}
+
+bool TilingSetEvictionQueue::IsEmpty() const {
+ return !current_eviction_tile_;
+}
+
+void TilingSetEvictionQueue::Pop() {
+ DCHECK(!IsEmpty());
+
+ if (!AdvanceToNextEvictionTile())
+ AdvanceToNextValidTiling();
+}
+
+Tile* TilingSetEvictionQueue::Top() {
+ DCHECK(!IsEmpty());
+ return current_eviction_tile_;
+}
+
+const Tile* TilingSetEvictionQueue::Top() const {
+ DCHECK(!IsEmpty());
+ return current_eviction_tile_;
+}
+
+bool TilingSetEvictionQueue::AdvanceToNextCategory() {
+ // Advance to the next category. This is done only after all tiling range
+ // types within the previous category have been gone through.
+ DCHECK_EQ(current_tiling_range_type_, PictureLayerTilingSet::HIGH_RES);
+
+ switch (current_category_) {
+ case PictureLayerTiling::EVENTUALLY:
+ current_category_ =
+ PictureLayerTiling::EVENTUALLY_AND_REQUIRED_FOR_ACTIVATION;
+ return true;
+ case PictureLayerTiling::EVENTUALLY_AND_REQUIRED_FOR_ACTIVATION:
+ current_category_ = PictureLayerTiling::SOON;
+ return true;
+ case PictureLayerTiling::SOON:
+ current_category_ = PictureLayerTiling::SOON_AND_REQUIRED_FOR_ACTIVATION;
+ return true;
+ case PictureLayerTiling::SOON_AND_REQUIRED_FOR_ACTIVATION:
+ current_category_ = PictureLayerTiling::NOW;
+ return true;
+ case PictureLayerTiling::NOW:
+ current_category_ = PictureLayerTiling::NOW_AND_REQUIRED_FOR_ACTIVATION;
+ return true;
+ case PictureLayerTiling::NOW_AND_REQUIRED_FOR_ACTIVATION:
+ return false;
+ }
+ NOTREACHED();
+ return false;
+}
+
+bool TilingSetEvictionQueue::AdvanceToNextEvictionTile() {
+ // Advance to the next eviction tile within the current category and tiling.
+ // This is done while advancing to a new tiling (in which case the next
+ // eviction tile index is 0) and while popping the current tile (in which
+ // case the next eviction tile index is greater than 0).
+ DCHECK_EQ(next_eviction_tile_index_ > 0, current_eviction_tile_ != nullptr);
+
+ while (next_eviction_tile_index_ < eviction_tiles_->size()) {
+ Tile* tile = (*eviction_tiles_)[next_eviction_tile_index_];
+ ++next_eviction_tile_index_;
+ if (tile->HasResources()) {
+ current_eviction_tile_ = tile;
+ return true;
+ }
+ }
+
+ current_eviction_tile_ = nullptr;
+ return false;
+}
+
+bool TilingSetEvictionQueue::AdvanceToNextTilingRangeType() {
+ // Advance to the next tiling range type within the current category or to
+ // the first tiling range type within the next category. This is done only
+ // after all tilings within the previous tiling range type have been gone
+ // through.
+ DCHECK_EQ(current_tiling_index_, CurrentTilingRange().end);
+
+ switch (current_tiling_range_type_) {
+ case PictureLayerTilingSet::HIGHER_THAN_HIGH_RES:
+ current_tiling_range_type_ = PictureLayerTilingSet::LOWER_THAN_LOW_RES;
+ return true;
+ case PictureLayerTilingSet::LOWER_THAN_LOW_RES:
+ current_tiling_range_type_ =
+ PictureLayerTilingSet::BETWEEN_HIGH_AND_LOW_RES;
+ return true;
+ case PictureLayerTilingSet::BETWEEN_HIGH_AND_LOW_RES:
+ current_tiling_range_type_ = PictureLayerTilingSet::LOW_RES;
+ return true;
+ case PictureLayerTilingSet::LOW_RES:
+ current_tiling_range_type_ = PictureLayerTilingSet::HIGH_RES;
+ return true;
+ case PictureLayerTilingSet::HIGH_RES:
+ if (!AdvanceToNextCategory())
+ return false;
+
+ current_tiling_range_type_ = PictureLayerTilingSet::HIGHER_THAN_HIGH_RES;
+ return true;
+ }
+ NOTREACHED();
+ return false;
+}
+
+bool TilingSetEvictionQueue::AdvanceToNextValidTiling() {
+ // Advance to the next tiling within current tiling range type or to
+ // the first tiling within the next tiling range type or category until
+ // the next eviction tile is found. This is done only after all eviction
+ // tiles within the previous tiling within the current category and tiling
+ // range type have been gone through.
+ DCHECK(!current_eviction_tile_);
+ DCHECK_NE(current_tiling_index_, CurrentTilingRange().end);
+
+ for (;;) {
+ ++current_tiling_index_;
+ while (current_tiling_index_ == CurrentTilingRange().end) {
+ if (!AdvanceToNextTilingRangeType())
+ return false;
+ current_tiling_index_ = CurrentTilingRange().start;
+ }
+
+ PictureLayerTiling* tiling = tiling_set_->tiling_at(CurrentTilingIndex());
+ eviction_tiles_ =
+ tiling->GetEvictionTiles(tree_priority_, current_category_);
+ next_eviction_tile_index_ = 0u;
+ if (AdvanceToNextEvictionTile())
+ return true;
+ }
+}
+
+PictureLayerTilingSet::TilingRange
+TilingSetEvictionQueue::CurrentTilingRange() const {
+ return tiling_set_->GetTilingRange(current_tiling_range_type_);
+}
+
+size_t TilingSetEvictionQueue::CurrentTilingIndex() const {
+ DCHECK_NE(current_tiling_index_, CurrentTilingRange().end);
+ switch (current_tiling_range_type_) {
+ case PictureLayerTilingSet::HIGHER_THAN_HIGH_RES:
+ case PictureLayerTilingSet::LOW_RES:
+ case PictureLayerTilingSet::HIGH_RES:
+ return current_tiling_index_;
+ // Tilings in the following ranges are accessed in reverse order.
+ case PictureLayerTilingSet::BETWEEN_HIGH_AND_LOW_RES:
+ case PictureLayerTilingSet::LOWER_THAN_LOW_RES: {
+ PictureLayerTilingSet::TilingRange tiling_range = CurrentTilingRange();
+ size_t current_tiling_range_offset =
+ current_tiling_index_ - tiling_range.start;
+ return tiling_range.end - 1 - current_tiling_range_offset;
+ }
+ }
+ NOTREACHED();
+ return 0;
+}
+
+}
diff --git a/cc/resources/tiling_set_eviction_queue.h b/cc/resources/tiling_set_eviction_queue.h
new file mode 100644
index 0000000..f88ce3b
--- /dev/null
+++ b/cc/resources/tiling_set_eviction_queue.h
@@ -0,0 +1,48 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CC_RESOURCES_TILING_SET_EVICTION_QUEUE_H_
+#define CC_RESOURCES_TILING_SET_EVICTION_QUEUE_H_
+
+#include "cc/base/cc_export.h"
+#include "cc/resources/picture_layer_tiling_set.h"
+
+namespace cc {
+
+class CC_EXPORT TilingSetEvictionQueue {
+ public:
+ TilingSetEvictionQueue();
+ TilingSetEvictionQueue(PictureLayerTilingSet* tiling_set,
+ TreePriority tree_priority);
+ ~TilingSetEvictionQueue();
+
+ Tile* Top();
+ const Tile* Top() const;
+ void Pop();
+ bool IsEmpty() const;
+
+ private:
+ bool AdvanceToNextCategory();
+ bool AdvanceToNextEvictionTile();
+ bool AdvanceToNextTilingRangeType();
+ bool AdvanceToNextValidTiling();
+
+ PictureLayerTilingSet::TilingRange CurrentTilingRange() const;
+ size_t CurrentTilingIndex() const;
+
+ PictureLayerTilingSet* tiling_set_;
+ TreePriority tree_priority_;
+
+ PictureLayerTiling::EvictionCategory current_category_;
+ size_t current_tiling_index_;
+ PictureLayerTilingSet::TilingRangeType current_tiling_range_type_;
+ Tile* current_eviction_tile_;
+
+ const std::vector<Tile*>* eviction_tiles_;
+ size_t next_eviction_tile_index_;
+};
+
+} // namespace cc
+
+#endif // CC_RESOURCES_TILING_SET_RASTER_QUEUE_H_
diff --git a/cc/resources/transform_display_item.cc b/cc/resources/transform_display_item.cc
new file mode 100644
index 0000000..c7f4d60
--- /dev/null
+++ b/cc/resources/transform_display_item.cc
@@ -0,0 +1,60 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "cc/resources/transform_display_item.h"
+
+#include "third_party/skia/include/core/SkCanvas.h"
+
+namespace cc {
+
+TransformDisplayItem::TransformDisplayItem(const gfx::Transform& transform)
+ : transform_(transform) {
+}
+
+TransformDisplayItem::~TransformDisplayItem() {
+}
+
+void TransformDisplayItem::Raster(SkCanvas* canvas,
+ SkDrawPictureCallback* callback) const {
+ canvas->save();
+ if (!transform_.IsIdentity())
+ canvas->concat(transform_.matrix());
+}
+
+bool TransformDisplayItem::IsSuitableForGpuRasterization() const {
+ return true;
+}
+
+int TransformDisplayItem::ApproximateOpCount() const {
+ return 1;
+}
+
+size_t TransformDisplayItem::PictureMemoryUsage() const {
+ return sizeof(gfx::Transform);
+}
+
+EndTransformDisplayItem::EndTransformDisplayItem() {
+}
+
+EndTransformDisplayItem::~EndTransformDisplayItem() {
+}
+
+void EndTransformDisplayItem::Raster(SkCanvas* canvas,
+ SkDrawPictureCallback* callback) const {
+ canvas->restore();
+}
+
+bool EndTransformDisplayItem::IsSuitableForGpuRasterization() const {
+ return true;
+}
+
+int EndTransformDisplayItem::ApproximateOpCount() const {
+ return 0;
+}
+
+size_t EndTransformDisplayItem::PictureMemoryUsage() const {
+ return 0;
+}
+
+} // namespace cc
diff --git a/cc/resources/transform_display_item.h b/cc/resources/transform_display_item.h
new file mode 100644
index 0000000..1671f49
--- /dev/null
+++ b/cc/resources/transform_display_item.h
@@ -0,0 +1,60 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CC_RESOURCES_TRANSFORM_DISPLAY_ITEM_H_
+#define CC_RESOURCES_TRANSFORM_DISPLAY_ITEM_H_
+
+#include "base/memory/scoped_ptr.h"
+#include "cc/base/cc_export.h"
+#include "cc/resources/display_item.h"
+#include "ui/gfx/transform.h"
+
+class SkCanvas;
+class SkDrawPictureCallback;
+
+namespace cc {
+
+class CC_EXPORT TransformDisplayItem : public DisplayItem {
+ public:
+ virtual ~TransformDisplayItem();
+
+ static scoped_ptr<TransformDisplayItem> Create(
+ const gfx::Transform& transform) {
+ return make_scoped_ptr(new TransformDisplayItem(transform));
+ }
+
+ void Raster(SkCanvas* canvas, SkDrawPictureCallback* callback) const override;
+
+ bool IsSuitableForGpuRasterization() const override;
+ int ApproximateOpCount() const override;
+ size_t PictureMemoryUsage() const override;
+
+ protected:
+ explicit TransformDisplayItem(const gfx::Transform& transform);
+
+ private:
+ gfx::Transform transform_;
+};
+
+class CC_EXPORT EndTransformDisplayItem : public DisplayItem {
+ public:
+ virtual ~EndTransformDisplayItem();
+
+ static scoped_ptr<EndTransformDisplayItem> Create() {
+ return make_scoped_ptr(new EndTransformDisplayItem());
+ }
+
+ void Raster(SkCanvas* canvas, SkDrawPictureCallback* callback) const override;
+
+ bool IsSuitableForGpuRasterization() const override;
+ int ApproximateOpCount() const override;
+ size_t PictureMemoryUsage() const override;
+
+ protected:
+ EndTransformDisplayItem();
+};
+
+} // namespace cc
+
+#endif // CC_RESOURCES_TRANSFORM_DISPLAY_ITEM_H_
diff --git a/cc/resources/transparency_display_item.cc b/cc/resources/transparency_display_item.cc
new file mode 100644
index 0000000..0401d90
--- /dev/null
+++ b/cc/resources/transparency_display_item.cc
@@ -0,0 +1,65 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "cc/resources/transparency_display_item.h"
+
+#include "third_party/skia/include/core/SkCanvas.h"
+#include "third_party/skia/include/core/SkPaint.h"
+#include "third_party/skia/include/core/SkXfermode.h"
+#include "ui/gfx/skia_util.h"
+
+namespace cc {
+
+TransparencyDisplayItem::TransparencyDisplayItem(float opacity,
+ SkXfermode::Mode blend_mode)
+ : opacity_(opacity), blend_mode_(blend_mode) {
+}
+
+TransparencyDisplayItem::~TransparencyDisplayItem() {
+}
+
+void TransparencyDisplayItem::Raster(SkCanvas* canvas,
+ SkDrawPictureCallback* callback) const {
+ SkPaint paint;
+ paint.setXfermodeMode(blend_mode_);
+ paint.setAlpha(opacity_ * 255);
+ canvas->saveLayer(NULL, &paint);
+}
+
+bool TransparencyDisplayItem::IsSuitableForGpuRasterization() const {
+ return true;
+}
+
+int TransparencyDisplayItem::ApproximateOpCount() const {
+ return 1;
+}
+
+size_t TransparencyDisplayItem::PictureMemoryUsage() const {
+ return sizeof(float) + sizeof(SkXfermode::Mode);
+}
+
+EndTransparencyDisplayItem::EndTransparencyDisplayItem() {
+}
+
+EndTransparencyDisplayItem::~EndTransparencyDisplayItem() {
+}
+
+void EndTransparencyDisplayItem::Raster(SkCanvas* canvas,
+ SkDrawPictureCallback* callback) const {
+ canvas->restore();
+}
+
+bool EndTransparencyDisplayItem::IsSuitableForGpuRasterization() const {
+ return true;
+}
+
+int EndTransparencyDisplayItem::ApproximateOpCount() const {
+ return 0;
+}
+
+size_t EndTransparencyDisplayItem::PictureMemoryUsage() const {
+ return 0;
+}
+
+} // namespace cc
diff --git a/cc/resources/transparency_display_item.h b/cc/resources/transparency_display_item.h
new file mode 100644
index 0000000..6766d91
--- /dev/null
+++ b/cc/resources/transparency_display_item.h
@@ -0,0 +1,64 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CC_RESOURCES_TRANSPARENCY_DISPLAY_ITEM_H_
+#define CC_RESOURCES_TRANSPARENCY_DISPLAY_ITEM_H_
+
+#include "base/memory/scoped_ptr.h"
+#include "cc/base/cc_export.h"
+#include "cc/resources/display_item.h"
+#include "skia/ext/refptr.h"
+#include "third_party/skia/include/core/SkXfermode.h"
+#include "ui/gfx/geometry/rect_f.h"
+
+class SkCanvas;
+class SkDrawPictureCallback;
+
+namespace cc {
+
+class CC_EXPORT TransparencyDisplayItem : public DisplayItem {
+ public:
+ virtual ~TransparencyDisplayItem();
+
+ static scoped_ptr<TransparencyDisplayItem> Create(
+ float opacity,
+ SkXfermode::Mode blend_mode) {
+ return make_scoped_ptr(new TransparencyDisplayItem(opacity, blend_mode));
+ }
+
+ void Raster(SkCanvas* canvas, SkDrawPictureCallback* callback) const override;
+
+ bool IsSuitableForGpuRasterization() const override;
+ int ApproximateOpCount() const override;
+ size_t PictureMemoryUsage() const override;
+
+ protected:
+ TransparencyDisplayItem(float opacity, SkXfermode::Mode blend_mode);
+
+ private:
+ float opacity_;
+ SkXfermode::Mode blend_mode_;
+};
+
+class CC_EXPORT EndTransparencyDisplayItem : public DisplayItem {
+ public:
+ virtual ~EndTransparencyDisplayItem();
+
+ static scoped_ptr<EndTransparencyDisplayItem> Create() {
+ return make_scoped_ptr(new EndTransparencyDisplayItem());
+ }
+
+ void Raster(SkCanvas* canvas, SkDrawPictureCallback* callback) const override;
+
+ bool IsSuitableForGpuRasterization() const override;
+ int ApproximateOpCount() const override;
+ size_t PictureMemoryUsage() const override;
+
+ protected:
+ EndTransparencyDisplayItem();
+};
+
+} // namespace cc
+
+#endif // CC_RESOURCES_TRANSPARENCY_DISPLAY_ITEM_H_
diff --git a/cc/resources/video_resource_updater.cc b/cc/resources/video_resource_updater.cc
index 7a775d9..2c9a688 100644
--- a/cc/resources/video_resource_updater.cc
+++ b/cc/resources/video_resource_updater.cc
@@ -20,7 +20,6 @@
namespace {
-const ResourceFormat kYUVResourceFormat = LUMINANCE_8;
const ResourceFormat kRGBResourceFormat = RGBA_8888;
class SyncPointClientImpl : public media::VideoFrame::SyncPointClient {
@@ -40,6 +39,37 @@
} // namespace
+VideoResourceUpdater::PlaneResource::PlaneResource(
+ unsigned int resource_id,
+ const gfx::Size& resource_size,
+ ResourceFormat resource_format,
+ gpu::Mailbox mailbox)
+ : resource_id(resource_id),
+ resource_size(resource_size),
+ resource_format(resource_format),
+ mailbox(mailbox),
+ frame_ptr(nullptr),
+ plane_index(0) {
+}
+
+bool VideoResourceUpdater::PlaneResourceMatchesUniqueID(
+ const PlaneResource& plane_resource,
+ const media::VideoFrame* video_frame,
+ int plane_index) {
+ return plane_resource.frame_ptr == video_frame &&
+ plane_resource.plane_index == plane_index &&
+ plane_resource.timestamp == video_frame->timestamp();
+}
+
+void VideoResourceUpdater::SetPlaneResourceUniqueId(
+ const media::VideoFrame* video_frame,
+ int plane_index,
+ PlaneResource* plane_resource) {
+ plane_resource->frame_ptr = video_frame;
+ plane_resource->plane_index = plane_index;
+ plane_resource->timestamp = video_frame->timestamp();
+}
+
VideoFrameExternalResources::VideoFrameExternalResources() : type(NONE) {}
VideoFrameExternalResources::~VideoFrameExternalResources() {}
@@ -104,14 +134,12 @@
// each plane in the frame.
static gfx::Size SoftwarePlaneDimension(
const scoped_refptr<media::VideoFrame>& input_frame,
- ResourceFormat output_resource_format,
+ bool software_compositor,
size_t plane_index) {
- if (output_resource_format == kYUVResourceFormat) {
+ if (!software_compositor) {
return media::VideoFrame::PlaneSize(
input_frame->format(), plane_index, input_frame->coded_size());
}
-
- DCHECK_EQ(output_resource_format, kRGBResourceFormat);
return input_frame->coded_size();
}
@@ -145,7 +173,8 @@
bool software_compositor = context_provider_ == NULL;
- ResourceFormat output_resource_format = kYUVResourceFormat;
+ ResourceFormat output_resource_format =
+ resource_provider_->yuv_resource_format();
size_t output_plane_count = media::VideoFrame::NumPlanes(input_frame_format);
// TODO(skaslev): If we're in software compositing mode, we do the YUV -> RGB
@@ -163,7 +192,7 @@
for (size_t i = 0; i < output_plane_count; ++i) {
gfx::Size output_plane_resource_size =
- SoftwarePlaneDimension(video_frame, output_resource_format, i);
+ SoftwarePlaneDimension(video_frame, software_compositor, i);
if (output_plane_resource_size.IsEmpty() ||
output_plane_resource_size.width() > max_resource_size ||
output_plane_resource_size.height() > max_resource_size) {
@@ -171,57 +200,56 @@
break;
}
- ResourceProvider::ResourceId resource_id = 0;
- gpu::Mailbox mailbox;
-
// Try recycle a previously-allocated resource.
- for (size_t i = 0; i < recycled_resources_.size(); ++i) {
- bool resource_matches =
- recycled_resources_[i].resource_format == output_resource_format &&
- recycled_resources_[i].resource_size == output_plane_resource_size;
- bool not_in_use =
- !software_compositor || !resource_provider_->InUseByConsumer(
- recycled_resources_[i].resource_id);
- if (resource_matches && not_in_use) {
- resource_id = recycled_resources_[i].resource_id;
- mailbox = recycled_resources_[i].mailbox;
- recycled_resources_.erase(recycled_resources_.begin() + i);
- break;
+ auto recycled_it = recycled_resources_.end();
+ for (auto it = recycled_resources_.begin(); it != recycled_resources_.end();
+ ++it) {
+ const bool resource_matches =
+ it->resource_format == output_resource_format &&
+ it->resource_size == output_plane_resource_size;
+ const bool in_use = software_compositor &&
+ resource_provider_->InUseByConsumer(it->resource_id);
+ if (resource_matches && !in_use) {
+ // We found a recycled resource with the allocation size and format we
+ // are looking for.
+ recycled_it = it;
+ // Keep looking for a recycled resource that also contains the data we
+ // are planning to put in it.
+ if (PlaneResourceMatchesUniqueID(*it, video_frame.get(), i))
+ break;
}
}
- if (resource_id == 0) {
- // TODO(danakj): Abstract out hw/sw resource create/delete from
- // ResourceProvider and stop using ResourceProvider in this class.
- resource_id = resource_provider_->CreateResource(
- output_plane_resource_size,
- GL_CLAMP_TO_EDGE,
- ResourceProvider::TextureHintImmutable,
- output_resource_format);
-
- DCHECK(mailbox.IsZero());
-
- if (!software_compositor) {
- DCHECK(context_provider_);
-
- gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL();
-
- GLC(gl, gl->GenMailboxCHROMIUM(mailbox.name));
- ResourceProvider::ScopedWriteLockGL lock(resource_provider_,
- resource_id);
- GLC(gl,
- gl->ProduceTextureDirectCHROMIUM(
- lock.texture_id(), GL_TEXTURE_2D, mailbox.name));
- }
-
- if (resource_id)
- all_resources_.push_back(resource_id);
+ // Check if we can avoid allocating a new resource.
+ if (recycled_it != recycled_resources_.end()) {
+ plane_resources.push_back(*recycled_it);
+ recycled_resources_.erase(recycled_it);
+ continue;
}
+ // TODO(danakj): Abstract out hw/sw resource create/delete from
+ // ResourceProvider and stop using ResourceProvider in this class.
+ const ResourceProvider::ResourceId resource_id =
+ resource_provider_->CreateResource(
+ output_plane_resource_size, GL_CLAMP_TO_EDGE,
+ ResourceProvider::TextureHintImmutable, output_resource_format);
if (resource_id == 0) {
allocation_success = false;
break;
}
+ all_resources_.push_back(resource_id);
+
+ gpu::Mailbox mailbox;
+ if (!software_compositor) {
+ DCHECK(context_provider_);
+
+ gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL();
+
+ GLC(gl, gl->GenMailboxCHROMIUM(mailbox.name));
+ ResourceProvider::ScopedWriteLockGL lock(resource_provider_, resource_id);
+ GLC(gl, gl->ProduceTextureDirectCHROMIUM(lock.texture_id(), GL_TEXTURE_2D,
+ mailbox.name));
+ }
DCHECK(software_compositor || !mailbox.IsZero());
plane_resources.push_back(PlaneResource(resource_id,
@@ -243,26 +271,23 @@
DCHECK_EQ(plane_resources[0].resource_format, kRGBResourceFormat);
DCHECK(plane_resources[0].mailbox.IsZero());
- if (!video_renderer_)
- video_renderer_.reset(new media::SkCanvasVideoRenderer);
+ if (!PlaneResourceMatchesUniqueID(plane_resources[0], video_frame.get(),
+ 0)) {
+ // We need to transfer data from |video_frame| to the plane resource.
+ if (!video_renderer_)
+ video_renderer_.reset(new media::SkCanvasVideoRenderer);
- {
ResourceProvider::ScopedWriteLockSoftware lock(
resource_provider_, plane_resources[0].resource_id);
SkCanvas canvas(lock.sk_bitmap());
video_renderer_->Copy(video_frame, &canvas);
+ SetPlaneResourceUniqueId(video_frame.get(), 0, &plane_resources[0]);
}
- RecycleResourceData recycle_data = {
- plane_resources[0].resource_id,
- plane_resources[0].resource_size,
- plane_resources[0].resource_format,
- gpu::Mailbox()
- };
external_resources.software_resources.push_back(
plane_resources[0].resource_id);
external_resources.software_release_callback =
- base::Bind(&RecycleResource, AsWeakPtr(), recycle_data);
+ base::Bind(&RecycleResource, AsWeakPtr(), plane_resources[0]);
external_resources.type = VideoFrameExternalResources::SOFTWARE_RESOURCE;
return external_resources;
@@ -270,32 +295,27 @@
for (size_t i = 0; i < plane_resources.size(); ++i) {
// Update each plane's resource id with its content.
- DCHECK_EQ(plane_resources[i].resource_format, kYUVResourceFormat);
+ DCHECK_EQ(plane_resources[i].resource_format,
+ resource_provider_->yuv_resource_format());
- const uint8_t* input_plane_pixels = video_frame->data(i);
+ if (!PlaneResourceMatchesUniqueID(plane_resources[i], video_frame.get(),
+ i)) {
+ // We need to transfer data from |video_frame| to the plane resource.
+ const uint8_t* input_plane_pixels = video_frame->data(i);
- gfx::Rect image_rect(0,
- 0,
- video_frame->stride(i),
- plane_resources[i].resource_size.height());
- gfx::Rect source_rect(plane_resources[i].resource_size);
- resource_provider_->SetPixels(plane_resources[i].resource_id,
- input_plane_pixels,
- image_rect,
- source_rect,
- gfx::Vector2d());
-
- RecycleResourceData recycle_data = {
- plane_resources[i].resource_id,
- plane_resources[i].resource_size,
- plane_resources[i].resource_format,
- plane_resources[i].mailbox
- };
+ gfx::Rect image_rect(0, 0, video_frame->stride(i),
+ plane_resources[i].resource_size.height());
+ gfx::Rect source_rect(plane_resources[i].resource_size);
+ resource_provider_->SetPixels(plane_resources[i].resource_id,
+ input_plane_pixels, image_rect, source_rect,
+ gfx::Vector2d());
+ SetPlaneResourceUniqueId(video_frame.get(), i, &plane_resources[i]);
+ }
external_resources.mailboxes.push_back(
TextureMailbox(plane_resources[i].mailbox, GL_TEXTURE_2D, 0));
external_resources.release_callbacks.push_back(
- base::Bind(&RecycleResource, AsWeakPtr(), recycle_data));
+ base::Bind(&RecycleResource, AsWeakPtr(), plane_resources[i]));
}
external_resources.type = VideoFrameExternalResources::YUV_RESOURCE;
@@ -362,7 +382,7 @@
// static
void VideoResourceUpdater::RecycleResource(
base::WeakPtr<VideoResourceUpdater> updater,
- RecycleResourceData data,
+ PlaneResource data,
uint32 sync_point,
bool lost_resource,
BlockingTaskRunner* main_thread_task_runner) {
@@ -385,16 +405,12 @@
// Drop recycled resources that are the wrong format.
while (!updater->recycled_resources_.empty() &&
updater->recycled_resources_.back().resource_format !=
- data.resource_format) {
+ data.resource_format) {
updater->DeleteResource(updater->recycled_resources_.back().resource_id);
updater->recycled_resources_.pop_back();
}
- PlaneResource recycled_resource(data.resource_id,
- data.resource_size,
- data.resource_format,
- data.mailbox);
- updater->recycled_resources_.push_back(recycled_resource);
+ updater->recycled_resources_.push_back(data);
}
} // namespace cc
diff --git a/cc/resources/video_resource_updater.h b/cc/resources/video_resource_updater.h
index 99800b4..38f6033 100644
--- a/cc/resources/video_resource_updater.h
+++ b/cc/resources/video_resource_updater.h
@@ -10,6 +10,7 @@
#include "base/basictypes.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
+#include "base/time/time.h"
#include "cc/base/cc_export.h"
#include "cc/resources/release_callback_impl.h"
#include "cc/resources/resource_format.h"
@@ -77,17 +78,28 @@
gfx::Size resource_size;
ResourceFormat resource_format;
gpu::Mailbox mailbox;
+ // These last three members will be used for identifying the data stored in
+ // this resource, and uniquely identifies a media::VideoFrame plane. The
+ // frame pointer will only be used for pointer comparison, i.e. the
+ // underlying data will not be accessed.
+ const void* frame_ptr;
+ int plane_index;
+ base::TimeDelta timestamp;
PlaneResource(unsigned resource_id,
const gfx::Size& resource_size,
ResourceFormat resource_format,
- gpu::Mailbox mailbox)
- : resource_id(resource_id),
- resource_size(resource_size),
- resource_format(resource_format),
- mailbox(mailbox) {}
+ gpu::Mailbox mailbox);
};
+ static bool PlaneResourceMatchesUniqueID(const PlaneResource& plane_resource,
+ const media::VideoFrame* video_frame,
+ int plane_index);
+
+ static void SetPlaneResourceUniqueId(const media::VideoFrame* video_frame,
+ int plane_index,
+ PlaneResource* plane_resource);
+
void DeleteResource(unsigned resource_id);
bool VerifyFrame(const scoped_refptr<media::VideoFrame>& video_frame);
VideoFrameExternalResources CreateForHardwarePlanes(
@@ -95,14 +107,8 @@
VideoFrameExternalResources CreateForSoftwarePlanes(
const scoped_refptr<media::VideoFrame>& video_frame);
- struct RecycleResourceData {
- unsigned resource_id;
- gfx::Size resource_size;
- ResourceFormat resource_format;
- gpu::Mailbox mailbox;
- };
static void RecycleResource(base::WeakPtr<VideoResourceUpdater> updater,
- RecycleResourceData data,
+ PlaneResource data,
uint32 sync_point,
bool lost_resource,
BlockingTaskRunner* main_thread_task_runner);
@@ -117,6 +123,8 @@
scoped_ptr<media::SkCanvasVideoRenderer> video_renderer_;
std::vector<unsigned> all_resources_;
+ // Recycle resources so that we can reduce the number of allocations and
+ // data transfers.
std::vector<PlaneResource> recycled_resources_;
DISALLOW_COPY_AND_ASSIGN(VideoResourceUpdater);
diff --git a/cc/resources/video_resource_updater_unittest.cc b/cc/resources/video_resource_updater_unittest.cc
index c0a4af4..1e3481b 100644
--- a/cc/resources/video_resource_updater_unittest.cc
+++ b/cc/resources/video_resource_updater_unittest.cc
@@ -17,11 +17,33 @@
namespace cc {
namespace {
+class WebGraphicsContext3DUploadCounter : public TestWebGraphicsContext3D {
+ public:
+ void texSubImage2D(GLenum target,
+ GLint level,
+ GLint xoffset,
+ GLint yoffset,
+ GLsizei width,
+ GLsizei height,
+ GLenum format,
+ GLenum type,
+ const void* pixels) override {
+ ++upload_count_;
+ }
+
+ int UploadCount() { return upload_count_; }
+ void ResetUploadCount() { upload_count_ = 0; }
+
+ private:
+ int upload_count_;
+};
+
class VideoResourceUpdaterTest : public testing::Test {
protected:
VideoResourceUpdaterTest() {
- scoped_ptr<TestWebGraphicsContext3D> context3d =
- TestWebGraphicsContext3D::Create();
+ scoped_ptr<WebGraphicsContext3DUploadCounter> context3d(
+ new WebGraphicsContext3DUploadCounter());
+
context3d_ = context3d.get();
output_surface3d_ =
@@ -60,7 +82,7 @@
base::Closure()); // no_longer_needed_cb
}
- TestWebGraphicsContext3D* context3d_;
+ WebGraphicsContext3DUploadCounter* context3d_;
FakeOutputSurfaceClient client_;
scoped_ptr<FakeOutputSurface> output_surface3d_;
scoped_ptr<TestSharedBitmapManager> shared_bitmap_manager_;
@@ -77,5 +99,52 @@
EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type);
}
+TEST_F(VideoResourceUpdaterTest, ReuseResource) {
+ VideoResourceUpdater updater(output_surface3d_->context_provider(),
+ resource_provider3d_.get());
+ scoped_refptr<media::VideoFrame> video_frame = CreateTestYUVVideoFrame();
+ video_frame->set_timestamp(base::TimeDelta::FromSeconds(1234));
+
+ // Allocate the resources for a YUV video frame.
+ context3d_->ResetUploadCount();
+ VideoFrameExternalResources resources =
+ updater.CreateExternalResourcesFromVideoFrame(video_frame);
+ EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type);
+ EXPECT_EQ(size_t(3), resources.mailboxes.size());
+ EXPECT_EQ(size_t(3), resources.release_callbacks.size());
+ // Expect exactly three texture uploads, one for each plane.
+ EXPECT_EQ(3, context3d_->UploadCount());
+
+ const ResourceProvider::ResourceId y_resource =
+ resource_provider3d_->CreateResourceFromTextureMailbox(
+ resources.mailboxes[media::VideoFrame::kYPlane],
+ SingleReleaseCallbackImpl::Create(
+ resources.release_callbacks[media::VideoFrame::kYPlane]));
+ const ResourceProvider::ResourceId u_resource =
+ resource_provider3d_->CreateResourceFromTextureMailbox(
+ resources.mailboxes[media::VideoFrame::kUPlane],
+ SingleReleaseCallbackImpl::Create(
+ resources.release_callbacks[media::VideoFrame::kUPlane]));
+ const ResourceProvider::ResourceId v_resource =
+ resource_provider3d_->CreateResourceFromTextureMailbox(
+ resources.mailboxes[media::VideoFrame::kVPlane],
+ SingleReleaseCallbackImpl::Create(
+ resources.release_callbacks[media::VideoFrame::kVPlane]));
+
+ // Delete the resources.
+ resource_provider3d_->DeleteResource(y_resource);
+ resource_provider3d_->DeleteResource(u_resource);
+ resource_provider3d_->DeleteResource(v_resource);
+
+ // Allocate resources for the same frame.
+ context3d_->ResetUploadCount();
+ resources = updater.CreateExternalResourcesFromVideoFrame(video_frame);
+ EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type);
+ EXPECT_EQ(size_t(3), resources.mailboxes.size());
+ EXPECT_EQ(size_t(3), resources.release_callbacks.size());
+ // The data should be reused so expect no texture uploads.
+ EXPECT_EQ(0, context3d_->UploadCount());
+}
+
} // namespace
} // namespace cc
diff --git a/cc/scheduler/begin_frame_source.cc b/cc/scheduler/begin_frame_source.cc
index 5252dcc..89b794e 100644
--- a/cc/scheduler/begin_frame_source.cc
+++ b/cc/scheduler/begin_frame_source.cc
@@ -7,6 +7,7 @@
#include "base/auto_reset.h"
#include "base/debug/trace_event.h"
#include "base/debug/trace_event_argument.h"
+#include "base/location.h"
#include "base/logging.h"
#include "base/strings/string_number_conversions.h"
#include "cc/scheduler/delay_based_time_source.h"
@@ -182,7 +183,7 @@
base::TimeTicks now = Now();
BeginFrameArgs args = BeginFrameArgs::Create(
- now, now + BeginFrameArgs::DefaultInterval(),
+ BEGINFRAME_FROM_HERE, now, now + BeginFrameArgs::DefaultInterval(),
BeginFrameArgs::DefaultInterval(), BeginFrameArgs::NORMAL);
CallOnBeginFrame(args);
}
@@ -242,8 +243,8 @@
base::TimeTicks frame_time,
BeginFrameArgs::BeginFrameArgsType type) {
base::TimeTicks deadline = time_source_->NextTickTime();
- return BeginFrameArgs::Create(frame_time, deadline, time_source_->Interval(),
- type);
+ return BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, frame_time, deadline,
+ time_source_->Interval(), type);
}
// TimeSourceClient support
diff --git a/cc/scheduler/begin_frame_source_unittest.cc b/cc/scheduler/begin_frame_source_unittest.cc
index 498d10b..0972762 100644
--- a/cc/scheduler/begin_frame_source_unittest.cc
+++ b/cc/scheduler/begin_frame_source_unittest.cc
@@ -15,19 +15,18 @@
#include "testing/gtest/include/gtest/gtest.h"
// Macros to help set up expected calls on the MockBeginFrameObserver.
-#define EXPECT_BEGIN_FRAME_DROP(obs, frame_time, deadline, interval) \
- { \
- ::testing::Expectation exp = \
- EXPECT_CALL((obs), \
- OnBeginFrame(CreateBeginFrameArgsForTesting( \
- frame_time, deadline, interval))) \
- .InSequence((obs).sequence); \
+#define EXPECT_BEGIN_FRAME_DROP(obs, frame_time, deadline, interval) \
+ { \
+ ::testing::Expectation exp = \
+ EXPECT_CALL((obs), OnBeginFrame(CreateBeginFrameArgsForTesting( \
+ BEGINFRAME_FROM_HERE, frame_time, deadline, \
+ interval))).InSequence((obs).sequence); \
}
#define EXPECT_BEGIN_FRAME_USED(obs, frame_time, deadline, interval) \
{ \
- BeginFrameArgs args = \
- CreateBeginFrameArgsForTesting(frame_time, deadline, interval); \
+ BeginFrameArgs args = CreateBeginFrameArgsForTesting( \
+ BEGINFRAME_FROM_HERE, frame_time, deadline, interval); \
::testing::Expectation exp = \
EXPECT_CALL((obs), OnBeginFrame(args)).InSequence((obs).sequence); \
EXPECT_CALL((obs), LastUsedBeginFrameArgs()) \
@@ -38,15 +37,15 @@
// Macros to send BeginFrameArgs on a FakeBeginFrameSink (and verify resulting
// observer behaviour).
-#define SEND_BEGIN_FRAME(args_equal_to, source, frame_time, deadline, \
- interval) \
- { \
- BeginFrameArgs old_args = (source).TestLastUsedBeginFrameArgs(); \
- BeginFrameArgs new_args = \
- CreateBeginFrameArgsForTesting(frame_time, deadline, interval); \
- ASSERT_FALSE(old_args == new_args); \
- (source).TestOnBeginFrame(new_args); \
- EXPECT_EQ(args_equal_to, (source).TestLastUsedBeginFrameArgs()); \
+#define SEND_BEGIN_FRAME(args_equal_to, source, frame_time, deadline, \
+ interval) \
+ { \
+ BeginFrameArgs old_args = (source).TestLastUsedBeginFrameArgs(); \
+ BeginFrameArgs new_args = CreateBeginFrameArgsForTesting( \
+ BEGINFRAME_FROM_HERE, frame_time, deadline, interval); \
+ ASSERT_FALSE(old_args == new_args); \
+ (source).TestOnBeginFrame(new_args); \
+ EXPECT_EQ(args_equal_to, (source).TestLastUsedBeginFrameArgs()); \
}
// When dropping LastUsedBeginFrameArgs **shouldn't** change.
@@ -99,19 +98,25 @@
MockBeginFrameObserver::kDefaultBeginFrameArgs);
obs.OnBeginFrame(CreateBeginFrameArgsForTesting(
- 100, 200, 300)); // One call to LastUsedBeginFrameArgs
- EXPECT_EQ(obs.LastUsedBeginFrameArgs(),
- CreateBeginFrameArgsForTesting(100, 200, 300));
+ BEGINFRAME_FROM_HERE, 100, 200,
+ 300)); // One call to LastUsedBeginFrameArgs
+ EXPECT_EQ(
+ obs.LastUsedBeginFrameArgs(),
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 100, 200, 300));
obs.OnBeginFrame(CreateBeginFrameArgsForTesting(
- 400, 600, 300)); // Multiple calls to LastUsedBeginFrameArgs
- EXPECT_EQ(obs.LastUsedBeginFrameArgs(),
- CreateBeginFrameArgsForTesting(400, 600, 300));
- EXPECT_EQ(obs.LastUsedBeginFrameArgs(),
- CreateBeginFrameArgsForTesting(400, 600, 300));
+ BEGINFRAME_FROM_HERE, 400, 600,
+ 300)); // Multiple calls to LastUsedBeginFrameArgs
+ EXPECT_EQ(
+ obs.LastUsedBeginFrameArgs(),
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 400, 600, 300));
+ EXPECT_EQ(
+ obs.LastUsedBeginFrameArgs(),
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 400, 600, 300));
obs.OnBeginFrame(CreateBeginFrameArgsForTesting(
- 700, 900, 300)); // No calls to LastUsedBeginFrameArgs
+ BEGINFRAME_FROM_HERE, 700, 900,
+ 300)); // No calls to LastUsedBeginFrameArgs
}
TEST(MockBeginFrameObserverTest, ExpectOnBeginFrameStatus) {
@@ -125,28 +130,45 @@
MockBeginFrameObserver::kDefaultBeginFrameArgs);
// Used
- obs.OnBeginFrame(CreateBeginFrameArgsForTesting(100, 200, 300));
- EXPECT_EQ(obs.LastUsedBeginFrameArgs(),
- CreateBeginFrameArgsForTesting(100, 200, 300));
+ obs.OnBeginFrame(
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 100, 200, 300));
+ EXPECT_EQ(
+ obs.LastUsedBeginFrameArgs(),
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 100, 200, 300));
// Dropped
- obs.OnBeginFrame(CreateBeginFrameArgsForTesting(400, 600, 300));
- EXPECT_EQ(obs.LastUsedBeginFrameArgs(),
- CreateBeginFrameArgsForTesting(100, 200, 300));
+ obs.OnBeginFrame(
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 400, 600, 300));
+ EXPECT_EQ(
+ obs.LastUsedBeginFrameArgs(),
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 100, 200, 300));
// Dropped
- obs.OnBeginFrame(CreateBeginFrameArgsForTesting(450, 650, 300));
- EXPECT_EQ(obs.LastUsedBeginFrameArgs(),
- CreateBeginFrameArgsForTesting(100, 200, 300));
+ obs.OnBeginFrame(
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 450, 650, 300));
+ EXPECT_EQ(
+ obs.LastUsedBeginFrameArgs(),
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 100, 200, 300));
// Used
- obs.OnBeginFrame(CreateBeginFrameArgsForTesting(700, 900, 300));
- EXPECT_EQ(obs.LastUsedBeginFrameArgs(),
- CreateBeginFrameArgsForTesting(700, 900, 300));
+ obs.OnBeginFrame(
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 700, 900, 300));
+ EXPECT_EQ(
+ obs.LastUsedBeginFrameArgs(),
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 700, 900, 300));
}
const BeginFrameArgs MockBeginFrameObserver::kDefaultBeginFrameArgs =
- CreateBeginFrameArgsForTesting(-1, -1, -1);
+ CreateBeginFrameArgsForTesting(
+#ifdef NDEBUG
+ nullptr,
+#else
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "MockBeginFrameObserver::kDefaultBeginFrameArgs"),
+#endif
+ -1,
+ -1,
+ -1);
// BeginFrameObserverMixIn testing ---------------------------------------
class MockMinimalBeginFrameObserverMixIn : public BeginFrameObserverMixIn {
@@ -168,25 +190,31 @@
EXPECT_DEATH({ obs.OnBeginFrame(BeginFrameArgs()); }, "");
#endif
- BeginFrameArgs args1 = CreateBeginFrameArgsForTesting(100, 200, 300);
+ BeginFrameArgs args1 =
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 100, 200, 300);
EXPECT_CALL(obs, OnBeginFrameMixInDelegate(args1)).WillOnce(Return(true));
obs.OnBeginFrame(args1);
EXPECT_EQ(args1, obs.LastUsedBeginFrameArgs());
EXPECT_EQ(0, obs.dropped_begin_frame_args());
#ifndef NDEBUG
- EXPECT_DEATH(
- { obs.OnBeginFrame(CreateBeginFrameArgsForTesting(50, 200, 300)); }, "");
+ EXPECT_DEATH({
+ obs.OnBeginFrame(CreateBeginFrameArgsForTesting(
+ BEGINFRAME_FROM_HERE, 50, 200, 300));
+ },
+ "");
#endif
// Returning false shouldn't update the LastUsedBeginFrameArgs value.
- BeginFrameArgs args2 = CreateBeginFrameArgsForTesting(200, 300, 400);
+ BeginFrameArgs args2 =
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 200, 300, 400);
EXPECT_CALL(obs, OnBeginFrameMixInDelegate(args2)).WillOnce(Return(false));
obs.OnBeginFrame(args2);
EXPECT_EQ(args1, obs.LastUsedBeginFrameArgs());
EXPECT_EQ(1, obs.dropped_begin_frame_args());
- BeginFrameArgs args3 = CreateBeginFrameArgsForTesting(150, 300, 400);
+ BeginFrameArgs args3 =
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 150, 300, 400);
EXPECT_CALL(obs, OnBeginFrameMixInDelegate(args3)).WillOnce(Return(true));
obs.OnBeginFrame(args3);
EXPECT_EQ(args3, obs.LastUsedBeginFrameArgs());
@@ -495,7 +523,8 @@
SetNeedsBeginFramesCallsOnBeginFrameWithMissedTick) {
now_src_->SetNowMicroseconds(10010);
EXPECT_CALL((*obs_), OnBeginFrame(CreateBeginFrameArgsForTesting(
- 10000, 20000, 10000, BeginFrameArgs::MISSED)));
+ BEGINFRAME_FROM_HERE, 10000, 20000, 10000,
+ BeginFrameArgs::MISSED)));
source_->SetNeedsBeginFrames(true); // Should cause the last tick to be sent
// No tasks should need to be run for this to occur.
}
diff --git a/cc/scheduler/scheduler.cc b/cc/scheduler/scheduler.cc
index 3e6f6c6..0cce5dc 100644
--- a/cc/scheduler/scheduler.cc
+++ b/cc/scheduler/scheduler.cc
@@ -470,20 +470,16 @@
// draining the queue if we don't catch up. If we consistently can't catch
// up, our fallback should be to lower our frame rate.
base::TimeTicks now = Now();
- base::TimeDelta draw_duration_estimate = client_->DrawDurationEstimate();
- while (!begin_retro_frame_args_.empty()) {
- base::TimeTicks adjusted_deadline = AdjustedBeginImplFrameDeadline(
- begin_retro_frame_args_.front(), draw_duration_estimate);
- if (now <= adjusted_deadline)
- break;
- TRACE_EVENT_INSTANT2("cc",
- "Scheduler::BeginRetroFrame discarding",
- TRACE_EVENT_SCOPE_THREAD,
- "deadline - now",
- (adjusted_deadline - now).InMicroseconds(),
- "BeginFrameArgs",
- begin_retro_frame_args_.front().AsValue());
+ while (!begin_retro_frame_args_.empty()) {
+ const BeginFrameArgs& args = begin_retro_frame_args_.front();
+ base::TimeTicks expiration_time = args.frame_time + args.interval;
+ if (now <= expiration_time)
+ break;
+ TRACE_EVENT_INSTANT2(
+ "cc", "Scheduler::BeginRetroFrame discarding", TRACE_EVENT_SCOPE_THREAD,
+ "expiration_time - now", (expiration_time - now).InMillisecondsF(),
+ "BeginFrameArgs", begin_retro_frame_args_.front().AsValue());
begin_retro_frame_args_.pop_front();
frame_source_->DidFinishFrame(begin_retro_frame_args_.size());
}
@@ -564,19 +560,38 @@
ProcessScheduledActions();
state_machine_.OnBeginImplFrameDeadlinePending();
- ScheduleBeginImplFrameDeadline(
- AdjustedBeginImplFrameDeadline(args, draw_duration_estimate));
+
+ if (settings_.using_synchronous_renderer_compositor) {
+ // The synchronous renderer compositor has to make its GL calls
+ // within this call.
+ // TODO(brianderson): Have the OutputSurface initiate the deadline tasks
+ // so the synchronous renderer compositor can take advantage of splitting
+ // up the BeginImplFrame and deadline as well.
+ OnBeginImplFrameDeadline();
+ } else {
+ ScheduleBeginImplFrameDeadline(
+ AdjustedBeginImplFrameDeadline(args, draw_duration_estimate));
+ }
}
base::TimeTicks Scheduler::AdjustedBeginImplFrameDeadline(
const BeginFrameArgs& args,
base::TimeDelta draw_duration_estimate) const {
- if (settings_.using_synchronous_renderer_compositor) {
- // The synchronous compositor needs to draw right away.
+ // The synchronous compositor does not post a deadline task.
+ DCHECK(!settings_.using_synchronous_renderer_compositor);
+ if (settings_.main_thread_should_always_be_low_latency) {
+ // In main thread low latency mode, always start deadline early.
return base::TimeTicks();
} else if (state_machine_.ShouldTriggerBeginImplFrameDeadlineEarly()) {
// We are ready to draw a new active tree immediately.
+ // We don't use Now() here because it's somewhat expensive to call.
return base::TimeTicks();
+ } else if (settings_.main_thread_should_always_be_low_latency) {
+ // Post long deadline to keep advancing during idle period. After activation
+ // we will be able to trigger deadline early.
+ // TODO(weiliangc): Don't post deadline once input is deferred with
+ // BeginRetroFrames.
+ return args.frame_time + args.interval;
} else if (state_machine_.needs_redraw()) {
// We have an animation or fast input path on the impl thread that wants
// to draw, so don't wait too long for a new active tree.
@@ -596,15 +611,6 @@
void Scheduler::ScheduleBeginImplFrameDeadline(base::TimeTicks deadline) {
TRACE_EVENT1(
"cc", "Scheduler::ScheduleBeginImplFrameDeadline", "deadline", deadline);
- if (settings_.using_synchronous_renderer_compositor) {
- // The synchronous renderer compositor has to make its GL calls
- // within this call.
- // TODO(brianderson): Have the OutputSurface initiate the deadline tasks
- // so the sychronous renderer compositor can take advantage of splitting
- // up the BeginImplFrame and deadline as well.
- OnBeginImplFrameDeadline();
- return;
- }
begin_impl_frame_deadline_task_.Cancel();
begin_impl_frame_deadline_task_.Reset(begin_impl_frame_deadline_closure_);
@@ -618,7 +624,6 @@
void Scheduler::OnBeginImplFrameDeadline() {
TRACE_EVENT0("cc", "Scheduler::OnBeginImplFrameDeadline");
begin_impl_frame_deadline_task_.Cancel();
-
// We split the deadline actions up into two phases so the state machine
// has a chance to trigger actions that should occur durring and after
// the deadline separately. For example:
diff --git a/cc/scheduler/scheduler_settings.cc b/cc/scheduler/scheduler_settings.cc
index 84f0fcd..53abe7b 100644
--- a/cc/scheduler/scheduler_settings.cc
+++ b/cc/scheduler/scheduler_settings.cc
@@ -19,6 +19,7 @@
using_synchronous_renderer_compositor(false),
throttle_frame_production(true),
disable_hi_res_timer_tasks_on_battery(false),
+ main_thread_should_always_be_low_latency(false),
background_frame_interval(base::TimeDelta::FromSeconds(1)) {
}
@@ -38,6 +39,8 @@
throttle_frame_production(settings.throttle_frame_production),
disable_hi_res_timer_tasks_on_battery(
settings.disable_hi_res_timer_tasks_on_battery),
+ main_thread_should_always_be_low_latency(
+ settings.main_thread_should_always_be_low_latency),
background_frame_interval(base::TimeDelta::FromSecondsD(
1.0 / settings.background_animation_rate)) {
}
@@ -64,6 +67,8 @@
state->SetBoolean("throttle_frame_production", throttle_frame_production);
state->SetBoolean("disable_hi_res_timer_tasks_on_battery",
disable_hi_res_timer_tasks_on_battery);
+ state->SetBoolean("main_thread_should_always_be_low_latency",
+ main_thread_should_always_be_low_latency);
state->SetInteger("background_frame_interval",
background_frame_interval.InMicroseconds());
return state;
diff --git a/cc/scheduler/scheduler_settings.h b/cc/scheduler/scheduler_settings.h
index e3fd425..4ff3c7e 100644
--- a/cc/scheduler/scheduler_settings.h
+++ b/cc/scheduler/scheduler_settings.h
@@ -35,6 +35,12 @@
bool throttle_frame_production;
bool disable_hi_res_timer_tasks_on_battery;
+ // In main thread low latency mode the entire
+ // BeginMainFrame->Commit->Activation->Draw cycle should complete before
+ // starting the next cycle. Additionally, BeginMainFrame and Commit are
+ // completed atomically with no other tasks or actions occuring between them.
+ bool main_thread_should_always_be_low_latency;
+
base::TimeDelta background_frame_interval;
scoped_refptr<base::debug::ConvertableToTraceFormat> AsValue() const;
diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_state_machine.cc
index 5f56255..2946a2c 100644
--- a/cc/scheduler/scheduler_state_machine.cc
+++ b/cc/scheduler/scheduler_state_machine.cc
@@ -97,6 +97,8 @@
return "COMMIT_STATE_READY_TO_COMMIT";
case COMMIT_STATE_WAITING_FOR_ACTIVATION:
return "COMMIT_STATE_WAITING_FOR_ACTIVATION";
+ case COMMIT_STATE_WAITING_FOR_DRAW:
+ return "COMMIT_STATE_WAITING_FOR_DRAW";
}
NOTREACHED();
return "???";
@@ -592,9 +594,11 @@
if (commit_was_aborted || settings_.main_frame_before_activation_enabled) {
commit_state_ = COMMIT_STATE_IDLE;
+ } else if (settings_.impl_side_painting) {
+ commit_state_ = COMMIT_STATE_WAITING_FOR_ACTIVATION;
} else {
- commit_state_ = settings_.impl_side_painting
- ? COMMIT_STATE_WAITING_FOR_ACTIVATION
+ commit_state_ = settings_.main_thread_should_always_be_low_latency
+ ? COMMIT_STATE_WAITING_FOR_DRAW
: COMMIT_STATE_IDLE;
}
@@ -637,8 +641,11 @@
}
void SchedulerStateMachine::UpdateStateOnActivation() {
- if (commit_state_ == COMMIT_STATE_WAITING_FOR_ACTIVATION)
- commit_state_ = COMMIT_STATE_IDLE;
+ if (commit_state_ == COMMIT_STATE_WAITING_FOR_ACTIVATION) {
+ commit_state_ = settings_.main_thread_should_always_be_low_latency
+ ? COMMIT_STATE_WAITING_FOR_DRAW
+ : COMMIT_STATE_IDLE;
+ }
if (output_surface_state_ == OUTPUT_SURFACE_WAITING_FOR_FIRST_ACTIVATION)
output_surface_state_ = OUTPUT_SURFACE_ACTIVE;
@@ -656,6 +663,9 @@
if (forced_redraw_state_ == FORCED_REDRAW_STATE_WAITING_FOR_DRAW)
forced_redraw_state_ = FORCED_REDRAW_STATE_IDLE;
+ if (commit_state_ == COMMIT_STATE_WAITING_FOR_DRAW)
+ commit_state_ = COMMIT_STATE_IDLE;
+
needs_redraw_ = false;
active_tree_needs_first_draw_ = false;
@@ -991,6 +1001,11 @@
DCHECK(commit_state_ == COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED)
<< AsValue()->ToString();
commit_state_ = COMMIT_STATE_READY_TO_COMMIT;
+ // In main thread low latency mode, commit should happen right after
+ // BeginFrame, meaning when this function is called, next action should be
+ // commit.
+ if (settings_.main_thread_should_always_be_low_latency)
+ DCHECK(ShouldCommit());
}
void SchedulerStateMachine::BeginMainFrameAborted(bool did_handle) {
diff --git a/cc/scheduler/scheduler_state_machine.h b/cc/scheduler/scheduler_state_machine.h
index c69c959..12f8635 100644
--- a/cc/scheduler/scheduler_state_machine.h
+++ b/cc/scheduler/scheduler_state_machine.h
@@ -68,6 +68,7 @@
COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED,
COMMIT_STATE_READY_TO_COMMIT,
COMMIT_STATE_WAITING_FOR_ACTIVATION,
+ COMMIT_STATE_WAITING_FOR_DRAW,
};
static const char* CommitStateToString(CommitState state);
diff --git a/cc/scheduler/scheduler_state_machine_unittest.cc b/cc/scheduler/scheduler_state_machine_unittest.cc
index af6d83a..f46389b 100644
--- a/cc/scheduler/scheduler_state_machine_unittest.cc
+++ b/cc/scheduler/scheduler_state_machine_unittest.cc
@@ -44,7 +44,8 @@
SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT,
SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED,
SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
- SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_ACTIVATION};
+ SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_ACTIVATION,
+ SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_DRAW};
// Exposes the protected state fields of the SchedulerStateMachine for testing
class StateMachine : public SchedulerStateMachine {
@@ -122,7 +123,8 @@
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
EXPECT_FALSE(state.BeginFrameNeeded());
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
state.OnBeginImplFrameDeadline();
@@ -140,7 +142,8 @@
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
EXPECT_FALSE(state.BeginFrameNeeded());
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
state.OnBeginImplFrameDeadline();
}
@@ -158,7 +161,8 @@
EXPECT_TRUE(state.BeginFrameNeeded());
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
}
@@ -195,7 +199,7 @@
EXPECT_TRUE(state.BeginFrameNeeded());
// Commit to the pending tree.
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
@@ -211,7 +215,7 @@
// Verify that the next commit starts while there is still a pending tree.
state.SetNeedsCommit();
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
@@ -252,7 +256,7 @@
state.SetNeedsRedraw(true);
EXPECT_TRUE(state.RedrawPending());
EXPECT_TRUE(state.BeginFrameNeeded());
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
state.OnBeginImplFrameDeadline();
@@ -269,7 +273,7 @@
// Failing the draw makes us require a commit.
state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
@@ -289,7 +293,7 @@
EXPECT_TRUE(state.RedrawPending());
EXPECT_TRUE(state.BeginFrameNeeded());
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
state.OnBeginImplFrameDeadline();
@@ -303,7 +307,7 @@
// Missing high res content requires a commit (but not a redraw)
state.DidDrawIfPossibleCompleted(DRAW_ABORTED_MISSING_HIGH_RES_CONTENT);
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_FALSE(state.RedrawPending());
@@ -323,7 +327,7 @@
state.SetNeedsRedraw(true);
EXPECT_TRUE(state.RedrawPending());
EXPECT_TRUE(state.BeginFrameNeeded());
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
state.OnBeginImplFrameDeadline();
@@ -344,7 +348,7 @@
// Failing the draw for animation checkerboards makes us require a commit.
state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
@@ -365,7 +369,7 @@
// Start a commit.
state.SetNeedsCommit();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
@@ -395,7 +399,7 @@
EXPECT_TRUE(state.RedrawPending());
// The redraw should be forced at the end of the next BeginImplFrame.
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
@@ -423,7 +427,7 @@
// Start a commit.
state.SetNeedsCommit();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
@@ -480,7 +484,7 @@
// Start a draw.
state.SetNeedsRedraw(true);
EXPECT_TRUE(state.BeginFrameNeeded());
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
state.OnBeginImplFrameDeadline();
@@ -497,7 +501,7 @@
// We should not be trying to draw again now, but we have a commit pending.
EXPECT_TRUE(state.BeginFrameNeeded());
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
@@ -523,7 +527,7 @@
// Draw the first frame.
EXPECT_TRUE(state.BeginFrameNeeded());
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
@@ -542,7 +546,7 @@
// Move to another frame. This should now draw.
EXPECT_TRUE(state.BeginFrameNeeded());
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
@@ -680,7 +684,8 @@
state.SetVisible(false);
state.SetNeedsRedraw(true);
if (j == 1)
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
state.SetCanDraw(false);
EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
@@ -702,7 +707,7 @@
state.SetNeedsRedraw(true);
state.SetVisible(true);
state.SetCanDraw(false);
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT);
EXPECT_ACTION_UPDATE_STATE(
@@ -730,7 +735,7 @@
EXPECT_TRUE(state.BeginFrameNeeded());
// Begin the frame.
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT,
@@ -766,7 +771,7 @@
state.begin_impl_frame_state());
EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING,
state.begin_impl_frame_state());
EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction());
@@ -803,7 +808,7 @@
state.SetNeedsCommit();
// Begin the frame.
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT,
@@ -840,6 +845,160 @@
EXPECT_FALSE(state.needs_redraw());
}
+TEST(SchedulerStateMachineTest, TestFullCycleWithMainThreadLowLatencyMode) {
+ SchedulerSettings scheduler_settings;
+ scheduler_settings.main_thread_should_always_be_low_latency = true;
+ StateMachine state(scheduler_settings);
+ state.SetCanStart();
+ state.UpdateState(state.NextAction());
+ state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
+ state.SetVisible(true);
+ state.SetCanDraw(true);
+
+ // Start clean and set commit.
+ state.SetNeedsCommit();
+
+ // Begin the frame.
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
+ EXPECT_ACTION_UPDATE_STATE(
+ SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
+ EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT,
+ state.CommitState());
+ EXPECT_FALSE(state.NeedsCommit());
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+
+ // Tell the scheduler the frame finished.
+ state.NotifyBeginMainFrameStarted();
+ state.NotifyReadyToCommit();
+ EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
+ state.CommitState());
+
+ // Commit.
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
+ EXPECT_TRUE(state.active_tree_needs_first_draw());
+ EXPECT_TRUE(state.needs_redraw());
+
+ // Now commit should wait for draw.
+ EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_DRAW,
+ state.CommitState());
+
+ // Swap throttled. Do not draw.
+ state.DidSwapBuffers();
+ state.OnBeginImplFrameDeadline();
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+ state.DidSwapBuffersComplete();
+
+ // Haven't draw since last commit, do not begin new main frame.
+ state.SetNeedsCommit();
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+
+ // At BeginImplFrame deadline, draw.
+ state.OnBeginImplFrameDeadline();
+ EXPECT_ACTION_UPDATE_STATE(
+ SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
+ state.DidSwapBuffers();
+ state.DidDrawIfPossibleCompleted(DRAW_SUCCESS);
+ state.DidSwapBuffersComplete();
+
+ // Now will be able to start main frame.
+ EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
+ EXPECT_FALSE(state.needs_redraw());
+ EXPECT_ACTION_UPDATE_STATE(
+ SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
+}
+
+TEST(SchedulerStateMachineTest,
+ TestFullCycleWithMainThreadLowLatencyMode_ImplSidePaint) {
+ SchedulerSettings scheduler_settings;
+ scheduler_settings.main_thread_should_always_be_low_latency = true;
+ scheduler_settings.impl_side_painting = true;
+ StateMachine state(scheduler_settings);
+ state.SetCanStart();
+ state.UpdateState(state.NextAction());
+ state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
+ state.SetVisible(true);
+ state.SetCanDraw(true);
+
+ // Start clean and set commit.
+ state.SetNeedsCommit();
+
+ // Begin the frame.
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
+ EXPECT_ACTION_UPDATE_STATE(
+ SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
+ EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT,
+ state.CommitState());
+ EXPECT_FALSE(state.NeedsCommit());
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+
+ // Tell the scheduler the frame finished.
+ state.NotifyBeginMainFrameStarted();
+ state.NotifyReadyToCommit();
+ EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
+ state.CommitState());
+
+ // Commit.
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
+
+ // Now commit should wait for activation.
+ EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_ACTIVATION,
+ state.CommitState());
+
+ // No activation yet, so this commit is not drawn yet. Force to draw this
+ // frame, and still block BeginMainFrame.
+ state.SetNeedsRedraw(true);
+ state.SetNeedsCommit();
+ state.OnBeginImplFrameDeadline();
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
+ EXPECT_ACTION_UPDATE_STATE(
+ SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+
+ // Cannot BeginMainFrame yet since last commit is not yet activated and drawn.
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
+ EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_ACTIVATION,
+ state.CommitState());
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+
+ // Now activate sync tree.
+ state.NotifyReadyToActivate();
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+ EXPECT_TRUE(state.active_tree_needs_first_draw());
+ EXPECT_TRUE(state.needs_redraw());
+ EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_DRAW,
+ state.CommitState());
+
+ // Swap throttled. Do not draw.
+ state.DidSwapBuffers();
+ state.OnBeginImplFrameDeadline();
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+ state.DidSwapBuffersComplete();
+
+ // Haven't draw since last commit, do not begin new main frame.
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+
+ // At BeginImplFrame deadline, draw. This draws unblocks BeginMainFrame.
+ state.OnBeginImplFrameDeadline();
+ EXPECT_ACTION_UPDATE_STATE(
+ SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
+ state.DidSwapBuffers();
+ state.DidDrawIfPossibleCompleted(DRAW_SUCCESS);
+ state.DidSwapBuffersComplete();
+
+ // Now will be able to start main frame.
+ EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
+ EXPECT_FALSE(state.needs_redraw());
+ EXPECT_ACTION_UPDATE_STATE(
+ SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
+}
+
TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) {
SchedulerSettings default_scheduler_settings;
StateMachine state(default_scheduler_settings);
@@ -853,7 +1012,7 @@
state.SetNeedsCommit();
// Begin the frame.
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT,
@@ -894,7 +1053,7 @@
EXPECT_FALSE(state.needs_redraw());
// Next BeginImplFrame should initiate second commit.
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
}
@@ -922,7 +1081,7 @@
state.SetNeedsCommit();
// Begin the frame while visible.
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT,
@@ -952,7 +1111,7 @@
EXPECT_TRUE(state.NeedsCommit());
// Start a new frame.
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
@@ -991,7 +1150,7 @@
// Start a new frame; draw because this is the first frame since output
// surface init'd.
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
state.OnBeginImplFrameDeadline();
@@ -1043,7 +1202,7 @@
// Become visible and start a new frame.
state.SetVisible(true);
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
@@ -1108,7 +1267,7 @@
EXPECT_TRUE(state.NeedsCommit());
// We should get that commit when we begin the next frame.
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
@@ -1145,7 +1304,7 @@
EXPECT_TRUE(state.NeedsCommit());
// Begin a frame when not visible, the scheduler animates but does not commit.
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState());
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
@@ -1171,14 +1330,14 @@
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
// Check that the first init does not SetNeedsCommit.
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
state.OnBeginImplFrameDeadline();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
// Check that a needs commit initiates a BeginMainFrame.
state.SetNeedsCommit();
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
}
@@ -1208,7 +1367,7 @@
state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
// When the context is recreated, we should begin a commit.
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
}
@@ -1232,14 +1391,14 @@
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
// Once context recreation begins, nothing should happen.
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
state.OnBeginImplFrameDeadline();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
// While context is recreating, commits shouldn't begin.
state.SetNeedsCommit();
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
state.OnBeginImplFrameDeadline();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
@@ -1265,7 +1424,7 @@
// Once the context is recreated, whether we draw should be based on
// SetCanDraw.
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
state.OnBeginImplFrameDeadline();
@@ -1293,7 +1452,7 @@
// Set damage and expect a draw.
state.SetNeedsRedraw(true);
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
@@ -1328,7 +1487,7 @@
EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
state.NextAction());
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING,
state.begin_impl_frame_state());
EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
@@ -1360,7 +1519,7 @@
// Set damage and expect a draw.
state.SetNeedsRedraw(true);
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
@@ -1395,7 +1554,7 @@
EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
state.NextAction());
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING,
state.begin_impl_frame_state());
EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction());
@@ -1416,7 +1575,7 @@
// After we get a new output surface, the commit flow should start.
state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
@@ -1452,7 +1611,7 @@
state.DidCreateAndInitializeOutputSurface();
EXPECT_FALSE(state.RedrawPending());
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME,
state.NextAction());
}
@@ -1584,7 +1743,7 @@
// This test mirrors what happens during the first frame of a scroll gesture.
// First we get the input event and a BeginFrame.
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
// As a response the compositor requests a redraw and a commit to tell the
// main thread about the new scroll offset.
@@ -1619,7 +1778,7 @@
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
@@ -1644,7 +1803,7 @@
// in prefer impl latency mode.
state.SetNeedsRedraw(true);
state.SetNeedsCommit();
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
@@ -1681,7 +1840,7 @@
// and did not just swap.
state.SetNeedsCommit();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineEarly());
state.OnBeginImplFrameDeadline();
@@ -1699,7 +1858,7 @@
state.SetNeedsCommit();
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
@@ -1726,7 +1885,7 @@
EXPECT_TRUE(state.BeginFrameNeeded());
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
state.OnBeginImplFrameDeadlinePending();
@@ -1752,7 +1911,7 @@
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
EXPECT_TRUE(state.BeginFrameNeeded());
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
@@ -1780,7 +1939,7 @@
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
EXPECT_TRUE(state.BeginFrameNeeded());
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
@@ -1812,7 +1971,7 @@
EXPECT_TRUE(state.BeginFrameNeeded());
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
- state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+ state.OnBeginImplFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
state.SetNeedsAnimate();
diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc
index 636beb0..2992dbc 100644
--- a/cc/scheduler/scheduler_unittest.cc
+++ b/cc/scheduler/scheduler_unittest.cc
@@ -168,19 +168,32 @@
void AdvanceFrame() {
TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler.frames"),
"FakeSchedulerClient::AdvanceFrame");
+ bool previous_deadline_pending =
+ scheduler_->BeginImplFrameDeadlinePending();
if (ExternalBeginFrame()) {
- // Creep the time forward so that any BeginFrameArgs is not equal to the
- // last one otherwise we violate the BeginFrameSource contract.
- now_src_->AdvanceNowMicroseconds(1);
- fake_external_begin_frame_source_->TestOnBeginFrame(
- CreateBeginFrameArgsForTesting(now_src_));
+ SendNextBeginFrame();
+ // This could be the previous deadline or a new one.
EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending());
}
-
+ // Consume previous deadline first. It is important that we check for the
+ // existence of a previous deadline so that we do not consume the new one.
+ if (previous_deadline_pending) {
+ EXPECT_TRUE(task_runner().RunTasksWhile(ImplFrameDeadlinePending(true)));
+ }
+ // Then run tasks until new deadline is scheduled.
EXPECT_TRUE(task_runner().RunTasksWhile(ImplFrameDeadlinePending(false)));
EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending());
}
+ void SendNextBeginFrame() {
+ DCHECK(ExternalBeginFrame());
+ // Creep the time forward so that any BeginFrameArgs is not equal to the
+ // last one otherwise we violate the BeginFrameSource contract.
+ now_src_->AdvanceNow(BeginFrameArgs::DefaultInterval());
+ fake_external_begin_frame_source_->TestOnBeginFrame(
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, now_src_));
+ }
+
OrderedSimpleTaskRunner& task_runner() { return *task_runner_; }
TestNowSource* now_src() { return now_src_.get(); }
@@ -1167,7 +1180,8 @@
scheduler->NotifyReadyToCommit();
scheduler->SetNeedsRedraw();
- BeginFrameArgs frame_args = CreateBeginFrameArgsForTesting(client.now_src());
+ BeginFrameArgs frame_args =
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, client.now_src());
frame_args.interval = base::TimeDelta::FromMilliseconds(1000);
client.fake_external_begin_frame_source()->TestOnBeginFrame(frame_args);
@@ -1240,7 +1254,8 @@
// Create a BeginFrame with a long deadline to avoid race conditions.
// This is the first BeginFrame, which will be handled immediately.
- BeginFrameArgs args = CreateBeginFrameArgsForTesting(client.now_src());
+ BeginFrameArgs args =
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, client.now_src());
args.deadline += base::TimeDelta::FromHours(1);
client.fake_external_begin_frame_source()->TestOnBeginFrame(args);
EXPECT_ACTION("WillBeginImplFrame", client, 0, 2);
@@ -1318,7 +1333,8 @@
// Create a BeginFrame with a long deadline to avoid race conditions.
// This is the first BeginFrame, which will be handled immediately.
- BeginFrameArgs args = CreateBeginFrameArgsForTesting(client.now_src());
+ BeginFrameArgs args =
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, client.now_src());
args.deadline += base::TimeDelta::FromHours(1);
client.fake_external_begin_frame_source()->TestOnBeginFrame(args);
EXPECT_ACTION("WillBeginImplFrame", client, 0, 2);
@@ -1387,6 +1403,131 @@
client.Reset();
}
+TEST(SchedulerTest, RetroFrameDoesNotExpireTooEarly) {
+ FakeSchedulerClient client;
+ SchedulerSettings scheduler_settings;
+ scheduler_settings.use_external_begin_frame_source = true;
+ TestScheduler* scheduler = client.CreateScheduler(scheduler_settings);
+ scheduler->SetCanStart();
+ scheduler->SetVisible(true);
+ scheduler->SetCanDraw(true);
+ InitializeOutputSurfaceAndFirstCommit(scheduler, &client);
+
+ client.Reset();
+ scheduler->SetNeedsCommit();
+ EXPECT_TRUE(client.needs_begin_frames());
+ EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client);
+
+ client.Reset();
+ client.AdvanceFrame();
+ EXPECT_ACTION("WillBeginImplFrame", client, 0, 2);
+ EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2);
+ EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
+
+ client.Reset();
+ scheduler->NotifyBeginMainFrameStarted();
+
+ client.Reset();
+ client.SendNextBeginFrame();
+ // This BeginFrame is queued up as a retro frame.
+ EXPECT_NO_ACTION(client);
+ // The previous deadline is still pending.
+ EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
+
+ client.Reset();
+ // This commit should schedule the (previous) deadline to trigger immediately.
+ scheduler->NotifyReadyToCommit();
+ EXPECT_SINGLE_ACTION("ScheduledActionCommit", client);
+
+ client.Reset();
+ // The deadline task should trigger causing a draw.
+ EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
+ client.task_runner().RunTasksWhile(client.ImplFrameDeadlinePending(true));
+ EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2);
+ EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2);
+
+ // Keep animating.
+ client.Reset();
+ scheduler->SetNeedsAnimate();
+ scheduler->SetNeedsRedraw();
+ EXPECT_NO_ACTION(client);
+
+ // Let's advance sufficiently past the next frame's deadline.
+ client.now_src()->AdvanceNow(
+ BeginFrameArgs::DefaultInterval() -
+ BeginFrameArgs::DefaultEstimatedParentDrawTime() +
+ base::TimeDelta::FromMicroseconds(1));
+
+ // The retro frame hasn't expired yet.
+ client.task_runner().RunTasksWhile(client.ImplFrameDeadlinePending(false));
+ EXPECT_ACTION("WillBeginImplFrame", client, 0, 2);
+ EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2);
+ EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
+
+ // This is an immediate deadline case.
+ client.Reset();
+ client.task_runner().RunPendingTasks();
+ EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
+ EXPECT_SINGLE_ACTION("ScheduledActionDrawAndSwapIfPossible", client);
+}
+
+TEST(SchedulerTest, RetroFrameDoesNotExpireTooLate) {
+ FakeSchedulerClient client;
+ SchedulerSettings scheduler_settings;
+ scheduler_settings.use_external_begin_frame_source = true;
+ TestScheduler* scheduler = client.CreateScheduler(scheduler_settings);
+ scheduler->SetCanStart();
+ scheduler->SetVisible(true);
+ scheduler->SetCanDraw(true);
+ InitializeOutputSurfaceAndFirstCommit(scheduler, &client);
+
+ client.Reset();
+ scheduler->SetNeedsCommit();
+ EXPECT_TRUE(client.needs_begin_frames());
+ EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client);
+
+ client.Reset();
+ client.AdvanceFrame();
+ EXPECT_ACTION("WillBeginImplFrame", client, 0, 2);
+ EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2);
+ EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
+
+ client.Reset();
+ scheduler->NotifyBeginMainFrameStarted();
+
+ client.Reset();
+ client.SendNextBeginFrame();
+ // This BeginFrame is queued up as a retro frame.
+ EXPECT_NO_ACTION(client);
+ // The previous deadline is still pending.
+ EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
+
+ client.Reset();
+ // This commit should schedule the (previous) deadline to trigger immediately.
+ scheduler->NotifyReadyToCommit();
+ EXPECT_SINGLE_ACTION("ScheduledActionCommit", client);
+
+ client.Reset();
+ // The deadline task should trigger causing a draw.
+ EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
+ client.task_runner().RunTasksWhile(client.ImplFrameDeadlinePending(true));
+ EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2);
+ EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2);
+
+ // Keep animating.
+ client.Reset();
+ scheduler->SetNeedsAnimate();
+ scheduler->SetNeedsRedraw();
+ EXPECT_NO_ACTION(client);
+
+ // Let's advance sufficiently past the next frame's deadline.
+ client.now_src()->AdvanceNow(BeginFrameArgs::DefaultInterval() +
+ base::TimeDelta::FromMicroseconds(1));
+
+ // The retro frame should've expired.
+ EXPECT_NO_ACTION(client);
+}
+
void BeginFramesNotFromClient(bool use_external_begin_frame_source,
bool throttle_frame_production) {
FakeSchedulerClient client;
@@ -1793,7 +1934,8 @@
// Create a BeginFrame with a long deadline to avoid race conditions.
// This is the first BeginFrame, which will be handled immediately.
client.Reset();
- BeginFrameArgs args = CreateBeginFrameArgsForTesting(client.now_src());
+ BeginFrameArgs args =
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, client.now_src());
args.deadline += base::TimeDelta::FromHours(1);
client.fake_external_begin_frame_source()->TestOnBeginFrame(args);
EXPECT_ACTION("WillBeginImplFrame", client, 0, 2);
@@ -1852,7 +1994,8 @@
// Create a BeginFrame with a long deadline to avoid race conditions.
// This is the first BeginFrame, which will be handled immediately.
client.Reset();
- BeginFrameArgs args = CreateBeginFrameArgsForTesting(client.now_src());
+ BeginFrameArgs args =
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, client.now_src());
args.deadline += base::TimeDelta::FromHours(1);
client.fake_external_begin_frame_source()->TestOnBeginFrame(args);
EXPECT_ACTION("WillBeginImplFrame", client, 0, 2);
diff --git a/cc/surfaces/BUILD.gn b/cc/surfaces/BUILD.gn
index a45e786..ea44068 100644
--- a/cc/surfaces/BUILD.gn
+++ b/cc/surfaces/BUILD.gn
@@ -2,6 +2,14 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+source_set("surface_id") {
+ sources = [
+ "surface_id.h",
+ ]
+
+ deps = [ "//base" ]
+}
+
component("surfaces") {
output_name = "cc_surfaces"
sources = [
@@ -15,7 +23,6 @@
"surface_factory.cc",
"surface_factory.h",
"surface_factory_client.h",
- "surface_id.h",
"surface_id_allocator.cc",
"surface_id_allocator.h",
"surface_manager.cc",
@@ -28,6 +35,7 @@
defines = [ "CC_SURFACES_IMPLEMENTATION=1" ]
deps = [
+ ":surface_id",
"//base",
"//base/third_party/dynamic_annotations",
"//cc",
diff --git a/cc/surfaces/display.cc b/cc/surfaces/display.cc
index a8ae27a..9257446 100644
--- a/cc/surfaces/display.cc
+++ b/cc/surfaces/display.cc
@@ -49,15 +49,23 @@
return output_surface_->BindToClient(this);
}
-void Display::Resize(SurfaceId id,
- const gfx::Size& size,
- float device_scale_factor) {
+void Display::SetSurfaceId(SurfaceId id, float device_scale_factor) {
current_surface_id_ = id;
- current_surface_size_ = size;
device_scale_factor_ = device_scale_factor;
client_->DisplayDamaged();
}
+void Display::Resize(const gfx::Size& size) {
+ if (size == current_surface_size_)
+ return;
+ // Need to ensure all pending swaps have executed before the window is
+ // resized, or D3D11 will scale the swap output.
+ if (renderer_ && settings_.finish_rendering_on_resize)
+ renderer_->Finish();
+ current_surface_size_ = size;
+ client_->DisplayDamaged();
+}
+
void Display::InitializeRenderer() {
if (resource_provider_)
return;
@@ -112,6 +120,9 @@
benchmark_instrumentation::IssueDisplayRenderingStatsEvent();
DelegatedFrameData* frame_data = frame->delegated_frame_data.get();
+ gfx::Size surface_size =
+ frame_data->render_pass_list.back()->output_rect.size();
+
gfx::Rect device_viewport_rect = gfx::Rect(current_surface_size_);
gfx::Rect device_clip_rect = device_viewport_rect;
bool disable_picture_quad_image_filtering = false;
@@ -122,7 +133,14 @@
device_viewport_rect,
device_clip_rect,
disable_picture_quad_image_filtering);
- renderer_->SwapBuffers(frame->metadata);
+
+ bool disable_swap = surface_size != current_surface_size_;
+ if (disable_swap) {
+ DidSwapBuffers();
+ } else {
+ renderer_->SwapBuffers(frame->metadata);
+ }
+
for (SurfaceAggregator::SurfaceIndexMap::iterator it =
aggregator_->previous_contained_surfaces().begin();
it != aggregator_->previous_contained_surfaces().end();
@@ -131,6 +149,8 @@
if (surface)
surface->RunDrawCallbacks();
}
+ if (disable_swap)
+ DidSwapBuffersComplete();
return true;
}
diff --git a/cc/surfaces/display.h b/cc/surfaces/display.h
index a0bb62a..47c55bb 100644
--- a/cc/surfaces/display.h
+++ b/cc/surfaces/display.h
@@ -51,9 +51,8 @@
// device_scale_factor is used to communicate to the external window system
// what scale this was rendered at.
- void Resize(SurfaceId id,
- const gfx::Size& new_size,
- float device_scale_factor);
+ void SetSurfaceId(SurfaceId id, float device_scale_factor);
+ void Resize(const gfx::Size& new_size);
bool Draw();
SurfaceId CurrentSurfaceId();
diff --git a/cc/surfaces/surface.cc b/cc/surfaces/surface.cc
index 600455f..c7b1145 100644
--- a/cc/surfaces/surface.cc
+++ b/cc/surfaces/surface.cc
@@ -18,9 +18,8 @@
// completely damaged the first time they're drawn from.
static const int kFrameIndexStart = 2;
-Surface::Surface(SurfaceId id, const gfx::Size& size, SurfaceFactory* factory)
+Surface::Surface(SurfaceId id, SurfaceFactory* factory)
: surface_id_(id),
- size_(size),
factory_(factory->AsWeakPtr()),
frame_index_(kFrameIndexStart) {
}
diff --git a/cc/surfaces/surface.h b/cc/surfaces/surface.h
index 7b3fbc1..ed0061d 100644
--- a/cc/surfaces/surface.h
+++ b/cc/surfaces/surface.h
@@ -34,10 +34,9 @@
class CC_SURFACES_EXPORT Surface {
public:
- Surface(SurfaceId id, const gfx::Size& size, SurfaceFactory* factory);
+ Surface(SurfaceId id, SurfaceFactory* factory);
~Surface();
- const gfx::Size& size() const { return size_; }
SurfaceId surface_id() const { return surface_id_; }
void QueueFrame(scoped_ptr<CompositorFrame> frame,
@@ -74,7 +73,6 @@
void ClearCopyRequests();
SurfaceId surface_id_;
- gfx::Size size_;
base::WeakPtr<SurfaceFactory> factory_;
// TODO(jamesr): Support multiple frames in flight.
scoped_ptr<CompositorFrame> current_frame_;
diff --git a/cc/surfaces/surface_aggregator.cc b/cc/surfaces/surface_aggregator.cc
index f5689c5..2334d14 100644
--- a/cc/surfaces/surface_aggregator.cc
+++ b/cc/surfaces/surface_aggregator.cc
@@ -153,13 +153,14 @@
}
gfx::Rect SurfaceAggregator::DamageRectForSurface(const Surface* surface,
- const RenderPass& source) {
+ const RenderPass& source,
+ const gfx::Rect& full_rect) {
int previous_index = previous_contained_surfaces_[surface->surface_id()];
if (previous_index == surface->frame_index())
return gfx::Rect();
else if (previous_index == surface->frame_index() - 1)
return source.damage_rect;
- return gfx::Rect(surface->size());
+ return full_rect;
}
void SurfaceAggregator::HandleSurfaceQuad(const SurfaceDrawQuad* surface_quad,
@@ -267,7 +268,8 @@
gfx::UnionRects(dest_pass->damage_rect,
MathUtil::MapEnclosingClippedRect(
surface_quad->quadTransform(),
- DamageRectForSurface(surface, last_pass)));
+ DamageRectForSurface(surface, last_pass,
+ surface_quad->visible_rect)));
referenced_surfaces_.erase(it);
}
@@ -364,9 +366,8 @@
RenderPassId remapped_pass_id =
RemapPassId(source.id, surface->surface_id());
- copy_pass->SetAll(remapped_pass_id,
- source.output_rect,
- DamageRectForSurface(surface, source),
+ copy_pass->SetAll(remapped_pass_id, source.output_rect,
+ DamageRectForSurface(surface, source, source.output_rect),
source.transform_to_root_target,
source.has_transparent_background);
@@ -415,6 +416,9 @@
referenced_surfaces_.erase(it);
DCHECK(referenced_surfaces_.empty());
+ if (dest_pass_list_->empty())
+ return nullptr;
+
dest_pass_list_ = NULL;
RemoveUnreferencedChildren();
contained_surfaces_.swap(previous_contained_surfaces_);
diff --git a/cc/surfaces/surface_aggregator.h b/cc/surfaces/surface_aggregator.h
index 6965041..1e68643 100644
--- a/cc/surfaces/surface_aggregator.h
+++ b/cc/surfaces/surface_aggregator.h
@@ -63,7 +63,8 @@
RenderPassList* render_pass_list);
int ChildIdForSurface(Surface* surface);
gfx::Rect DamageRectForSurface(const Surface* surface,
- const RenderPass& source);
+ const RenderPass& source,
+ const gfx::Rect& full_rect);
SurfaceManager* manager_;
ResourceProvider* provider_;
diff --git a/cc/surfaces/surface_aggregator_unittest.cc b/cc/surfaces/surface_aggregator_unittest.cc
index 2e47708..1daff52 100644
--- a/cc/surfaces/surface_aggregator_unittest.cc
+++ b/cc/surfaces/surface_aggregator_unittest.cc
@@ -59,7 +59,7 @@
TEST_F(SurfaceAggregatorTest, ValidSurfaceNoFrame) {
SurfaceId one_id(7);
- factory_.Create(one_id, SurfaceSize());
+ factory_.Create(one_id);
scoped_ptr<CompositorFrame> frame = aggregator_.Aggregate(one_id);
EXPECT_FALSE(frame);
factory_.Destroy(one_id);
@@ -72,7 +72,7 @@
virtual void SetUp() {
SurfaceAggregatorTest::SetUp();
root_surface_id_ = allocator_.GenerateId();
- factory_.Create(root_surface_id_, SurfaceSize());
+ factory_.Create(root_surface_id_);
}
virtual void TearDown() {
@@ -157,7 +157,7 @@
TEST_F(SurfaceAggregatorValidSurfaceTest, OpacityCopied) {
SurfaceId embedded_surface_id = allocator_.GenerateId();
- factory_.Create(embedded_surface_id, SurfaceSize());
+ factory_.Create(embedded_surface_id);
test::Quad embedded_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN)};
test::Pass embedded_passes[] = {
@@ -190,9 +190,9 @@
TEST_F(SurfaceAggregatorValidSurfaceTest, OpacityCombinedWithNesting) {
SurfaceId surface_id1 = allocator_.GenerateId();
- factory_.Create(surface_id1, SurfaceSize());
+ factory_.Create(surface_id1);
SurfaceId surface_id2 = allocator_.GenerateId();
- factory_.Create(surface_id2, SurfaceSize());
+ factory_.Create(surface_id2);
// |surface_id1| is color quad.
{
@@ -258,7 +258,7 @@
// color quad should be aggregated into the final frame.
TEST_F(SurfaceAggregatorValidSurfaceTest, SimpleSurfaceReference) {
SurfaceId embedded_surface_id = allocator_.GenerateId();
- factory_.Create(embedded_surface_id, SurfaceSize());
+ factory_.Create(embedded_surface_id);
test::Quad embedded_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN)};
test::Pass embedded_passes[] = {
@@ -287,7 +287,7 @@
TEST_F(SurfaceAggregatorValidSurfaceTest, CopyRequest) {
SurfaceId embedded_surface_id = allocator_.GenerateId();
- factory_.Create(embedded_surface_id, SurfaceSize());
+ factory_.Create(embedded_surface_id);
test::Quad embedded_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN)};
test::Pass embedded_passes[] = {
@@ -344,7 +344,7 @@
// Root surface may contain copy requests.
TEST_F(SurfaceAggregatorValidSurfaceTest, RootCopyRequest) {
SurfaceId embedded_surface_id = allocator_.GenerateId();
- factory_.Create(embedded_surface_id, SurfaceSize());
+ factory_.Create(embedded_surface_id);
test::Quad embedded_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN)};
test::Pass embedded_passes[] = {
@@ -432,7 +432,7 @@
// This tests referencing a surface that has multiple render passes.
TEST_F(SurfaceAggregatorValidSurfaceTest, MultiPassSurfaceReference) {
SurfaceId embedded_surface_id = child_allocator_.GenerateId();
- factory_.Create(embedded_surface_id, SurfaceSize());
+ factory_.Create(embedded_surface_id);
RenderPassId pass_ids[] = {RenderPassId(1, 1), RenderPassId(1, 2),
RenderPassId(1, 3)};
@@ -590,7 +590,7 @@
// should also just be dropped.
TEST_F(SurfaceAggregatorValidSurfaceTest, ValidSurfaceReferenceWithNoFrame) {
SurfaceId surface_with_no_frame_id = allocator_.GenerateId();
- factory_.Create(surface_with_no_frame_id, gfx::Size(5, 5));
+ factory_.Create(surface_with_no_frame_id);
test::Quad quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN),
test::Quad::SurfaceQuad(surface_with_no_frame_id, 1.f),
test::Quad::SolidColorQuad(SK_ColorBLUE)};
@@ -628,7 +628,7 @@
// Tests a more complex cycle with one intermediate surface.
TEST_F(SurfaceAggregatorValidSurfaceTest, TwoSurfaceCyclicalReference) {
SurfaceId child_surface_id = allocator_.GenerateId();
- factory_.Create(child_surface_id, SurfaceSize());
+ factory_.Create(child_surface_id);
test::Quad parent_quads[] = {test::Quad::SolidColorQuad(SK_ColorBLUE),
test::Quad::SurfaceQuad(child_surface_id, 1.f),
@@ -667,7 +667,7 @@
// namespace and update RenderPassDrawQuad's id references to match.
TEST_F(SurfaceAggregatorValidSurfaceTest, RenderPassIdMapping) {
SurfaceId child_surface_id = allocator_.GenerateId();
- factory_.Create(child_surface_id, SurfaceSize());
+ factory_.Create(child_surface_id);
RenderPassId child_pass_id[] = {RenderPassId(1, 1), RenderPassId(1, 2)};
test::Quad child_quad[][1] = {{test::Quad::SolidColorQuad(SK_ColorGREEN)},
@@ -795,7 +795,7 @@
RenderPassId pass_id(1, 1);
SurfaceId grandchild_surface_id = allocator_.GenerateId();
- factory_.Create(grandchild_surface_id, SurfaceSize());
+ factory_.Create(grandchild_surface_id);
scoped_ptr<RenderPass> grandchild_pass = RenderPass::Create();
gfx::Rect output_rect(SurfaceSize());
gfx::Rect damage_rect(SurfaceSize());
@@ -807,7 +807,7 @@
QueuePassAsFrame(grandchild_pass.Pass(), grandchild_surface_id);
SurfaceId child_one_surface_id = allocator_.GenerateId();
- factory_.Create(child_one_surface_id, SurfaceSize());
+ factory_.Create(child_one_surface_id);
scoped_ptr<RenderPass> child_one_pass = RenderPass::Create();
child_one_pass->SetNew(
@@ -825,7 +825,7 @@
QueuePassAsFrame(child_one_pass.Pass(), child_one_surface_id);
SurfaceId child_two_surface_id = allocator_.GenerateId();
- factory_.Create(child_two_surface_id, SurfaceSize());
+ factory_.Create(child_two_surface_id);
scoped_ptr<RenderPass> child_two_pass = RenderPass::Create();
child_two_pass->SetNew(
@@ -903,7 +903,7 @@
// affected.
TEST_F(SurfaceAggregatorValidSurfaceTest, AggregateMultiplePassWithTransform) {
SurfaceId child_surface_id = allocator_.GenerateId();
- factory_.Create(child_surface_id, SurfaceSize());
+ factory_.Create(child_surface_id);
RenderPassId child_pass_id[] = {RenderPassId(1, 1), RenderPassId(1, 2)};
test::Quad child_quads[][1] = {
{test::Quad::SolidColorQuad(SK_ColorGREEN)},
@@ -1038,7 +1038,7 @@
// Tests that damage rects are aggregated correctly when surfaces change.
TEST_F(SurfaceAggregatorValidSurfaceTest, AggregateDamageRect) {
SurfaceId child_surface_id = allocator_.GenerateId();
- factory_.Create(child_surface_id, SurfaceSize());
+ factory_.Create(child_surface_id);
RenderPassId child_pass_id = RenderPassId(1, 1);
test::Quad child_quads[] = {test::Quad::RenderPassQuad(child_pass_id)};
test::Pass child_passes[] = {
@@ -1300,7 +1300,7 @@
ResourceTrackingSurfaceFactoryClient client;
SurfaceFactory factory(&manager_, &client);
SurfaceId surface_id(7u);
- factory.Create(surface_id, SurfaceSize());
+ factory.Create(surface_id);
ResourceProvider::ResourceId ids[] = {11, 12, 13};
SubmitFrameWithResources(ids, arraysize(ids), &factory, surface_id);
@@ -1328,9 +1328,9 @@
ResourceTrackingSurfaceFactoryClient client;
SurfaceFactory factory(&manager_, &client);
SurfaceId surface_id(7u);
- factory.Create(surface_id, SurfaceSize());
+ factory.Create(surface_id);
SurfaceId surface_id2(8u);
- factory.Create(surface_id2, SurfaceSize());
+ factory.Create(surface_id2);
ResourceProvider::ResourceId ids[] = {11, 12, 13};
SubmitFrameWithResources(ids, arraysize(ids), &factory, surface_id);
diff --git a/cc/surfaces/surface_factory.cc b/cc/surfaces/surface_factory.cc
index 574f5d1..fd5a6d4 100644
--- a/cc/surfaces/surface_factory.cc
+++ b/cc/surfaces/surface_factory.cc
@@ -30,8 +30,8 @@
surface_map_.clear();
}
-void SurfaceFactory::Create(SurfaceId surface_id, const gfx::Size& size) {
- scoped_ptr<Surface> surface(new Surface(surface_id, size, this));
+void SurfaceFactory::Create(SurfaceId surface_id) {
+ scoped_ptr<Surface> surface(new Surface(surface_id, this));
manager_->RegisterSurface(surface.get());
DCHECK(!surface_map_.count(surface_id));
surface_map_.add(surface_id, surface.Pass());
diff --git a/cc/surfaces/surface_factory.h b/cc/surfaces/surface_factory.h
index 8e9211c..eba32d2 100644
--- a/cc/surfaces/surface_factory.h
+++ b/cc/surfaces/surface_factory.h
@@ -38,7 +38,7 @@
SurfaceFactory(SurfaceManager* manager, SurfaceFactoryClient* client);
~SurfaceFactory();
- void Create(SurfaceId surface_id, const gfx::Size& size);
+ void Create(SurfaceId surface_id);
void Destroy(SurfaceId surface_id);
void DestroyAll();
// A frame can only be submitted to a surface created by this factory,
diff --git a/cc/surfaces/surface_factory_unittest.cc b/cc/surfaces/surface_factory_unittest.cc
index 14a25fd..84dcc5e 100644
--- a/cc/surfaces/surface_factory_unittest.cc
+++ b/cc/surfaces/surface_factory_unittest.cc
@@ -39,7 +39,7 @@
class SurfaceFactoryTest : public testing::Test {
public:
SurfaceFactoryTest() : factory_(&manager_, &client_), surface_id_(3) {
- factory_.Create(surface_id_, gfx::Size(5, 5));
+ factory_.Create(surface_id_);
}
virtual ~SurfaceFactoryTest() {
@@ -361,7 +361,7 @@
// Tests doing a DestroyAll before shutting down the factory;
TEST_F(SurfaceFactoryTest, DestroyAll) {
SurfaceId id(7);
- factory_.Create(id, gfx::Size(1, 1));
+ factory_.Create(id);
scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData);
TransferableResource resource;
@@ -378,7 +378,7 @@
TEST_F(SurfaceFactoryTest, DestroySequence) {
SurfaceId id2(5);
- factory_.Create(id2, gfx::Size(5, 5));
+ factory_.Create(id2);
// Check that waiting before the sequence is satisfied works.
manager_.GetSurfaceForId(id2)
@@ -395,7 +395,7 @@
DCHECK(!manager_.GetSurfaceForId(id2));
// Check that waiting after the sequence is satisfied works.
- factory_.Create(id2, gfx::Size(5, 5));
+ factory_.Create(id2);
DCHECK(manager_.GetSurfaceForId(id2));
manager_.GetSurfaceForId(id2)
->AddDestructionDependency(SurfaceSequence(0, 6));
diff --git a/cc/surfaces/surface_unittest.cc b/cc/surfaces/surface_unittest.cc
index b8990c5..7f2de36 100644
--- a/cc/surfaces/surface_unittest.cc
+++ b/cc/surfaces/surface_unittest.cc
@@ -17,7 +17,7 @@
SurfaceId surface_id(6);
{
- factory.Create(surface_id, gfx::Size(5, 5));
+ factory.Create(surface_id);
EXPECT_TRUE(!!manager.GetSurfaceForId(surface_id));
factory.Destroy(surface_id);
}
diff --git a/cc/surfaces/surfaces_pixeltest.cc b/cc/surfaces/surfaces_pixeltest.cc
index c70028b..bf9d483 100644
--- a/cc/surfaces/surfaces_pixeltest.cc
+++ b/cc/surfaces/surfaces_pixeltest.cc
@@ -85,7 +85,7 @@
root_frame->delegated_frame_data = delegated_frame_data.Pass();
SurfaceId root_surface_id = allocator_.GenerateId();
- factory_.Create(root_surface_id, device_viewport_size_);
+ factory_.Create(root_surface_id);
factory_.SubmitFrame(root_surface_id, root_frame.Pass(), base::Closure());
SurfaceAggregator aggregator(&manager_, resource_provider_.get());
@@ -107,8 +107,8 @@
gfx::Size child_size(200, 100);
SurfaceId child_surface_id = allocator_.GenerateId();
SurfaceId root_surface_id = allocator_.GenerateId();
- factory_.Create(child_surface_id, child_size);
- factory_.Create(root_surface_id, device_viewport_size_);
+ factory_.Create(child_surface_id);
+ factory_.Create(root_surface_id);
{
gfx::Rect rect(device_viewport_size_);
RenderPassId id(1, 1);
@@ -199,9 +199,9 @@
SurfaceId left_child_id = allocator_.GenerateId();
SurfaceId right_child_id = allocator_.GenerateId();
SurfaceId root_surface_id = allocator_.GenerateId();
- factory_.Create(left_child_id, child_size);
- factory_.Create(right_child_id, child_size);
- factory_.Create(root_surface_id, device_viewport_size_);
+ factory_.Create(left_child_id);
+ factory_.Create(right_child_id);
+ factory_.Create(root_surface_id);
{
gfx::Rect rect(device_viewport_size_);
diff --git a/cc/test/begin_frame_args_test.cc b/cc/test/begin_frame_args_test.cc
index f70d0c5..7b29748 100644
--- a/cc/test/begin_frame_args_test.cc
+++ b/cc/test/begin_frame_args_test.cc
@@ -10,57 +10,67 @@
namespace cc {
-BeginFrameArgs CreateBeginFrameArgsForTesting() {
- return CreateBeginFrameArgsForTesting(gfx::FrameTime::Now());
-}
-
-BeginFrameArgs CreateBeginFrameArgsForTesting(base::TimeTicks frame_time) {
- return BeginFrameArgs::Create(
- frame_time, frame_time + (BeginFrameArgs::DefaultInterval() / 2),
- BeginFrameArgs::DefaultInterval(), BeginFrameArgs::NORMAL);
-}
-
-BeginFrameArgs CreateBeginFrameArgsForTesting(int64 frame_time,
- int64 deadline,
- int64 interval) {
- return BeginFrameArgs::Create(base::TimeTicks::FromInternalValue(frame_time),
- base::TimeTicks::FromInternalValue(deadline),
- base::TimeDelta::FromInternalValue(interval),
- BeginFrameArgs::NORMAL);
+BeginFrameArgs CreateBeginFrameArgsForTesting(
+ BeginFrameArgs::CreationLocation location) {
+ return CreateBeginFrameArgsForTesting(location, gfx::FrameTime::Now());
}
BeginFrameArgs CreateBeginFrameArgsForTesting(
+ BeginFrameArgs::CreationLocation location,
+ base::TimeTicks frame_time) {
+ return BeginFrameArgs::Create(
+ location, frame_time,
+ frame_time + (BeginFrameArgs::DefaultInterval() / 2),
+ BeginFrameArgs::DefaultInterval(), BeginFrameArgs::NORMAL);
+}
+
+BeginFrameArgs CreateBeginFrameArgsForTesting(
+ BeginFrameArgs::CreationLocation location,
+ int64 frame_time,
+ int64 deadline,
+ int64 interval) {
+ return BeginFrameArgs::Create(
+ location, base::TimeTicks::FromInternalValue(frame_time),
+ base::TimeTicks::FromInternalValue(deadline),
+ base::TimeDelta::FromInternalValue(interval), BeginFrameArgs::NORMAL);
+}
+
+BeginFrameArgs CreateBeginFrameArgsForTesting(
+ BeginFrameArgs::CreationLocation location,
int64 frame_time,
int64 deadline,
int64 interval,
BeginFrameArgs::BeginFrameArgsType type) {
- return BeginFrameArgs::Create(base::TimeTicks::FromInternalValue(frame_time),
- base::TimeTicks::FromInternalValue(deadline),
- base::TimeDelta::FromInternalValue(interval),
- type);
+ return BeginFrameArgs::Create(
+ location, base::TimeTicks::FromInternalValue(frame_time),
+ base::TimeTicks::FromInternalValue(deadline),
+ base::TimeDelta::FromInternalValue(interval), type);
}
-BeginFrameArgs CreateExpiredBeginFrameArgsForTesting() {
+BeginFrameArgs CreateExpiredBeginFrameArgsForTesting(
+ BeginFrameArgs::CreationLocation location) {
base::TimeTicks now = gfx::FrameTime::Now();
- return BeginFrameArgs::Create(now, now - BeginFrameArgs::DefaultInterval(),
- BeginFrameArgs::DefaultInterval(),
- BeginFrameArgs::NORMAL);
+ return BeginFrameArgs::Create(
+ location, now, now - BeginFrameArgs::DefaultInterval(),
+ BeginFrameArgs::DefaultInterval(), BeginFrameArgs::NORMAL);
}
BeginFrameArgs CreateBeginFrameArgsForTesting(
+ BeginFrameArgs::CreationLocation location,
scoped_refptr<TestNowSource> now_src) {
base::TimeTicks now = now_src->Now();
return BeginFrameArgs::Create(
- now, now + (BeginFrameArgs::DefaultInterval() / 2),
+ location, now, now + (BeginFrameArgs::DefaultInterval() / 2),
BeginFrameArgs::DefaultInterval(), BeginFrameArgs::NORMAL);
}
BeginFrameArgs CreateExpiredBeginFrameArgsForTesting(
+ BeginFrameArgs::CreationLocation location,
scoped_refptr<TestNowSource> now_src) {
base::TimeTicks now = now_src->Now();
- return BeginFrameArgs::Create(now, now - BeginFrameArgs::DefaultInterval(),
- BeginFrameArgs::DefaultInterval(),
- BeginFrameArgs::NORMAL);
+ return BeginFrameArgs::Create(
+ location, now, now - BeginFrameArgs::DefaultInterval(),
+ BeginFrameArgs::DefaultInterval(), BeginFrameArgs::NORMAL);
}
bool operator==(const BeginFrameArgs& lhs, const BeginFrameArgs& rhs) {
diff --git a/cc/test/begin_frame_args_test.h b/cc/test/begin_frame_args_test.h
index ca4aa45..73aaf02 100644
--- a/cc/test/begin_frame_args_test.h
+++ b/cc/test/begin_frame_args_test.h
@@ -15,23 +15,32 @@
namespace cc {
// Functions for quickly creating BeginFrameArgs
-BeginFrameArgs CreateBeginFrameArgsForTesting();
-BeginFrameArgs CreateBeginFrameArgsForTesting(base::TimeTicks frame_time);
-BeginFrameArgs CreateBeginFrameArgsForTesting(int64 frame_time,
- int64 deadline,
- int64 interval);
BeginFrameArgs CreateBeginFrameArgsForTesting(
+ BeginFrameArgs::CreationLocation location);
+BeginFrameArgs CreateBeginFrameArgsForTesting(
+ BeginFrameArgs::CreationLocation location,
+ base::TimeTicks frame_time);
+BeginFrameArgs CreateBeginFrameArgsForTesting(
+ BeginFrameArgs::CreationLocation location,
+ int64 frame_time,
+ int64 deadline,
+ int64 interval);
+BeginFrameArgs CreateBeginFrameArgsForTesting(
+ BeginFrameArgs::CreationLocation location,
int64 frame_time,
int64 deadline,
int64 interval,
BeginFrameArgs::BeginFrameArgsType type);
-BeginFrameArgs CreateExpiredBeginFrameArgsForTesting();
+BeginFrameArgs CreateExpiredBeginFrameArgsForTesting(
+ BeginFrameArgs::CreationLocation location);
// Creates a BeginFrameArgs using the fake Now value stored on the
// OrderSimpleTaskRunner.
BeginFrameArgs CreateBeginFrameArgsForTesting(
+ BeginFrameArgs::CreationLocation location,
scoped_refptr<TestNowSource> now_src);
BeginFrameArgs CreateExpiredBeginFrameArgsForTesting(
+ BeginFrameArgs::CreationLocation location,
scoped_refptr<TestNowSource> now_src);
// gtest helpers -- these *must* be in the same namespace as the types they
diff --git a/cc/test/fake_content_layer_client.cc b/cc/test/fake_content_layer_client.cc
index 5463aed..46d1baa 100644
--- a/cc/test/fake_content_layer_client.cc
+++ b/cc/test/fake_content_layer_client.cc
@@ -4,7 +4,10 @@
#include "cc/test/fake_content_layer_client.h"
+#include "cc/resources/clip_display_item.h"
+#include "cc/resources/drawing_display_item.h"
#include "third_party/skia/include/core/SkCanvas.h"
+#include "third_party/skia/include/core/SkPictureRecorder.h"
#include "ui/gfx/skia_util.h"
namespace cc {
@@ -52,6 +55,58 @@
}
}
+scoped_refptr<DisplayItemList>
+FakeContentLayerClient::PaintContentsToDisplayList(
+ const gfx::Rect& clip,
+ GraphicsContextStatus gc_status) {
+ SkPictureRecorder recorder;
+ skia::RefPtr<SkCanvas> canvas;
+ skia::RefPtr<SkPicture> picture;
+ scoped_refptr<DisplayItemList> list = DisplayItemList::Create();
+ list->AppendItem(ClipDisplayItem::Create(clip, std::vector<SkRRect>()));
+
+ for (RectPaintVector::const_iterator it = draw_rects_.begin();
+ it != draw_rects_.end(); ++it) {
+ const gfx::RectF& draw_rect = it->first;
+ const SkPaint& paint = it->second;
+ canvas = skia::SharePtr(
+ recorder.beginRecording(draw_rect.width(), draw_rect.height()));
+ canvas->drawRectCoords(0.f, 0.f, draw_rect.width(), draw_rect.height(),
+ paint);
+ picture = skia::AdoptRef(recorder.endRecording());
+ list->AppendItem(DrawingDisplayItem::Create(
+ picture, gfx::PointF(draw_rect.x(), draw_rect.y())));
+ }
+
+ for (BitmapVector::const_iterator it = draw_bitmaps_.begin();
+ it != draw_bitmaps_.end(); ++it) {
+ canvas = skia::SharePtr(
+ recorder.beginRecording(it->bitmap.width(), it->bitmap.height()));
+ canvas->drawBitmap(it->bitmap, 0.f, 0.f, &it->paint);
+ picture = skia::AdoptRef(recorder.endRecording());
+ list->AppendItem(DrawingDisplayItem::Create(
+ picture, gfx::PointF(it->point.x(), it->point.y())));
+ }
+
+ if (fill_with_nonsolid_color_) {
+ gfx::RectF draw_rect = clip;
+ bool red = true;
+ while (!draw_rect.IsEmpty()) {
+ SkPaint paint;
+ paint.setColor(red ? SK_ColorRED : SK_ColorBLUE);
+ canvas =
+ skia::SharePtr(recorder.beginRecording(clip.width(), clip.height()));
+ canvas->drawRect(gfx::RectFToSkRect(draw_rect), paint);
+ picture = skia::AdoptRef(recorder.endRecording());
+ list->AppendItem(DrawingDisplayItem::Create(picture, gfx::PointF()));
+ draw_rect.Inset(1, 1);
+ }
+ }
+
+ list->AppendItem(EndClipDisplayItem::Create());
+ return list;
+}
+
bool FakeContentLayerClient::FillsBoundsCompletely() const { return false; }
} // namespace cc
diff --git a/cc/test/fake_content_layer_client.h b/cc/test/fake_content_layer_client.h
index 141bc97..1060d08 100644
--- a/cc/test/fake_content_layer_client.h
+++ b/cc/test/fake_content_layer_client.h
@@ -31,6 +31,9 @@
SkCanvas* canvas,
const gfx::Rect& rect,
ContentLayerClient::GraphicsContextStatus gc_status) override;
+ scoped_refptr<DisplayItemList> PaintContentsToDisplayList(
+ const gfx::Rect& clip,
+ GraphicsContextStatus gc_status) override;
bool FillsBoundsCompletely() const override;
void set_fill_with_nonsolid_color(bool nonsolid) {
diff --git a/cc/test/fake_layer_tree_host_impl.cc b/cc/test/fake_layer_tree_host_impl.cc
index ea19e14..305b856 100644
--- a/cc/test/fake_layer_tree_host_impl.cc
+++ b/cc/test/fake_layer_tree_host_impl.cc
@@ -24,7 +24,8 @@
// Avoid using Now() as the frame time in unit tests.
base::TimeTicks time_ticks = base::TimeTicks::FromInternalValue(1);
- SetCurrentBeginFrameArgs(CreateBeginFrameArgsForTesting(time_ticks));
+ SetCurrentBeginFrameArgs(
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
}
FakeLayerTreeHostImpl::FakeLayerTreeHostImpl(const LayerTreeSettings& settings,
@@ -42,7 +43,8 @@
// Avoid using Now() as the frame time in unit tests.
base::TimeTicks time_ticks = base::TimeTicks::FromInternalValue(1);
- SetCurrentBeginFrameArgs(CreateBeginFrameArgsForTesting(time_ticks));
+ SetCurrentBeginFrameArgs(
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
}
FakeLayerTreeHostImpl::~FakeLayerTreeHostImpl() {}
diff --git a/cc/test/layer_tree_pixel_resource_test.cc b/cc/test/layer_tree_pixel_resource_test.cc
index 9bd75ac..1839643 100644
--- a/cc/test/layer_tree_pixel_resource_test.cc
+++ b/cc/test/layer_tree_pixel_resource_test.cc
@@ -159,7 +159,7 @@
case ZERO_COPY_RASTER_WORKER_POOL:
EXPECT_TRUE(context_provider);
EXPECT_EQ(PIXEL_TEST_GL, test_type_);
- EXPECT_TRUE(host_impl->CanUseZeroCopyRasterizer());
+ EXPECT_TRUE(host_impl->GetRendererCapabilities().using_image);
*resource_pool =
ResourcePool::Create(resource_provider,
draw_texture_target_,
@@ -173,7 +173,7 @@
case ONE_COPY_RASTER_WORKER_POOL:
EXPECT_TRUE(context_provider);
EXPECT_EQ(PIXEL_TEST_GL, test_type_);
- EXPECT_TRUE(host_impl->CanUseOneCopyRasterizer());
+ EXPECT_TRUE(host_impl->GetRendererCapabilities().using_image);
// We need to create a staging resource pool when using copy rasterizer.
*staging_resource_pool =
ResourcePool::Create(resource_provider,
diff --git a/cc/test/layer_tree_test.cc b/cc/test/layer_tree_test.cc
index 80e9f11..9f08677 100644
--- a/cc/test/layer_tree_test.cc
+++ b/cc/test/layer_tree_test.cc
@@ -91,7 +91,7 @@
void TestOnBeginFrame() {
DCHECK(CalledOnValidThread());
- CallOnBeginFrame(CreateBeginFrameArgsForTesting());
+ CallOnBeginFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));
}
private:
@@ -153,6 +153,11 @@
test_hooks_->ScheduledActionBeginOutputSurfaceCreation();
}
+ void ScheduledActionManageTiles() override {
+ ThreadProxy::ScheduledActionManageTiles();
+ test_hooks_->ScheduledActionManageTiles();
+ }
+
ThreadProxyForTest(
TestHooks* test_hooks,
LayerTreeHost* host,
@@ -780,6 +785,11 @@
RunTest(true, false, true);
}
+void LayerTreeTest::RunTestWithMainThreadLowLatency() {
+ settings_.main_thread_should_always_be_low_latency = true;
+ RunTest(false, false, false);
+}
+
void LayerTreeTest::RequestNewOutputSurface(bool fallback) {
layer_tree_host_->SetOutputSurface(CreateOutputSurface(fallback));
}
diff --git a/cc/test/layer_tree_test.h b/cc/test/layer_tree_test.h
index 2914cfc..ba2ef69 100644
--- a/cc/test/layer_tree_test.h
+++ b/cc/test/layer_tree_test.h
@@ -98,6 +98,7 @@
virtual void ScheduledActionAnimate() {}
virtual void ScheduledActionCommit() {}
virtual void ScheduledActionBeginOutputSurfaceCreation() {}
+ virtual void ScheduledActionManageTiles() {}
// Implementation of AnimationDelegate:
void NotifyAnimationStarted(base::TimeTicks monotonic_time,
@@ -175,6 +176,7 @@
bool delegating_renderer,
bool impl_side_painting);
virtual void RunTestWithImplSidePainting();
+ virtual void RunTestWithMainThreadLowLatency();
bool HasImplThread() { return proxy() ? proxy()->HasImplThread() : false; }
base::SingleThreadTaskRunner* ImplThreadTaskRunner() {
@@ -235,7 +237,18 @@
} // namespace cc
+#define SINGLE_THREAD_DIRECT_RENDERER_NOIMPL_MAIN_THREAD_LOW_LATENCY_TEST_F( \
+ TEST_FIXTURE_NAME) \
+ TEST_F( \
+ TEST_FIXTURE_NAME, \
+ RunSingleThread_DirectRenderer_MainThreadPaint_MainThreadLowLatency) { \
+ RunTestWithMainThreadLowLatency(); \
+ } \
+ class SingleThreadDirectNoImplLowLatencyNeedsSemicolon##TEST_FIXTURE_NAME {}
+
#define SINGLE_THREAD_DIRECT_RENDERER_NOIMPL_TEST_F(TEST_FIXTURE_NAME) \
+ SINGLE_THREAD_DIRECT_RENDERER_NOIMPL_MAIN_THREAD_LOW_LATENCY_TEST_F( \
+ TEST_FIXTURE_NAME); \
TEST_F(TEST_FIXTURE_NAME, RunSingleThread_DirectRenderer_MainThreadPaint) { \
RunTest(false, false, false); \
} \
diff --git a/cc/test/skia_common.cc b/cc/test/skia_common.cc
index 1ccb2d1..ef61e21 100644
--- a/cc/test/skia_common.cc
+++ b/cc/test/skia_common.cc
@@ -4,6 +4,7 @@
#include "cc/test/skia_common.h"
+#include "cc/resources/display_item_list.h"
#include "cc/resources/picture.h"
#include "skia/ext/refptr.h"
#include "third_party/skia/include/core/SkCanvas.h"
@@ -26,6 +27,18 @@
picture->Raster(&canvas, NULL, negated_content_region, 1.0f);
}
+void DrawDisplayList(unsigned char* buffer,
+ const gfx::Rect& layer_rect,
+ scoped_refptr<DisplayItemList> list) {
+ SkImageInfo info =
+ SkImageInfo::MakeN32Premul(layer_rect.width(), layer_rect.height());
+ SkBitmap bitmap;
+ bitmap.installPixels(info, buffer, info.minRowBytes());
+ SkCanvas canvas(bitmap);
+ canvas.clipRect(gfx::RectToSkRect(layer_rect));
+ list->Raster(&canvas, NULL, 1.0f);
+}
+
void CreateBitmap(const gfx::Size& size, const char* uri, SkBitmap* bitmap) {
SkImageInfo info = SkImageInfo::MakeN32Premul(size.width(), size.height());
diff --git a/cc/test/skia_common.h b/cc/test/skia_common.h
index 3bafa0b..51ebcc5 100644
--- a/cc/test/skia_common.h
+++ b/cc/test/skia_common.h
@@ -18,11 +18,16 @@
namespace cc {
class Picture;
+class DisplayItemList;
void DrawPicture(unsigned char* buffer,
const gfx::Rect& layer_rect,
scoped_refptr<Picture> picture);
+void DrawDisplayList(unsigned char* buffer,
+ const gfx::Rect& layer_rect,
+ scoped_refptr<DisplayItemList> list);
+
void CreateBitmap(const gfx::Size& size, const char* uri, SkBitmap* bitmap);
} // namespace cc
diff --git a/cc/test/solid_color_content_layer_client.cc b/cc/test/solid_color_content_layer_client.cc
index 237dbb6..701f004 100644
--- a/cc/test/solid_color_content_layer_client.cc
+++ b/cc/test/solid_color_content_layer_client.cc
@@ -25,6 +25,14 @@
paint);
}
+scoped_refptr<DisplayItemList>
+SolidColorContentLayerClient::PaintContentsToDisplayList(
+ const gfx::Rect& clip,
+ GraphicsContextStatus gc_status) {
+ NOTIMPLEMENTED();
+ return DisplayItemList::Create();
+}
+
bool SolidColorContentLayerClient::FillsBoundsCompletely() const {
return false;
}
diff --git a/cc/test/solid_color_content_layer_client.h b/cc/test/solid_color_content_layer_client.h
index 7a962cf..93fca84 100644
--- a/cc/test/solid_color_content_layer_client.h
+++ b/cc/test/solid_color_content_layer_client.h
@@ -20,6 +20,9 @@
SkCanvas* canvas,
const gfx::Rect& rect,
ContentLayerClient::GraphicsContextStatus gc_status) override;
+ scoped_refptr<DisplayItemList> PaintContentsToDisplayList(
+ const gfx::Rect& clip,
+ GraphicsContextStatus gc_status) override;
bool FillsBoundsCompletely() const override;
private:
diff --git a/cc/test/test_shared_bitmap_manager.cc b/cc/test/test_shared_bitmap_manager.cc
index d7716dd..933dcd2 100644
--- a/cc/test/test_shared_bitmap_manager.cc
+++ b/cc/test/test_shared_bitmap_manager.cc
@@ -4,15 +4,41 @@
#include "cc/test/test_shared_bitmap_manager.h"
-#include "base/bind.h"
+#include "base/memory/shared_memory.h"
namespace cc {
-void FreeSharedBitmap(SharedBitmap* shared_bitmap) {
- delete shared_bitmap->memory();
-}
+namespace {
+class OwnedSharedBitmap : public SharedBitmap {
+ public:
+ OwnedSharedBitmap(scoped_ptr<base::SharedMemory> shared_memory,
+ const SharedBitmapId& id)
+ : SharedBitmap(static_cast<uint8*>(shared_memory->memory()), id),
+ shared_memory_(shared_memory.Pass()) {}
-void IgnoreSharedBitmap(SharedBitmap* shared_bitmap) {}
+ ~OwnedSharedBitmap() override {}
+
+ base::SharedMemory* memory() override { return shared_memory_.get(); }
+
+ private:
+ scoped_ptr<base::SharedMemory> shared_memory_;
+};
+
+class UnownedSharedBitmap : public SharedBitmap {
+ public:
+ UnownedSharedBitmap(base::SharedMemory* shared_memory,
+ const SharedBitmapId& id)
+ : SharedBitmap(static_cast<uint8*>(shared_memory->memory()), id),
+ shared_memory_(shared_memory) {}
+
+ ~UnownedSharedBitmap() override {}
+
+ base::SharedMemory* memory() override { return shared_memory_; }
+
+ private:
+ base::SharedMemory* shared_memory_;
+};
+} // namespace
TestSharedBitmapManager::TestSharedBitmapManager() {}
@@ -25,8 +51,7 @@
memory->CreateAndMapAnonymous(size.GetArea() * 4);
SharedBitmapId id = SharedBitmap::GenerateId();
bitmap_map_[id] = memory.get();
- return make_scoped_ptr(
- new SharedBitmap(memory.release(), id, base::Bind(&FreeSharedBitmap)));
+ return make_scoped_ptr(new OwnedSharedBitmap(memory.Pass(), id));
}
scoped_ptr<SharedBitmap> TestSharedBitmapManager::GetSharedBitmapFromId(
@@ -35,8 +60,7 @@
base::AutoLock lock(lock_);
if (bitmap_map_.find(id) == bitmap_map_.end())
return nullptr;
- return make_scoped_ptr(
- new SharedBitmap(bitmap_map_[id], id, base::Bind(&IgnoreSharedBitmap)));
+ return make_scoped_ptr(new UnownedSharedBitmap(bitmap_map_[id], id));
}
scoped_ptr<SharedBitmap> TestSharedBitmapManager::GetBitmapForSharedMemory(
@@ -44,8 +68,7 @@
base::AutoLock lock(lock_);
SharedBitmapId id = SharedBitmap::GenerateId();
bitmap_map_[id] = memory;
- return make_scoped_ptr(
- new SharedBitmap(memory, id, base::Bind(&IgnoreSharedBitmap)));
+ return make_scoped_ptr(new UnownedSharedBitmap(memory, id));
}
} // namespace cc
diff --git a/cc/test/test_web_graphics_context_3d.h b/cc/test/test_web_graphics_context_3d.h
index ff2c704..56c17c0 100644
--- a/cc/test/test_web_graphics_context_3d.h
+++ b/cc/test/test_web_graphics_context_3d.h
@@ -330,6 +330,9 @@
void set_support_image(bool support) {
test_capabilities_.gpu.image = support;
}
+ void set_support_texture_rectangle(bool support) {
+ test_capabilities_.gpu.texture_rectangle = support;
+ }
// When this context is lost, all contexts in its share group are also lost.
void add_share_group_context(TestWebGraphicsContext3D* context3d) {
diff --git a/cc/trees/layer_tree_host_common.cc b/cc/trees/layer_tree_host_common.cc
index 6863850..6d75687 100644
--- a/cc/trees/layer_tree_host_common.cc
+++ b/cc/trees/layer_tree_host_common.cc
@@ -392,7 +392,7 @@
gfx::Rect visible_rect_in_target_surface_space =
layer->drawable_content_rect();
- if (!layer->render_target()->render_surface()->clip_rect().IsEmpty()) {
+ if (layer->render_target()->render_surface()->is_clipped()) {
// The |layer| L has a target T which owns a surface Ts. The surface Ts
// has a target TsT.
//
diff --git a/cc/trees/layer_tree_host_common_unittest.cc b/cc/trees/layer_tree_host_common_unittest.cc
index 7a282c1..8c02bd3 100644
--- a/cc/trees/layer_tree_host_common_unittest.cc
+++ b/cc/trees/layer_tree_host_common_unittest.cc
@@ -59,6 +59,12 @@
SkCanvas* canvas,
const gfx::Rect& clip,
ContentLayerClient::GraphicsContextStatus gc_status) override {}
+ scoped_refptr<DisplayItemList> PaintContentsToDisplayList(
+ const gfx::Rect& clip,
+ GraphicsContextStatus gc_status) override {
+ NOTIMPLEMENTED();
+ return DisplayItemList::Create();
+ }
bool FillsBoundsCompletely() const override { return false; }
};
@@ -2820,6 +2826,56 @@
}
TEST_F(LayerTreeHostCommonTest,
+ VisibleContentRectsForClippedSurfaceWithEmptyClip) {
+ scoped_refptr<Layer> root = Layer::Create();
+ scoped_refptr<LayerWithForcedDrawsContent> child1 =
+ make_scoped_refptr(new LayerWithForcedDrawsContent());
+ scoped_refptr<LayerWithForcedDrawsContent> child2 =
+ make_scoped_refptr(new LayerWithForcedDrawsContent());
+ scoped_refptr<LayerWithForcedDrawsContent> child3 =
+ make_scoped_refptr(new LayerWithForcedDrawsContent());
+ root->AddChild(child1);
+ root->AddChild(child2);
+ root->AddChild(child3);
+
+ scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
+ host->SetRootLayer(root);
+
+ gfx::Transform identity_matrix;
+ SetLayerPropertiesForTesting(root.get(), identity_matrix, gfx::Point3F(),
+ gfx::PointF(), gfx::Size(100, 100), true, false);
+ SetLayerPropertiesForTesting(child1.get(), identity_matrix, gfx::Point3F(),
+ gfx::PointF(5.f, 5.f), gfx::Size(50, 50), true,
+ false);
+ SetLayerPropertiesForTesting(child2.get(), identity_matrix, gfx::Point3F(),
+ gfx::PointF(75.f, 75.f), gfx::Size(50, 50), true,
+ false);
+ SetLayerPropertiesForTesting(child3.get(), identity_matrix, gfx::Point3F(),
+ gfx::PointF(125.f, 125.f), gfx::Size(50, 50),
+ true, false);
+
+ RenderSurfaceLayerList render_surface_layer_list;
+ // Now set the root render surface an empty clip.
+ LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
+ root.get(), gfx::Size(), &render_surface_layer_list);
+
+ LayerTreeHostCommon::CalculateDrawProperties(&inputs);
+ ASSERT_TRUE(root->render_surface());
+ EXPECT_FALSE(root->is_clipped());
+
+ gfx::Rect empty;
+ EXPECT_EQ(empty, root->render_surface()->clip_rect());
+ EXPECT_TRUE(root->render_surface()->is_clipped());
+
+ // Visible content rect calculation will check if the target surface is
+ // clipped or not. An empty clip rect does not indicate the render surface
+ // is unclipped.
+ EXPECT_EQ(empty, child1->visible_content_rect());
+ EXPECT_EQ(empty, child2->visible_content_rect());
+ EXPECT_EQ(empty, child3->visible_content_rect());
+}
+
+TEST_F(LayerTreeHostCommonTest,
DrawableAndVisibleContentRectsForLayersWithUninvertibleTransform) {
scoped_refptr<Layer> root = Layer::Create();
scoped_refptr<LayerWithForcedDrawsContent> child =
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index e49dcfe..10b0685 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -151,22 +151,6 @@
max_transfer_buffer_usage_bytes);
}
-unsigned GetMapImageTextureTarget(
- const ContextProvider::Capabilities& context_capabilities) {
-// TODO(reveman): This should be a setting passed to the compositor instead
-// of hard-coded here. The target that need to be used depends on our choice
-// of GpuMemoryBuffer type. Note: SURFACE_TEXTURE needs EXTERNAL_OES,
-// IO_SURFACE needs RECTANGLE_ARB. crbug.com/431059
-#if defined(OS_ANDROID)
- if (context_capabilities.gpu.egl_image_external)
- return GL_TEXTURE_EXTERNAL_OES;
-#endif
- if (context_capabilities.gpu.texture_rectangle)
- return GL_TEXTURE_RECTANGLE_ARB;
-
- return GL_TEXTURE_2D;
-}
-
size_t GetMaxStagingResourceCount() {
// Upper bound for number of staging resource to allow.
return 32;
@@ -2005,9 +1989,6 @@
DCHECK(task_runner);
ContextProvider* context_provider = output_surface_->context_provider();
- bool should_use_zero_copy_rasterizer =
- settings_.use_zero_copy || IsSynchronousSingleThreaded();
-
if (!context_provider) {
*resource_pool =
ResourcePool::Create(resource_provider_.get(),
@@ -2018,7 +1999,10 @@
BitmapRasterWorkerPool::Create(task_runner,
RasterWorkerPool::GetTaskGraphRunner(),
resource_provider_.get());
- } else if (use_gpu_rasterization_) {
+ return;
+ }
+
+ if (use_gpu_rasterization_) {
*resource_pool =
ResourcePool::Create(resource_provider_.get(),
GL_TEXTURE_2D,
@@ -2029,53 +2013,65 @@
context_provider,
resource_provider_.get(),
settings_.use_distance_field_text);
- } else if (should_use_zero_copy_rasterizer && CanUseZeroCopyRasterizer()) {
- *resource_pool = ResourcePool::Create(
- resource_provider_.get(),
- GetMapImageTextureTarget(context_provider->ContextCapabilities()),
- resource_provider_->best_texture_format());
+ return;
+ }
- TaskGraphRunner* task_graph_runner;
- if (IsSynchronousSingleThreaded()) {
- DCHECK(!single_thread_synchronous_task_graph_runner_);
- single_thread_synchronous_task_graph_runner_.reset(new TaskGraphRunner);
- task_graph_runner = single_thread_synchronous_task_graph_runner_.get();
- } else {
- task_graph_runner = RasterWorkerPool::GetTaskGraphRunner();
+ if (GetRendererCapabilities().using_image) {
+ unsigned image_target = GL_TEXTURE_2D;
+#if defined(OS_MACOSX)
+ // GL_TEXTURE_RECTANGLE_ARB target is required by IOSurface backed images.
+ DCHECK(context_provider->ContextCapabilities().gpu.texture_rectangle);
+ image_target = GL_TEXTURE_RECTANGLE_ARB;
+#endif
+ if (settings_.use_image_external) {
+ DCHECK(context_provider->ContextCapabilities().gpu.egl_image_external);
+ image_target = GL_TEXTURE_EXTERNAL_OES;
}
- *raster_worker_pool = ZeroCopyRasterWorkerPool::Create(
- task_runner, task_graph_runner, resource_provider_.get());
- } else if (settings_.use_one_copy && CanUseOneCopyRasterizer()) {
- // We need to create a staging resource pool when using copy rasterizer.
- *staging_resource_pool = ResourcePool::Create(
- resource_provider_.get(),
- GetMapImageTextureTarget(context_provider->ContextCapabilities()),
- resource_provider_->best_texture_format());
- *resource_pool =
- ResourcePool::Create(resource_provider_.get(),
- GL_TEXTURE_2D,
- resource_provider_->best_texture_format());
+ if (settings_.use_zero_copy || IsSynchronousSingleThreaded()) {
+ *resource_pool =
+ ResourcePool::Create(resource_provider_.get(), image_target,
+ resource_provider_->best_texture_format());
- *raster_worker_pool =
- OneCopyRasterWorkerPool::Create(task_runner,
- RasterWorkerPool::GetTaskGraphRunner(),
- context_provider,
- resource_provider_.get(),
- staging_resource_pool_.get());
- } else {
- *resource_pool = ResourcePool::Create(
- resource_provider_.get(),
- GL_TEXTURE_2D,
- resource_provider_->memory_efficient_texture_format());
+ TaskGraphRunner* task_graph_runner;
+ if (IsSynchronousSingleThreaded()) {
+ DCHECK(!single_thread_synchronous_task_graph_runner_);
+ single_thread_synchronous_task_graph_runner_.reset(new TaskGraphRunner);
+ task_graph_runner = single_thread_synchronous_task_graph_runner_.get();
+ } else {
+ task_graph_runner = RasterWorkerPool::GetTaskGraphRunner();
+ }
- *raster_worker_pool = PixelBufferRasterWorkerPool::Create(
- task_runner, RasterWorkerPool::GetTaskGraphRunner(), context_provider,
- resource_provider_.get(),
- GetMaxTransferBufferUsageBytes(
- context_provider->ContextCapabilities(),
- settings_.renderer_settings.refresh_rate));
+ *raster_worker_pool = ZeroCopyRasterWorkerPool::Create(
+ task_runner, task_graph_runner, resource_provider_.get());
+ return;
+ }
+
+ if (settings_.use_one_copy) {
+ // We need to create a staging resource pool when using copy rasterizer.
+ *staging_resource_pool =
+ ResourcePool::Create(resource_provider_.get(), image_target,
+ resource_provider_->best_texture_format());
+ *resource_pool =
+ ResourcePool::Create(resource_provider_.get(), GL_TEXTURE_2D,
+ resource_provider_->best_texture_format());
+
+ *raster_worker_pool = OneCopyRasterWorkerPool::Create(
+ task_runner, RasterWorkerPool::GetTaskGraphRunner(), context_provider,
+ resource_provider_.get(), staging_resource_pool_.get());
+ return;
+ }
}
+
+ *resource_pool = ResourcePool::Create(
+ resource_provider_.get(), GL_TEXTURE_2D,
+ resource_provider_->memory_efficient_texture_format());
+
+ *raster_worker_pool = PixelBufferRasterWorkerPool::Create(
+ task_runner, RasterWorkerPool::GetTaskGraphRunner(), context_provider,
+ resource_provider_.get(),
+ GetMaxTransferBufferUsageBytes(context_provider->ContextCapabilities(),
+ settings_.renderer_settings.refresh_rate));
}
void LayerTreeHostImpl::DestroyTileManager() {
@@ -2096,14 +2092,6 @@
return !proxy_->HasImplThread() && !settings_.single_thread_proxy_scheduler;
}
-bool LayerTreeHostImpl::CanUseZeroCopyRasterizer() const {
- return GetRendererCapabilities().using_image;
-}
-
-bool LayerTreeHostImpl::CanUseOneCopyRasterizer() const {
- return GetRendererCapabilities().using_image;
-}
-
void LayerTreeHostImpl::EnforceZeroBudget(bool zero_budget) {
SetManagedMemoryPolicy(cached_managed_memory_policy_, zero_budget);
}
@@ -2563,10 +2551,14 @@
return actual_viewport_end_point - viewport_point;
}
-static gfx::Vector2dF ScrollLayerWithLocalDelta(LayerImpl* layer_impl,
- const gfx::Vector2dF& local_delta) {
+static gfx::Vector2dF ScrollLayerWithLocalDelta(
+ LayerImpl* layer_impl,
+ const gfx::Vector2dF& local_delta,
+ float page_scale_factor) {
gfx::Vector2dF previous_delta(layer_impl->ScrollDelta());
- layer_impl->ScrollBy(local_delta);
+ gfx::Vector2dF delta = local_delta;
+ delta.Scale(1.f / page_scale_factor);
+ layer_impl->ScrollBy(delta);
return layer_impl->ScrollDelta() - previous_delta;
}
@@ -2644,7 +2636,8 @@
// Gesture events need to be transformed from viewport coordinates to local
// layer coordinates so that the scrolling contents exactly follow the
// user's finger. In contrast, wheel events represent a fixed amount of
- // scrolling so we can just apply them directly.
+ // scrolling so we can just apply them directly, but the page scale factor
+ // is applied to the scroll delta.
if (!wheel_scrolling_) {
float scale_from_viewport_to_screen_space = device_scale_factor_;
applied_delta =
@@ -2652,7 +2645,8 @@
scale_from_viewport_to_screen_space,
viewport_point, pending_delta);
} else {
- applied_delta = ScrollLayerWithLocalDelta(layer_impl, pending_delta);
+ applied_delta = ScrollLayerWithLocalDelta(
+ layer_impl, pending_delta, active_tree_->total_page_scale_factor());
}
const float kEpsilon = 0.1f;
@@ -2774,7 +2768,8 @@
gfx::Vector2dF delta = gfx::Vector2dF(0.f, page);
- gfx::Vector2dF applied_delta = ScrollLayerWithLocalDelta(layer_impl, delta);
+ gfx::Vector2dF applied_delta =
+ ScrollLayerWithLocalDelta(layer_impl, delta, 1.f);
if (!applied_delta.IsZero()) {
client_->SetNeedsCommitOnImplThread();
@@ -3251,9 +3246,9 @@
// task), fall back to physical time. This should still be monotonic.
if (current_begin_frame_args_.IsValid())
return current_begin_frame_args_;
- return BeginFrameArgs::Create(gfx::FrameTime::Now(), base::TimeTicks(),
- BeginFrameArgs::DefaultInterval(),
- BeginFrameArgs::NORMAL);
+ return BeginFrameArgs::Create(
+ BEGINFRAME_FROM_HERE, gfx::FrameTime::Now(), base::TimeTicks(),
+ BeginFrameArgs::DefaultInterval(), BeginFrameArgs::NORMAL);
}
scoped_refptr<base::debug::ConvertableToTraceFormat>
diff --git a/cc/trees/layer_tree_host_impl.h b/cc/trees/layer_tree_host_impl.h
index d1b29ca..900e658 100644
--- a/cc/trees/layer_tree_host_impl.h
+++ b/cc/trees/layer_tree_host_impl.h
@@ -481,8 +481,6 @@
// Only valid for synchronous (non-scheduled) single-threaded case.
void SynchronouslyInitializeAllTiles();
- bool CanUseZeroCopyRasterizer() const;
- bool CanUseOneCopyRasterizer() const;
virtual void CreateResourceAndRasterWorkerPool(
scoped_ptr<RasterWorkerPool>* raster_worker_pool,
scoped_ptr<ResourcePool>* resource_pool,
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
index 7151689..4e070e2 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -945,7 +945,7 @@
}
// Scrolling after a pinch gesture should always be in local space. The
- // scroll deltas do not have the page scale factor applied.
+ // scroll deltas have the page scale factor applied.
{
host_impl_->active_tree()->SetPageScaleFactorAndLimits(
page_scale_factor, min_page_scale, max_page_scale);
@@ -968,9 +968,8 @@
scoped_ptr<ScrollAndScaleSet> scroll_info =
host_impl_->ProcessScrollDeltas();
- ExpectContains(*scroll_info.get(),
- scroll_layer->id(),
- scroll_delta);
+ ExpectContains(*scroll_info.get(), scroll_layer->id(),
+ gfx::Vector2d(0, scroll_delta.y() / page_scale_delta));
}
}
@@ -1395,7 +1394,8 @@
0) {}
BeginFrameArgs CurrentBeginFrameArgs() const override {
- return CreateBeginFrameArgsForTesting(fake_current_physical_time_);
+ return CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE,
+ fake_current_physical_time_);
}
void SetCurrentPhysicalTimeTicksForTest(base::TimeTicks fake_now) {
@@ -3596,7 +3596,7 @@
host_impl_->ScrollBy(gfx::Point(), wheel_scroll_delta);
host_impl_->ScrollEnd();
- // The scale should not have been applied to the scroll delta.
+ // It should apply the scale factor to the scroll delta for the wheel event.
scroll_info = host_impl_->ProcessScrollDeltas();
ExpectContains(*scroll_info.get(),
scroll_layer->id(),
@@ -7800,6 +7800,41 @@
EXPECT_EQ(1u, raw_replica_mask_layer->did_become_active_call_count());
}
+TEST_F(LayerTreeHostImplTest, WheelScrollWithPageScaleFactorOnInnerLayer) {
+ LayerImpl* scroll_layer = SetupScrollAndContentsLayers(gfx::Size(100, 100));
+ host_impl_->SetViewportSize(gfx::Size(50, 50));
+ DrawFrame();
+
+ EXPECT_EQ(scroll_layer, host_impl_->InnerViewportScrollLayer());
+
+ float min_page_scale = 1.f, max_page_scale = 4.f;
+ float page_scale_factor = 1.f;
+
+ // The scroll deltas should have the page scale factor applied.
+ {
+ host_impl_->active_tree()->SetPageScaleFactorAndLimits(
+ page_scale_factor, min_page_scale, max_page_scale);
+ host_impl_->active_tree()->SetPageScaleDelta(1.f);
+ scroll_layer->SetScrollDelta(gfx::Vector2d());
+
+ float page_scale_delta = 2.f;
+ host_impl_->ScrollBegin(gfx::Point(), InputHandler::Gesture);
+ host_impl_->PinchGestureBegin();
+ host_impl_->PinchGestureUpdate(page_scale_delta, gfx::Point());
+ host_impl_->PinchGestureEnd();
+ host_impl_->ScrollEnd();
+
+ gfx::Vector2dF scroll_delta(0, 5);
+ EXPECT_EQ(InputHandler::ScrollStarted,
+ host_impl_->ScrollBegin(gfx::Point(), InputHandler::Wheel));
+ EXPECT_VECTOR_EQ(gfx::Vector2dF(), scroll_layer->TotalScrollOffset());
+
+ host_impl_->ScrollBy(gfx::Point(), scroll_delta);
+ host_impl_->ScrollEnd();
+ EXPECT_VECTOR_EQ(gfx::Vector2dF(0, 2.5), scroll_layer->TotalScrollOffset());
+ }
+}
+
class LayerTreeHostImplCountingLostSurfaces : public LayerTreeHostImplTest {
public:
LayerTreeHostImplCountingLostSurfaces() : num_lost_surfaces_(0) {}
diff --git a/cc/trees/layer_tree_host_pixeltest_masks.cc b/cc/trees/layer_tree_host_pixeltest_masks.cc
index c494914..1235e15 100644
--- a/cc/trees/layer_tree_host_pixeltest_masks.cc
+++ b/cc/trees/layer_tree_host_pixeltest_masks.cc
@@ -47,6 +47,13 @@
}
}
+ scoped_refptr<DisplayItemList> PaintContentsToDisplayList(
+ const gfx::Rect& clip,
+ GraphicsContextStatus gc_status) override {
+ NOTIMPLEMENTED();
+ return DisplayItemList::Create();
+ }
+
private:
gfx::Size bounds_;
};
diff --git a/cc/trees/layer_tree_host_pixeltest_on_demand_raster.cc b/cc/trees/layer_tree_host_pixeltest_on_demand_raster.cc
index e7dd149..a5ccb8b 100644
--- a/cc/trees/layer_tree_host_pixeltest_on_demand_raster.cc
+++ b/cc/trees/layer_tree_host_pixeltest_on_demand_raster.cc
@@ -80,6 +80,13 @@
paint);
}
+ scoped_refptr<DisplayItemList> PaintContentsToDisplayList(
+ const gfx::Rect& clip,
+ GraphicsContextStatus gc_status) override {
+ NOTIMPLEMENTED();
+ return DisplayItemList::Create();
+ }
+
private:
gfx::Rect layer_rect_;
};
diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc
index f589c84..51c5d7e 100644
--- a/cc/trees/layer_tree_host_unittest.cc
+++ b/cc/trees/layer_tree_host_unittest.cc
@@ -1112,6 +1112,12 @@
if (test_layer_)
test_layer_->SetOpacity(0.f);
}
+ scoped_refptr<DisplayItemList> PaintContentsToDisplayList(
+ const gfx::Rect& clip,
+ GraphicsContextStatus gc_status) override {
+ NOTIMPLEMENTED();
+ return DisplayItemList::Create();
+ }
bool FillsBoundsCompletely() const override { return false; }
private:
@@ -2321,6 +2327,13 @@
++paint_count_;
}
+ scoped_refptr<DisplayItemList> PaintContentsToDisplayList(
+ const gfx::Rect& clip,
+ GraphicsContextStatus gc_status) override {
+ NOTIMPLEMENTED();
+ return DisplayItemList::Create();
+ }
+
bool FillsBoundsCompletely() const override { return false; }
private:
@@ -2591,6 +2604,13 @@
layer_->SetBounds(gfx::Size(2, 2));
}
+ scoped_refptr<DisplayItemList> PaintContentsToDisplayList(
+ const gfx::Rect& clip,
+ GraphicsContextStatus gc_status) override {
+ NOTIMPLEMENTED();
+ return DisplayItemList::Create();
+ }
+
bool FillsBoundsCompletely() const override { return false; }
private:
@@ -5653,6 +5673,9 @@
TestWebGraphicsContext3D::Create();
context3d->set_support_image(true);
context3d->set_support_sync_query(true);
+#if defined(OS_MACOSX)
+ context3d->set_support_texture_rectangle(true);
+#endif
if (delegating_renderer())
return FakeOutputSurface::CreateDelegating3d(context3d.Pass());
@@ -5840,4 +5863,59 @@
MULTI_THREAD_TEST_F(LayerTreeHostTestContinuousDrawWhenCreatingVisibleTiles);
+class LayerTreeHostTestOneActivatePerManageTiles : public LayerTreeHostTest {
+ public:
+ LayerTreeHostTestOneActivatePerManageTiles()
+ : notify_ready_to_activate_count_(0u), scheduled_manage_tiles_count_(0) {}
+
+ void SetupTree() override {
+ client_.set_fill_with_nonsolid_color(true);
+ scoped_refptr<FakePictureLayer> root_layer =
+ FakePictureLayer::Create(&client_);
+ root_layer->SetBounds(gfx::Size(1500, 1500));
+ root_layer->SetIsDrawable(true);
+
+ layer_tree_host()->SetRootLayer(root_layer);
+ LayerTreeHostTest::SetupTree();
+ }
+
+ void BeginTest() override {
+ layer_tree_host()->SetViewportSize(gfx::Size(16, 16));
+ PostSetNeedsCommitToMainThread();
+ }
+
+ void InitializedRendererOnThread(LayerTreeHostImpl* host_impl,
+ bool success) override {
+ ASSERT_TRUE(success);
+ host_impl->tile_manager()->SetScheduledRasterTaskLimitForTesting(1);
+ }
+
+ void NotifyReadyToActivateOnThread(LayerTreeHostImpl* impl) override {
+ ++notify_ready_to_activate_count_;
+ EndTestAfterDelayMs(100);
+ }
+
+ void ScheduledActionManageTiles() override {
+ ++scheduled_manage_tiles_count_;
+ }
+
+ void AfterTest() override {
+ // Expect at most a notification for each scheduled manage tiles, plus one
+ // for the initial commit (which doesn't go through scheduled actions).
+ // The reason this is not an equality is because depending on timing, we
+ // might get a manage tiles but not yet get a notification that we're
+ // ready to activate. The intent of a test is to ensure that we don't
+ // get more than one notification per manage tiles, so this is OK.
+ EXPECT_LE(notify_ready_to_activate_count_,
+ 1u + scheduled_manage_tiles_count_);
+ }
+
+ protected:
+ FakeContentLayerClient client_;
+ size_t notify_ready_to_activate_count_;
+ size_t scheduled_manage_tiles_count_;
+};
+
+MULTI_THREAD_IMPL_TEST_F(LayerTreeHostTestOneActivatePerManageTiles);
+
} // namespace cc
diff --git a/cc/trees/layer_tree_host_unittest_animation.cc b/cc/trees/layer_tree_host_unittest_animation.cc
index 8318192..f6bc4d9 100644
--- a/cc/trees/layer_tree_host_unittest_animation.cc
+++ b/cc/trees/layer_tree_host_unittest_animation.cc
@@ -106,13 +106,12 @@
LayerTreeHostAnimationTestSetNeedsAnimateInsideAnimationCallback);
// Add a layer animation and confirm that
-// LayerTreeHostImpl::updateAnimationState does get called and continues to
-// get called.
+// LayerTreeHostImpl::UpdateAnimationState does get called.
class LayerTreeHostAnimationTestAddAnimation
: public LayerTreeHostAnimationTest {
public:
LayerTreeHostAnimationTestAddAnimation()
- : num_begin_frames_(0), received_animation_started_notification_(false) {}
+ : update_animation_state_was_called_(false) {}
void BeginTest() override {
PostAddInstantAnimationToMainThread(layer_tree_host()->root_layer());
@@ -120,53 +119,28 @@
void UpdateAnimationState(LayerTreeHostImpl* host_impl,
bool has_unfinished_animation) override {
- if (!num_begin_frames_) {
- // The animation had zero duration so LayerTreeHostImpl should no
- // longer need to animate its layers.
- EXPECT_FALSE(has_unfinished_animation);
- num_begin_frames_++;
- return;
- }
-
- if (received_animation_started_notification_) {
- EXPECT_LT(base::TimeTicks(), start_time_);
-
- LayerAnimationController* controller_impl =
- host_impl->active_tree()->root_layer()->layer_animation_controller();
- Animation* animation_impl =
- controller_impl->GetAnimation(Animation::Opacity);
- if (animation_impl)
- controller_impl->RemoveAnimation(animation_impl->id());
-
- EndTest();
- }
+ EXPECT_FALSE(has_unfinished_animation);
+ update_animation_state_was_called_ = true;
}
void NotifyAnimationStarted(base::TimeTicks monotonic_time,
Animation::TargetProperty target_property,
int group) override {
- received_animation_started_notification_ = true;
- start_time_ = monotonic_time;
- if (num_begin_frames_) {
- EXPECT_LT(base::TimeTicks(), start_time_);
+ EXPECT_LT(base::TimeTicks(), monotonic_time);
- LayerAnimationController* controller =
- layer_tree_host()->root_layer()->layer_animation_controller();
- Animation* animation =
- controller->GetAnimation(Animation::Opacity);
- if (animation)
- controller->RemoveAnimation(animation->id());
+ LayerAnimationController* controller =
+ layer_tree_host()->root_layer()->layer_animation_controller();
+ Animation* animation = controller->GetAnimation(Animation::Opacity);
+ if (animation)
+ controller->RemoveAnimation(animation->id());
- EndTest();
- }
+ EndTest();
}
- void AfterTest() override {}
+ void AfterTest() override { EXPECT_TRUE(update_animation_state_was_called_); }
private:
- int num_begin_frames_;
- bool received_animation_started_notification_;
- base::TimeTicks start_time_;
+ bool update_animation_state_was_called_;
};
SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostAnimationTestAddAnimation);
@@ -531,9 +505,7 @@
class LayerTreeHostAnimationTestSynchronizeAnimationStartTimes
: public LayerTreeHostAnimationTest {
public:
- LayerTreeHostAnimationTestSynchronizeAnimationStartTimes()
- : main_start_time_(-1.0),
- impl_start_time_(-1.0) {}
+ LayerTreeHostAnimationTestSynchronizeAnimationStartTimes() {}
void SetupTree() override {
LayerTreeHostAnimationTest::SetupTree();
@@ -553,12 +525,9 @@
layer_animation_controller();
Animation* animation =
controller->GetAnimation(Animation::Opacity);
- main_start_time_ =
- (animation->start_time() - base::TimeTicks()).InSecondsF();
+ main_start_time_ = animation->start_time();
controller->RemoveAnimation(animation->id());
-
- if (impl_start_time_ > 0.0)
- EndTest();
+ EndTest();
}
void UpdateAnimationState(LayerTreeHostImpl* impl_host,
@@ -571,21 +540,17 @@
if (!animation)
return;
- impl_start_time_ =
- (animation->start_time() - base::TimeTicks()).InSecondsF();
- controller->RemoveAnimation(animation->id());
-
- if (main_start_time_ > 0.0)
- EndTest();
+ impl_start_time_ = animation->start_time();
}
void AfterTest() override {
- EXPECT_FLOAT_EQ(impl_start_time_, main_start_time_);
+ EXPECT_EQ(impl_start_time_, main_start_time_);
+ EXPECT_LT(base::TimeTicks(), impl_start_time_);
}
private:
- double main_start_time_;
- double impl_start_time_;
+ base::TimeTicks main_start_time_;
+ base::TimeTicks impl_start_time_;
FakeContentLayerClient client_;
scoped_refptr<FakeContentLayer> content_;
};
diff --git a/cc/trees/layer_tree_settings.cc b/cc/trees/layer_tree_settings.cc
index e792427..0771eb8 100644
--- a/cc/trees/layer_tree_settings.cc
+++ b/cc/trees/layer_tree_settings.cc
@@ -61,10 +61,13 @@
strict_layer_property_change_checking(false),
use_one_copy(false),
use_zero_copy(false),
+ use_image_external(false),
ignore_root_layer_flings(false),
scheduled_raster_task_limit(32),
use_occlusion_for_tile_prioritization(false),
- record_full_layer(false) {
+ record_full_layer(false),
+ use_display_lists(false),
+ main_thread_should_always_be_low_latency(false) {
}
LayerTreeSettings::~LayerTreeSettings() {}
diff --git a/cc/trees/layer_tree_settings.h b/cc/trees/layer_tree_settings.h
index ebbe7f7..438344b 100644
--- a/cc/trees/layer_tree_settings.h
+++ b/cc/trees/layer_tree_settings.h
@@ -73,10 +73,13 @@
bool strict_layer_property_change_checking;
bool use_one_copy;
bool use_zero_copy;
+ bool use_image_external;
bool ignore_root_layer_flings;
size_t scheduled_raster_task_limit;
bool use_occlusion_for_tile_prioritization;
bool record_full_layer;
+ bool use_display_lists;
+ bool main_thread_should_always_be_low_latency;
LayerTreeDebugState initial_debug_state;
};
diff --git a/cc/trees/single_thread_proxy.cc b/cc/trees/single_thread_proxy.cc
index 5a40d7e..9a13457 100644
--- a/cc/trees/single_thread_proxy.cc
+++ b/cc/trees/single_thread_proxy.cc
@@ -430,9 +430,8 @@
// equivalent of blocking commit until activation and also running
// all tasks posted during commit/activation before CommitComplete.
MainThreadTaskRunner()->PostTask(
- FROM_HERE,
- base::Bind(&SingleThreadProxy::CommitComplete,
- weak_factory_.GetWeakPtr()));
+ FROM_HERE, base::Bind(&SingleThreadProxy::CommitComplete,
+ weak_factory_.GetWeakPtr()));
}
timing_history_.DidActivateSyncTree();
@@ -493,8 +492,8 @@
{
BeginFrameArgs begin_frame_args(BeginFrameArgs::Create(
- frame_begin_time, base::TimeTicks(), BeginFrameArgs::DefaultInterval(),
- BeginFrameArgs::SYNCHRONOUS));
+ BEGINFRAME_FROM_HERE, frame_begin_time, base::TimeTicks(),
+ BeginFrameArgs::DefaultInterval(), BeginFrameArgs::SYNCHRONOUS));
DoBeginMainFrame(begin_frame_args);
DoCommit();
diff --git a/crypto/rsa_private_key_nss.cc b/crypto/rsa_private_key_nss.cc
index 0065875..c51e308 100644
--- a/crypto/rsa_private_key_nss.cc
+++ b/crypto/rsa_private_key_nss.cc
@@ -278,29 +278,37 @@
scoped_ptr<RSAPrivateKey> result(new RSAPrivateKey);
- SECItem der_private_key_info;
- der_private_key_info.data = const_cast<unsigned char*>(&input.front());
- der_private_key_info.len = input.size();
- // Allow the private key to be used for key unwrapping, data decryption,
- // and signature generation.
- const unsigned int key_usage = KU_KEY_ENCIPHERMENT | KU_DATA_ENCIPHERMENT |
- KU_DIGITAL_SIGNATURE;
- // TODO(davidben): PK11_ImportDERPrivateKeyInfoAndReturnKey calls NSS's
- // SEC_ASN1DecodeItem which does not enforce that there is no trailing
- // data.
- SECStatus rv = PK11_ImportDERPrivateKeyInfoAndReturnKey(
- slot, &der_private_key_info, NULL, NULL, permanent, sensitive,
- key_usage, &result->key_, NULL);
- if (rv != SECSuccess) {
+ ScopedPLArenaPool arena(PORT_NewArena(DER_DEFAULT_CHUNKSIZE));
+ if (!arena) {
NOTREACHED();
return NULL;
}
- result->public_key_ = SECKEY_ConvertToPublicKey(result->key_);
- if (!result->public_key_) {
- NOTREACHED();
+ // Excess data is illegal, but NSS silently accepts it, so first ensure that
+ // |input| consists of a single ASN.1 element.
+ SECItem input_item;
+ input_item.data = const_cast<unsigned char*>(&input.front());
+ input_item.len = input.size();
+ SECItem der_private_key_info;
+ SECStatus rv = SEC_QuickDERDecodeItem(arena.get(), &der_private_key_info,
+ SEC_ASN1_GET(SEC_AnyTemplate),
+ &input_item);
+ if (rv != SECSuccess)
return NULL;
- }
+
+ // Allow the private key to be used for key unwrapping, data decryption,
+ // and signature generation.
+ const unsigned int key_usage = KU_KEY_ENCIPHERMENT | KU_DATA_ENCIPHERMENT |
+ KU_DIGITAL_SIGNATURE;
+ rv = PK11_ImportDERPrivateKeyInfoAndReturnKey(
+ slot, &der_private_key_info, NULL, NULL, permanent, sensitive,
+ key_usage, &result->key_, NULL);
+ if (rv != SECSuccess)
+ return NULL;
+
+ result->public_key_ = SECKEY_ConvertToPublicKey(result->key_);
+ if (!result->public_key_)
+ return NULL;
return result.release();
}
diff --git a/crypto/rsa_private_key_openssl.cc b/crypto/rsa_private_key_openssl.cc
index 0df1730..3dcce67 100644
--- a/crypto/rsa_private_key_openssl.cc
+++ b/crypto/rsa_private_key_openssl.cc
@@ -83,13 +83,10 @@
// Importing is a little more involved than exporting, as we must first
// PKCS#8 decode the input, and then import the EVP_PKEY from Private Key
// Info structure returned.
- //
- // TODO(davidben): This should check that |ptr| advanced to the end of |input|
- // to ensure there is no trailing data.
const uint8_t* ptr = &input[0];
ScopedPKCS8_PRIV_KEY_INFO p8inf(
d2i_PKCS8_PRIV_KEY_INFO(nullptr, &ptr, input.size()));
- if (!p8inf.get())
+ if (!p8inf.get() || ptr != &input[0] + input.size())
return NULL;
scoped_ptr<RSAPrivateKey> result(new RSAPrivateKey);
diff --git a/crypto/rsa_private_key_unittest.cc b/crypto/rsa_private_key_unittest.cc
index d53d502..a7253e2 100644
--- a/crypto/rsa_private_key_unittest.cc
+++ b/crypto/rsa_private_key_unittest.cc
@@ -150,6 +150,20 @@
ASSERT_EQ(input, privkey_copy);
}
+// Test that CreateFromPrivateKeyInfo fails if there is extra data after the RSA
+// key.
+TEST(RSAPrivateKeyUnitTest, ExtraData) {
+ std::vector<uint8> input(
+ kTestPrivateKeyInfo, kTestPrivateKeyInfo + sizeof(kTestPrivateKeyInfo));
+ input.push_back(0);
+
+ scoped_ptr<crypto::RSAPrivateKey> key(
+ crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(input));
+
+ // Import should fail.
+ EXPECT_FALSE(key);
+}
+
// Verify that generated public keys look good. This test data was generated
// with the openssl command line tool.
diff --git a/gin/isolate_holder.cc b/gin/isolate_holder.cc
index 2cdacc0..2b6d64b 100644
--- a/gin/isolate_holder.cc
+++ b/gin/isolate_holder.cc
@@ -20,6 +20,9 @@
#include "gin/run_microtasks_observer.h"
#ifdef V8_USE_EXTERNAL_STARTUP_DATA
+#ifdef OS_MACOSX
+#include "base/mac/foundation_util.h"
+#endif // OS_MACOSX
#include "base/path_service.h"
#endif // V8_USE_EXTERNAL_STARTUP_DATA
@@ -68,6 +71,16 @@
return true;
}
+
+#if !defined(OS_MACOSX)
+const int v8_snapshot_dir =
+#if defined(OS_ANDROID)
+ base::DIR_ANDROID_APP_DATA;
+#elif defined(OS_POSIX)
+ base::DIR_EXE;
+#endif // defined(OS_ANDROID)
+#endif // !defined(OS_MACOSX)
+
#endif // V8_USE_EXTERNAL_STARTUP_DATA
} // namespace
@@ -79,18 +92,21 @@
if (g_mapped_natives && g_mapped_snapshot)
return true;
+#if !defined(OS_MACOSX)
base::FilePath data_path;
- PathService::Get(
-#if defined(OS_ANDROID)
- base::DIR_ANDROID_APP_DATA,
-#elif defined(OS_POSIX)
- base::DIR_EXE,
-#endif
- &data_path);
+ PathService::Get(v8_snapshot_dir, &data_path);
DCHECK(!data_path.empty());
base::FilePath natives_path = data_path.AppendASCII("natives_blob.bin");
base::FilePath snapshot_path = data_path.AppendASCII("snapshot_blob.bin");
+#else // !defined(OS_MACOSX)
+ base::FilePath natives_path = base::mac::PathForFrameworkBundleResource(
+ CFSTR("natives_blob.bin"));
+ base::FilePath snapshot_path = base::mac::PathForFrameworkBundleResource(
+ CFSTR("snapshot_blob.bin"));
+ DCHECK(!natives_path.empty());
+ DCHECK(!snapshot_path.empty());
+#endif // !defined(OS_MACOSX)
return MapV8Files(&natives_path, &snapshot_path);
}
@@ -181,13 +197,11 @@
v8::StartupData natives;
natives.data = reinterpret_cast<const char*>(g_mapped_natives->data());
natives.raw_size = static_cast<int>(g_mapped_natives->length());
- natives.compressed_size = static_cast<int>(g_mapped_natives->length());
v8::V8::SetNativesDataBlob(&natives);
v8::StartupData snapshot;
snapshot.data = reinterpret_cast<const char*>(g_mapped_snapshot->data());
snapshot.raw_size = static_cast<int>(g_mapped_snapshot->length());
- snapshot.compressed_size = static_cast<int>(g_mapped_snapshot->length());
v8::V8::SetSnapshotDataBlob(&snapshot);
#endif // V8_USE_EXTERNAL_STARTUP_DATA
v8::V8::Initialize();
diff --git a/gin/modules/module_registry_unittest.cc b/gin/modules/module_registry_unittest.cc
index 3d784dc..ed725fc 100644
--- a/gin/modules/module_registry_unittest.cc
+++ b/gin/modules/module_registry_unittest.cc
@@ -70,6 +70,10 @@
->LoadModule(isolate, "two", base::Bind(NestedCallback));
}
+void OnModuleLoadedNoOp(v8::Handle<v8::Value> value) {
+ ASSERT_TRUE(value->IsNumber());
+}
+
} // namespace
typedef V8Test ModuleRegistryTest;
@@ -133,4 +137,28 @@
EXPECT_EQ(3, counter);
}
+// Verifies that explicitly loading a module that's already pending does
+// not cause the ModuleRegistry's unsatisfied_dependency set to grow.
+TEST_F(ModuleRegistryTest, UnsatisfiedDependenciesTest) {
+ TestHelper helper(instance_->isolate());
+ std::string source =
+ "define('one', ['no_such_module'], function(nsm) {"
+ " return 1;"
+ "});";
+ ModuleRegistry* registry =
+ ModuleRegistry::From(helper.runner->GetContextHolder()->context());
+
+ std::set<std::string> no_such_module_set;
+ no_such_module_set.insert("no_such_module");
+
+ // Adds one unsatisfied dependency on "no-such-module".
+ helper.runner->Run(source, "script");
+ EXPECT_EQ(no_such_module_set, registry->unsatisfied_dependencies());
+
+ // Should have no effect on the unsatisfied_dependencies set.
+ ModuleRegistry::LoadModuleCallback callback = base::Bind(OnModuleLoadedNoOp);
+ registry->LoadModule(instance_->isolate(), "one", callback);
+ EXPECT_EQ(no_such_module_set, registry->unsatisfied_dependencies());
+}
+
} // namespace gin
diff --git a/gin/shell/gin_main.cc b/gin/shell/gin_main.cc
index 2f7998e..d0fe119 100644
--- a/gin/shell/gin_main.cc
+++ b/gin/shell/gin_main.cc
@@ -12,7 +12,6 @@
#include "gin/modules/console.h"
#include "gin/modules/module_runner_delegate.h"
#include "gin/public/isolate_holder.h"
-#include "gin/test/file_runner.h"
#include "gin/try_catch.h"
namespace gin {
diff --git a/gpu/BUILD.gn b/gpu/BUILD.gn
index 4fc8145..25a80b3 100644
--- a/gpu/BUILD.gn
+++ b/gpu/BUILD.gn
@@ -100,6 +100,7 @@
":gpu",
":test_support",
"//base",
+ "//base/test:test_support",
"//base/third_party/dynamic_annotations",
"//testing/gmock",
"//testing/gtest",
@@ -251,6 +252,7 @@
deps = [
"//base",
+ "//base/test:test_support",
"//base/third_party/dynamic_annotations",
"//testing/gmock",
"//testing/gtest",
diff --git a/gpu/GLES2/gl2chromium_autogen.h b/gpu/GLES2/gl2chromium_autogen.h
index 5489d06..f7b0c5d 100644
--- a/gpu/GLES2/gl2chromium_autogen.h
+++ b/gpu/GLES2/gl2chromium_autogen.h
@@ -36,6 +36,7 @@
#define glCompileShader GLES2_GET_FUN(CompileShader)
#define glCompressedTexImage2D GLES2_GET_FUN(CompressedTexImage2D)
#define glCompressedTexSubImage2D GLES2_GET_FUN(CompressedTexSubImage2D)
+#define glCopyBufferSubData GLES2_GET_FUN(CopyBufferSubData)
#define glCopyTexImage2D GLES2_GET_FUN(CopyTexImage2D)
#define glCopyTexSubImage2D GLES2_GET_FUN(CopyTexSubImage2D)
#define glCreateProgram GLES2_GET_FUN(CreateProgram)
@@ -61,6 +62,7 @@
#define glFlush GLES2_GET_FUN(Flush)
#define glFramebufferRenderbuffer GLES2_GET_FUN(FramebufferRenderbuffer)
#define glFramebufferTexture2D GLES2_GET_FUN(FramebufferTexture2D)
+#define glFramebufferTextureLayer GLES2_GET_FUN(FramebufferTextureLayer)
#define glFrontFace GLES2_GET_FUN(FrontFace)
#define glGenBuffers GLES2_GET_FUN(GenBuffers)
#define glGenerateMipmap GLES2_GET_FUN(GenerateMipmap)
@@ -78,6 +80,7 @@
#define glGetFramebufferAttachmentParameteriv \
GLES2_GET_FUN(GetFramebufferAttachmentParameteriv)
#define glGetIntegerv GLES2_GET_FUN(GetIntegerv)
+#define glGetInternalformativ GLES2_GET_FUN(GetInternalformativ)
#define glGetProgramiv GLES2_GET_FUN(GetProgramiv)
#define glGetProgramInfoLog GLES2_GET_FUN(GetProgramInfoLog)
#define glGetRenderbufferParameteriv GLES2_GET_FUN(GetRenderbufferParameteriv)
@@ -126,26 +129,41 @@
#define glTexParameterfv GLES2_GET_FUN(TexParameterfv)
#define glTexParameteri GLES2_GET_FUN(TexParameteri)
#define glTexParameteriv GLES2_GET_FUN(TexParameteriv)
+#define glTexStorage3D GLES2_GET_FUN(TexStorage3D)
#define glTexSubImage2D GLES2_GET_FUN(TexSubImage2D)
#define glUniform1f GLES2_GET_FUN(Uniform1f)
#define glUniform1fv GLES2_GET_FUN(Uniform1fv)
#define glUniform1i GLES2_GET_FUN(Uniform1i)
#define glUniform1iv GLES2_GET_FUN(Uniform1iv)
+#define glUniform1ui GLES2_GET_FUN(Uniform1ui)
+#define glUniform1uiv GLES2_GET_FUN(Uniform1uiv)
#define glUniform2f GLES2_GET_FUN(Uniform2f)
#define glUniform2fv GLES2_GET_FUN(Uniform2fv)
#define glUniform2i GLES2_GET_FUN(Uniform2i)
#define glUniform2iv GLES2_GET_FUN(Uniform2iv)
+#define glUniform2ui GLES2_GET_FUN(Uniform2ui)
+#define glUniform2uiv GLES2_GET_FUN(Uniform2uiv)
#define glUniform3f GLES2_GET_FUN(Uniform3f)
#define glUniform3fv GLES2_GET_FUN(Uniform3fv)
#define glUniform3i GLES2_GET_FUN(Uniform3i)
#define glUniform3iv GLES2_GET_FUN(Uniform3iv)
+#define glUniform3ui GLES2_GET_FUN(Uniform3ui)
+#define glUniform3uiv GLES2_GET_FUN(Uniform3uiv)
#define glUniform4f GLES2_GET_FUN(Uniform4f)
#define glUniform4fv GLES2_GET_FUN(Uniform4fv)
#define glUniform4i GLES2_GET_FUN(Uniform4i)
#define glUniform4iv GLES2_GET_FUN(Uniform4iv)
+#define glUniform4ui GLES2_GET_FUN(Uniform4ui)
+#define glUniform4uiv GLES2_GET_FUN(Uniform4uiv)
#define glUniformMatrix2fv GLES2_GET_FUN(UniformMatrix2fv)
+#define glUniformMatrix2x3fv GLES2_GET_FUN(UniformMatrix2x3fv)
+#define glUniformMatrix2x4fv GLES2_GET_FUN(UniformMatrix2x4fv)
#define glUniformMatrix3fv GLES2_GET_FUN(UniformMatrix3fv)
+#define glUniformMatrix3x2fv GLES2_GET_FUN(UniformMatrix3x2fv)
+#define glUniformMatrix3x4fv GLES2_GET_FUN(UniformMatrix3x4fv)
#define glUniformMatrix4fv GLES2_GET_FUN(UniformMatrix4fv)
+#define glUniformMatrix4x2fv GLES2_GET_FUN(UniformMatrix4x2fv)
+#define glUniformMatrix4x3fv GLES2_GET_FUN(UniformMatrix4x3fv)
#define glUseProgram GLES2_GET_FUN(UseProgram)
#define glValidateProgram GLES2_GET_FUN(ValidateProgram)
#define glVertexAttrib1f GLES2_GET_FUN(VertexAttrib1f)
@@ -156,6 +174,11 @@
#define glVertexAttrib3fv GLES2_GET_FUN(VertexAttrib3fv)
#define glVertexAttrib4f GLES2_GET_FUN(VertexAttrib4f)
#define glVertexAttrib4fv GLES2_GET_FUN(VertexAttrib4fv)
+#define glVertexAttribI4i GLES2_GET_FUN(VertexAttribI4i)
+#define glVertexAttribI4iv GLES2_GET_FUN(VertexAttribI4iv)
+#define glVertexAttribI4ui GLES2_GET_FUN(VertexAttribI4ui)
+#define glVertexAttribI4uiv GLES2_GET_FUN(VertexAttribI4uiv)
+#define glVertexAttribIPointer GLES2_GET_FUN(VertexAttribIPointer)
#define glVertexAttribPointer GLES2_GET_FUN(VertexAttribPointer)
#define glViewport GLES2_GET_FUN(Viewport)
#define glBlitFramebufferCHROMIUM GLES2_GET_FUN(BlitFramebufferCHROMIUM)
diff --git a/gpu/angle_unittest_main.cc b/gpu/angle_unittest_main.cc
index 67e91ed..e7667f6 100644
--- a/gpu/angle_unittest_main.cc
+++ b/gpu/angle_unittest_main.cc
@@ -3,22 +3,33 @@
// found in the LICENSE file.
#include "base/at_exit.h"
+#include "base/bind.h"
#include "base/command_line.h"
+#include "base/message_loop/message_loop.h"
+#include "base/test/launcher/unit_test_launcher.h"
+#include "base/test/test_suite.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/angle/include/GLSLANG/ShaderLang.h"
+namespace {
+
+int RunHelper(base::TestSuite* test_suite) {
+ base::MessageLoopForIO message_loop;
+ return test_suite->Run();
+}
+
+} // namespace
+
int main(int argc, char** argv) {
- // On Android, AtExitManager is created in
- // testing/android/native_test_wrapper.cc before main() is called.
- // The same thing is also done in base/test/test_suite.cc
-#if !defined(OS_ANDROID)
- base::AtExitManager exit_manager;
-#endif
CommandLine::Init(argc, argv);
testing::InitGoogleMock(&argc, argv);
ShInitialize();
- int rt = RUN_ALL_TESTS();
+ base::TestSuite test_suite(argc, argv);
+ int rt = base::LaunchUnitTestsSerially(
+ argc,
+ argv,
+ base::Bind(&RunHelper, base::Unretained(&test_suite)));
ShFinalize();
return rt;
}
diff --git a/gpu/command_buffer/build_gles2_cmd_buffer.py b/gpu/command_buffer/build_gles2_cmd_buffer.py
index 7cccd43..7a3db58 100755
--- a/gpu/command_buffer/build_gles2_cmd_buffer.py
+++ b/gpu/command_buffer/build_gles2_cmd_buffer.py
@@ -688,6 +688,16 @@
'GL_PROXY_TEXTURE_CUBE_MAP',
]
},
+ 'Texture3DTarget': {
+ 'type': 'GLenum',
+ 'valid': [
+ 'GL_TEXTURE_3D',
+ 'GL_TEXTURE_2D_ARRAY',
+ ],
+ 'invalid': [
+ 'GL_TEXTURE_2D',
+ ]
+ },
'TextureBindTarget': {
'type': 'GLenum',
'valid': [
@@ -1347,6 +1357,8 @@
# the corresponding feature info flag is enabled. Implies
# 'extension': True.
# not_shared: For GENn types, True if objects can't be shared between contexts
+# unsafe: True = no validation is implemented on the service side and the
+# command is only available with --enable-unsafe-es3-apis.
_FUNCTION_INFO = {
'ActiveTexture': {
@@ -1450,6 +1462,9 @@
'chromium': True,
'trace_level': 1,
},
+ 'CopyBufferSubData': {
+ 'unsafe': True,
+ },
'CreateAndConsumeTextureCHROMIUM': {
'decoder_func': 'DoCreateAndConsumeTextureCHROMIUM',
'impl_func': False,
@@ -1751,6 +1766,10 @@
'extension_flag': 'multisampled_render_to_texture',
'trace_level': 1,
},
+ 'FramebufferTextureLayer': {
+ 'decoder_func': 'DoFramebufferTextureLayer',
+ 'unsafe': True,
+ },
'GenerateMipmap': {
'decoder_func': 'DoGenerateMipmap',
'gl_test_func': 'glGenerateMipmapEXT',
@@ -1860,6 +1879,11 @@
'decoder_func': 'DoGetIntegerv',
'client_test': False,
},
+ 'GetInternalformativ': {
+ 'type': 'GETn',
+ 'result': ['SizedResult<GLint>'],
+ 'unsafe': True,
+ },
'GetMaxValueInBufferCHROMIUM': {
'type': 'Is',
'decoder_func': 'DoGetMaxValueInBufferCHROMIUM',
@@ -2198,6 +2222,9 @@
'gl_test_func': 'glTexParameteri',
'first_element_only': True,
},
+ 'TexStorage3D': {
+ 'unsafe': True,
+ },
'TexSubImage2D': {
'type': 'Manual',
'data_transfer_methods': ['shm'],
@@ -2221,6 +2248,16 @@
'decoder_func': 'DoUniform1iv',
'unit_test': False,
},
+ 'Uniform1ui': {
+ 'type': 'PUTXn',
+ 'count': 1,
+ 'unsafe': True,
+ },
+ 'Uniform1uiv': {
+ 'type': 'PUTn',
+ 'count': 1,
+ 'unsafe': True,
+ },
'Uniform2i': {'type': 'PUTXn', 'count': 2},
'Uniform2f': {'type': 'PUTXn', 'count': 2},
'Uniform2fv': {
@@ -2233,6 +2270,16 @@
'count': 2,
'decoder_func': 'DoUniform2iv',
},
+ 'Uniform2ui': {
+ 'type': 'PUTXn',
+ 'count': 2,
+ 'unsafe': True,
+ },
+ 'Uniform2uiv': {
+ 'type': 'PUTn',
+ 'count': 2,
+ 'unsafe': True,
+ },
'Uniform3i': {'type': 'PUTXn', 'count': 3},
'Uniform3f': {'type': 'PUTXn', 'count': 3},
'Uniform3fv': {
@@ -2245,6 +2292,16 @@
'count': 3,
'decoder_func': 'DoUniform3iv',
},
+ 'Uniform3ui': {
+ 'type': 'PUTXn',
+ 'count': 3,
+ 'unsafe': True,
+ },
+ 'Uniform3uiv': {
+ 'type': 'PUTn',
+ 'count': 3,
+ 'unsafe': True,
+ },
'Uniform4i': {'type': 'PUTXn', 'count': 4},
'Uniform4f': {'type': 'PUTXn', 'count': 4},
'Uniform4fv': {
@@ -2257,21 +2314,61 @@
'count': 4,
'decoder_func': 'DoUniform4iv',
},
+ 'Uniform4ui': {
+ 'type': 'PUTXn',
+ 'count': 4,
+ 'unsafe': True,
+ },
+ 'Uniform4uiv': {
+ 'type': 'PUTn',
+ 'count': 4,
+ 'unsafe': True,
+ },
'UniformMatrix2fv': {
'type': 'PUTn',
'count': 4,
'decoder_func': 'DoUniformMatrix2fv',
},
+ 'UniformMatrix2x3fv': {
+ 'type': 'PUTn',
+ 'count': 6,
+ 'unsafe': True,
+ },
+ 'UniformMatrix2x4fv': {
+ 'type': 'PUTn',
+ 'count': 8,
+ 'unsafe': True,
+ },
'UniformMatrix3fv': {
'type': 'PUTn',
'count': 9,
'decoder_func': 'DoUniformMatrix3fv',
},
+ 'UniformMatrix3x2fv': {
+ 'type': 'PUTn',
+ 'count': 6,
+ 'unsafe': True,
+ },
+ 'UniformMatrix3x4fv': {
+ 'type': 'PUTn',
+ 'count': 12,
+ 'unsafe': True,
+ },
'UniformMatrix4fv': {
'type': 'PUTn',
'count': 16,
'decoder_func': 'DoUniformMatrix4fv',
},
+ 'UniformMatrix4x2fv': {
+ 'type': 'PUTn',
+ 'count': 8,
+ 'unsafe': True,
+ },
+ 'UniformMatrix4x3fv': {
+ 'type': 'PUTn',
+ 'count': 12,
+ 'unsafe': True,
+ },
'UnmapBufferCHROMIUM': {
'gen_cmd': False,
'extension': True,
@@ -2321,12 +2418,36 @@
'count': 4,
'decoder_func': 'DoVertexAttrib4fv',
},
+ 'VertexAttribI4i': {
+ 'unsafe': True,
+ },
+ 'VertexAttribI4iv': {
+ 'type': 'PUT',
+ 'count': 4,
+ 'unsafe': True,
+ },
+ 'VertexAttribI4ui': {
+ 'unsafe': True,
+ },
+ 'VertexAttribI4uiv': {
+ 'type': 'PUT',
+ 'count': 4,
+ 'unsafe': True,
+ },
+ 'VertexAttribIPointer': {
+ 'type': 'Manual',
+ 'cmd_args': 'GLuint indx, GLintVertexAttribSize size, '
+ 'GLenumVertexAttribType type, GLsizei stride, '
+ 'GLuint offset',
+ 'client_test': False,
+ 'unsafe': True,
+ },
'VertexAttribPointer': {
- 'type': 'Manual',
- 'cmd_args': 'GLuint indx, GLintVertexAttribSize size, '
- 'GLenumVertexAttribType type, GLboolean normalized, '
- 'GLsizei stride, GLuint offset',
- 'client_test': False,
+ 'type': 'Manual',
+ 'cmd_args': 'GLuint indx, GLintVertexAttribSize size, '
+ 'GLenumVertexAttribType type, GLboolean normalized, '
+ 'GLsizei stride, GLuint offset',
+ 'client_test': False,
},
'Scissor': {
'type': 'StateSet',
@@ -2336,11 +2457,11 @@
'decoder_func': 'DoViewport',
},
'ResizeCHROMIUM': {
- 'type': 'Custom',
- 'impl_func': False,
- 'unit_test': False,
- 'extension': True,
- 'chromium': True,
+ 'type': 'Custom',
+ 'impl_func': False,
+ 'unit_test': False,
+ 'extension': True,
+ 'chromium': True,
},
'GetRequestableExtensionsCHROMIUM': {
'type': 'Custom',
@@ -2978,7 +3099,12 @@
"""Writes function header for service implementation handlers."""
file.Write("""error::Error GLES2DecoderImpl::Handle%(name)s(
uint32_t immediate_data_size, const void* cmd_data) {
- const gles2::cmds::%(name)s& c =
+ """ % {'name': func.name})
+ if func.IsUnsafe():
+ file.Write("""if (!unsafe_es3_apis_enabled())
+ return error::kUnknownCommand;
+ """)
+ file.Write("""const gles2::cmds::%(name)s& c =
*static_cast<const gles2::cmds::%(name)s*>(cmd_data);
(void)c;
""" % {'name': func.name})
@@ -3140,36 +3266,40 @@
SetupExpectationsForEnableDisable(%(gl_args)s, true);
SpecializedSetup<cmds::%(name)s, 0>(true);
cmds::%(name)s cmd;
- cmd.Init(%(args)s);
- EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
- EXPECT_EQ(GL_NO_ERROR, GetGLError());
-}
-"""
+ cmd.Init(%(args)s);"""
elif func.name == 'Disable':
valid_test = """
TEST_P(%(test_name)s, %(name)sValidArgs) {
SetupExpectationsForEnableDisable(%(gl_args)s, false);
SpecializedSetup<cmds::%(name)s, 0>(true);
cmds::%(name)s cmd;
- cmd.Init(%(args)s);
- EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
- EXPECT_EQ(GL_NO_ERROR, GetGLError());
-}
-"""
+ cmd.Init(%(args)s);"""
else:
valid_test = """
TEST_P(%(test_name)s, %(name)sValidArgs) {
EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s));
SpecializedSetup<cmds::%(name)s, 0>(true);
cmds::%(name)s cmd;
- cmd.Init(%(args)s);
+ cmd.Init(%(args)s);"""
+ if func.IsUnsafe():
+ valid_test += """
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));
+}
+"""
+ else:
+ valid_test += """
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
EXPECT_EQ(GL_NO_ERROR, GetGLError());
}
"""
self.WriteValidUnitTest(func, file, valid_test, *extras)
- invalid_test = """
+ if not func.IsUnsafe():
+ invalid_test = """
TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0);
SpecializedSetup<cmds::%(name)s, 0>(false);
@@ -3178,7 +3308,7 @@
EXPECT_EQ(error::%(parse_result)s, ExecuteCmd(cmd));%(gl_error_test)s
}
"""
- self.WriteInvalidUnitTest(func, file, invalid_test, *extras)
+ self.WriteInvalidUnitTest(func, file, invalid_test, *extras)
def WriteImmediateServiceUnitTest(self, func, file, *extras):
"""Writes the service unit test for an immediate command."""
@@ -4919,12 +5049,21 @@
EXPECT_CALL(*gl_, %(gl_func_name)s(%(local_gl_args)s));
result->size = 0;
cmds::%(name)s cmd;
- cmd.Init(%(args)s);
+ cmd.Init(%(args)s);"""
+ if func.IsUnsafe():
+ valid_test += """
+ decoder_->set_unsafe_es3_apis_enabled(true);"""
+ valid_test += """
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(
%(valid_pname)s),
result->GetNumResults());
- EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());"""
+ if func.IsUnsafe():
+ valid_test += """
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));"""
+ valid_test += """
}
"""
gl_arg_strings = []
@@ -4944,7 +5083,8 @@
'valid_pname': valid_pname,
}, *extras)
- invalid_test = """
+ if not func.IsUnsafe():
+ invalid_test = """
TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0);
SpecializedSetup<cmds::%(name)s, 0>(false);
@@ -4957,7 +5097,7 @@
EXPECT_EQ(0u, result->size);%(gl_error_test)s
}
"""
- self.WriteInvalidUnitTest(func, file, invalid_test, *extras)
+ self.WriteInvalidUnitTest(func, file, invalid_test, *extras)
class ArrayArgTypeHandler(TypeHandler):
"""Base class for type handlers that handle args that are arrays"""
@@ -5040,10 +5180,20 @@
EXPECT_CALL(
*gl_,
%(gl_func_name)s(%(gl_args)s, %(data_ref)sreinterpret_cast<
- %(data_type)s*>(ImmediateDataAddress(&cmd))));
+ %(data_type)s*>(ImmediateDataAddress(&cmd))));"""
+ if func.IsUnsafe():
+ valid_test += """
+ decoder_->set_unsafe_es3_apis_enabled(true);"""
+ valid_test += """
EXPECT_EQ(error::kNoError,
ExecuteImmediateCmd(cmd, sizeof(temp)));
- EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());"""
+ if func.IsUnsafe():
+ valid_test += """
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand,
+ ExecuteImmediateCmd(cmd, sizeof(temp)));"""
+ valid_test += """
}
"""
gl_arg_strings = [
@@ -5309,10 +5459,20 @@
reinterpret_cast<%(data_type)s*>(ImmediateDataAddress(&cmd))));
SpecializedSetup<cmds::%(name)s, 0>(true);
%(data_type)s temp[%(data_count)s * 2] = { 0, };
- cmd.Init(%(args)s, &temp[0]);
+ cmd.Init(%(args)s, &temp[0]);"""
+ if func.IsUnsafe():
+ valid_test += """
+ decoder_->set_unsafe_es3_apis_enabled(true);"""
+ valid_test += """
EXPECT_EQ(error::kNoError,
ExecuteImmediateCmd(cmd, sizeof(temp)));
- EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());"""
+ if func.IsUnsafe():
+ valid_test += """
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand,
+ ExecuteImmediateCmd(cmd, sizeof(temp)));"""
+ valid_test += """
}
"""
gl_arg_strings = []
@@ -5586,7 +5746,13 @@
def WriteHandlerImplementation(self, func, file):
"""Overrriden from TypeHandler."""
- code = """ %(type)s temp[%(count)s] = { %(values)s};
+ code = """ %(type)s temp[%(count)s] = { %(values)s};"""
+ if func.IsUnsafe():
+ code += """
+ gl%(name)sv(%(location)s, 1, &temp[0]);
+"""
+ else:
+ code += """
Do%(name)sv(%(location)s, 1, &temp[0]);
"""
values = ""
@@ -5612,9 +5778,18 @@
EXPECT_CALL(*gl_, %(name)sv(%(local_args)s));
SpecializedSetup<cmds::%(name)s, 0>(true);
cmds::%(name)s cmd;
- cmd.Init(%(args)s);
+ cmd.Init(%(args)s);"""
+ if func.IsUnsafe():
+ valid_test += """
+ decoder_->set_unsafe_es3_apis_enabled(true);"""
+ valid_test += """
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
- EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());"""
+ if func.IsUnsafe():
+ valid_test += """
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));"""
+ valid_test += """
}
"""
args = func.GetOriginalArgs()
@@ -6368,6 +6543,8 @@
return self.named_type.GetConstantValue()
def WriteValidationCode(self, file, func):
+ if func.IsUnsafe():
+ return
if self.named_type.IsConstant():
return
file.Write(" if (!validators_->%s.IsValid(%s)) {\n" %
@@ -6846,6 +7023,10 @@
"""Returns whether the function is immediate data function or not."""
return False
+ def IsUnsafe(self):
+ """Returns whether the function has service side validation or not."""
+ return self.GetInfo('unsafe', False)
+
def GetInfo(self, name, default = None):
"""Returns a value from the function info for this function."""
if name in self.info:
@@ -6874,7 +7055,8 @@
def IsCoreGLFunction(self):
return (not self.IsExtension() and
- not self.GetInfo('pepper_interface'))
+ not self.GetInfo('pepper_interface') and
+ not self.IsUnsafe())
def InPepperInterface(self, interface):
ext = self.GetInfo('pepper_interface')
@@ -8301,6 +8483,7 @@
dict = {}
for fname in ['third_party/khronos/GLES2/gl2.h',
'third_party/khronos/GLES2/gl2ext.h',
+ 'third_party/khronos/GLES3/gl3.h',
'gpu/GLES2/gl2chromium.h',
'gpu/GLES2/gl2extchromium.h']:
lines = open(fname).readlines()
diff --git a/gpu/command_buffer/client/cmd_buffer_helper.h b/gpu/command_buffer/client/cmd_buffer_helper.h
index 954107f..d10a554 100644
--- a/gpu/command_buffer/client/cmd_buffer_helper.h
+++ b/gpu/command_buffer/client/cmd_buffer_helper.h
@@ -137,11 +137,12 @@
template <typename T>
void ForceNullCheck(T* data) {
-#if defined(OS_WIN) && defined(ARCH_CPU_64_BITS)
+#if defined(COMPILER_MSVC) && defined(ARCH_CPU_64_BITS) && !defined(__clang__)
// 64-bit MSVC's alias analysis was determining that the command buffer
// entry couldn't be NULL, so it optimized out the NULL check.
// Dereferencing the same datatype through a volatile pointer seems to
// prevent that from happening. http://crbug.com/361936
+ // TODO(jbauman): Remove once we're on VC2015, http://crbug.com/412902
if (data)
static_cast<volatile T*>(data)->header;
#endif
diff --git a/gpu/command_buffer/client/gles2_c_lib_autogen.h b/gpu/command_buffer/client/gles2_c_lib_autogen.h
index b1181ae..727d39a 100644
--- a/gpu/command_buffer/client/gles2_c_lib_autogen.h
+++ b/gpu/command_buffer/client/gles2_c_lib_autogen.h
@@ -116,6 +116,14 @@
gles2::GetGLContext()->CompressedTexSubImage2D(
target, level, xoffset, yoffset, width, height, format, imageSize, data);
}
+void GLES2CopyBufferSubData(GLenum readtarget,
+ GLenum writetarget,
+ GLintptr readoffset,
+ GLintptr writeoffset,
+ GLsizeiptr size) {
+ gles2::GetGLContext()->CopyBufferSubData(readtarget, writetarget, readoffset,
+ writeoffset, size);
+}
void GLES2CopyTexImage2D(GLenum target,
GLint level,
GLenum internalformat,
@@ -219,6 +227,14 @@
gles2::GetGLContext()->FramebufferTexture2D(target, attachment, textarget,
texture, level);
}
+void GLES2FramebufferTextureLayer(GLenum target,
+ GLenum attachment,
+ GLuint texture,
+ GLint level,
+ GLint layer) {
+ gles2::GetGLContext()->FramebufferTextureLayer(target, attachment, texture,
+ level, layer);
+}
void GLES2FrontFace(GLenum mode) {
gles2::GetGLContext()->FrontFace(mode);
}
@@ -288,6 +304,14 @@
void GLES2GetIntegerv(GLenum pname, GLint* params) {
gles2::GetGLContext()->GetIntegerv(pname, params);
}
+void GLES2GetInternalformativ(GLenum target,
+ GLenum format,
+ GLenum pname,
+ GLsizei bufSize,
+ GLint* params) {
+ gles2::GetGLContext()->GetInternalformativ(target, format, pname, bufSize,
+ params);
+}
void GLES2GetProgramiv(GLuint program, GLenum pname, GLint* params) {
gles2::GetGLContext()->GetProgramiv(program, pname, params);
}
@@ -479,6 +503,15 @@
void GLES2TexParameteriv(GLenum target, GLenum pname, const GLint* params) {
gles2::GetGLContext()->TexParameteriv(target, pname, params);
}
+void GLES2TexStorage3D(GLenum target,
+ GLsizei levels,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth) {
+ gles2::GetGLContext()->TexStorage3D(target, levels, internalFormat, width,
+ height, depth);
+}
void GLES2TexSubImage2D(GLenum target,
GLint level,
GLint xoffset,
@@ -503,6 +536,12 @@
void GLES2Uniform1iv(GLint location, GLsizei count, const GLint* v) {
gles2::GetGLContext()->Uniform1iv(location, count, v);
}
+void GLES2Uniform1ui(GLint location, GLuint x) {
+ gles2::GetGLContext()->Uniform1ui(location, x);
+}
+void GLES2Uniform1uiv(GLint location, GLsizei count, const GLuint* v) {
+ gles2::GetGLContext()->Uniform1uiv(location, count, v);
+}
void GLES2Uniform2f(GLint location, GLfloat x, GLfloat y) {
gles2::GetGLContext()->Uniform2f(location, x, y);
}
@@ -515,6 +554,12 @@
void GLES2Uniform2iv(GLint location, GLsizei count, const GLint* v) {
gles2::GetGLContext()->Uniform2iv(location, count, v);
}
+void GLES2Uniform2ui(GLint location, GLuint x, GLuint y) {
+ gles2::GetGLContext()->Uniform2ui(location, x, y);
+}
+void GLES2Uniform2uiv(GLint location, GLsizei count, const GLuint* v) {
+ gles2::GetGLContext()->Uniform2uiv(location, count, v);
+}
void GLES2Uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z) {
gles2::GetGLContext()->Uniform3f(location, x, y, z);
}
@@ -527,6 +572,12 @@
void GLES2Uniform3iv(GLint location, GLsizei count, const GLint* v) {
gles2::GetGLContext()->Uniform3iv(location, count, v);
}
+void GLES2Uniform3ui(GLint location, GLuint x, GLuint y, GLuint z) {
+ gles2::GetGLContext()->Uniform3ui(location, x, y, z);
+}
+void GLES2Uniform3uiv(GLint location, GLsizei count, const GLuint* v) {
+ gles2::GetGLContext()->Uniform3uiv(location, count, v);
+}
void GLES2Uniform4f(GLint location,
GLfloat x,
GLfloat y,
@@ -543,24 +594,66 @@
void GLES2Uniform4iv(GLint location, GLsizei count, const GLint* v) {
gles2::GetGLContext()->Uniform4iv(location, count, v);
}
+void GLES2Uniform4ui(GLint location, GLuint x, GLuint y, GLuint z, GLuint w) {
+ gles2::GetGLContext()->Uniform4ui(location, x, y, z, w);
+}
+void GLES2Uniform4uiv(GLint location, GLsizei count, const GLuint* v) {
+ gles2::GetGLContext()->Uniform4uiv(location, count, v);
+}
void GLES2UniformMatrix2fv(GLint location,
GLsizei count,
GLboolean transpose,
const GLfloat* value) {
gles2::GetGLContext()->UniformMatrix2fv(location, count, transpose, value);
}
+void GLES2UniformMatrix2x3fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) {
+ gles2::GetGLContext()->UniformMatrix2x3fv(location, count, transpose, value);
+}
+void GLES2UniformMatrix2x4fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) {
+ gles2::GetGLContext()->UniformMatrix2x4fv(location, count, transpose, value);
+}
void GLES2UniformMatrix3fv(GLint location,
GLsizei count,
GLboolean transpose,
const GLfloat* value) {
gles2::GetGLContext()->UniformMatrix3fv(location, count, transpose, value);
}
+void GLES2UniformMatrix3x2fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) {
+ gles2::GetGLContext()->UniformMatrix3x2fv(location, count, transpose, value);
+}
+void GLES2UniformMatrix3x4fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) {
+ gles2::GetGLContext()->UniformMatrix3x4fv(location, count, transpose, value);
+}
void GLES2UniformMatrix4fv(GLint location,
GLsizei count,
GLboolean transpose,
const GLfloat* value) {
gles2::GetGLContext()->UniformMatrix4fv(location, count, transpose, value);
}
+void GLES2UniformMatrix4x2fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) {
+ gles2::GetGLContext()->UniformMatrix4x2fv(location, count, transpose, value);
+}
+void GLES2UniformMatrix4x3fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) {
+ gles2::GetGLContext()->UniformMatrix4x3fv(location, count, transpose, value);
+}
void GLES2UseProgram(GLuint program) {
gles2::GetGLContext()->UseProgram(program);
}
@@ -595,6 +688,29 @@
void GLES2VertexAttrib4fv(GLuint indx, const GLfloat* values) {
gles2::GetGLContext()->VertexAttrib4fv(indx, values);
}
+void GLES2VertexAttribI4i(GLuint indx, GLint x, GLint y, GLint z, GLint w) {
+ gles2::GetGLContext()->VertexAttribI4i(indx, x, y, z, w);
+}
+void GLES2VertexAttribI4iv(GLuint indx, const GLint* values) {
+ gles2::GetGLContext()->VertexAttribI4iv(indx, values);
+}
+void GLES2VertexAttribI4ui(GLuint indx,
+ GLuint x,
+ GLuint y,
+ GLuint z,
+ GLuint w) {
+ gles2::GetGLContext()->VertexAttribI4ui(indx, x, y, z, w);
+}
+void GLES2VertexAttribI4uiv(GLuint indx, const GLuint* values) {
+ gles2::GetGLContext()->VertexAttribI4uiv(indx, values);
+}
+void GLES2VertexAttribIPointer(GLuint indx,
+ GLint size,
+ GLenum type,
+ GLsizei stride,
+ const void* ptr) {
+ gles2::GetGLContext()->VertexAttribIPointer(indx, size, type, stride, ptr);
+}
void GLES2VertexAttribPointer(GLuint indx,
GLint size,
GLenum type,
@@ -1054,6 +1170,10 @@
reinterpret_cast<GLES2FunctionPointer>(glCompressedTexSubImage2D),
},
{
+ "glCopyBufferSubData",
+ reinterpret_cast<GLES2FunctionPointer>(glCopyBufferSubData),
+ },
+ {
"glCopyTexImage2D",
reinterpret_cast<GLES2FunctionPointer>(glCopyTexImage2D),
},
@@ -1154,6 +1274,10 @@
reinterpret_cast<GLES2FunctionPointer>(glFramebufferTexture2D),
},
{
+ "glFramebufferTextureLayer",
+ reinterpret_cast<GLES2FunctionPointer>(glFramebufferTextureLayer),
+ },
+ {
"glFrontFace",
reinterpret_cast<GLES2FunctionPointer>(glFrontFace),
},
@@ -1219,6 +1343,10 @@
reinterpret_cast<GLES2FunctionPointer>(glGetIntegerv),
},
{
+ "glGetInternalformativ",
+ reinterpret_cast<GLES2FunctionPointer>(glGetInternalformativ),
+ },
+ {
"glGetProgramiv",
reinterpret_cast<GLES2FunctionPointer>(glGetProgramiv),
},
@@ -1411,6 +1539,10 @@
reinterpret_cast<GLES2FunctionPointer>(glTexParameteriv),
},
{
+ "glTexStorage3D",
+ reinterpret_cast<GLES2FunctionPointer>(glTexStorage3D),
+ },
+ {
"glTexSubImage2D",
reinterpret_cast<GLES2FunctionPointer>(glTexSubImage2D),
},
@@ -1431,6 +1563,14 @@
reinterpret_cast<GLES2FunctionPointer>(glUniform1iv),
},
{
+ "glUniform1ui",
+ reinterpret_cast<GLES2FunctionPointer>(glUniform1ui),
+ },
+ {
+ "glUniform1uiv",
+ reinterpret_cast<GLES2FunctionPointer>(glUniform1uiv),
+ },
+ {
"glUniform2f",
reinterpret_cast<GLES2FunctionPointer>(glUniform2f),
},
@@ -1447,6 +1587,14 @@
reinterpret_cast<GLES2FunctionPointer>(glUniform2iv),
},
{
+ "glUniform2ui",
+ reinterpret_cast<GLES2FunctionPointer>(glUniform2ui),
+ },
+ {
+ "glUniform2uiv",
+ reinterpret_cast<GLES2FunctionPointer>(glUniform2uiv),
+ },
+ {
"glUniform3f",
reinterpret_cast<GLES2FunctionPointer>(glUniform3f),
},
@@ -1463,6 +1611,14 @@
reinterpret_cast<GLES2FunctionPointer>(glUniform3iv),
},
{
+ "glUniform3ui",
+ reinterpret_cast<GLES2FunctionPointer>(glUniform3ui),
+ },
+ {
+ "glUniform3uiv",
+ reinterpret_cast<GLES2FunctionPointer>(glUniform3uiv),
+ },
+ {
"glUniform4f",
reinterpret_cast<GLES2FunctionPointer>(glUniform4f),
},
@@ -1479,18 +1635,50 @@
reinterpret_cast<GLES2FunctionPointer>(glUniform4iv),
},
{
+ "glUniform4ui",
+ reinterpret_cast<GLES2FunctionPointer>(glUniform4ui),
+ },
+ {
+ "glUniform4uiv",
+ reinterpret_cast<GLES2FunctionPointer>(glUniform4uiv),
+ },
+ {
"glUniformMatrix2fv",
reinterpret_cast<GLES2FunctionPointer>(glUniformMatrix2fv),
},
{
+ "glUniformMatrix2x3fv",
+ reinterpret_cast<GLES2FunctionPointer>(glUniformMatrix2x3fv),
+ },
+ {
+ "glUniformMatrix2x4fv",
+ reinterpret_cast<GLES2FunctionPointer>(glUniformMatrix2x4fv),
+ },
+ {
"glUniformMatrix3fv",
reinterpret_cast<GLES2FunctionPointer>(glUniformMatrix3fv),
},
{
+ "glUniformMatrix3x2fv",
+ reinterpret_cast<GLES2FunctionPointer>(glUniformMatrix3x2fv),
+ },
+ {
+ "glUniformMatrix3x4fv",
+ reinterpret_cast<GLES2FunctionPointer>(glUniformMatrix3x4fv),
+ },
+ {
"glUniformMatrix4fv",
reinterpret_cast<GLES2FunctionPointer>(glUniformMatrix4fv),
},
{
+ "glUniformMatrix4x2fv",
+ reinterpret_cast<GLES2FunctionPointer>(glUniformMatrix4x2fv),
+ },
+ {
+ "glUniformMatrix4x3fv",
+ reinterpret_cast<GLES2FunctionPointer>(glUniformMatrix4x3fv),
+ },
+ {
"glUseProgram",
reinterpret_cast<GLES2FunctionPointer>(glUseProgram),
},
@@ -1531,6 +1719,26 @@
reinterpret_cast<GLES2FunctionPointer>(glVertexAttrib4fv),
},
{
+ "glVertexAttribI4i",
+ reinterpret_cast<GLES2FunctionPointer>(glVertexAttribI4i),
+ },
+ {
+ "glVertexAttribI4iv",
+ reinterpret_cast<GLES2FunctionPointer>(glVertexAttribI4iv),
+ },
+ {
+ "glVertexAttribI4ui",
+ reinterpret_cast<GLES2FunctionPointer>(glVertexAttribI4ui),
+ },
+ {
+ "glVertexAttribI4uiv",
+ reinterpret_cast<GLES2FunctionPointer>(glVertexAttribI4uiv),
+ },
+ {
+ "glVertexAttribIPointer",
+ reinterpret_cast<GLES2FunctionPointer>(glVertexAttribIPointer),
+ },
+ {
"glVertexAttribPointer",
reinterpret_cast<GLES2FunctionPointer>(glVertexAttribPointer),
},
diff --git a/gpu/command_buffer/client/gles2_cmd_helper_autogen.h b/gpu/command_buffer/client/gles2_cmd_helper_autogen.h
index 75796a2..b8e3b66 100644
--- a/gpu/command_buffer/client/gles2_cmd_helper_autogen.h
+++ b/gpu/command_buffer/client/gles2_cmd_helper_autogen.h
@@ -243,6 +243,18 @@
}
}
+void CopyBufferSubData(GLenum readtarget,
+ GLenum writetarget,
+ GLintptr readoffset,
+ GLintptr writeoffset,
+ GLsizeiptr size) {
+ gles2::cmds::CopyBufferSubData* c =
+ GetCmdSpace<gles2::cmds::CopyBufferSubData>();
+ if (c) {
+ c->Init(readtarget, writetarget, readoffset, writeoffset, size);
+ }
+}
+
void CopyTexImage2D(GLenum target,
GLint level,
GLenum internalformat,
@@ -457,6 +469,18 @@
}
}
+void FramebufferTextureLayer(GLenum target,
+ GLenum attachment,
+ GLuint texture,
+ GLint level,
+ GLint layer) {
+ gles2::cmds::FramebufferTextureLayer* c =
+ GetCmdSpace<gles2::cmds::FramebufferTextureLayer>();
+ if (c) {
+ c->Init(target, attachment, texture, level, layer);
+ }
+}
+
void FrontFace(GLenum mode) {
gles2::cmds::FrontFace* c = GetCmdSpace<gles2::cmds::FrontFace>();
if (c) {
@@ -611,6 +635,19 @@
}
}
+void GetInternalformativ(GLenum target,
+ GLenum format,
+ GLenum pname,
+ GLsizei bufSize,
+ uint32_t params_shm_id,
+ uint32_t params_shm_offset) {
+ gles2::cmds::GetInternalformativ* c =
+ GetCmdSpace<gles2::cmds::GetInternalformativ>();
+ if (c) {
+ c->Init(target, format, pname, bufSize, params_shm_id, params_shm_offset);
+ }
+}
+
void GetProgramiv(GLuint program,
GLenum pname,
uint32_t params_shm_id,
@@ -1033,6 +1070,18 @@
}
}
+void TexStorage3D(GLenum target,
+ GLsizei levels,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth) {
+ gles2::cmds::TexStorage3D* c = GetCmdSpace<gles2::cmds::TexStorage3D>();
+ if (c) {
+ c->Init(target, levels, internalFormat, width, height, depth);
+ }
+}
+
void TexSubImage2D(GLenum target,
GLint level,
GLint xoffset,
@@ -1083,6 +1132,22 @@
}
}
+void Uniform1ui(GLint location, GLuint x) {
+ gles2::cmds::Uniform1ui* c = GetCmdSpace<gles2::cmds::Uniform1ui>();
+ if (c) {
+ c->Init(location, x);
+ }
+}
+
+void Uniform1uivImmediate(GLint location, GLsizei count, const GLuint* v) {
+ const uint32_t size = gles2::cmds::Uniform1uivImmediate::ComputeSize(count);
+ gles2::cmds::Uniform1uivImmediate* c =
+ GetImmediateCmdSpaceTotalSize<gles2::cmds::Uniform1uivImmediate>(size);
+ if (c) {
+ c->Init(location, count, v);
+ }
+}
+
void Uniform2f(GLint location, GLfloat x, GLfloat y) {
gles2::cmds::Uniform2f* c = GetCmdSpace<gles2::cmds::Uniform2f>();
if (c) {
@@ -1115,6 +1180,22 @@
}
}
+void Uniform2ui(GLint location, GLuint x, GLuint y) {
+ gles2::cmds::Uniform2ui* c = GetCmdSpace<gles2::cmds::Uniform2ui>();
+ if (c) {
+ c->Init(location, x, y);
+ }
+}
+
+void Uniform2uivImmediate(GLint location, GLsizei count, const GLuint* v) {
+ const uint32_t size = gles2::cmds::Uniform2uivImmediate::ComputeSize(count);
+ gles2::cmds::Uniform2uivImmediate* c =
+ GetImmediateCmdSpaceTotalSize<gles2::cmds::Uniform2uivImmediate>(size);
+ if (c) {
+ c->Init(location, count, v);
+ }
+}
+
void Uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z) {
gles2::cmds::Uniform3f* c = GetCmdSpace<gles2::cmds::Uniform3f>();
if (c) {
@@ -1147,6 +1228,22 @@
}
}
+void Uniform3ui(GLint location, GLuint x, GLuint y, GLuint z) {
+ gles2::cmds::Uniform3ui* c = GetCmdSpace<gles2::cmds::Uniform3ui>();
+ if (c) {
+ c->Init(location, x, y, z);
+ }
+}
+
+void Uniform3uivImmediate(GLint location, GLsizei count, const GLuint* v) {
+ const uint32_t size = gles2::cmds::Uniform3uivImmediate::ComputeSize(count);
+ gles2::cmds::Uniform3uivImmediate* c =
+ GetImmediateCmdSpaceTotalSize<gles2::cmds::Uniform3uivImmediate>(size);
+ if (c) {
+ c->Init(location, count, v);
+ }
+}
+
void Uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w) {
gles2::cmds::Uniform4f* c = GetCmdSpace<gles2::cmds::Uniform4f>();
if (c) {
@@ -1179,6 +1276,22 @@
}
}
+void Uniform4ui(GLint location, GLuint x, GLuint y, GLuint z, GLuint w) {
+ gles2::cmds::Uniform4ui* c = GetCmdSpace<gles2::cmds::Uniform4ui>();
+ if (c) {
+ c->Init(location, x, y, z, w);
+ }
+}
+
+void Uniform4uivImmediate(GLint location, GLsizei count, const GLuint* v) {
+ const uint32_t size = gles2::cmds::Uniform4uivImmediate::ComputeSize(count);
+ gles2::cmds::Uniform4uivImmediate* c =
+ GetImmediateCmdSpaceTotalSize<gles2::cmds::Uniform4uivImmediate>(size);
+ if (c) {
+ c->Init(location, count, v);
+ }
+}
+
void UniformMatrix2fvImmediate(GLint location,
GLsizei count,
const GLfloat* value) {
@@ -1192,6 +1305,32 @@
}
}
+void UniformMatrix2x3fvImmediate(GLint location,
+ GLsizei count,
+ const GLfloat* value) {
+ const uint32_t size =
+ gles2::cmds::UniformMatrix2x3fvImmediate::ComputeSize(count);
+ gles2::cmds::UniformMatrix2x3fvImmediate* c =
+ GetImmediateCmdSpaceTotalSize<gles2::cmds::UniformMatrix2x3fvImmediate>(
+ size);
+ if (c) {
+ c->Init(location, count, value);
+ }
+}
+
+void UniformMatrix2x4fvImmediate(GLint location,
+ GLsizei count,
+ const GLfloat* value) {
+ const uint32_t size =
+ gles2::cmds::UniformMatrix2x4fvImmediate::ComputeSize(count);
+ gles2::cmds::UniformMatrix2x4fvImmediate* c =
+ GetImmediateCmdSpaceTotalSize<gles2::cmds::UniformMatrix2x4fvImmediate>(
+ size);
+ if (c) {
+ c->Init(location, count, value);
+ }
+}
+
void UniformMatrix3fvImmediate(GLint location,
GLsizei count,
const GLfloat* value) {
@@ -1205,6 +1344,32 @@
}
}
+void UniformMatrix3x2fvImmediate(GLint location,
+ GLsizei count,
+ const GLfloat* value) {
+ const uint32_t size =
+ gles2::cmds::UniformMatrix3x2fvImmediate::ComputeSize(count);
+ gles2::cmds::UniformMatrix3x2fvImmediate* c =
+ GetImmediateCmdSpaceTotalSize<gles2::cmds::UniformMatrix3x2fvImmediate>(
+ size);
+ if (c) {
+ c->Init(location, count, value);
+ }
+}
+
+void UniformMatrix3x4fvImmediate(GLint location,
+ GLsizei count,
+ const GLfloat* value) {
+ const uint32_t size =
+ gles2::cmds::UniformMatrix3x4fvImmediate::ComputeSize(count);
+ gles2::cmds::UniformMatrix3x4fvImmediate* c =
+ GetImmediateCmdSpaceTotalSize<gles2::cmds::UniformMatrix3x4fvImmediate>(
+ size);
+ if (c) {
+ c->Init(location, count, value);
+ }
+}
+
void UniformMatrix4fvImmediate(GLint location,
GLsizei count,
const GLfloat* value) {
@@ -1218,6 +1383,32 @@
}
}
+void UniformMatrix4x2fvImmediate(GLint location,
+ GLsizei count,
+ const GLfloat* value) {
+ const uint32_t size =
+ gles2::cmds::UniformMatrix4x2fvImmediate::ComputeSize(count);
+ gles2::cmds::UniformMatrix4x2fvImmediate* c =
+ GetImmediateCmdSpaceTotalSize<gles2::cmds::UniformMatrix4x2fvImmediate>(
+ size);
+ if (c) {
+ c->Init(location, count, value);
+ }
+}
+
+void UniformMatrix4x3fvImmediate(GLint location,
+ GLsizei count,
+ const GLfloat* value) {
+ const uint32_t size =
+ gles2::cmds::UniformMatrix4x3fvImmediate::ComputeSize(count);
+ gles2::cmds::UniformMatrix4x3fvImmediate* c =
+ GetImmediateCmdSpaceTotalSize<gles2::cmds::UniformMatrix4x3fvImmediate>(
+ size);
+ if (c) {
+ c->Init(location, count, value);
+ }
+}
+
void UseProgram(GLuint program) {
gles2::cmds::UseProgram* c = GetCmdSpace<gles2::cmds::UseProgram>();
if (c) {
@@ -1300,6 +1491,53 @@
}
}
+void VertexAttribI4i(GLuint indx, GLint x, GLint y, GLint z, GLint w) {
+ gles2::cmds::VertexAttribI4i* c = GetCmdSpace<gles2::cmds::VertexAttribI4i>();
+ if (c) {
+ c->Init(indx, x, y, z, w);
+ }
+}
+
+void VertexAttribI4ivImmediate(GLuint indx, const GLint* values) {
+ const uint32_t size = gles2::cmds::VertexAttribI4ivImmediate::ComputeSize();
+ gles2::cmds::VertexAttribI4ivImmediate* c =
+ GetImmediateCmdSpaceTotalSize<gles2::cmds::VertexAttribI4ivImmediate>(
+ size);
+ if (c) {
+ c->Init(indx, values);
+ }
+}
+
+void VertexAttribI4ui(GLuint indx, GLuint x, GLuint y, GLuint z, GLuint w) {
+ gles2::cmds::VertexAttribI4ui* c =
+ GetCmdSpace<gles2::cmds::VertexAttribI4ui>();
+ if (c) {
+ c->Init(indx, x, y, z, w);
+ }
+}
+
+void VertexAttribI4uivImmediate(GLuint indx, const GLuint* values) {
+ const uint32_t size = gles2::cmds::VertexAttribI4uivImmediate::ComputeSize();
+ gles2::cmds::VertexAttribI4uivImmediate* c =
+ GetImmediateCmdSpaceTotalSize<gles2::cmds::VertexAttribI4uivImmediate>(
+ size);
+ if (c) {
+ c->Init(indx, values);
+ }
+}
+
+void VertexAttribIPointer(GLuint indx,
+ GLint size,
+ GLenum type,
+ GLsizei stride,
+ GLuint offset) {
+ gles2::cmds::VertexAttribIPointer* c =
+ GetCmdSpace<gles2::cmds::VertexAttribIPointer>();
+ if (c) {
+ c->Init(indx, size, type, stride, offset);
+ }
+}
+
void VertexAttribPointer(GLuint indx,
GLint size,
GLenum type,
diff --git a/gpu/command_buffer/client/gles2_implementation.cc b/gpu/command_buffer/client/gles2_implementation.cc
index 51c6370..1916e7d 100644
--- a/gpu/command_buffer/client/gles2_implementation.cc
+++ b/gpu/command_buffer/client/gles2_implementation.cc
@@ -725,6 +725,13 @@
return GetHelper(pname, params);
}
+bool GLES2Implementation::GetInternalformativHelper(
+ GLenum target, GLenum format, GLenum pname, GLsizei bufSize,
+ GLint* params) {
+ // TODO(zmo): Implement the client side caching.
+ return false;
+}
+
GLuint GLES2Implementation::GetMaxValueInBufferCHROMIUMHelper(
GLuint buffer_id, GLsizei count, GLenum type, GLuint offset) {
typedef cmds::GetMaxValueInBufferCHROMIUM::Result Result;
@@ -1111,6 +1118,19 @@
CheckGLError();
}
+void GLES2Implementation::VertexAttribIPointer(
+ GLuint index, GLint size, GLenum type, GLsizei stride, const void* ptr) {
+ GPU_CLIENT_SINGLE_THREAD_CHECK();
+ GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttribPointer("
+ << index << ", "
+ << size << ", "
+ << GLES2Util::GetStringVertexAttribType(type) << ", "
+ << stride << ", "
+ << ptr << ")");
+ helper_->VertexAttribIPointer(index, size, type, stride, ToGLuint(ptr));
+ CheckGLError();
+}
+
void GLES2Implementation::VertexAttribPointer(
GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride,
const void* ptr) {
@@ -1121,7 +1141,7 @@
<< GLES2Util::GetStringVertexAttribType(type) << ", "
<< GLES2Util::GetStringBool(normalized) << ", "
<< stride << ", "
- << static_cast<const void*>(ptr) << ")");
+ << ptr << ")");
// Record the info on the client side.
if (!vertex_array_object_manager_->SetAttribPointer(
bound_array_buffer_id_, index, size, type, normalized, stride, ptr)) {
diff --git a/gpu/command_buffer/client/gles2_implementation.h b/gpu/command_buffer/client/gles2_implementation.h
index 4fcfea8..77b8a87 100644
--- a/gpu/command_buffer/client/gles2_implementation.h
+++ b/gpu/command_buffer/client/gles2_implementation.h
@@ -510,6 +510,9 @@
bool GetFramebufferAttachmentParameterivHelper(
GLenum target, GLenum attachment, GLenum pname, GLint* params);
bool GetIntegervHelper(GLenum pname, GLint* params);
+ bool GetInternalformativHelper(
+ GLenum target, GLenum format, GLenum pname, GLsizei bufSize,
+ GLint* params);
bool GetProgramivHelper(GLuint program, GLenum pname, GLint* params);
bool GetRenderbufferParameterivHelper(
GLenum target, GLenum pname, GLint* params);
diff --git a/gpu/command_buffer/client/gles2_implementation_autogen.h b/gpu/command_buffer/client/gles2_implementation_autogen.h
index f58c0a8..66cfcef 100644
--- a/gpu/command_buffer/client/gles2_implementation_autogen.h
+++ b/gpu/command_buffer/client/gles2_implementation_autogen.h
@@ -94,6 +94,12 @@
GLsizei imageSize,
const void* data) override;
+void CopyBufferSubData(GLenum readtarget,
+ GLenum writetarget,
+ GLintptr readoffset,
+ GLintptr writeoffset,
+ GLsizeiptr size) override;
+
void CopyTexImage2D(GLenum target,
GLint level,
GLenum internalformat,
@@ -164,6 +170,12 @@
GLuint texture,
GLint level) override;
+void FramebufferTextureLayer(GLenum target,
+ GLenum attachment,
+ GLuint texture,
+ GLint level,
+ GLint layer) override;
+
void FrontFace(GLenum mode) override;
void GenBuffers(GLsizei n, GLuint* buffers) override;
@@ -214,6 +226,12 @@
void GetIntegerv(GLenum pname, GLint* params) override;
+void GetInternalformativ(GLenum target,
+ GLenum format,
+ GLenum pname,
+ GLsizei bufSize,
+ GLint* params) override;
+
void GetProgramiv(GLuint program, GLenum pname, GLint* params) override;
void GetProgramInfoLog(GLuint program,
@@ -354,6 +372,13 @@
void TexParameteriv(GLenum target, GLenum pname, const GLint* params) override;
+void TexStorage3D(GLenum target,
+ GLsizei levels,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth) override;
+
void TexSubImage2D(GLenum target,
GLint level,
GLint xoffset,
@@ -372,6 +397,10 @@
void Uniform1iv(GLint location, GLsizei count, const GLint* v) override;
+void Uniform1ui(GLint location, GLuint x) override;
+
+void Uniform1uiv(GLint location, GLsizei count, const GLuint* v) override;
+
void Uniform2f(GLint location, GLfloat x, GLfloat y) override;
void Uniform2fv(GLint location, GLsizei count, const GLfloat* v) override;
@@ -380,6 +409,10 @@
void Uniform2iv(GLint location, GLsizei count, const GLint* v) override;
+void Uniform2ui(GLint location, GLuint x, GLuint y) override;
+
+void Uniform2uiv(GLint location, GLsizei count, const GLuint* v) override;
+
void Uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z) override;
void Uniform3fv(GLint location, GLsizei count, const GLfloat* v) override;
@@ -388,6 +421,10 @@
void Uniform3iv(GLint location, GLsizei count, const GLint* v) override;
+void Uniform3ui(GLint location, GLuint x, GLuint y, GLuint z) override;
+
+void Uniform3uiv(GLint location, GLsizei count, const GLuint* v) override;
+
void Uniform4f(GLint location,
GLfloat x,
GLfloat y,
@@ -400,21 +437,59 @@
void Uniform4iv(GLint location, GLsizei count, const GLint* v) override;
+void Uniform4ui(GLint location,
+ GLuint x,
+ GLuint y,
+ GLuint z,
+ GLuint w) override;
+
+void Uniform4uiv(GLint location, GLsizei count, const GLuint* v) override;
+
void UniformMatrix2fv(GLint location,
GLsizei count,
GLboolean transpose,
const GLfloat* value) override;
+void UniformMatrix2x3fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) override;
+
+void UniformMatrix2x4fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) override;
+
void UniformMatrix3fv(GLint location,
GLsizei count,
GLboolean transpose,
const GLfloat* value) override;
+void UniformMatrix3x2fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) override;
+
+void UniformMatrix3x4fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) override;
+
void UniformMatrix4fv(GLint location,
GLsizei count,
GLboolean transpose,
const GLfloat* value) override;
+void UniformMatrix4x2fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) override;
+
+void UniformMatrix4x3fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) override;
+
void UseProgram(GLuint program) override;
void ValidateProgram(GLuint program) override;
@@ -439,6 +514,24 @@
void VertexAttrib4fv(GLuint indx, const GLfloat* values) override;
+void VertexAttribI4i(GLuint indx, GLint x, GLint y, GLint z, GLint w) override;
+
+void VertexAttribI4iv(GLuint indx, const GLint* values) override;
+
+void VertexAttribI4ui(GLuint indx,
+ GLuint x,
+ GLuint y,
+ GLuint z,
+ GLuint w) override;
+
+void VertexAttribI4uiv(GLuint indx, const GLuint* values) override;
+
+void VertexAttribIPointer(GLuint indx,
+ GLint size,
+ GLenum type,
+ GLsizei stride,
+ const void* ptr) override;
+
void VertexAttribPointer(GLuint indx,
GLint size,
GLenum type,
diff --git a/gpu/command_buffer/client/gles2_implementation_impl_autogen.h b/gpu/command_buffer/client/gles2_implementation_impl_autogen.h
index 8541e77..d67e7ed 100644
--- a/gpu/command_buffer/client/gles2_implementation_impl_autogen.h
+++ b/gpu/command_buffer/client/gles2_implementation_impl_autogen.h
@@ -209,6 +209,34 @@
CheckGLError();
}
+void GLES2Implementation::CopyBufferSubData(GLenum readtarget,
+ GLenum writetarget,
+ GLintptr readoffset,
+ GLintptr writeoffset,
+ GLsizeiptr size) {
+ GPU_CLIENT_SINGLE_THREAD_CHECK();
+ GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCopyBufferSubData("
+ << GLES2Util::GetStringBufferTarget(readtarget) << ", "
+ << GLES2Util::GetStringBufferTarget(writetarget) << ", "
+ << readoffset << ", " << writeoffset << ", " << size
+ << ")");
+ if (readoffset < 0) {
+ SetGLError(GL_INVALID_VALUE, "glCopyBufferSubData", "readoffset < 0");
+ return;
+ }
+ if (writeoffset < 0) {
+ SetGLError(GL_INVALID_VALUE, "glCopyBufferSubData", "writeoffset < 0");
+ return;
+ }
+ if (size < 0) {
+ SetGLError(GL_INVALID_VALUE, "glCopyBufferSubData", "size < 0");
+ return;
+ }
+ helper_->CopyBufferSubData(readtarget, writetarget, readoffset, writeoffset,
+ size);
+ CheckGLError();
+}
+
void GLES2Implementation::CopyTexImage2D(GLenum target,
GLint level,
GLenum internalformat,
@@ -474,6 +502,20 @@
CheckGLError();
}
+void GLES2Implementation::FramebufferTextureLayer(GLenum target,
+ GLenum attachment,
+ GLuint texture,
+ GLint level,
+ GLint layer) {
+ GPU_CLIENT_SINGLE_THREAD_CHECK();
+ GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glFramebufferTextureLayer("
+ << GLES2Util::GetStringFrameBufferTarget(target) << ", "
+ << GLES2Util::GetStringAttachment(attachment) << ", "
+ << texture << ", " << level << ", " << layer << ")");
+ helper_->FramebufferTextureLayer(target, attachment, texture, level, layer);
+ CheckGLError();
+}
+
void GLES2Implementation::FrontFace(GLenum mode) {
GPU_CLIENT_SINGLE_THREAD_CHECK();
GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glFrontFace("
@@ -717,6 +759,44 @@
});
CheckGLError();
}
+void GLES2Implementation::GetInternalformativ(GLenum target,
+ GLenum format,
+ GLenum pname,
+ GLsizei bufSize,
+ GLint* params) {
+ GPU_CLIENT_SINGLE_THREAD_CHECK();
+ GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params);
+ GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetInternalformativ("
+ << GLES2Util::GetStringRenderBufferTarget(target) << ", "
+ << GLES2Util::GetStringRenderBufferFormat(format) << ", "
+ << GLES2Util::GetStringRenderBufferParameter(pname) << ", "
+ << bufSize << ", " << static_cast<const void*>(params)
+ << ")");
+ if (bufSize < 0) {
+ SetGLError(GL_INVALID_VALUE, "glGetInternalformativ", "bufSize < 0");
+ return;
+ }
+ TRACE_EVENT0("gpu", "GLES2Implementation::GetInternalformativ");
+ if (GetInternalformativHelper(target, format, pname, bufSize, params)) {
+ return;
+ }
+ typedef cmds::GetInternalformativ::Result Result;
+ Result* result = GetResultAs<Result*>();
+ if (!result) {
+ return;
+ }
+ result->SetNumResults(0);
+ helper_->GetInternalformativ(target, format, pname, bufSize, GetResultShmId(),
+ GetResultShmOffset());
+ WaitForCmd();
+ result->CopyResult(params);
+ GPU_CLIENT_LOG_CODE_BLOCK({
+ for (int32_t i = 0; i < result->GetNumResults(); ++i) {
+ GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]);
+ }
+ });
+ CheckGLError();
+}
void GLES2Implementation::GetProgramiv(GLuint program,
GLenum pname,
GLint* params) {
@@ -1245,6 +1325,39 @@
CheckGLError();
}
+void GLES2Implementation::TexStorage3D(GLenum target,
+ GLsizei levels,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth) {
+ GPU_CLIENT_SINGLE_THREAD_CHECK();
+ GPU_CLIENT_LOG(
+ "[" << GetLogPrefix() << "] glTexStorage3D("
+ << GLES2Util::GetStringTexture3DTarget(target) << ", " << levels
+ << ", "
+ << GLES2Util::GetStringTextureInternalFormatStorage(internalFormat)
+ << ", " << width << ", " << height << ", " << depth << ")");
+ if (levels < 0) {
+ SetGLError(GL_INVALID_VALUE, "glTexStorage3D", "levels < 0");
+ return;
+ }
+ if (width < 0) {
+ SetGLError(GL_INVALID_VALUE, "glTexStorage3D", "width < 0");
+ return;
+ }
+ if (height < 0) {
+ SetGLError(GL_INVALID_VALUE, "glTexStorage3D", "height < 0");
+ return;
+ }
+ if (depth < 0) {
+ SetGLError(GL_INVALID_VALUE, "glTexStorage3D", "depth < 0");
+ return;
+ }
+ helper_->TexStorage3D(target, levels, internalFormat, width, height, depth);
+ CheckGLError();
+}
+
void GLES2Implementation::Uniform1f(GLint location, GLfloat x) {
GPU_CLIENT_SINGLE_THREAD_CHECK();
GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform1f(" << location << ", "
@@ -1299,6 +1412,33 @@
CheckGLError();
}
+void GLES2Implementation::Uniform1ui(GLint location, GLuint x) {
+ GPU_CLIENT_SINGLE_THREAD_CHECK();
+ GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform1ui(" << location << ", "
+ << x << ")");
+ helper_->Uniform1ui(location, x);
+ CheckGLError();
+}
+
+void GLES2Implementation::Uniform1uiv(GLint location,
+ GLsizei count,
+ const GLuint* v) {
+ GPU_CLIENT_SINGLE_THREAD_CHECK();
+ GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform1uiv(" << location << ", "
+ << count << ", " << static_cast<const void*>(v) << ")");
+ GPU_CLIENT_LOG_CODE_BLOCK({
+ for (GLsizei i = 0; i < count; ++i) {
+ GPU_CLIENT_LOG(" " << i << ": " << v[0 + i * 1]);
+ }
+ });
+ if (count < 0) {
+ SetGLError(GL_INVALID_VALUE, "glUniform1uiv", "count < 0");
+ return;
+ }
+ helper_->Uniform1uivImmediate(location, count, v);
+ CheckGLError();
+}
+
void GLES2Implementation::Uniform2f(GLint location, GLfloat x, GLfloat y) {
GPU_CLIENT_SINGLE_THREAD_CHECK();
GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform2f(" << location << ", "
@@ -1353,6 +1493,33 @@
CheckGLError();
}
+void GLES2Implementation::Uniform2ui(GLint location, GLuint x, GLuint y) {
+ GPU_CLIENT_SINGLE_THREAD_CHECK();
+ GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform2ui(" << location << ", "
+ << x << ", " << y << ")");
+ helper_->Uniform2ui(location, x, y);
+ CheckGLError();
+}
+
+void GLES2Implementation::Uniform2uiv(GLint location,
+ GLsizei count,
+ const GLuint* v) {
+ GPU_CLIENT_SINGLE_THREAD_CHECK();
+ GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform2uiv(" << location << ", "
+ << count << ", " << static_cast<const void*>(v) << ")");
+ GPU_CLIENT_LOG_CODE_BLOCK({
+ for (GLsizei i = 0; i < count; ++i) {
+ GPU_CLIENT_LOG(" " << i << ": " << v[0 + i * 2] << ", " << v[1 + i * 2]);
+ }
+ });
+ if (count < 0) {
+ SetGLError(GL_INVALID_VALUE, "glUniform2uiv", "count < 0");
+ return;
+ }
+ helper_->Uniform2uivImmediate(location, count, v);
+ CheckGLError();
+}
+
void GLES2Implementation::Uniform3f(GLint location,
GLfloat x,
GLfloat y,
@@ -1412,6 +1579,37 @@
CheckGLError();
}
+void GLES2Implementation::Uniform3ui(GLint location,
+ GLuint x,
+ GLuint y,
+ GLuint z) {
+ GPU_CLIENT_SINGLE_THREAD_CHECK();
+ GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform3ui(" << location << ", "
+ << x << ", " << y << ", " << z << ")");
+ helper_->Uniform3ui(location, x, y, z);
+ CheckGLError();
+}
+
+void GLES2Implementation::Uniform3uiv(GLint location,
+ GLsizei count,
+ const GLuint* v) {
+ GPU_CLIENT_SINGLE_THREAD_CHECK();
+ GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform3uiv(" << location << ", "
+ << count << ", " << static_cast<const void*>(v) << ")");
+ GPU_CLIENT_LOG_CODE_BLOCK({
+ for (GLsizei i = 0; i < count; ++i) {
+ GPU_CLIENT_LOG(" " << i << ": " << v[0 + i * 3] << ", " << v[1 + i * 3]
+ << ", " << v[2 + i * 3]);
+ }
+ });
+ if (count < 0) {
+ SetGLError(GL_INVALID_VALUE, "glUniform3uiv", "count < 0");
+ return;
+ }
+ helper_->Uniform3uivImmediate(location, count, v);
+ CheckGLError();
+}
+
void GLES2Implementation::Uniform4f(GLint location,
GLfloat x,
GLfloat y,
@@ -1476,6 +1674,38 @@
CheckGLError();
}
+void GLES2Implementation::Uniform4ui(GLint location,
+ GLuint x,
+ GLuint y,
+ GLuint z,
+ GLuint w) {
+ GPU_CLIENT_SINGLE_THREAD_CHECK();
+ GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform4ui(" << location << ", "
+ << x << ", " << y << ", " << z << ", " << w << ")");
+ helper_->Uniform4ui(location, x, y, z, w);
+ CheckGLError();
+}
+
+void GLES2Implementation::Uniform4uiv(GLint location,
+ GLsizei count,
+ const GLuint* v) {
+ GPU_CLIENT_SINGLE_THREAD_CHECK();
+ GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform4uiv(" << location << ", "
+ << count << ", " << static_cast<const void*>(v) << ")");
+ GPU_CLIENT_LOG_CODE_BLOCK({
+ for (GLsizei i = 0; i < count; ++i) {
+ GPU_CLIENT_LOG(" " << i << ": " << v[0 + i * 4] << ", " << v[1 + i * 4]
+ << ", " << v[2 + i * 4] << ", " << v[3 + i * 4]);
+ }
+ });
+ if (count < 0) {
+ SetGLError(GL_INVALID_VALUE, "glUniform4uiv", "count < 0");
+ return;
+ }
+ helper_->Uniform4uivImmediate(location, count, v);
+ CheckGLError();
+}
+
void GLES2Implementation::UniformMatrix2fv(GLint location,
GLsizei count,
GLboolean transpose,
@@ -1505,6 +1735,67 @@
CheckGLError();
}
+void GLES2Implementation::UniformMatrix2x3fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) {
+ GPU_CLIENT_SINGLE_THREAD_CHECK();
+ GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniformMatrix2x3fv(" << location
+ << ", " << count << ", "
+ << GLES2Util::GetStringBool(transpose) << ", "
+ << static_cast<const void*>(value) << ")");
+ GPU_CLIENT_LOG_CODE_BLOCK({
+ for (GLsizei i = 0; i < count; ++i) {
+ GPU_CLIENT_LOG(" " << i << ": " << value[0 + i * 6] << ", "
+ << value[1 + i * 6] << ", " << value[2 + i * 6]
+ << ", " << value[3 + i * 6] << ", "
+ << value[4 + i * 6] << ", " << value[5 + i * 6]);
+ }
+ });
+ if (count < 0) {
+ SetGLError(GL_INVALID_VALUE, "glUniformMatrix2x3fv", "count < 0");
+ return;
+ }
+ if (transpose != false) {
+ SetGLError(GL_INVALID_VALUE, "glUniformMatrix2x3fv",
+ "transpose GL_INVALID_VALUE");
+ return;
+ }
+ helper_->UniformMatrix2x3fvImmediate(location, count, value);
+ CheckGLError();
+}
+
+void GLES2Implementation::UniformMatrix2x4fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) {
+ GPU_CLIENT_SINGLE_THREAD_CHECK();
+ GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniformMatrix2x4fv(" << location
+ << ", " << count << ", "
+ << GLES2Util::GetStringBool(transpose) << ", "
+ << static_cast<const void*>(value) << ")");
+ GPU_CLIENT_LOG_CODE_BLOCK({
+ for (GLsizei i = 0; i < count; ++i) {
+ GPU_CLIENT_LOG(
+ " " << i << ": " << value[0 + i * 8] << ", " << value[1 + i * 8]
+ << ", " << value[2 + i * 8] << ", " << value[3 + i * 8] << ", "
+ << value[4 + i * 8] << ", " << value[5 + i * 8] << ", "
+ << value[6 + i * 8] << ", " << value[7 + i * 8]);
+ }
+ });
+ if (count < 0) {
+ SetGLError(GL_INVALID_VALUE, "glUniformMatrix2x4fv", "count < 0");
+ return;
+ }
+ if (transpose != false) {
+ SetGLError(GL_INVALID_VALUE, "glUniformMatrix2x4fv",
+ "transpose GL_INVALID_VALUE");
+ return;
+ }
+ helper_->UniformMatrix2x4fvImmediate(location, count, value);
+ CheckGLError();
+}
+
void GLES2Implementation::UniformMatrix3fv(GLint location,
GLsizei count,
GLboolean transpose,
@@ -1537,6 +1828,69 @@
CheckGLError();
}
+void GLES2Implementation::UniformMatrix3x2fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) {
+ GPU_CLIENT_SINGLE_THREAD_CHECK();
+ GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniformMatrix3x2fv(" << location
+ << ", " << count << ", "
+ << GLES2Util::GetStringBool(transpose) << ", "
+ << static_cast<const void*>(value) << ")");
+ GPU_CLIENT_LOG_CODE_BLOCK({
+ for (GLsizei i = 0; i < count; ++i) {
+ GPU_CLIENT_LOG(" " << i << ": " << value[0 + i * 6] << ", "
+ << value[1 + i * 6] << ", " << value[2 + i * 6]
+ << ", " << value[3 + i * 6] << ", "
+ << value[4 + i * 6] << ", " << value[5 + i * 6]);
+ }
+ });
+ if (count < 0) {
+ SetGLError(GL_INVALID_VALUE, "glUniformMatrix3x2fv", "count < 0");
+ return;
+ }
+ if (transpose != false) {
+ SetGLError(GL_INVALID_VALUE, "glUniformMatrix3x2fv",
+ "transpose GL_INVALID_VALUE");
+ return;
+ }
+ helper_->UniformMatrix3x2fvImmediate(location, count, value);
+ CheckGLError();
+}
+
+void GLES2Implementation::UniformMatrix3x4fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) {
+ GPU_CLIENT_SINGLE_THREAD_CHECK();
+ GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniformMatrix3x4fv(" << location
+ << ", " << count << ", "
+ << GLES2Util::GetStringBool(transpose) << ", "
+ << static_cast<const void*>(value) << ")");
+ GPU_CLIENT_LOG_CODE_BLOCK({
+ for (GLsizei i = 0; i < count; ++i) {
+ GPU_CLIENT_LOG(
+ " " << i << ": " << value[0 + i * 12] << ", " << value[1 + i * 12]
+ << ", " << value[2 + i * 12] << ", " << value[3 + i * 12] << ", "
+ << value[4 + i * 12] << ", " << value[5 + i * 12] << ", "
+ << value[6 + i * 12] << ", " << value[7 + i * 12] << ", "
+ << value[8 + i * 12] << ", " << value[9 + i * 12] << ", "
+ << value[10 + i * 12] << ", " << value[11 + i * 12]);
+ }
+ });
+ if (count < 0) {
+ SetGLError(GL_INVALID_VALUE, "glUniformMatrix3x4fv", "count < 0");
+ return;
+ }
+ if (transpose != false) {
+ SetGLError(GL_INVALID_VALUE, "glUniformMatrix3x4fv",
+ "transpose GL_INVALID_VALUE");
+ return;
+ }
+ helper_->UniformMatrix3x4fvImmediate(location, count, value);
+ CheckGLError();
+}
+
void GLES2Implementation::UniformMatrix4fv(GLint location,
GLsizei count,
GLboolean transpose,
@@ -1572,6 +1926,70 @@
CheckGLError();
}
+void GLES2Implementation::UniformMatrix4x2fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) {
+ GPU_CLIENT_SINGLE_THREAD_CHECK();
+ GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniformMatrix4x2fv(" << location
+ << ", " << count << ", "
+ << GLES2Util::GetStringBool(transpose) << ", "
+ << static_cast<const void*>(value) << ")");
+ GPU_CLIENT_LOG_CODE_BLOCK({
+ for (GLsizei i = 0; i < count; ++i) {
+ GPU_CLIENT_LOG(
+ " " << i << ": " << value[0 + i * 8] << ", " << value[1 + i * 8]
+ << ", " << value[2 + i * 8] << ", " << value[3 + i * 8] << ", "
+ << value[4 + i * 8] << ", " << value[5 + i * 8] << ", "
+ << value[6 + i * 8] << ", " << value[7 + i * 8]);
+ }
+ });
+ if (count < 0) {
+ SetGLError(GL_INVALID_VALUE, "glUniformMatrix4x2fv", "count < 0");
+ return;
+ }
+ if (transpose != false) {
+ SetGLError(GL_INVALID_VALUE, "glUniformMatrix4x2fv",
+ "transpose GL_INVALID_VALUE");
+ return;
+ }
+ helper_->UniformMatrix4x2fvImmediate(location, count, value);
+ CheckGLError();
+}
+
+void GLES2Implementation::UniformMatrix4x3fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) {
+ GPU_CLIENT_SINGLE_THREAD_CHECK();
+ GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniformMatrix4x3fv(" << location
+ << ", " << count << ", "
+ << GLES2Util::GetStringBool(transpose) << ", "
+ << static_cast<const void*>(value) << ")");
+ GPU_CLIENT_LOG_CODE_BLOCK({
+ for (GLsizei i = 0; i < count; ++i) {
+ GPU_CLIENT_LOG(
+ " " << i << ": " << value[0 + i * 12] << ", " << value[1 + i * 12]
+ << ", " << value[2 + i * 12] << ", " << value[3 + i * 12] << ", "
+ << value[4 + i * 12] << ", " << value[5 + i * 12] << ", "
+ << value[6 + i * 12] << ", " << value[7 + i * 12] << ", "
+ << value[8 + i * 12] << ", " << value[9 + i * 12] << ", "
+ << value[10 + i * 12] << ", " << value[11 + i * 12]);
+ }
+ });
+ if (count < 0) {
+ SetGLError(GL_INVALID_VALUE, "glUniformMatrix4x3fv", "count < 0");
+ return;
+ }
+ if (transpose != false) {
+ SetGLError(GL_INVALID_VALUE, "glUniformMatrix4x3fv",
+ "transpose GL_INVALID_VALUE");
+ return;
+ }
+ helper_->UniformMatrix4x3fvImmediate(location, count, value);
+ CheckGLError();
+}
+
void GLES2Implementation::UseProgram(GLuint program) {
GPU_CLIENT_SINGLE_THREAD_CHECK();
GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUseProgram(" << program << ")");
@@ -1670,6 +2088,51 @@
CheckGLError();
}
+void GLES2Implementation::VertexAttribI4i(GLuint indx,
+ GLint x,
+ GLint y,
+ GLint z,
+ GLint w) {
+ GPU_CLIENT_SINGLE_THREAD_CHECK();
+ GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttribI4i(" << indx << ", "
+ << x << ", " << y << ", " << z << ", " << w << ")");
+ helper_->VertexAttribI4i(indx, x, y, z, w);
+ CheckGLError();
+}
+
+void GLES2Implementation::VertexAttribI4iv(GLuint indx, const GLint* values) {
+ GPU_CLIENT_SINGLE_THREAD_CHECK();
+ GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttribI4iv(" << indx
+ << ", " << static_cast<const void*>(values) << ")");
+ GPU_CLIENT_LOG("values: " << values[0] << ", " << values[1] << ", "
+ << values[2] << ", " << values[3]);
+ helper_->VertexAttribI4ivImmediate(indx, values);
+ CheckGLError();
+}
+
+void GLES2Implementation::VertexAttribI4ui(GLuint indx,
+ GLuint x,
+ GLuint y,
+ GLuint z,
+ GLuint w) {
+ GPU_CLIENT_SINGLE_THREAD_CHECK();
+ GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttribI4ui(" << indx
+ << ", " << x << ", " << y << ", " << z << ", " << w
+ << ")");
+ helper_->VertexAttribI4ui(indx, x, y, z, w);
+ CheckGLError();
+}
+
+void GLES2Implementation::VertexAttribI4uiv(GLuint indx, const GLuint* values) {
+ GPU_CLIENT_SINGLE_THREAD_CHECK();
+ GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttribI4uiv(" << indx
+ << ", " << static_cast<const void*>(values) << ")");
+ GPU_CLIENT_LOG("values: " << values[0] << ", " << values[1] << ", "
+ << values[2] << ", " << values[3]);
+ helper_->VertexAttribI4uivImmediate(indx, values);
+ CheckGLError();
+}
+
void GLES2Implementation::Viewport(GLint x,
GLint y,
GLsizei width,
diff --git a/gpu/command_buffer/client/gles2_implementation_unittest.cc b/gpu/command_buffer/client/gles2_implementation_unittest.cc
index 87aaeb1..d772b8e 100644
--- a/gpu/command_buffer/client/gles2_implementation_unittest.cc
+++ b/gpu/command_buffer/client/gles2_implementation_unittest.cc
@@ -10,6 +10,7 @@
#include <GLES2/gl2ext.h>
#include <GLES2/gl2extchromium.h>
+#include <GLES3/gl3.h>
#include "base/compiler_specific.h"
#include "gpu/command_buffer/client/client_test_helper.h"
#include "gpu/command_buffer/client/program_info_manager.h"
diff --git a/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h b/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h
index 74a438c..f48e9ab 100644
--- a/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h
+++ b/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h
@@ -209,6 +209,17 @@
// TODO: Implement unit test for CompressedTexImage2D
// TODO: Implement unit test for CompressedTexSubImage2D
+TEST_F(GLES2ImplementationTest, CopyBufferSubData) {
+ struct Cmds {
+ cmds::CopyBufferSubData cmd;
+ };
+ Cmds expected;
+ expected.cmd.Init(GL_ARRAY_BUFFER, GL_ARRAY_BUFFER, 3, 4, 5);
+
+ gl_->CopyBufferSubData(GL_ARRAY_BUFFER, GL_ARRAY_BUFFER, 3, 4, 5);
+ EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
+}
+
TEST_F(GLES2ImplementationTest, CopyTexImage2D) {
struct Cmds {
cmds::CopyTexImage2D cmd;
@@ -445,6 +456,17 @@
EXPECT_EQ(GL_INVALID_VALUE, CheckError());
}
+TEST_F(GLES2ImplementationTest, FramebufferTextureLayer) {
+ struct Cmds {
+ cmds::FramebufferTextureLayer cmd;
+ };
+ Cmds expected;
+ expected.cmd.Init(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 3, 4, 5);
+
+ gl_->FramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 3, 4, 5);
+ EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
+}
+
TEST_F(GLES2ImplementationTest, FrontFace) {
struct Cmds {
cmds::FrontFace cmd;
@@ -632,6 +654,24 @@
EXPECT_EQ(static_cast<Result::Type>(1), result);
}
+TEST_F(GLES2ImplementationTest, GetInternalformativ) {
+ struct Cmds {
+ cmds::GetInternalformativ cmd;
+ };
+ typedef cmds::GetInternalformativ::Result Result;
+ Result::Type result = 0;
+ Cmds expected;
+ ExpectedMemoryInfo result1 = GetExpectedResultMemory(4);
+ expected.cmd.Init(123, GL_RGBA4, GL_RENDERBUFFER_RED_SIZE, 4, result1.id,
+ result1.offset);
+ EXPECT_CALL(*command_buffer(), OnFlush())
+ .WillOnce(SetMemory(result1.ptr, SizedResultHelper<Result::Type>(1)))
+ .RetiresOnSaturation();
+ gl_->GetInternalformativ(123, GL_RGBA4, GL_RENDERBUFFER_RED_SIZE, 4, &result);
+ EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
+ EXPECT_EQ(static_cast<Result::Type>(1), result);
+}
+
TEST_F(GLES2ImplementationTest, GetProgramiv) {
struct Cmds {
cmds::GetProgramiv cmd;
@@ -1111,6 +1151,17 @@
EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
}
+TEST_F(GLES2ImplementationTest, TexStorage3D) {
+ struct Cmds {
+ cmds::TexStorage3D cmd;
+ };
+ Cmds expected;
+ expected.cmd.Init(GL_TEXTURE_3D, 2, GL_RGB565, 4, 5, 6);
+
+ gl_->TexStorage3D(GL_TEXTURE_3D, 2, GL_RGB565, 4, 5, 6);
+ EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
+}
+
TEST_F(GLES2ImplementationTest, Uniform1f) {
struct Cmds {
cmds::Uniform1f cmd;
@@ -1169,6 +1220,35 @@
EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
}
+TEST_F(GLES2ImplementationTest, Uniform1ui) {
+ struct Cmds {
+ cmds::Uniform1ui cmd;
+ };
+ Cmds expected;
+ expected.cmd.Init(1, 2);
+
+ gl_->Uniform1ui(1, 2);
+ EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
+}
+
+TEST_F(GLES2ImplementationTest, Uniform1uiv) {
+ GLuint data[2][1] = {{0}};
+ struct Cmds {
+ cmds::Uniform1uivImmediate cmd;
+ GLuint data[2][1];
+ };
+
+ Cmds expected;
+ for (int ii = 0; ii < 2; ++ii) {
+ for (int jj = 0; jj < 1; ++jj) {
+ data[ii][jj] = static_cast<GLuint>(ii * 1 + jj);
+ }
+ }
+ expected.cmd.Init(1, 2, &data[0][0]);
+ gl_->Uniform1uiv(1, 2, &data[0][0]);
+ EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
+}
+
TEST_F(GLES2ImplementationTest, Uniform2f) {
struct Cmds {
cmds::Uniform2f cmd;
@@ -1227,6 +1307,35 @@
EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
}
+TEST_F(GLES2ImplementationTest, Uniform2ui) {
+ struct Cmds {
+ cmds::Uniform2ui cmd;
+ };
+ Cmds expected;
+ expected.cmd.Init(1, 2, 3);
+
+ gl_->Uniform2ui(1, 2, 3);
+ EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
+}
+
+TEST_F(GLES2ImplementationTest, Uniform2uiv) {
+ GLuint data[2][2] = {{0}};
+ struct Cmds {
+ cmds::Uniform2uivImmediate cmd;
+ GLuint data[2][2];
+ };
+
+ Cmds expected;
+ for (int ii = 0; ii < 2; ++ii) {
+ for (int jj = 0; jj < 2; ++jj) {
+ data[ii][jj] = static_cast<GLuint>(ii * 2 + jj);
+ }
+ }
+ expected.cmd.Init(1, 2, &data[0][0]);
+ gl_->Uniform2uiv(1, 2, &data[0][0]);
+ EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
+}
+
TEST_F(GLES2ImplementationTest, Uniform3f) {
struct Cmds {
cmds::Uniform3f cmd;
@@ -1285,6 +1394,35 @@
EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
}
+TEST_F(GLES2ImplementationTest, Uniform3ui) {
+ struct Cmds {
+ cmds::Uniform3ui cmd;
+ };
+ Cmds expected;
+ expected.cmd.Init(1, 2, 3, 4);
+
+ gl_->Uniform3ui(1, 2, 3, 4);
+ EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
+}
+
+TEST_F(GLES2ImplementationTest, Uniform3uiv) {
+ GLuint data[2][3] = {{0}};
+ struct Cmds {
+ cmds::Uniform3uivImmediate cmd;
+ GLuint data[2][3];
+ };
+
+ Cmds expected;
+ for (int ii = 0; ii < 2; ++ii) {
+ for (int jj = 0; jj < 3; ++jj) {
+ data[ii][jj] = static_cast<GLuint>(ii * 3 + jj);
+ }
+ }
+ expected.cmd.Init(1, 2, &data[0][0]);
+ gl_->Uniform3uiv(1, 2, &data[0][0]);
+ EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
+}
+
TEST_F(GLES2ImplementationTest, Uniform4f) {
struct Cmds {
cmds::Uniform4f cmd;
@@ -1343,6 +1481,35 @@
EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
}
+TEST_F(GLES2ImplementationTest, Uniform4ui) {
+ struct Cmds {
+ cmds::Uniform4ui cmd;
+ };
+ Cmds expected;
+ expected.cmd.Init(1, 2, 3, 4, 5);
+
+ gl_->Uniform4ui(1, 2, 3, 4, 5);
+ EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
+}
+
+TEST_F(GLES2ImplementationTest, Uniform4uiv) {
+ GLuint data[2][4] = {{0}};
+ struct Cmds {
+ cmds::Uniform4uivImmediate cmd;
+ GLuint data[2][4];
+ };
+
+ Cmds expected;
+ for (int ii = 0; ii < 2; ++ii) {
+ for (int jj = 0; jj < 4; ++jj) {
+ data[ii][jj] = static_cast<GLuint>(ii * 4 + jj);
+ }
+ }
+ expected.cmd.Init(1, 2, &data[0][0]);
+ gl_->Uniform4uiv(1, 2, &data[0][0]);
+ EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
+}
+
TEST_F(GLES2ImplementationTest, UniformMatrix2fv) {
GLfloat data[2][4] = {{0}};
struct Cmds {
@@ -1373,6 +1540,66 @@
EXPECT_EQ(GL_INVALID_VALUE, CheckError());
}
+TEST_F(GLES2ImplementationTest, UniformMatrix2x3fv) {
+ GLfloat data[2][6] = {{0}};
+ struct Cmds {
+ cmds::UniformMatrix2x3fvImmediate cmd;
+ GLfloat data[2][6];
+ };
+
+ Cmds expected;
+ for (int ii = 0; ii < 2; ++ii) {
+ for (int jj = 0; jj < 6; ++jj) {
+ data[ii][jj] = static_cast<GLfloat>(ii * 6 + jj);
+ }
+ }
+ expected.cmd.Init(1, 2, &data[0][0]);
+ gl_->UniformMatrix2x3fv(1, 2, false, &data[0][0]);
+ EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
+}
+
+TEST_F(GLES2ImplementationTest, UniformMatrix2x3fvInvalidConstantArg2) {
+ GLfloat data[2][6] = {{0}};
+ for (int ii = 0; ii < 2; ++ii) {
+ for (int jj = 0; jj < 6; ++jj) {
+ data[ii][jj] = static_cast<GLfloat>(ii * 6 + jj);
+ }
+ }
+ gl_->UniformMatrix2x3fv(1, 2, true, &data[0][0]);
+ EXPECT_TRUE(NoCommandsWritten());
+ EXPECT_EQ(GL_INVALID_VALUE, CheckError());
+}
+
+TEST_F(GLES2ImplementationTest, UniformMatrix2x4fv) {
+ GLfloat data[2][8] = {{0}};
+ struct Cmds {
+ cmds::UniformMatrix2x4fvImmediate cmd;
+ GLfloat data[2][8];
+ };
+
+ Cmds expected;
+ for (int ii = 0; ii < 2; ++ii) {
+ for (int jj = 0; jj < 8; ++jj) {
+ data[ii][jj] = static_cast<GLfloat>(ii * 8 + jj);
+ }
+ }
+ expected.cmd.Init(1, 2, &data[0][0]);
+ gl_->UniformMatrix2x4fv(1, 2, false, &data[0][0]);
+ EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
+}
+
+TEST_F(GLES2ImplementationTest, UniformMatrix2x4fvInvalidConstantArg2) {
+ GLfloat data[2][8] = {{0}};
+ for (int ii = 0; ii < 2; ++ii) {
+ for (int jj = 0; jj < 8; ++jj) {
+ data[ii][jj] = static_cast<GLfloat>(ii * 8 + jj);
+ }
+ }
+ gl_->UniformMatrix2x4fv(1, 2, true, &data[0][0]);
+ EXPECT_TRUE(NoCommandsWritten());
+ EXPECT_EQ(GL_INVALID_VALUE, CheckError());
+}
+
TEST_F(GLES2ImplementationTest, UniformMatrix3fv) {
GLfloat data[2][9] = {{0}};
struct Cmds {
@@ -1403,6 +1630,66 @@
EXPECT_EQ(GL_INVALID_VALUE, CheckError());
}
+TEST_F(GLES2ImplementationTest, UniformMatrix3x2fv) {
+ GLfloat data[2][6] = {{0}};
+ struct Cmds {
+ cmds::UniformMatrix3x2fvImmediate cmd;
+ GLfloat data[2][6];
+ };
+
+ Cmds expected;
+ for (int ii = 0; ii < 2; ++ii) {
+ for (int jj = 0; jj < 6; ++jj) {
+ data[ii][jj] = static_cast<GLfloat>(ii * 6 + jj);
+ }
+ }
+ expected.cmd.Init(1, 2, &data[0][0]);
+ gl_->UniformMatrix3x2fv(1, 2, false, &data[0][0]);
+ EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
+}
+
+TEST_F(GLES2ImplementationTest, UniformMatrix3x2fvInvalidConstantArg2) {
+ GLfloat data[2][6] = {{0}};
+ for (int ii = 0; ii < 2; ++ii) {
+ for (int jj = 0; jj < 6; ++jj) {
+ data[ii][jj] = static_cast<GLfloat>(ii * 6 + jj);
+ }
+ }
+ gl_->UniformMatrix3x2fv(1, 2, true, &data[0][0]);
+ EXPECT_TRUE(NoCommandsWritten());
+ EXPECT_EQ(GL_INVALID_VALUE, CheckError());
+}
+
+TEST_F(GLES2ImplementationTest, UniformMatrix3x4fv) {
+ GLfloat data[2][12] = {{0}};
+ struct Cmds {
+ cmds::UniformMatrix3x4fvImmediate cmd;
+ GLfloat data[2][12];
+ };
+
+ Cmds expected;
+ for (int ii = 0; ii < 2; ++ii) {
+ for (int jj = 0; jj < 12; ++jj) {
+ data[ii][jj] = static_cast<GLfloat>(ii * 12 + jj);
+ }
+ }
+ expected.cmd.Init(1, 2, &data[0][0]);
+ gl_->UniformMatrix3x4fv(1, 2, false, &data[0][0]);
+ EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
+}
+
+TEST_F(GLES2ImplementationTest, UniformMatrix3x4fvInvalidConstantArg2) {
+ GLfloat data[2][12] = {{0}};
+ for (int ii = 0; ii < 2; ++ii) {
+ for (int jj = 0; jj < 12; ++jj) {
+ data[ii][jj] = static_cast<GLfloat>(ii * 12 + jj);
+ }
+ }
+ gl_->UniformMatrix3x4fv(1, 2, true, &data[0][0]);
+ EXPECT_TRUE(NoCommandsWritten());
+ EXPECT_EQ(GL_INVALID_VALUE, CheckError());
+}
+
TEST_F(GLES2ImplementationTest, UniformMatrix4fv) {
GLfloat data[2][16] = {{0}};
struct Cmds {
@@ -1433,6 +1720,66 @@
EXPECT_EQ(GL_INVALID_VALUE, CheckError());
}
+TEST_F(GLES2ImplementationTest, UniformMatrix4x2fv) {
+ GLfloat data[2][8] = {{0}};
+ struct Cmds {
+ cmds::UniformMatrix4x2fvImmediate cmd;
+ GLfloat data[2][8];
+ };
+
+ Cmds expected;
+ for (int ii = 0; ii < 2; ++ii) {
+ for (int jj = 0; jj < 8; ++jj) {
+ data[ii][jj] = static_cast<GLfloat>(ii * 8 + jj);
+ }
+ }
+ expected.cmd.Init(1, 2, &data[0][0]);
+ gl_->UniformMatrix4x2fv(1, 2, false, &data[0][0]);
+ EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
+}
+
+TEST_F(GLES2ImplementationTest, UniformMatrix4x2fvInvalidConstantArg2) {
+ GLfloat data[2][8] = {{0}};
+ for (int ii = 0; ii < 2; ++ii) {
+ for (int jj = 0; jj < 8; ++jj) {
+ data[ii][jj] = static_cast<GLfloat>(ii * 8 + jj);
+ }
+ }
+ gl_->UniformMatrix4x2fv(1, 2, true, &data[0][0]);
+ EXPECT_TRUE(NoCommandsWritten());
+ EXPECT_EQ(GL_INVALID_VALUE, CheckError());
+}
+
+TEST_F(GLES2ImplementationTest, UniformMatrix4x3fv) {
+ GLfloat data[2][12] = {{0}};
+ struct Cmds {
+ cmds::UniformMatrix4x3fvImmediate cmd;
+ GLfloat data[2][12];
+ };
+
+ Cmds expected;
+ for (int ii = 0; ii < 2; ++ii) {
+ for (int jj = 0; jj < 12; ++jj) {
+ data[ii][jj] = static_cast<GLfloat>(ii * 12 + jj);
+ }
+ }
+ expected.cmd.Init(1, 2, &data[0][0]);
+ gl_->UniformMatrix4x3fv(1, 2, false, &data[0][0]);
+ EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
+}
+
+TEST_F(GLES2ImplementationTest, UniformMatrix4x3fvInvalidConstantArg2) {
+ GLfloat data[2][12] = {{0}};
+ for (int ii = 0; ii < 2; ++ii) {
+ for (int jj = 0; jj < 12; ++jj) {
+ data[ii][jj] = static_cast<GLfloat>(ii * 12 + jj);
+ }
+ }
+ gl_->UniformMatrix4x3fv(1, 2, true, &data[0][0]);
+ EXPECT_TRUE(NoCommandsWritten());
+ EXPECT_EQ(GL_INVALID_VALUE, CheckError());
+}
+
TEST_F(GLES2ImplementationTest, UseProgram) {
struct Cmds {
cmds::UseProgram cmd;
@@ -1566,6 +1913,60 @@
EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
}
+TEST_F(GLES2ImplementationTest, VertexAttribI4i) {
+ struct Cmds {
+ cmds::VertexAttribI4i cmd;
+ };
+ Cmds expected;
+ expected.cmd.Init(1, 2, 3, 4, 5);
+
+ gl_->VertexAttribI4i(1, 2, 3, 4, 5);
+ EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
+}
+
+TEST_F(GLES2ImplementationTest, VertexAttribI4iv) {
+ GLint data[4] = {0};
+ struct Cmds {
+ cmds::VertexAttribI4ivImmediate cmd;
+ GLint data[4];
+ };
+
+ for (int jj = 0; jj < 4; ++jj) {
+ data[jj] = static_cast<GLint>(jj);
+ }
+ Cmds expected;
+ expected.cmd.Init(1, &data[0]);
+ gl_->VertexAttribI4iv(1, &data[0]);
+ EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
+}
+
+TEST_F(GLES2ImplementationTest, VertexAttribI4ui) {
+ struct Cmds {
+ cmds::VertexAttribI4ui cmd;
+ };
+ Cmds expected;
+ expected.cmd.Init(1, 2, 3, 4, 5);
+
+ gl_->VertexAttribI4ui(1, 2, 3, 4, 5);
+ EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
+}
+
+TEST_F(GLES2ImplementationTest, VertexAttribI4uiv) {
+ GLuint data[4] = {0};
+ struct Cmds {
+ cmds::VertexAttribI4uivImmediate cmd;
+ GLuint data[4];
+ };
+
+ for (int jj = 0; jj < 4; ++jj) {
+ data[jj] = static_cast<GLuint>(jj);
+ }
+ Cmds expected;
+ expected.cmd.Init(1, &data[0]);
+ gl_->VertexAttribI4uiv(1, &data[0]);
+ EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
+}
+
TEST_F(GLES2ImplementationTest, Viewport) {
struct Cmds {
cmds::Viewport cmd;
diff --git a/gpu/command_buffer/client/gles2_interface_autogen.h b/gpu/command_buffer/client/gles2_interface_autogen.h
index ee4591c..f8c2707 100644
--- a/gpu/command_buffer/client/gles2_interface_autogen.h
+++ b/gpu/command_buffer/client/gles2_interface_autogen.h
@@ -71,6 +71,11 @@
GLenum format,
GLsizei imageSize,
const void* data) = 0;
+virtual void CopyBufferSubData(GLenum readtarget,
+ GLenum writetarget,
+ GLintptr readoffset,
+ GLintptr writeoffset,
+ GLsizeiptr size) = 0;
virtual void CopyTexImage2D(GLenum target,
GLint level,
GLenum internalformat,
@@ -120,6 +125,11 @@
GLenum textarget,
GLuint texture,
GLint level) = 0;
+virtual void FramebufferTextureLayer(GLenum target,
+ GLenum attachment,
+ GLuint texture,
+ GLint level,
+ GLint layer) = 0;
virtual void FrontFace(GLenum mode) = 0;
virtual void GenBuffers(GLsizei n, GLuint* buffers) = 0;
virtual void GenerateMipmap(GLenum target) = 0;
@@ -156,6 +166,11 @@
GLenum pname,
GLint* params) = 0;
virtual void GetIntegerv(GLenum pname, GLint* params) = 0;
+virtual void GetInternalformativ(GLenum target,
+ GLenum format,
+ GLenum pname,
+ GLsizei bufSize,
+ GLint* params) = 0;
virtual void GetProgramiv(GLuint program, GLenum pname, GLint* params) = 0;
virtual void GetProgramInfoLog(GLuint program,
GLsizei bufsize,
@@ -256,6 +271,12 @@
virtual void TexParameteriv(GLenum target,
GLenum pname,
const GLint* params) = 0;
+virtual void TexStorage3D(GLenum target,
+ GLsizei levels,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth) = 0;
virtual void TexSubImage2D(GLenum target,
GLint level,
GLint xoffset,
@@ -269,14 +290,20 @@
virtual void Uniform1fv(GLint location, GLsizei count, const GLfloat* v) = 0;
virtual void Uniform1i(GLint location, GLint x) = 0;
virtual void Uniform1iv(GLint location, GLsizei count, const GLint* v) = 0;
+virtual void Uniform1ui(GLint location, GLuint x) = 0;
+virtual void Uniform1uiv(GLint location, GLsizei count, const GLuint* v) = 0;
virtual void Uniform2f(GLint location, GLfloat x, GLfloat y) = 0;
virtual void Uniform2fv(GLint location, GLsizei count, const GLfloat* v) = 0;
virtual void Uniform2i(GLint location, GLint x, GLint y) = 0;
virtual void Uniform2iv(GLint location, GLsizei count, const GLint* v) = 0;
+virtual void Uniform2ui(GLint location, GLuint x, GLuint y) = 0;
+virtual void Uniform2uiv(GLint location, GLsizei count, const GLuint* v) = 0;
virtual void Uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z) = 0;
virtual void Uniform3fv(GLint location, GLsizei count, const GLfloat* v) = 0;
virtual void Uniform3i(GLint location, GLint x, GLint y, GLint z) = 0;
virtual void Uniform3iv(GLint location, GLsizei count, const GLint* v) = 0;
+virtual void Uniform3ui(GLint location, GLuint x, GLuint y, GLuint z) = 0;
+virtual void Uniform3uiv(GLint location, GLsizei count, const GLuint* v) = 0;
virtual void Uniform4f(GLint location,
GLfloat x,
GLfloat y,
@@ -285,18 +312,48 @@
virtual void Uniform4fv(GLint location, GLsizei count, const GLfloat* v) = 0;
virtual void Uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w) = 0;
virtual void Uniform4iv(GLint location, GLsizei count, const GLint* v) = 0;
+virtual void Uniform4ui(GLint location,
+ GLuint x,
+ GLuint y,
+ GLuint z,
+ GLuint w) = 0;
+virtual void Uniform4uiv(GLint location, GLsizei count, const GLuint* v) = 0;
virtual void UniformMatrix2fv(GLint location,
GLsizei count,
GLboolean transpose,
const GLfloat* value) = 0;
+virtual void UniformMatrix2x3fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) = 0;
+virtual void UniformMatrix2x4fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) = 0;
virtual void UniformMatrix3fv(GLint location,
GLsizei count,
GLboolean transpose,
const GLfloat* value) = 0;
+virtual void UniformMatrix3x2fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) = 0;
+virtual void UniformMatrix3x4fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) = 0;
virtual void UniformMatrix4fv(GLint location,
GLsizei count,
GLboolean transpose,
const GLfloat* value) = 0;
+virtual void UniformMatrix4x2fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) = 0;
+virtual void UniformMatrix4x3fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) = 0;
virtual void UseProgram(GLuint program) = 0;
virtual void ValidateProgram(GLuint program) = 0;
virtual void VertexAttrib1f(GLuint indx, GLfloat x) = 0;
@@ -311,6 +368,23 @@
GLfloat z,
GLfloat w) = 0;
virtual void VertexAttrib4fv(GLuint indx, const GLfloat* values) = 0;
+virtual void VertexAttribI4i(GLuint indx,
+ GLint x,
+ GLint y,
+ GLint z,
+ GLint w) = 0;
+virtual void VertexAttribI4iv(GLuint indx, const GLint* values) = 0;
+virtual void VertexAttribI4ui(GLuint indx,
+ GLuint x,
+ GLuint y,
+ GLuint z,
+ GLuint w) = 0;
+virtual void VertexAttribI4uiv(GLuint indx, const GLuint* values) = 0;
+virtual void VertexAttribIPointer(GLuint indx,
+ GLint size,
+ GLenum type,
+ GLsizei stride,
+ const void* ptr) = 0;
virtual void VertexAttribPointer(GLuint indx,
GLint size,
GLenum type,
diff --git a/gpu/command_buffer/client/gles2_interface_stub_autogen.h b/gpu/command_buffer/client/gles2_interface_stub_autogen.h
index 637c000..5d8a40a 100644
--- a/gpu/command_buffer/client/gles2_interface_stub_autogen.h
+++ b/gpu/command_buffer/client/gles2_interface_stub_autogen.h
@@ -70,6 +70,11 @@
GLenum format,
GLsizei imageSize,
const void* data) override;
+void CopyBufferSubData(GLenum readtarget,
+ GLenum writetarget,
+ GLintptr readoffset,
+ GLintptr writeoffset,
+ GLsizeiptr size) override;
void CopyTexImage2D(GLenum target,
GLint level,
GLenum internalformat,
@@ -119,6 +124,11 @@
GLenum textarget,
GLuint texture,
GLint level) override;
+void FramebufferTextureLayer(GLenum target,
+ GLenum attachment,
+ GLuint texture,
+ GLint level,
+ GLint layer) override;
void FrontFace(GLenum mode) override;
void GenBuffers(GLsizei n, GLuint* buffers) override;
void GenerateMipmap(GLenum target) override;
@@ -153,6 +163,11 @@
GLenum pname,
GLint* params) override;
void GetIntegerv(GLenum pname, GLint* params) override;
+void GetInternalformativ(GLenum target,
+ GLenum format,
+ GLenum pname,
+ GLsizei bufSize,
+ GLint* params) override;
void GetProgramiv(GLuint program, GLenum pname, GLint* params) override;
void GetProgramInfoLog(GLuint program,
GLsizei bufsize,
@@ -249,6 +264,12 @@
const GLfloat* params) override;
void TexParameteri(GLenum target, GLenum pname, GLint param) override;
void TexParameteriv(GLenum target, GLenum pname, const GLint* params) override;
+void TexStorage3D(GLenum target,
+ GLsizei levels,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth) override;
void TexSubImage2D(GLenum target,
GLint level,
GLint xoffset,
@@ -262,14 +283,20 @@
void Uniform1fv(GLint location, GLsizei count, const GLfloat* v) override;
void Uniform1i(GLint location, GLint x) override;
void Uniform1iv(GLint location, GLsizei count, const GLint* v) override;
+void Uniform1ui(GLint location, GLuint x) override;
+void Uniform1uiv(GLint location, GLsizei count, const GLuint* v) override;
void Uniform2f(GLint location, GLfloat x, GLfloat y) override;
void Uniform2fv(GLint location, GLsizei count, const GLfloat* v) override;
void Uniform2i(GLint location, GLint x, GLint y) override;
void Uniform2iv(GLint location, GLsizei count, const GLint* v) override;
+void Uniform2ui(GLint location, GLuint x, GLuint y) override;
+void Uniform2uiv(GLint location, GLsizei count, const GLuint* v) override;
void Uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z) override;
void Uniform3fv(GLint location, GLsizei count, const GLfloat* v) override;
void Uniform3i(GLint location, GLint x, GLint y, GLint z) override;
void Uniform3iv(GLint location, GLsizei count, const GLint* v) override;
+void Uniform3ui(GLint location, GLuint x, GLuint y, GLuint z) override;
+void Uniform3uiv(GLint location, GLsizei count, const GLuint* v) override;
void Uniform4f(GLint location,
GLfloat x,
GLfloat y,
@@ -278,18 +305,48 @@
void Uniform4fv(GLint location, GLsizei count, const GLfloat* v) override;
void Uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w) override;
void Uniform4iv(GLint location, GLsizei count, const GLint* v) override;
+void Uniform4ui(GLint location,
+ GLuint x,
+ GLuint y,
+ GLuint z,
+ GLuint w) override;
+void Uniform4uiv(GLint location, GLsizei count, const GLuint* v) override;
void UniformMatrix2fv(GLint location,
GLsizei count,
GLboolean transpose,
const GLfloat* value) override;
+void UniformMatrix2x3fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) override;
+void UniformMatrix2x4fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) override;
void UniformMatrix3fv(GLint location,
GLsizei count,
GLboolean transpose,
const GLfloat* value) override;
+void UniformMatrix3x2fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) override;
+void UniformMatrix3x4fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) override;
void UniformMatrix4fv(GLint location,
GLsizei count,
GLboolean transpose,
const GLfloat* value) override;
+void UniformMatrix4x2fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) override;
+void UniformMatrix4x3fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) override;
void UseProgram(GLuint program) override;
void ValidateProgram(GLuint program) override;
void VertexAttrib1f(GLuint indx, GLfloat x) override;
@@ -304,6 +361,19 @@
GLfloat z,
GLfloat w) override;
void VertexAttrib4fv(GLuint indx, const GLfloat* values) override;
+void VertexAttribI4i(GLuint indx, GLint x, GLint y, GLint z, GLint w) override;
+void VertexAttribI4iv(GLuint indx, const GLint* values) override;
+void VertexAttribI4ui(GLuint indx,
+ GLuint x,
+ GLuint y,
+ GLuint z,
+ GLuint w) override;
+void VertexAttribI4uiv(GLuint indx, const GLuint* values) override;
+void VertexAttribIPointer(GLuint indx,
+ GLint size,
+ GLenum type,
+ GLsizei stride,
+ const void* ptr) override;
void VertexAttribPointer(GLuint indx,
GLint size,
GLenum type,
diff --git a/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h b/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h
index 5a986e9..b4792ca 100644
--- a/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h
+++ b/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h
@@ -99,6 +99,12 @@
GLsizei /* imageSize */,
const void* /* data */) {
}
+void GLES2InterfaceStub::CopyBufferSubData(GLenum /* readtarget */,
+ GLenum /* writetarget */,
+ GLintptr /* readoffset */,
+ GLintptr /* writeoffset */,
+ GLsizeiptr /* size */) {
+}
void GLES2InterfaceStub::CopyTexImage2D(GLenum /* target */,
GLint /* level */,
GLenum /* internalformat */,
@@ -185,6 +191,12 @@
GLuint /* texture */,
GLint /* level */) {
}
+void GLES2InterfaceStub::FramebufferTextureLayer(GLenum /* target */,
+ GLenum /* attachment */,
+ GLuint /* texture */,
+ GLint /* level */,
+ GLint /* layer */) {
+}
void GLES2InterfaceStub::FrontFace(GLenum /* mode */) {
}
void GLES2InterfaceStub::GenBuffers(GLsizei /* n */, GLuint* /* buffers */) {
@@ -244,6 +256,12 @@
}
void GLES2InterfaceStub::GetIntegerv(GLenum /* pname */, GLint* /* params */) {
}
+void GLES2InterfaceStub::GetInternalformativ(GLenum /* target */,
+ GLenum /* format */,
+ GLenum /* pname */,
+ GLsizei /* bufSize */,
+ GLint* /* params */) {
+}
void GLES2InterfaceStub::GetProgramiv(GLuint /* program */,
GLenum /* pname */,
GLint* /* params */) {
@@ -430,6 +448,13 @@
GLenum /* pname */,
const GLint* /* params */) {
}
+void GLES2InterfaceStub::TexStorage3D(GLenum /* target */,
+ GLsizei /* levels */,
+ GLenum /* internalFormat */,
+ GLsizei /* width */,
+ GLsizei /* height */,
+ GLsizei /* depth */) {
+}
void GLES2InterfaceStub::TexSubImage2D(GLenum /* target */,
GLint /* level */,
GLint /* xoffset */,
@@ -452,6 +477,12 @@
GLsizei /* count */,
const GLint* /* v */) {
}
+void GLES2InterfaceStub::Uniform1ui(GLint /* location */, GLuint /* x */) {
+}
+void GLES2InterfaceStub::Uniform1uiv(GLint /* location */,
+ GLsizei /* count */,
+ const GLuint* /* v */) {
+}
void GLES2InterfaceStub::Uniform2f(GLint /* location */,
GLfloat /* x */,
GLfloat /* y */) {
@@ -468,6 +499,14 @@
GLsizei /* count */,
const GLint* /* v */) {
}
+void GLES2InterfaceStub::Uniform2ui(GLint /* location */,
+ GLuint /* x */,
+ GLuint /* y */) {
+}
+void GLES2InterfaceStub::Uniform2uiv(GLint /* location */,
+ GLsizei /* count */,
+ const GLuint* /* v */) {
+}
void GLES2InterfaceStub::Uniform3f(GLint /* location */,
GLfloat /* x */,
GLfloat /* y */,
@@ -486,6 +525,15 @@
GLsizei /* count */,
const GLint* /* v */) {
}
+void GLES2InterfaceStub::Uniform3ui(GLint /* location */,
+ GLuint /* x */,
+ GLuint /* y */,
+ GLuint /* z */) {
+}
+void GLES2InterfaceStub::Uniform3uiv(GLint /* location */,
+ GLsizei /* count */,
+ const GLuint* /* v */) {
+}
void GLES2InterfaceStub::Uniform4f(GLint /* location */,
GLfloat /* x */,
GLfloat /* y */,
@@ -506,21 +554,61 @@
GLsizei /* count */,
const GLint* /* v */) {
}
+void GLES2InterfaceStub::Uniform4ui(GLint /* location */,
+ GLuint /* x */,
+ GLuint /* y */,
+ GLuint /* z */,
+ GLuint /* w */) {
+}
+void GLES2InterfaceStub::Uniform4uiv(GLint /* location */,
+ GLsizei /* count */,
+ const GLuint* /* v */) {
+}
void GLES2InterfaceStub::UniformMatrix2fv(GLint /* location */,
GLsizei /* count */,
GLboolean /* transpose */,
const GLfloat* /* value */) {
}
+void GLES2InterfaceStub::UniformMatrix2x3fv(GLint /* location */,
+ GLsizei /* count */,
+ GLboolean /* transpose */,
+ const GLfloat* /* value */) {
+}
+void GLES2InterfaceStub::UniformMatrix2x4fv(GLint /* location */,
+ GLsizei /* count */,
+ GLboolean /* transpose */,
+ const GLfloat* /* value */) {
+}
void GLES2InterfaceStub::UniformMatrix3fv(GLint /* location */,
GLsizei /* count */,
GLboolean /* transpose */,
const GLfloat* /* value */) {
}
+void GLES2InterfaceStub::UniformMatrix3x2fv(GLint /* location */,
+ GLsizei /* count */,
+ GLboolean /* transpose */,
+ const GLfloat* /* value */) {
+}
+void GLES2InterfaceStub::UniformMatrix3x4fv(GLint /* location */,
+ GLsizei /* count */,
+ GLboolean /* transpose */,
+ const GLfloat* /* value */) {
+}
void GLES2InterfaceStub::UniformMatrix4fv(GLint /* location */,
GLsizei /* count */,
GLboolean /* transpose */,
const GLfloat* /* value */) {
}
+void GLES2InterfaceStub::UniformMatrix4x2fv(GLint /* location */,
+ GLsizei /* count */,
+ GLboolean /* transpose */,
+ const GLfloat* /* value */) {
+}
+void GLES2InterfaceStub::UniformMatrix4x3fv(GLint /* location */,
+ GLsizei /* count */,
+ GLboolean /* transpose */,
+ const GLfloat* /* value */) {
+}
void GLES2InterfaceStub::UseProgram(GLuint /* program */) {
}
void GLES2InterfaceStub::ValidateProgram(GLuint /* program */) {
@@ -554,6 +642,30 @@
void GLES2InterfaceStub::VertexAttrib4fv(GLuint /* indx */,
const GLfloat* /* values */) {
}
+void GLES2InterfaceStub::VertexAttribI4i(GLuint /* indx */,
+ GLint /* x */,
+ GLint /* y */,
+ GLint /* z */,
+ GLint /* w */) {
+}
+void GLES2InterfaceStub::VertexAttribI4iv(GLuint /* indx */,
+ const GLint* /* values */) {
+}
+void GLES2InterfaceStub::VertexAttribI4ui(GLuint /* indx */,
+ GLuint /* x */,
+ GLuint /* y */,
+ GLuint /* z */,
+ GLuint /* w */) {
+}
+void GLES2InterfaceStub::VertexAttribI4uiv(GLuint /* indx */,
+ const GLuint* /* values */) {
+}
+void GLES2InterfaceStub::VertexAttribIPointer(GLuint /* indx */,
+ GLint /* size */,
+ GLenum /* type */,
+ GLsizei /* stride */,
+ const void* /* ptr */) {
+}
void GLES2InterfaceStub::VertexAttribPointer(GLuint /* indx */,
GLint /* size */,
GLenum /* type */,
diff --git a/gpu/command_buffer/client/gles2_trace_implementation_autogen.h b/gpu/command_buffer/client/gles2_trace_implementation_autogen.h
index b4349ae..72860f1 100644
--- a/gpu/command_buffer/client/gles2_trace_implementation_autogen.h
+++ b/gpu/command_buffer/client/gles2_trace_implementation_autogen.h
@@ -70,6 +70,11 @@
GLenum format,
GLsizei imageSize,
const void* data) override;
+void CopyBufferSubData(GLenum readtarget,
+ GLenum writetarget,
+ GLintptr readoffset,
+ GLintptr writeoffset,
+ GLsizeiptr size) override;
void CopyTexImage2D(GLenum target,
GLint level,
GLenum internalformat,
@@ -119,6 +124,11 @@
GLenum textarget,
GLuint texture,
GLint level) override;
+void FramebufferTextureLayer(GLenum target,
+ GLenum attachment,
+ GLuint texture,
+ GLint level,
+ GLint layer) override;
void FrontFace(GLenum mode) override;
void GenBuffers(GLsizei n, GLuint* buffers) override;
void GenerateMipmap(GLenum target) override;
@@ -153,6 +163,11 @@
GLenum pname,
GLint* params) override;
void GetIntegerv(GLenum pname, GLint* params) override;
+void GetInternalformativ(GLenum target,
+ GLenum format,
+ GLenum pname,
+ GLsizei bufSize,
+ GLint* params) override;
void GetProgramiv(GLuint program, GLenum pname, GLint* params) override;
void GetProgramInfoLog(GLuint program,
GLsizei bufsize,
@@ -249,6 +264,12 @@
const GLfloat* params) override;
void TexParameteri(GLenum target, GLenum pname, GLint param) override;
void TexParameteriv(GLenum target, GLenum pname, const GLint* params) override;
+void TexStorage3D(GLenum target,
+ GLsizei levels,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth) override;
void TexSubImage2D(GLenum target,
GLint level,
GLint xoffset,
@@ -262,14 +283,20 @@
void Uniform1fv(GLint location, GLsizei count, const GLfloat* v) override;
void Uniform1i(GLint location, GLint x) override;
void Uniform1iv(GLint location, GLsizei count, const GLint* v) override;
+void Uniform1ui(GLint location, GLuint x) override;
+void Uniform1uiv(GLint location, GLsizei count, const GLuint* v) override;
void Uniform2f(GLint location, GLfloat x, GLfloat y) override;
void Uniform2fv(GLint location, GLsizei count, const GLfloat* v) override;
void Uniform2i(GLint location, GLint x, GLint y) override;
void Uniform2iv(GLint location, GLsizei count, const GLint* v) override;
+void Uniform2ui(GLint location, GLuint x, GLuint y) override;
+void Uniform2uiv(GLint location, GLsizei count, const GLuint* v) override;
void Uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z) override;
void Uniform3fv(GLint location, GLsizei count, const GLfloat* v) override;
void Uniform3i(GLint location, GLint x, GLint y, GLint z) override;
void Uniform3iv(GLint location, GLsizei count, const GLint* v) override;
+void Uniform3ui(GLint location, GLuint x, GLuint y, GLuint z) override;
+void Uniform3uiv(GLint location, GLsizei count, const GLuint* v) override;
void Uniform4f(GLint location,
GLfloat x,
GLfloat y,
@@ -278,18 +305,48 @@
void Uniform4fv(GLint location, GLsizei count, const GLfloat* v) override;
void Uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w) override;
void Uniform4iv(GLint location, GLsizei count, const GLint* v) override;
+void Uniform4ui(GLint location,
+ GLuint x,
+ GLuint y,
+ GLuint z,
+ GLuint w) override;
+void Uniform4uiv(GLint location, GLsizei count, const GLuint* v) override;
void UniformMatrix2fv(GLint location,
GLsizei count,
GLboolean transpose,
const GLfloat* value) override;
+void UniformMatrix2x3fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) override;
+void UniformMatrix2x4fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) override;
void UniformMatrix3fv(GLint location,
GLsizei count,
GLboolean transpose,
const GLfloat* value) override;
+void UniformMatrix3x2fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) override;
+void UniformMatrix3x4fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) override;
void UniformMatrix4fv(GLint location,
GLsizei count,
GLboolean transpose,
const GLfloat* value) override;
+void UniformMatrix4x2fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) override;
+void UniformMatrix4x3fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) override;
void UseProgram(GLuint program) override;
void ValidateProgram(GLuint program) override;
void VertexAttrib1f(GLuint indx, GLfloat x) override;
@@ -304,6 +361,19 @@
GLfloat z,
GLfloat w) override;
void VertexAttrib4fv(GLuint indx, const GLfloat* values) override;
+void VertexAttribI4i(GLuint indx, GLint x, GLint y, GLint z, GLint w) override;
+void VertexAttribI4iv(GLuint indx, const GLint* values) override;
+void VertexAttribI4ui(GLuint indx,
+ GLuint x,
+ GLuint y,
+ GLuint z,
+ GLuint w) override;
+void VertexAttribI4uiv(GLuint indx, const GLuint* values) override;
+void VertexAttribIPointer(GLuint indx,
+ GLint size,
+ GLenum type,
+ GLsizei stride,
+ const void* ptr) override;
void VertexAttribPointer(GLuint indx,
GLint size,
GLenum type,
diff --git a/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h b/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h
index d7b53b4..28e6f43 100644
--- a/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h
+++ b/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h
@@ -167,6 +167,16 @@
format, imageSize, data);
}
+void GLES2TraceImplementation::CopyBufferSubData(GLenum readtarget,
+ GLenum writetarget,
+ GLintptr readoffset,
+ GLintptr writeoffset,
+ GLsizeiptr size) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::CopyBufferSubData");
+ gl_->CopyBufferSubData(readtarget, writetarget, readoffset, writeoffset,
+ size);
+}
+
void GLES2TraceImplementation::CopyTexImage2D(GLenum target,
GLint level,
GLenum internalformat,
@@ -325,6 +335,15 @@
gl_->FramebufferTexture2D(target, attachment, textarget, texture, level);
}
+void GLES2TraceImplementation::FramebufferTextureLayer(GLenum target,
+ GLenum attachment,
+ GLuint texture,
+ GLint level,
+ GLint layer) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::FramebufferTextureLayer");
+ gl_->FramebufferTextureLayer(target, attachment, texture, level, layer);
+}
+
void GLES2TraceImplementation::FrontFace(GLenum mode) {
TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::FrontFace");
gl_->FrontFace(mode);
@@ -430,6 +449,15 @@
gl_->GetIntegerv(pname, params);
}
+void GLES2TraceImplementation::GetInternalformativ(GLenum target,
+ GLenum format,
+ GLenum pname,
+ GLsizei bufSize,
+ GLint* params) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GetInternalformativ");
+ gl_->GetInternalformativ(target, format, pname, bufSize, params);
+}
+
void GLES2TraceImplementation::GetProgramiv(GLuint program,
GLenum pname,
GLint* params) {
@@ -751,6 +779,16 @@
gl_->TexParameteriv(target, pname, params);
}
+void GLES2TraceImplementation::TexStorage3D(GLenum target,
+ GLsizei levels,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::TexStorage3D");
+ gl_->TexStorage3D(target, levels, internalFormat, width, height, depth);
+}
+
void GLES2TraceImplementation::TexSubImage2D(GLenum target,
GLint level,
GLint xoffset,
@@ -789,6 +827,18 @@
gl_->Uniform1iv(location, count, v);
}
+void GLES2TraceImplementation::Uniform1ui(GLint location, GLuint x) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::Uniform1ui");
+ gl_->Uniform1ui(location, x);
+}
+
+void GLES2TraceImplementation::Uniform1uiv(GLint location,
+ GLsizei count,
+ const GLuint* v) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::Uniform1uiv");
+ gl_->Uniform1uiv(location, count, v);
+}
+
void GLES2TraceImplementation::Uniform2f(GLint location, GLfloat x, GLfloat y) {
TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::Uniform2f");
gl_->Uniform2f(location, x, y);
@@ -813,6 +863,18 @@
gl_->Uniform2iv(location, count, v);
}
+void GLES2TraceImplementation::Uniform2ui(GLint location, GLuint x, GLuint y) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::Uniform2ui");
+ gl_->Uniform2ui(location, x, y);
+}
+
+void GLES2TraceImplementation::Uniform2uiv(GLint location,
+ GLsizei count,
+ const GLuint* v) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::Uniform2uiv");
+ gl_->Uniform2uiv(location, count, v);
+}
+
void GLES2TraceImplementation::Uniform3f(GLint location,
GLfloat x,
GLfloat y,
@@ -843,6 +905,21 @@
gl_->Uniform3iv(location, count, v);
}
+void GLES2TraceImplementation::Uniform3ui(GLint location,
+ GLuint x,
+ GLuint y,
+ GLuint z) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::Uniform3ui");
+ gl_->Uniform3ui(location, x, y, z);
+}
+
+void GLES2TraceImplementation::Uniform3uiv(GLint location,
+ GLsizei count,
+ const GLuint* v) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::Uniform3uiv");
+ gl_->Uniform3uiv(location, count, v);
+}
+
void GLES2TraceImplementation::Uniform4f(GLint location,
GLfloat x,
GLfloat y,
@@ -875,6 +952,22 @@
gl_->Uniform4iv(location, count, v);
}
+void GLES2TraceImplementation::Uniform4ui(GLint location,
+ GLuint x,
+ GLuint y,
+ GLuint z,
+ GLuint w) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::Uniform4ui");
+ gl_->Uniform4ui(location, x, y, z, w);
+}
+
+void GLES2TraceImplementation::Uniform4uiv(GLint location,
+ GLsizei count,
+ const GLuint* v) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::Uniform4uiv");
+ gl_->Uniform4uiv(location, count, v);
+}
+
void GLES2TraceImplementation::UniformMatrix2fv(GLint location,
GLsizei count,
GLboolean transpose,
@@ -883,6 +976,22 @@
gl_->UniformMatrix2fv(location, count, transpose, value);
}
+void GLES2TraceImplementation::UniformMatrix2x3fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::UniformMatrix2x3fv");
+ gl_->UniformMatrix2x3fv(location, count, transpose, value);
+}
+
+void GLES2TraceImplementation::UniformMatrix2x4fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::UniformMatrix2x4fv");
+ gl_->UniformMatrix2x4fv(location, count, transpose, value);
+}
+
void GLES2TraceImplementation::UniformMatrix3fv(GLint location,
GLsizei count,
GLboolean transpose,
@@ -891,6 +1000,22 @@
gl_->UniformMatrix3fv(location, count, transpose, value);
}
+void GLES2TraceImplementation::UniformMatrix3x2fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::UniformMatrix3x2fv");
+ gl_->UniformMatrix3x2fv(location, count, transpose, value);
+}
+
+void GLES2TraceImplementation::UniformMatrix3x4fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::UniformMatrix3x4fv");
+ gl_->UniformMatrix3x4fv(location, count, transpose, value);
+}
+
void GLES2TraceImplementation::UniformMatrix4fv(GLint location,
GLsizei count,
GLboolean transpose,
@@ -899,6 +1024,22 @@
gl_->UniformMatrix4fv(location, count, transpose, value);
}
+void GLES2TraceImplementation::UniformMatrix4x2fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::UniformMatrix4x2fv");
+ gl_->UniformMatrix4x2fv(location, count, transpose, value);
+}
+
+void GLES2TraceImplementation::UniformMatrix4x3fv(GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::UniformMatrix4x3fv");
+ gl_->UniformMatrix4x3fv(location, count, transpose, value);
+}
+
void GLES2TraceImplementation::UseProgram(GLuint program) {
TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::UseProgram");
gl_->UseProgram(program);
@@ -962,6 +1103,45 @@
gl_->VertexAttrib4fv(indx, values);
}
+void GLES2TraceImplementation::VertexAttribI4i(GLuint indx,
+ GLint x,
+ GLint y,
+ GLint z,
+ GLint w) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::VertexAttribI4i");
+ gl_->VertexAttribI4i(indx, x, y, z, w);
+}
+
+void GLES2TraceImplementation::VertexAttribI4iv(GLuint indx,
+ const GLint* values) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::VertexAttribI4iv");
+ gl_->VertexAttribI4iv(indx, values);
+}
+
+void GLES2TraceImplementation::VertexAttribI4ui(GLuint indx,
+ GLuint x,
+ GLuint y,
+ GLuint z,
+ GLuint w) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::VertexAttribI4ui");
+ gl_->VertexAttribI4ui(indx, x, y, z, w);
+}
+
+void GLES2TraceImplementation::VertexAttribI4uiv(GLuint indx,
+ const GLuint* values) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::VertexAttribI4uiv");
+ gl_->VertexAttribI4uiv(indx, values);
+}
+
+void GLES2TraceImplementation::VertexAttribIPointer(GLuint indx,
+ GLint size,
+ GLenum type,
+ GLsizei stride,
+ const void* ptr) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::VertexAttribIPointer");
+ gl_->VertexAttribIPointer(indx, size, type, stride, ptr);
+}
+
void GLES2TraceImplementation::VertexAttribPointer(GLuint indx,
GLint size,
GLenum type,
diff --git a/gpu/command_buffer/cmd_buffer_functions.txt b/gpu/command_buffer/cmd_buffer_functions.txt
index 0f17198..dc613b9 100644
--- a/gpu/command_buffer/cmd_buffer_functions.txt
+++ b/gpu/command_buffer/cmd_buffer_functions.txt
@@ -27,6 +27,7 @@
GL_APICALL void GL_APIENTRY glCompileShader (GLidShader shader);
GL_APICALL void GL_APIENTRY glCompressedTexImage2D (GLenumTextureTarget target, GLint level, GLenumCompressedTextureFormat internalformat, GLsizei width, GLsizei height, GLintTextureBorder border, GLsizei imageSize, const void* data);
GL_APICALL void GL_APIENTRY glCompressedTexSubImage2D (GLenumTextureTarget target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenumCompressedTextureFormat format, GLsizei imageSize, const void* data);
+GL_APICALL void GL_APIENTRY glCopyBufferSubData (GLenumBufferTarget readtarget, GLenumBufferTarget writetarget, GLintptrNotNegative readoffset, GLintptrNotNegative writeoffset, GLsizeiptr size);
GL_APICALL void GL_APIENTRY glCopyTexImage2D (GLenumTextureTarget target, GLint level, GLenumTextureInternalFormat internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLintTextureBorder border);
GL_APICALL void GL_APIENTRY glCopyTexSubImage2D (GLenumTextureTarget target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
GL_APICALL GLuint GL_APIENTRY glCreateProgram (void);
@@ -52,6 +53,7 @@
GL_APICALL void GL_APIENTRY glFlush (void);
GL_APICALL void GL_APIENTRY glFramebufferRenderbuffer (GLenumFrameBufferTarget target, GLenumAttachment attachment, GLenumRenderBufferTarget renderbuffertarget, GLidRenderbuffer renderbuffer);
GL_APICALL void GL_APIENTRY glFramebufferTexture2D (GLenumFrameBufferTarget target, GLenumAttachment attachment, GLenumTextureTarget textarget, GLidTexture texture, GLintZeroOnly level);
+GL_APICALL void GL_APIENTRY glFramebufferTextureLayer (GLenumFrameBufferTarget target, GLenumAttachment attachment, GLidTexture texture, GLint level, GLint layer);
GL_APICALL void GL_APIENTRY glFrontFace (GLenumFaceMode mode);
GL_APICALL void GL_APIENTRY glGenBuffers (GLsizeiNotNegative n, GLuint* buffers);
GL_APICALL void GL_APIENTRY glGenerateMipmap (GLenumTextureBindTarget target);
@@ -68,6 +70,7 @@
GL_APICALL void GL_APIENTRY glGetFloatv (GLenumGLState pname, GLfloat* params);
GL_APICALL void GL_APIENTRY glGetFramebufferAttachmentParameteriv (GLenumFrameBufferTarget target, GLenumAttachment attachment, GLenumFrameBufferParameter pname, GLint* params);
GL_APICALL void GL_APIENTRY glGetIntegerv (GLenumGLState pname, GLint* params);
+GL_APICALL void GL_APIENTRY glGetInternalformativ (GLenumRenderBufferTarget target, GLenumRenderBufferFormat format, GLenumRenderBufferParameter pname, GLsizei bufSize, GLint* params);
GL_APICALL void GL_APIENTRY glGetProgramiv (GLidProgram program, GLenumProgramParameter pname, GLint* params);
GL_APICALL void GL_APIENTRY glGetProgramInfoLog (GLidProgram program, GLsizeiNotNegative bufsize, GLsizeiOptional* length, char* infolog);
GL_APICALL void GL_APIENTRY glGetRenderbufferParameteriv (GLenumRenderBufferTarget target, GLenumRenderBufferParameter pname, GLint* params);
@@ -116,26 +119,41 @@
GL_APICALL void GL_APIENTRY glTexParameterfv (GLenumTextureBindTarget target, GLenumTextureParameter pname, const GLfloat* params);
GL_APICALL void GL_APIENTRY glTexParameteri (GLenumTextureBindTarget target, GLenumTextureParameter pname, GLint param);
GL_APICALL void GL_APIENTRY glTexParameteriv (GLenumTextureBindTarget target, GLenumTextureParameter pname, const GLint* params);
+GL_APICALL void GL_APIENTRY glTexStorage3D (GLenumTexture3DTarget target, GLsizei levels, GLenumTextureInternalFormatStorage internalFormat, GLsizei width, GLsizei height, GLsizei depth);
GL_APICALL void GL_APIENTRY glTexSubImage2D (GLenumTextureTarget target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenumTextureFormat format, GLenumPixelType type, const void* pixels);
GL_APICALL void GL_APIENTRY glUniform1f (GLintUniformLocation location, GLfloat x);
GL_APICALL void GL_APIENTRY glUniform1fv (GLintUniformLocation location, GLsizeiNotNegative count, const GLfloat* v);
GL_APICALL void GL_APIENTRY glUniform1i (GLintUniformLocation location, GLint x);
GL_APICALL void GL_APIENTRY glUniform1iv (GLintUniformLocation location, GLsizeiNotNegative count, const GLint* v);
+GL_APICALL void GL_APIENTRY glUniform1ui (GLintUniformLocation location, GLuint x);
+GL_APICALL void GL_APIENTRY glUniform1uiv (GLintUniformLocation location, GLsizeiNotNegative count, const GLuint* v);
GL_APICALL void GL_APIENTRY glUniform2f (GLintUniformLocation location, GLfloat x, GLfloat y);
GL_APICALL void GL_APIENTRY glUniform2fv (GLintUniformLocation location, GLsizeiNotNegative count, const GLfloat* v);
GL_APICALL void GL_APIENTRY glUniform2i (GLintUniformLocation location, GLint x, GLint y);
GL_APICALL void GL_APIENTRY glUniform2iv (GLintUniformLocation location, GLsizeiNotNegative count, const GLint* v);
+GL_APICALL void GL_APIENTRY glUniform2ui (GLintUniformLocation location, GLuint x, GLuint y);
+GL_APICALL void GL_APIENTRY glUniform2uiv (GLintUniformLocation location, GLsizeiNotNegative count, const GLuint* v);
GL_APICALL void GL_APIENTRY glUniform3f (GLintUniformLocation location, GLfloat x, GLfloat y, GLfloat z);
GL_APICALL void GL_APIENTRY glUniform3fv (GLintUniformLocation location, GLsizeiNotNegative count, const GLfloat* v);
GL_APICALL void GL_APIENTRY glUniform3i (GLintUniformLocation location, GLint x, GLint y, GLint z);
GL_APICALL void GL_APIENTRY glUniform3iv (GLintUniformLocation location, GLsizeiNotNegative count, const GLint* v);
+GL_APICALL void GL_APIENTRY glUniform3ui (GLintUniformLocation location, GLuint x, GLuint y, GLuint z);
+GL_APICALL void GL_APIENTRY glUniform3uiv (GLintUniformLocation location, GLsizeiNotNegative count, const GLuint* v);
GL_APICALL void GL_APIENTRY glUniform4f (GLintUniformLocation location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
GL_APICALL void GL_APIENTRY glUniform4fv (GLintUniformLocation location, GLsizeiNotNegative count, const GLfloat* v);
GL_APICALL void GL_APIENTRY glUniform4i (GLintUniformLocation location, GLint x, GLint y, GLint z, GLint w);
GL_APICALL void GL_APIENTRY glUniform4iv (GLintUniformLocation location, GLsizeiNotNegative count, const GLint* v);
+GL_APICALL void GL_APIENTRY glUniform4ui (GLintUniformLocation location, GLuint x, GLuint y, GLuint z, GLuint w);
+GL_APICALL void GL_APIENTRY glUniform4uiv (GLintUniformLocation location, GLsizeiNotNegative count, const GLuint* v);
GL_APICALL void GL_APIENTRY glUniformMatrix2fv (GLintUniformLocation location, GLsizeiNotNegative count, GLbooleanFalseOnly transpose, const GLfloat* value);
+GL_APICALL void GL_APIENTRY glUniformMatrix2x3fv (GLintUniformLocation location, GLsizeiNotNegative count, GLbooleanFalseOnly transpose, const GLfloat* value);
+GL_APICALL void GL_APIENTRY glUniformMatrix2x4fv (GLintUniformLocation location, GLsizeiNotNegative count, GLbooleanFalseOnly transpose, const GLfloat* value);
GL_APICALL void GL_APIENTRY glUniformMatrix3fv (GLintUniformLocation location, GLsizeiNotNegative count, GLbooleanFalseOnly transpose, const GLfloat* value);
+GL_APICALL void GL_APIENTRY glUniformMatrix3x2fv (GLintUniformLocation location, GLsizeiNotNegative count, GLbooleanFalseOnly transpose, const GLfloat* value);
+GL_APICALL void GL_APIENTRY glUniformMatrix3x4fv (GLintUniformLocation location, GLsizeiNotNegative count, GLbooleanFalseOnly transpose, const GLfloat* value);
GL_APICALL void GL_APIENTRY glUniformMatrix4fv (GLintUniformLocation location, GLsizeiNotNegative count, GLbooleanFalseOnly transpose, const GLfloat* value);
+GL_APICALL void GL_APIENTRY glUniformMatrix4x2fv (GLintUniformLocation location, GLsizeiNotNegative count, GLbooleanFalseOnly transpose, const GLfloat* value);
+GL_APICALL void GL_APIENTRY glUniformMatrix4x3fv (GLintUniformLocation location, GLsizeiNotNegative count, GLbooleanFalseOnly transpose, const GLfloat* value);
GL_APICALL void GL_APIENTRY glUseProgram (GLidZeroProgram program);
GL_APICALL void GL_APIENTRY glValidateProgram (GLidProgram program);
GL_APICALL void GL_APIENTRY glVertexAttrib1f (GLuint indx, GLfloat x);
@@ -146,6 +164,11 @@
GL_APICALL void GL_APIENTRY glVertexAttrib3fv (GLuint indx, const GLfloat* values);
GL_APICALL void GL_APIENTRY glVertexAttrib4f (GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
GL_APICALL void GL_APIENTRY glVertexAttrib4fv (GLuint indx, const GLfloat* values);
+GL_APICALL void GL_APIENTRY glVertexAttribI4i (GLuint indx, GLint x, GLint y, GLint z, GLint w);
+GL_APICALL void GL_APIENTRY glVertexAttribI4iv (GLuint indx, const GLint* values);
+GL_APICALL void GL_APIENTRY glVertexAttribI4ui (GLuint indx, GLuint x, GLuint y, GLuint z, GLuint w);
+GL_APICALL void GL_APIENTRY glVertexAttribI4uiv (GLuint indx, const GLuint* values);
+GL_APICALL void GL_APIENTRY glVertexAttribIPointer (GLuint indx, GLintVertexAttribSize size, GLenumVertexAttribType type, GLsizei stride, const void* ptr);
GL_APICALL void GL_APIENTRY glVertexAttribPointer (GLuint indx, GLintVertexAttribSize size, GLenumVertexAttribType type, GLboolean normalized, GLsizei stride, const void* ptr);
GL_APICALL void GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);
GL_APICALL void GL_APIENTRY glBlitFramebufferCHROMIUM (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenumBlitFilter filter);
diff --git a/gpu/command_buffer/common/BUILD.gn b/gpu/command_buffer/common/BUILD.gn
index ad6d320..68c3c84 100644
--- a/gpu/command_buffer/common/BUILD.gn
+++ b/gpu/command_buffer/common/BUILD.gn
@@ -28,6 +28,8 @@
"mailbox_holder.h",
"thread_local.h",
"time.h",
+ "value_state.cc",
+ "value_state.h",
]
defines = [ "GPU_IMPLEMENTATION" ]
diff --git a/gpu/command_buffer/common/capabilities.cc b/gpu/command_buffer/common/capabilities.cc
index 9d9e90d..ab33aeb 100644
--- a/gpu/command_buffer/common/capabilities.cc
+++ b/gpu/command_buffer/common/capabilities.cc
@@ -37,7 +37,8 @@
image(false),
future_sync_points(false),
blend_equation_advanced(false),
- blend_equation_advanced_coherent(false) {
+ blend_equation_advanced_coherent(false),
+ texture_rg(false) {
}
} // namespace gpu
diff --git a/gpu/command_buffer/common/capabilities.h b/gpu/command_buffer/common/capabilities.h
index 224829c..a465ca2 100644
--- a/gpu/command_buffer/common/capabilities.h
+++ b/gpu/command_buffer/common/capabilities.h
@@ -91,6 +91,7 @@
bool future_sync_points;
bool blend_equation_advanced;
bool blend_equation_advanced_coherent;
+ bool texture_rg;
};
} // namespace gpu
diff --git a/gpu/command_buffer/common/gles2_cmd_format_autogen.h b/gpu/command_buffer/common/gles2_cmd_format_autogen.h
index 14f0728..c451b98 100644
--- a/gpu/command_buffer/common/gles2_cmd_format_autogen.h
+++ b/gpu/command_buffer/common/gles2_cmd_format_autogen.h
@@ -1168,6 +1168,65 @@
COMPILE_ASSERT(offsetof(CompressedTexSubImage2D, data_shm_offset) == 40,
OffsetOf_CompressedTexSubImage2D_data_shm_offset_not_40);
+struct CopyBufferSubData {
+ typedef CopyBufferSubData ValueType;
+ static const CommandId kCmdId = kCopyBufferSubData;
+ static const cmd::ArgFlags kArgFlags = cmd::kFixed;
+ static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3);
+
+ static uint32_t ComputeSize() {
+ return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT
+ }
+
+ void SetHeader() { header.SetCmd<ValueType>(); }
+
+ void Init(GLenum _readtarget,
+ GLenum _writetarget,
+ GLintptr _readoffset,
+ GLintptr _writeoffset,
+ GLsizeiptr _size) {
+ SetHeader();
+ readtarget = _readtarget;
+ writetarget = _writetarget;
+ readoffset = _readoffset;
+ writeoffset = _writeoffset;
+ size = _size;
+ }
+
+ void* Set(void* cmd,
+ GLenum _readtarget,
+ GLenum _writetarget,
+ GLintptr _readoffset,
+ GLintptr _writeoffset,
+ GLsizeiptr _size) {
+ static_cast<ValueType*>(cmd)
+ ->Init(_readtarget, _writetarget, _readoffset, _writeoffset, _size);
+ return NextCmdAddress<ValueType>(cmd);
+ }
+
+ gpu::CommandHeader header;
+ uint32_t readtarget;
+ uint32_t writetarget;
+ int32_t readoffset;
+ int32_t writeoffset;
+ int32_t size;
+};
+
+COMPILE_ASSERT(sizeof(CopyBufferSubData) == 24,
+ Sizeof_CopyBufferSubData_is_not_24);
+COMPILE_ASSERT(offsetof(CopyBufferSubData, header) == 0,
+ OffsetOf_CopyBufferSubData_header_not_0);
+COMPILE_ASSERT(offsetof(CopyBufferSubData, readtarget) == 4,
+ OffsetOf_CopyBufferSubData_readtarget_not_4);
+COMPILE_ASSERT(offsetof(CopyBufferSubData, writetarget) == 8,
+ OffsetOf_CopyBufferSubData_writetarget_not_8);
+COMPILE_ASSERT(offsetof(CopyBufferSubData, readoffset) == 12,
+ OffsetOf_CopyBufferSubData_readoffset_not_12);
+COMPILE_ASSERT(offsetof(CopyBufferSubData, writeoffset) == 16,
+ OffsetOf_CopyBufferSubData_writeoffset_not_16);
+COMPILE_ASSERT(offsetof(CopyBufferSubData, size) == 20,
+ OffsetOf_CopyBufferSubData_size_not_20);
+
struct CopyTexImage2D {
typedef CopyTexImage2D ValueType;
static const CommandId kCmdId = kCopyTexImage2D;
@@ -2150,6 +2209,65 @@
COMPILE_ASSERT(offsetof(FramebufferTexture2D, texture) == 16,
OffsetOf_FramebufferTexture2D_texture_not_16);
+struct FramebufferTextureLayer {
+ typedef FramebufferTextureLayer ValueType;
+ static const CommandId kCmdId = kFramebufferTextureLayer;
+ static const cmd::ArgFlags kArgFlags = cmd::kFixed;
+ static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3);
+
+ static uint32_t ComputeSize() {
+ return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT
+ }
+
+ void SetHeader() { header.SetCmd<ValueType>(); }
+
+ void Init(GLenum _target,
+ GLenum _attachment,
+ GLuint _texture,
+ GLint _level,
+ GLint _layer) {
+ SetHeader();
+ target = _target;
+ attachment = _attachment;
+ texture = _texture;
+ level = _level;
+ layer = _layer;
+ }
+
+ void* Set(void* cmd,
+ GLenum _target,
+ GLenum _attachment,
+ GLuint _texture,
+ GLint _level,
+ GLint _layer) {
+ static_cast<ValueType*>(cmd)
+ ->Init(_target, _attachment, _texture, _level, _layer);
+ return NextCmdAddress<ValueType>(cmd);
+ }
+
+ gpu::CommandHeader header;
+ uint32_t target;
+ uint32_t attachment;
+ uint32_t texture;
+ int32_t level;
+ int32_t layer;
+};
+
+COMPILE_ASSERT(sizeof(FramebufferTextureLayer) == 24,
+ Sizeof_FramebufferTextureLayer_is_not_24);
+COMPILE_ASSERT(offsetof(FramebufferTextureLayer, header) == 0,
+ OffsetOf_FramebufferTextureLayer_header_not_0);
+COMPILE_ASSERT(offsetof(FramebufferTextureLayer, target) == 4,
+ OffsetOf_FramebufferTextureLayer_target_not_4);
+COMPILE_ASSERT(offsetof(FramebufferTextureLayer, attachment) == 8,
+ OffsetOf_FramebufferTextureLayer_attachment_not_8);
+COMPILE_ASSERT(offsetof(FramebufferTextureLayer, texture) == 12,
+ OffsetOf_FramebufferTextureLayer_texture_not_12);
+COMPILE_ASSERT(offsetof(FramebufferTextureLayer, level) == 16,
+ OffsetOf_FramebufferTextureLayer_level_not_16);
+COMPILE_ASSERT(offsetof(FramebufferTextureLayer, layer) == 20,
+ OffsetOf_FramebufferTextureLayer_layer_not_20);
+
struct FrontFace {
typedef FrontFace ValueType;
static const CommandId kCmdId = kFrontFace;
@@ -2930,6 +3048,73 @@
COMPILE_ASSERT(offsetof(GetIntegerv, params_shm_offset) == 12,
OffsetOf_GetIntegerv_params_shm_offset_not_12);
+struct GetInternalformativ {
+ typedef GetInternalformativ ValueType;
+ static const CommandId kCmdId = kGetInternalformativ;
+ static const cmd::ArgFlags kArgFlags = cmd::kFixed;
+ static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3);
+
+ typedef SizedResult<GLint> Result;
+
+ static uint32_t ComputeSize() {
+ return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT
+ }
+
+ void SetHeader() { header.SetCmd<ValueType>(); }
+
+ void Init(GLenum _target,
+ GLenum _format,
+ GLenum _pname,
+ GLsizei _bufSize,
+ uint32_t _params_shm_id,
+ uint32_t _params_shm_offset) {
+ SetHeader();
+ target = _target;
+ format = _format;
+ pname = _pname;
+ bufSize = _bufSize;
+ params_shm_id = _params_shm_id;
+ params_shm_offset = _params_shm_offset;
+ }
+
+ void* Set(void* cmd,
+ GLenum _target,
+ GLenum _format,
+ GLenum _pname,
+ GLsizei _bufSize,
+ uint32_t _params_shm_id,
+ uint32_t _params_shm_offset) {
+ static_cast<ValueType*>(cmd)->Init(_target, _format, _pname, _bufSize,
+ _params_shm_id, _params_shm_offset);
+ return NextCmdAddress<ValueType>(cmd);
+ }
+
+ gpu::CommandHeader header;
+ uint32_t target;
+ uint32_t format;
+ uint32_t pname;
+ int32_t bufSize;
+ uint32_t params_shm_id;
+ uint32_t params_shm_offset;
+};
+
+COMPILE_ASSERT(sizeof(GetInternalformativ) == 28,
+ Sizeof_GetInternalformativ_is_not_28);
+COMPILE_ASSERT(offsetof(GetInternalformativ, header) == 0,
+ OffsetOf_GetInternalformativ_header_not_0);
+COMPILE_ASSERT(offsetof(GetInternalformativ, target) == 4,
+ OffsetOf_GetInternalformativ_target_not_4);
+COMPILE_ASSERT(offsetof(GetInternalformativ, format) == 8,
+ OffsetOf_GetInternalformativ_format_not_8);
+COMPILE_ASSERT(offsetof(GetInternalformativ, pname) == 12,
+ OffsetOf_GetInternalformativ_pname_not_12);
+COMPILE_ASSERT(offsetof(GetInternalformativ, bufSize) == 16,
+ OffsetOf_GetInternalformativ_bufSize_not_16);
+COMPILE_ASSERT(offsetof(GetInternalformativ, params_shm_id) == 20,
+ OffsetOf_GetInternalformativ_params_shm_id_not_20);
+COMPILE_ASSERT(offsetof(GetInternalformativ, params_shm_offset) == 24,
+ OffsetOf_GetInternalformativ_params_shm_offset_not_24);
+
struct GetProgramiv {
typedef GetProgramiv ValueType;
static const CommandId kCmdId = kGetProgramiv;
@@ -5093,6 +5278,70 @@
COMPILE_ASSERT(offsetof(TexParameterivImmediate, pname) == 8,
OffsetOf_TexParameterivImmediate_pname_not_8);
+struct TexStorage3D {
+ typedef TexStorage3D ValueType;
+ static const CommandId kCmdId = kTexStorage3D;
+ static const cmd::ArgFlags kArgFlags = cmd::kFixed;
+ static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3);
+
+ static uint32_t ComputeSize() {
+ return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT
+ }
+
+ void SetHeader() { header.SetCmd<ValueType>(); }
+
+ void Init(GLenum _target,
+ GLsizei _levels,
+ GLenum _internalFormat,
+ GLsizei _width,
+ GLsizei _height,
+ GLsizei _depth) {
+ SetHeader();
+ target = _target;
+ levels = _levels;
+ internalFormat = _internalFormat;
+ width = _width;
+ height = _height;
+ depth = _depth;
+ }
+
+ void* Set(void* cmd,
+ GLenum _target,
+ GLsizei _levels,
+ GLenum _internalFormat,
+ GLsizei _width,
+ GLsizei _height,
+ GLsizei _depth) {
+ static_cast<ValueType*>(cmd)
+ ->Init(_target, _levels, _internalFormat, _width, _height, _depth);
+ return NextCmdAddress<ValueType>(cmd);
+ }
+
+ gpu::CommandHeader header;
+ uint32_t target;
+ int32_t levels;
+ uint32_t internalFormat;
+ int32_t width;
+ int32_t height;
+ int32_t depth;
+};
+
+COMPILE_ASSERT(sizeof(TexStorage3D) == 28, Sizeof_TexStorage3D_is_not_28);
+COMPILE_ASSERT(offsetof(TexStorage3D, header) == 0,
+ OffsetOf_TexStorage3D_header_not_0);
+COMPILE_ASSERT(offsetof(TexStorage3D, target) == 4,
+ OffsetOf_TexStorage3D_target_not_4);
+COMPILE_ASSERT(offsetof(TexStorage3D, levels) == 8,
+ OffsetOf_TexStorage3D_levels_not_8);
+COMPILE_ASSERT(offsetof(TexStorage3D, internalFormat) == 12,
+ OffsetOf_TexStorage3D_internalFormat_not_12);
+COMPILE_ASSERT(offsetof(TexStorage3D, width) == 16,
+ OffsetOf_TexStorage3D_width_not_16);
+COMPILE_ASSERT(offsetof(TexStorage3D, height) == 20,
+ OffsetOf_TexStorage3D_height_not_20);
+COMPILE_ASSERT(offsetof(TexStorage3D, depth) == 24,
+ OffsetOf_TexStorage3D_depth_not_24);
+
struct TexSubImage2D {
typedef TexSubImage2D ValueType;
static const CommandId kCmdId = kTexSubImage2D;
@@ -5350,6 +5599,87 @@
COMPILE_ASSERT(offsetof(Uniform1ivImmediate, count) == 8,
OffsetOf_Uniform1ivImmediate_count_not_8);
+struct Uniform1ui {
+ typedef Uniform1ui ValueType;
+ static const CommandId kCmdId = kUniform1ui;
+ static const cmd::ArgFlags kArgFlags = cmd::kFixed;
+ static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3);
+
+ static uint32_t ComputeSize() {
+ return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT
+ }
+
+ void SetHeader() { header.SetCmd<ValueType>(); }
+
+ void Init(GLint _location, GLuint _x) {
+ SetHeader();
+ location = _location;
+ x = _x;
+ }
+
+ void* Set(void* cmd, GLint _location, GLuint _x) {
+ static_cast<ValueType*>(cmd)->Init(_location, _x);
+ return NextCmdAddress<ValueType>(cmd);
+ }
+
+ gpu::CommandHeader header;
+ int32_t location;
+ uint32_t x;
+};
+
+COMPILE_ASSERT(sizeof(Uniform1ui) == 12, Sizeof_Uniform1ui_is_not_12);
+COMPILE_ASSERT(offsetof(Uniform1ui, header) == 0,
+ OffsetOf_Uniform1ui_header_not_0);
+COMPILE_ASSERT(offsetof(Uniform1ui, location) == 4,
+ OffsetOf_Uniform1ui_location_not_4);
+COMPILE_ASSERT(offsetof(Uniform1ui, x) == 8, OffsetOf_Uniform1ui_x_not_8);
+
+struct Uniform1uivImmediate {
+ typedef Uniform1uivImmediate ValueType;
+ static const CommandId kCmdId = kUniform1uivImmediate;
+ static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN;
+ static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3);
+
+ static uint32_t ComputeDataSize(GLsizei count) {
+ return static_cast<uint32_t>(sizeof(GLuint) * 1 * count); // NOLINT
+ }
+
+ static uint32_t ComputeSize(GLsizei count) {
+ return static_cast<uint32_t>(sizeof(ValueType) +
+ ComputeDataSize(count)); // NOLINT
+ }
+
+ void SetHeader(GLsizei count) {
+ header.SetCmdByTotalSize<ValueType>(ComputeSize(count));
+ }
+
+ void Init(GLint _location, GLsizei _count, const GLuint* _v) {
+ SetHeader(_count);
+ location = _location;
+ count = _count;
+ memcpy(ImmediateDataAddress(this), _v, ComputeDataSize(_count));
+ }
+
+ void* Set(void* cmd, GLint _location, GLsizei _count, const GLuint* _v) {
+ static_cast<ValueType*>(cmd)->Init(_location, _count, _v);
+ const uint32_t size = ComputeSize(_count);
+ return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size);
+ }
+
+ gpu::CommandHeader header;
+ int32_t location;
+ int32_t count;
+};
+
+COMPILE_ASSERT(sizeof(Uniform1uivImmediate) == 12,
+ Sizeof_Uniform1uivImmediate_is_not_12);
+COMPILE_ASSERT(offsetof(Uniform1uivImmediate, header) == 0,
+ OffsetOf_Uniform1uivImmediate_header_not_0);
+COMPILE_ASSERT(offsetof(Uniform1uivImmediate, location) == 4,
+ OffsetOf_Uniform1uivImmediate_location_not_4);
+COMPILE_ASSERT(offsetof(Uniform1uivImmediate, count) == 8,
+ OffsetOf_Uniform1uivImmediate_count_not_8);
+
struct Uniform2f {
typedef Uniform2f ValueType;
static const CommandId kCmdId = kUniform2f;
@@ -5518,6 +5848,90 @@
COMPILE_ASSERT(offsetof(Uniform2ivImmediate, count) == 8,
OffsetOf_Uniform2ivImmediate_count_not_8);
+struct Uniform2ui {
+ typedef Uniform2ui ValueType;
+ static const CommandId kCmdId = kUniform2ui;
+ static const cmd::ArgFlags kArgFlags = cmd::kFixed;
+ static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3);
+
+ static uint32_t ComputeSize() {
+ return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT
+ }
+
+ void SetHeader() { header.SetCmd<ValueType>(); }
+
+ void Init(GLint _location, GLuint _x, GLuint _y) {
+ SetHeader();
+ location = _location;
+ x = _x;
+ y = _y;
+ }
+
+ void* Set(void* cmd, GLint _location, GLuint _x, GLuint _y) {
+ static_cast<ValueType*>(cmd)->Init(_location, _x, _y);
+ return NextCmdAddress<ValueType>(cmd);
+ }
+
+ gpu::CommandHeader header;
+ int32_t location;
+ uint32_t x;
+ uint32_t y;
+};
+
+COMPILE_ASSERT(sizeof(Uniform2ui) == 16, Sizeof_Uniform2ui_is_not_16);
+COMPILE_ASSERT(offsetof(Uniform2ui, header) == 0,
+ OffsetOf_Uniform2ui_header_not_0);
+COMPILE_ASSERT(offsetof(Uniform2ui, location) == 4,
+ OffsetOf_Uniform2ui_location_not_4);
+COMPILE_ASSERT(offsetof(Uniform2ui, x) == 8, OffsetOf_Uniform2ui_x_not_8);
+COMPILE_ASSERT(offsetof(Uniform2ui, y) == 12, OffsetOf_Uniform2ui_y_not_12);
+
+struct Uniform2uivImmediate {
+ typedef Uniform2uivImmediate ValueType;
+ static const CommandId kCmdId = kUniform2uivImmediate;
+ static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN;
+ static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3);
+
+ static uint32_t ComputeDataSize(GLsizei count) {
+ return static_cast<uint32_t>(sizeof(GLuint) * 2 * count); // NOLINT
+ }
+
+ static uint32_t ComputeSize(GLsizei count) {
+ return static_cast<uint32_t>(sizeof(ValueType) +
+ ComputeDataSize(count)); // NOLINT
+ }
+
+ void SetHeader(GLsizei count) {
+ header.SetCmdByTotalSize<ValueType>(ComputeSize(count));
+ }
+
+ void Init(GLint _location, GLsizei _count, const GLuint* _v) {
+ SetHeader(_count);
+ location = _location;
+ count = _count;
+ memcpy(ImmediateDataAddress(this), _v, ComputeDataSize(_count));
+ }
+
+ void* Set(void* cmd, GLint _location, GLsizei _count, const GLuint* _v) {
+ static_cast<ValueType*>(cmd)->Init(_location, _count, _v);
+ const uint32_t size = ComputeSize(_count);
+ return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size);
+ }
+
+ gpu::CommandHeader header;
+ int32_t location;
+ int32_t count;
+};
+
+COMPILE_ASSERT(sizeof(Uniform2uivImmediate) == 12,
+ Sizeof_Uniform2uivImmediate_is_not_12);
+COMPILE_ASSERT(offsetof(Uniform2uivImmediate, header) == 0,
+ OffsetOf_Uniform2uivImmediate_header_not_0);
+COMPILE_ASSERT(offsetof(Uniform2uivImmediate, location) == 4,
+ OffsetOf_Uniform2uivImmediate_location_not_4);
+COMPILE_ASSERT(offsetof(Uniform2uivImmediate, count) == 8,
+ OffsetOf_Uniform2uivImmediate_count_not_8);
+
struct Uniform3f {
typedef Uniform3f ValueType;
static const CommandId kCmdId = kUniform3f;
@@ -5692,6 +6106,93 @@
COMPILE_ASSERT(offsetof(Uniform3ivImmediate, count) == 8,
OffsetOf_Uniform3ivImmediate_count_not_8);
+struct Uniform3ui {
+ typedef Uniform3ui ValueType;
+ static const CommandId kCmdId = kUniform3ui;
+ static const cmd::ArgFlags kArgFlags = cmd::kFixed;
+ static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3);
+
+ static uint32_t ComputeSize() {
+ return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT
+ }
+
+ void SetHeader() { header.SetCmd<ValueType>(); }
+
+ void Init(GLint _location, GLuint _x, GLuint _y, GLuint _z) {
+ SetHeader();
+ location = _location;
+ x = _x;
+ y = _y;
+ z = _z;
+ }
+
+ void* Set(void* cmd, GLint _location, GLuint _x, GLuint _y, GLuint _z) {
+ static_cast<ValueType*>(cmd)->Init(_location, _x, _y, _z);
+ return NextCmdAddress<ValueType>(cmd);
+ }
+
+ gpu::CommandHeader header;
+ int32_t location;
+ uint32_t x;
+ uint32_t y;
+ uint32_t z;
+};
+
+COMPILE_ASSERT(sizeof(Uniform3ui) == 20, Sizeof_Uniform3ui_is_not_20);
+COMPILE_ASSERT(offsetof(Uniform3ui, header) == 0,
+ OffsetOf_Uniform3ui_header_not_0);
+COMPILE_ASSERT(offsetof(Uniform3ui, location) == 4,
+ OffsetOf_Uniform3ui_location_not_4);
+COMPILE_ASSERT(offsetof(Uniform3ui, x) == 8, OffsetOf_Uniform3ui_x_not_8);
+COMPILE_ASSERT(offsetof(Uniform3ui, y) == 12, OffsetOf_Uniform3ui_y_not_12);
+COMPILE_ASSERT(offsetof(Uniform3ui, z) == 16, OffsetOf_Uniform3ui_z_not_16);
+
+struct Uniform3uivImmediate {
+ typedef Uniform3uivImmediate ValueType;
+ static const CommandId kCmdId = kUniform3uivImmediate;
+ static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN;
+ static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3);
+
+ static uint32_t ComputeDataSize(GLsizei count) {
+ return static_cast<uint32_t>(sizeof(GLuint) * 3 * count); // NOLINT
+ }
+
+ static uint32_t ComputeSize(GLsizei count) {
+ return static_cast<uint32_t>(sizeof(ValueType) +
+ ComputeDataSize(count)); // NOLINT
+ }
+
+ void SetHeader(GLsizei count) {
+ header.SetCmdByTotalSize<ValueType>(ComputeSize(count));
+ }
+
+ void Init(GLint _location, GLsizei _count, const GLuint* _v) {
+ SetHeader(_count);
+ location = _location;
+ count = _count;
+ memcpy(ImmediateDataAddress(this), _v, ComputeDataSize(_count));
+ }
+
+ void* Set(void* cmd, GLint _location, GLsizei _count, const GLuint* _v) {
+ static_cast<ValueType*>(cmd)->Init(_location, _count, _v);
+ const uint32_t size = ComputeSize(_count);
+ return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size);
+ }
+
+ gpu::CommandHeader header;
+ int32_t location;
+ int32_t count;
+};
+
+COMPILE_ASSERT(sizeof(Uniform3uivImmediate) == 12,
+ Sizeof_Uniform3uivImmediate_is_not_12);
+COMPILE_ASSERT(offsetof(Uniform3uivImmediate, header) == 0,
+ OffsetOf_Uniform3uivImmediate_header_not_0);
+COMPILE_ASSERT(offsetof(Uniform3uivImmediate, location) == 4,
+ OffsetOf_Uniform3uivImmediate_location_not_4);
+COMPILE_ASSERT(offsetof(Uniform3uivImmediate, count) == 8,
+ OffsetOf_Uniform3uivImmediate_count_not_8);
+
struct Uniform4f {
typedef Uniform4f ValueType;
static const CommandId kCmdId = kUniform4f;
@@ -5882,6 +6383,101 @@
COMPILE_ASSERT(offsetof(Uniform4ivImmediate, count) == 8,
OffsetOf_Uniform4ivImmediate_count_not_8);
+struct Uniform4ui {
+ typedef Uniform4ui ValueType;
+ static const CommandId kCmdId = kUniform4ui;
+ static const cmd::ArgFlags kArgFlags = cmd::kFixed;
+ static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3);
+
+ static uint32_t ComputeSize() {
+ return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT
+ }
+
+ void SetHeader() { header.SetCmd<ValueType>(); }
+
+ void Init(GLint _location, GLuint _x, GLuint _y, GLuint _z, GLuint _w) {
+ SetHeader();
+ location = _location;
+ x = _x;
+ y = _y;
+ z = _z;
+ w = _w;
+ }
+
+ void* Set(void* cmd,
+ GLint _location,
+ GLuint _x,
+ GLuint _y,
+ GLuint _z,
+ GLuint _w) {
+ static_cast<ValueType*>(cmd)->Init(_location, _x, _y, _z, _w);
+ return NextCmdAddress<ValueType>(cmd);
+ }
+
+ gpu::CommandHeader header;
+ int32_t location;
+ uint32_t x;
+ uint32_t y;
+ uint32_t z;
+ uint32_t w;
+};
+
+COMPILE_ASSERT(sizeof(Uniform4ui) == 24, Sizeof_Uniform4ui_is_not_24);
+COMPILE_ASSERT(offsetof(Uniform4ui, header) == 0,
+ OffsetOf_Uniform4ui_header_not_0);
+COMPILE_ASSERT(offsetof(Uniform4ui, location) == 4,
+ OffsetOf_Uniform4ui_location_not_4);
+COMPILE_ASSERT(offsetof(Uniform4ui, x) == 8, OffsetOf_Uniform4ui_x_not_8);
+COMPILE_ASSERT(offsetof(Uniform4ui, y) == 12, OffsetOf_Uniform4ui_y_not_12);
+COMPILE_ASSERT(offsetof(Uniform4ui, z) == 16, OffsetOf_Uniform4ui_z_not_16);
+COMPILE_ASSERT(offsetof(Uniform4ui, w) == 20, OffsetOf_Uniform4ui_w_not_20);
+
+struct Uniform4uivImmediate {
+ typedef Uniform4uivImmediate ValueType;
+ static const CommandId kCmdId = kUniform4uivImmediate;
+ static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN;
+ static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3);
+
+ static uint32_t ComputeDataSize(GLsizei count) {
+ return static_cast<uint32_t>(sizeof(GLuint) * 4 * count); // NOLINT
+ }
+
+ static uint32_t ComputeSize(GLsizei count) {
+ return static_cast<uint32_t>(sizeof(ValueType) +
+ ComputeDataSize(count)); // NOLINT
+ }
+
+ void SetHeader(GLsizei count) {
+ header.SetCmdByTotalSize<ValueType>(ComputeSize(count));
+ }
+
+ void Init(GLint _location, GLsizei _count, const GLuint* _v) {
+ SetHeader(_count);
+ location = _location;
+ count = _count;
+ memcpy(ImmediateDataAddress(this), _v, ComputeDataSize(_count));
+ }
+
+ void* Set(void* cmd, GLint _location, GLsizei _count, const GLuint* _v) {
+ static_cast<ValueType*>(cmd)->Init(_location, _count, _v);
+ const uint32_t size = ComputeSize(_count);
+ return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size);
+ }
+
+ gpu::CommandHeader header;
+ int32_t location;
+ int32_t count;
+};
+
+COMPILE_ASSERT(sizeof(Uniform4uivImmediate) == 12,
+ Sizeof_Uniform4uivImmediate_is_not_12);
+COMPILE_ASSERT(offsetof(Uniform4uivImmediate, header) == 0,
+ OffsetOf_Uniform4uivImmediate_header_not_0);
+COMPILE_ASSERT(offsetof(Uniform4uivImmediate, location) == 4,
+ OffsetOf_Uniform4uivImmediate_location_not_4);
+COMPILE_ASSERT(offsetof(Uniform4uivImmediate, count) == 8,
+ OffsetOf_Uniform4uivImmediate_count_not_8);
+
struct UniformMatrix2fvImmediate {
typedef UniformMatrix2fvImmediate ValueType;
static const CommandId kCmdId = kUniformMatrix2fvImmediate;
@@ -5929,6 +6525,100 @@
COMPILE_ASSERT(offsetof(UniformMatrix2fvImmediate, count) == 8,
OffsetOf_UniformMatrix2fvImmediate_count_not_8);
+struct UniformMatrix2x3fvImmediate {
+ typedef UniformMatrix2x3fvImmediate ValueType;
+ static const CommandId kCmdId = kUniformMatrix2x3fvImmediate;
+ static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN;
+ static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3);
+
+ static uint32_t ComputeDataSize(GLsizei count) {
+ return static_cast<uint32_t>(sizeof(GLfloat) * 6 * count); // NOLINT
+ }
+
+ static uint32_t ComputeSize(GLsizei count) {
+ return static_cast<uint32_t>(sizeof(ValueType) +
+ ComputeDataSize(count)); // NOLINT
+ }
+
+ void SetHeader(GLsizei count) {
+ header.SetCmdByTotalSize<ValueType>(ComputeSize(count));
+ }
+
+ void Init(GLint _location, GLsizei _count, const GLfloat* _value) {
+ SetHeader(_count);
+ location = _location;
+ count = _count;
+ memcpy(ImmediateDataAddress(this), _value, ComputeDataSize(_count));
+ }
+
+ void* Set(void* cmd, GLint _location, GLsizei _count, const GLfloat* _value) {
+ static_cast<ValueType*>(cmd)->Init(_location, _count, _value);
+ const uint32_t size = ComputeSize(_count);
+ return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size);
+ }
+
+ gpu::CommandHeader header;
+ int32_t location;
+ int32_t count;
+ static const uint32_t transpose = false;
+};
+
+COMPILE_ASSERT(sizeof(UniformMatrix2x3fvImmediate) == 12,
+ Sizeof_UniformMatrix2x3fvImmediate_is_not_12);
+COMPILE_ASSERT(offsetof(UniformMatrix2x3fvImmediate, header) == 0,
+ OffsetOf_UniformMatrix2x3fvImmediate_header_not_0);
+COMPILE_ASSERT(offsetof(UniformMatrix2x3fvImmediate, location) == 4,
+ OffsetOf_UniformMatrix2x3fvImmediate_location_not_4);
+COMPILE_ASSERT(offsetof(UniformMatrix2x3fvImmediate, count) == 8,
+ OffsetOf_UniformMatrix2x3fvImmediate_count_not_8);
+
+struct UniformMatrix2x4fvImmediate {
+ typedef UniformMatrix2x4fvImmediate ValueType;
+ static const CommandId kCmdId = kUniformMatrix2x4fvImmediate;
+ static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN;
+ static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3);
+
+ static uint32_t ComputeDataSize(GLsizei count) {
+ return static_cast<uint32_t>(sizeof(GLfloat) * 8 * count); // NOLINT
+ }
+
+ static uint32_t ComputeSize(GLsizei count) {
+ return static_cast<uint32_t>(sizeof(ValueType) +
+ ComputeDataSize(count)); // NOLINT
+ }
+
+ void SetHeader(GLsizei count) {
+ header.SetCmdByTotalSize<ValueType>(ComputeSize(count));
+ }
+
+ void Init(GLint _location, GLsizei _count, const GLfloat* _value) {
+ SetHeader(_count);
+ location = _location;
+ count = _count;
+ memcpy(ImmediateDataAddress(this), _value, ComputeDataSize(_count));
+ }
+
+ void* Set(void* cmd, GLint _location, GLsizei _count, const GLfloat* _value) {
+ static_cast<ValueType*>(cmd)->Init(_location, _count, _value);
+ const uint32_t size = ComputeSize(_count);
+ return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size);
+ }
+
+ gpu::CommandHeader header;
+ int32_t location;
+ int32_t count;
+ static const uint32_t transpose = false;
+};
+
+COMPILE_ASSERT(sizeof(UniformMatrix2x4fvImmediate) == 12,
+ Sizeof_UniformMatrix2x4fvImmediate_is_not_12);
+COMPILE_ASSERT(offsetof(UniformMatrix2x4fvImmediate, header) == 0,
+ OffsetOf_UniformMatrix2x4fvImmediate_header_not_0);
+COMPILE_ASSERT(offsetof(UniformMatrix2x4fvImmediate, location) == 4,
+ OffsetOf_UniformMatrix2x4fvImmediate_location_not_4);
+COMPILE_ASSERT(offsetof(UniformMatrix2x4fvImmediate, count) == 8,
+ OffsetOf_UniformMatrix2x4fvImmediate_count_not_8);
+
struct UniformMatrix3fvImmediate {
typedef UniformMatrix3fvImmediate ValueType;
static const CommandId kCmdId = kUniformMatrix3fvImmediate;
@@ -5976,6 +6666,100 @@
COMPILE_ASSERT(offsetof(UniformMatrix3fvImmediate, count) == 8,
OffsetOf_UniformMatrix3fvImmediate_count_not_8);
+struct UniformMatrix3x2fvImmediate {
+ typedef UniformMatrix3x2fvImmediate ValueType;
+ static const CommandId kCmdId = kUniformMatrix3x2fvImmediate;
+ static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN;
+ static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3);
+
+ static uint32_t ComputeDataSize(GLsizei count) {
+ return static_cast<uint32_t>(sizeof(GLfloat) * 6 * count); // NOLINT
+ }
+
+ static uint32_t ComputeSize(GLsizei count) {
+ return static_cast<uint32_t>(sizeof(ValueType) +
+ ComputeDataSize(count)); // NOLINT
+ }
+
+ void SetHeader(GLsizei count) {
+ header.SetCmdByTotalSize<ValueType>(ComputeSize(count));
+ }
+
+ void Init(GLint _location, GLsizei _count, const GLfloat* _value) {
+ SetHeader(_count);
+ location = _location;
+ count = _count;
+ memcpy(ImmediateDataAddress(this), _value, ComputeDataSize(_count));
+ }
+
+ void* Set(void* cmd, GLint _location, GLsizei _count, const GLfloat* _value) {
+ static_cast<ValueType*>(cmd)->Init(_location, _count, _value);
+ const uint32_t size = ComputeSize(_count);
+ return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size);
+ }
+
+ gpu::CommandHeader header;
+ int32_t location;
+ int32_t count;
+ static const uint32_t transpose = false;
+};
+
+COMPILE_ASSERT(sizeof(UniformMatrix3x2fvImmediate) == 12,
+ Sizeof_UniformMatrix3x2fvImmediate_is_not_12);
+COMPILE_ASSERT(offsetof(UniformMatrix3x2fvImmediate, header) == 0,
+ OffsetOf_UniformMatrix3x2fvImmediate_header_not_0);
+COMPILE_ASSERT(offsetof(UniformMatrix3x2fvImmediate, location) == 4,
+ OffsetOf_UniformMatrix3x2fvImmediate_location_not_4);
+COMPILE_ASSERT(offsetof(UniformMatrix3x2fvImmediate, count) == 8,
+ OffsetOf_UniformMatrix3x2fvImmediate_count_not_8);
+
+struct UniformMatrix3x4fvImmediate {
+ typedef UniformMatrix3x4fvImmediate ValueType;
+ static const CommandId kCmdId = kUniformMatrix3x4fvImmediate;
+ static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN;
+ static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3);
+
+ static uint32_t ComputeDataSize(GLsizei count) {
+ return static_cast<uint32_t>(sizeof(GLfloat) * 12 * count); // NOLINT
+ }
+
+ static uint32_t ComputeSize(GLsizei count) {
+ return static_cast<uint32_t>(sizeof(ValueType) +
+ ComputeDataSize(count)); // NOLINT
+ }
+
+ void SetHeader(GLsizei count) {
+ header.SetCmdByTotalSize<ValueType>(ComputeSize(count));
+ }
+
+ void Init(GLint _location, GLsizei _count, const GLfloat* _value) {
+ SetHeader(_count);
+ location = _location;
+ count = _count;
+ memcpy(ImmediateDataAddress(this), _value, ComputeDataSize(_count));
+ }
+
+ void* Set(void* cmd, GLint _location, GLsizei _count, const GLfloat* _value) {
+ static_cast<ValueType*>(cmd)->Init(_location, _count, _value);
+ const uint32_t size = ComputeSize(_count);
+ return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size);
+ }
+
+ gpu::CommandHeader header;
+ int32_t location;
+ int32_t count;
+ static const uint32_t transpose = false;
+};
+
+COMPILE_ASSERT(sizeof(UniformMatrix3x4fvImmediate) == 12,
+ Sizeof_UniformMatrix3x4fvImmediate_is_not_12);
+COMPILE_ASSERT(offsetof(UniformMatrix3x4fvImmediate, header) == 0,
+ OffsetOf_UniformMatrix3x4fvImmediate_header_not_0);
+COMPILE_ASSERT(offsetof(UniformMatrix3x4fvImmediate, location) == 4,
+ OffsetOf_UniformMatrix3x4fvImmediate_location_not_4);
+COMPILE_ASSERT(offsetof(UniformMatrix3x4fvImmediate, count) == 8,
+ OffsetOf_UniformMatrix3x4fvImmediate_count_not_8);
+
struct UniformMatrix4fvImmediate {
typedef UniformMatrix4fvImmediate ValueType;
static const CommandId kCmdId = kUniformMatrix4fvImmediate;
@@ -6023,6 +6807,100 @@
COMPILE_ASSERT(offsetof(UniformMatrix4fvImmediate, count) == 8,
OffsetOf_UniformMatrix4fvImmediate_count_not_8);
+struct UniformMatrix4x2fvImmediate {
+ typedef UniformMatrix4x2fvImmediate ValueType;
+ static const CommandId kCmdId = kUniformMatrix4x2fvImmediate;
+ static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN;
+ static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3);
+
+ static uint32_t ComputeDataSize(GLsizei count) {
+ return static_cast<uint32_t>(sizeof(GLfloat) * 8 * count); // NOLINT
+ }
+
+ static uint32_t ComputeSize(GLsizei count) {
+ return static_cast<uint32_t>(sizeof(ValueType) +
+ ComputeDataSize(count)); // NOLINT
+ }
+
+ void SetHeader(GLsizei count) {
+ header.SetCmdByTotalSize<ValueType>(ComputeSize(count));
+ }
+
+ void Init(GLint _location, GLsizei _count, const GLfloat* _value) {
+ SetHeader(_count);
+ location = _location;
+ count = _count;
+ memcpy(ImmediateDataAddress(this), _value, ComputeDataSize(_count));
+ }
+
+ void* Set(void* cmd, GLint _location, GLsizei _count, const GLfloat* _value) {
+ static_cast<ValueType*>(cmd)->Init(_location, _count, _value);
+ const uint32_t size = ComputeSize(_count);
+ return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size);
+ }
+
+ gpu::CommandHeader header;
+ int32_t location;
+ int32_t count;
+ static const uint32_t transpose = false;
+};
+
+COMPILE_ASSERT(sizeof(UniformMatrix4x2fvImmediate) == 12,
+ Sizeof_UniformMatrix4x2fvImmediate_is_not_12);
+COMPILE_ASSERT(offsetof(UniformMatrix4x2fvImmediate, header) == 0,
+ OffsetOf_UniformMatrix4x2fvImmediate_header_not_0);
+COMPILE_ASSERT(offsetof(UniformMatrix4x2fvImmediate, location) == 4,
+ OffsetOf_UniformMatrix4x2fvImmediate_location_not_4);
+COMPILE_ASSERT(offsetof(UniformMatrix4x2fvImmediate, count) == 8,
+ OffsetOf_UniformMatrix4x2fvImmediate_count_not_8);
+
+struct UniformMatrix4x3fvImmediate {
+ typedef UniformMatrix4x3fvImmediate ValueType;
+ static const CommandId kCmdId = kUniformMatrix4x3fvImmediate;
+ static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN;
+ static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3);
+
+ static uint32_t ComputeDataSize(GLsizei count) {
+ return static_cast<uint32_t>(sizeof(GLfloat) * 12 * count); // NOLINT
+ }
+
+ static uint32_t ComputeSize(GLsizei count) {
+ return static_cast<uint32_t>(sizeof(ValueType) +
+ ComputeDataSize(count)); // NOLINT
+ }
+
+ void SetHeader(GLsizei count) {
+ header.SetCmdByTotalSize<ValueType>(ComputeSize(count));
+ }
+
+ void Init(GLint _location, GLsizei _count, const GLfloat* _value) {
+ SetHeader(_count);
+ location = _location;
+ count = _count;
+ memcpy(ImmediateDataAddress(this), _value, ComputeDataSize(_count));
+ }
+
+ void* Set(void* cmd, GLint _location, GLsizei _count, const GLfloat* _value) {
+ static_cast<ValueType*>(cmd)->Init(_location, _count, _value);
+ const uint32_t size = ComputeSize(_count);
+ return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size);
+ }
+
+ gpu::CommandHeader header;
+ int32_t location;
+ int32_t count;
+ static const uint32_t transpose = false;
+};
+
+COMPILE_ASSERT(sizeof(UniformMatrix4x3fvImmediate) == 12,
+ Sizeof_UniformMatrix4x3fvImmediate_is_not_12);
+COMPILE_ASSERT(offsetof(UniformMatrix4x3fvImmediate, header) == 0,
+ OffsetOf_UniformMatrix4x3fvImmediate_header_not_0);
+COMPILE_ASSERT(offsetof(UniformMatrix4x3fvImmediate, location) == 4,
+ OffsetOf_UniformMatrix4x3fvImmediate_location_not_4);
+COMPILE_ASSERT(offsetof(UniformMatrix4x3fvImmediate, count) == 8,
+ OffsetOf_UniformMatrix4x3fvImmediate_count_not_8);
+
struct UseProgram {
typedef UseProgram ValueType;
static const CommandId kCmdId = kUseProgram;
@@ -6420,6 +7298,246 @@
COMPILE_ASSERT(offsetof(VertexAttrib4fvImmediate, indx) == 4,
OffsetOf_VertexAttrib4fvImmediate_indx_not_4);
+struct VertexAttribI4i {
+ typedef VertexAttribI4i ValueType;
+ static const CommandId kCmdId = kVertexAttribI4i;
+ static const cmd::ArgFlags kArgFlags = cmd::kFixed;
+ static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3);
+
+ static uint32_t ComputeSize() {
+ return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT
+ }
+
+ void SetHeader() { header.SetCmd<ValueType>(); }
+
+ void Init(GLuint _indx, GLint _x, GLint _y, GLint _z, GLint _w) {
+ SetHeader();
+ indx = _indx;
+ x = _x;
+ y = _y;
+ z = _z;
+ w = _w;
+ }
+
+ void* Set(void* cmd, GLuint _indx, GLint _x, GLint _y, GLint _z, GLint _w) {
+ static_cast<ValueType*>(cmd)->Init(_indx, _x, _y, _z, _w);
+ return NextCmdAddress<ValueType>(cmd);
+ }
+
+ gpu::CommandHeader header;
+ uint32_t indx;
+ int32_t x;
+ int32_t y;
+ int32_t z;
+ int32_t w;
+};
+
+COMPILE_ASSERT(sizeof(VertexAttribI4i) == 24, Sizeof_VertexAttribI4i_is_not_24);
+COMPILE_ASSERT(offsetof(VertexAttribI4i, header) == 0,
+ OffsetOf_VertexAttribI4i_header_not_0);
+COMPILE_ASSERT(offsetof(VertexAttribI4i, indx) == 4,
+ OffsetOf_VertexAttribI4i_indx_not_4);
+COMPILE_ASSERT(offsetof(VertexAttribI4i, x) == 8,
+ OffsetOf_VertexAttribI4i_x_not_8);
+COMPILE_ASSERT(offsetof(VertexAttribI4i, y) == 12,
+ OffsetOf_VertexAttribI4i_y_not_12);
+COMPILE_ASSERT(offsetof(VertexAttribI4i, z) == 16,
+ OffsetOf_VertexAttribI4i_z_not_16);
+COMPILE_ASSERT(offsetof(VertexAttribI4i, w) == 20,
+ OffsetOf_VertexAttribI4i_w_not_20);
+
+struct VertexAttribI4ivImmediate {
+ typedef VertexAttribI4ivImmediate ValueType;
+ static const CommandId kCmdId = kVertexAttribI4ivImmediate;
+ static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN;
+ static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3);
+
+ static uint32_t ComputeDataSize() {
+ return static_cast<uint32_t>(sizeof(GLint) * 4); // NOLINT
+ }
+
+ static uint32_t ComputeSize() {
+ return static_cast<uint32_t>(sizeof(ValueType) +
+ ComputeDataSize()); // NOLINT
+ }
+
+ void SetHeader() { header.SetCmdByTotalSize<ValueType>(ComputeSize()); }
+
+ void Init(GLuint _indx, const GLint* _values) {
+ SetHeader();
+ indx = _indx;
+ memcpy(ImmediateDataAddress(this), _values, ComputeDataSize());
+ }
+
+ void* Set(void* cmd, GLuint _indx, const GLint* _values) {
+ static_cast<ValueType*>(cmd)->Init(_indx, _values);
+ const uint32_t size = ComputeSize();
+ return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size);
+ }
+
+ gpu::CommandHeader header;
+ uint32_t indx;
+};
+
+COMPILE_ASSERT(sizeof(VertexAttribI4ivImmediate) == 8,
+ Sizeof_VertexAttribI4ivImmediate_is_not_8);
+COMPILE_ASSERT(offsetof(VertexAttribI4ivImmediate, header) == 0,
+ OffsetOf_VertexAttribI4ivImmediate_header_not_0);
+COMPILE_ASSERT(offsetof(VertexAttribI4ivImmediate, indx) == 4,
+ OffsetOf_VertexAttribI4ivImmediate_indx_not_4);
+
+struct VertexAttribI4ui {
+ typedef VertexAttribI4ui ValueType;
+ static const CommandId kCmdId = kVertexAttribI4ui;
+ static const cmd::ArgFlags kArgFlags = cmd::kFixed;
+ static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3);
+
+ static uint32_t ComputeSize() {
+ return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT
+ }
+
+ void SetHeader() { header.SetCmd<ValueType>(); }
+
+ void Init(GLuint _indx, GLuint _x, GLuint _y, GLuint _z, GLuint _w) {
+ SetHeader();
+ indx = _indx;
+ x = _x;
+ y = _y;
+ z = _z;
+ w = _w;
+ }
+
+ void* Set(void* cmd,
+ GLuint _indx,
+ GLuint _x,
+ GLuint _y,
+ GLuint _z,
+ GLuint _w) {
+ static_cast<ValueType*>(cmd)->Init(_indx, _x, _y, _z, _w);
+ return NextCmdAddress<ValueType>(cmd);
+ }
+
+ gpu::CommandHeader header;
+ uint32_t indx;
+ uint32_t x;
+ uint32_t y;
+ uint32_t z;
+ uint32_t w;
+};
+
+COMPILE_ASSERT(sizeof(VertexAttribI4ui) == 24,
+ Sizeof_VertexAttribI4ui_is_not_24);
+COMPILE_ASSERT(offsetof(VertexAttribI4ui, header) == 0,
+ OffsetOf_VertexAttribI4ui_header_not_0);
+COMPILE_ASSERT(offsetof(VertexAttribI4ui, indx) == 4,
+ OffsetOf_VertexAttribI4ui_indx_not_4);
+COMPILE_ASSERT(offsetof(VertexAttribI4ui, x) == 8,
+ OffsetOf_VertexAttribI4ui_x_not_8);
+COMPILE_ASSERT(offsetof(VertexAttribI4ui, y) == 12,
+ OffsetOf_VertexAttribI4ui_y_not_12);
+COMPILE_ASSERT(offsetof(VertexAttribI4ui, z) == 16,
+ OffsetOf_VertexAttribI4ui_z_not_16);
+COMPILE_ASSERT(offsetof(VertexAttribI4ui, w) == 20,
+ OffsetOf_VertexAttribI4ui_w_not_20);
+
+struct VertexAttribI4uivImmediate {
+ typedef VertexAttribI4uivImmediate ValueType;
+ static const CommandId kCmdId = kVertexAttribI4uivImmediate;
+ static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN;
+ static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3);
+
+ static uint32_t ComputeDataSize() {
+ return static_cast<uint32_t>(sizeof(GLuint) * 4); // NOLINT
+ }
+
+ static uint32_t ComputeSize() {
+ return static_cast<uint32_t>(sizeof(ValueType) +
+ ComputeDataSize()); // NOLINT
+ }
+
+ void SetHeader() { header.SetCmdByTotalSize<ValueType>(ComputeSize()); }
+
+ void Init(GLuint _indx, const GLuint* _values) {
+ SetHeader();
+ indx = _indx;
+ memcpy(ImmediateDataAddress(this), _values, ComputeDataSize());
+ }
+
+ void* Set(void* cmd, GLuint _indx, const GLuint* _values) {
+ static_cast<ValueType*>(cmd)->Init(_indx, _values);
+ const uint32_t size = ComputeSize();
+ return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size);
+ }
+
+ gpu::CommandHeader header;
+ uint32_t indx;
+};
+
+COMPILE_ASSERT(sizeof(VertexAttribI4uivImmediate) == 8,
+ Sizeof_VertexAttribI4uivImmediate_is_not_8);
+COMPILE_ASSERT(offsetof(VertexAttribI4uivImmediate, header) == 0,
+ OffsetOf_VertexAttribI4uivImmediate_header_not_0);
+COMPILE_ASSERT(offsetof(VertexAttribI4uivImmediate, indx) == 4,
+ OffsetOf_VertexAttribI4uivImmediate_indx_not_4);
+
+struct VertexAttribIPointer {
+ typedef VertexAttribIPointer ValueType;
+ static const CommandId kCmdId = kVertexAttribIPointer;
+ static const cmd::ArgFlags kArgFlags = cmd::kFixed;
+ static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3);
+
+ static uint32_t ComputeSize() {
+ return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT
+ }
+
+ void SetHeader() { header.SetCmd<ValueType>(); }
+
+ void Init(GLuint _indx,
+ GLint _size,
+ GLenum _type,
+ GLsizei _stride,
+ GLuint _offset) {
+ SetHeader();
+ indx = _indx;
+ size = _size;
+ type = _type;
+ stride = _stride;
+ offset = _offset;
+ }
+
+ void* Set(void* cmd,
+ GLuint _indx,
+ GLint _size,
+ GLenum _type,
+ GLsizei _stride,
+ GLuint _offset) {
+ static_cast<ValueType*>(cmd)->Init(_indx, _size, _type, _stride, _offset);
+ return NextCmdAddress<ValueType>(cmd);
+ }
+
+ gpu::CommandHeader header;
+ uint32_t indx;
+ int32_t size;
+ uint32_t type;
+ int32_t stride;
+ uint32_t offset;
+};
+
+COMPILE_ASSERT(sizeof(VertexAttribIPointer) == 24,
+ Sizeof_VertexAttribIPointer_is_not_24);
+COMPILE_ASSERT(offsetof(VertexAttribIPointer, header) == 0,
+ OffsetOf_VertexAttribIPointer_header_not_0);
+COMPILE_ASSERT(offsetof(VertexAttribIPointer, indx) == 4,
+ OffsetOf_VertexAttribIPointer_indx_not_4);
+COMPILE_ASSERT(offsetof(VertexAttribIPointer, size) == 8,
+ OffsetOf_VertexAttribIPointer_size_not_8);
+COMPILE_ASSERT(offsetof(VertexAttribIPointer, type) == 12,
+ OffsetOf_VertexAttribIPointer_type_not_12);
+COMPILE_ASSERT(offsetof(VertexAttribIPointer, stride) == 16,
+ OffsetOf_VertexAttribIPointer_stride_not_16);
+COMPILE_ASSERT(offsetof(VertexAttribIPointer, offset) == 20,
+ OffsetOf_VertexAttribIPointer_offset_not_20);
+
struct VertexAttribPointer {
typedef VertexAttribPointer ValueType;
static const CommandId kCmdId = kVertexAttribPointer;
diff --git a/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h b/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h
index d1470d4..acc5e77 100644
--- a/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h
+++ b/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h
@@ -366,6 +366,23 @@
CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd));
}
+TEST_F(GLES2FormatTest, CopyBufferSubData) {
+ cmds::CopyBufferSubData& cmd = *GetBufferAs<cmds::CopyBufferSubData>();
+ void* next_cmd =
+ cmd.Set(&cmd, static_cast<GLenum>(11), static_cast<GLenum>(12),
+ static_cast<GLintptr>(13), static_cast<GLintptr>(14),
+ static_cast<GLsizeiptr>(15));
+ EXPECT_EQ(static_cast<uint32_t>(cmds::CopyBufferSubData::kCmdId),
+ cmd.header.command);
+ EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u);
+ EXPECT_EQ(static_cast<GLenum>(11), cmd.readtarget);
+ EXPECT_EQ(static_cast<GLenum>(12), cmd.writetarget);
+ EXPECT_EQ(static_cast<GLintptr>(13), cmd.readoffset);
+ EXPECT_EQ(static_cast<GLintptr>(14), cmd.writeoffset);
+ EXPECT_EQ(static_cast<GLsizeiptr>(15), cmd.size);
+ CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd));
+}
+
TEST_F(GLES2FormatTest, CopyTexImage2D) {
cmds::CopyTexImage2D& cmd = *GetBufferAs<cmds::CopyTexImage2D>();
void* next_cmd = cmd.Set(&cmd, static_cast<GLenum>(11),
@@ -686,6 +703,23 @@
CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd));
}
+TEST_F(GLES2FormatTest, FramebufferTextureLayer) {
+ cmds::FramebufferTextureLayer& cmd =
+ *GetBufferAs<cmds::FramebufferTextureLayer>();
+ void* next_cmd = cmd.Set(&cmd, static_cast<GLenum>(11),
+ static_cast<GLenum>(12), static_cast<GLuint>(13),
+ static_cast<GLint>(14), static_cast<GLint>(15));
+ EXPECT_EQ(static_cast<uint32_t>(cmds::FramebufferTextureLayer::kCmdId),
+ cmd.header.command);
+ EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u);
+ EXPECT_EQ(static_cast<GLenum>(11), cmd.target);
+ EXPECT_EQ(static_cast<GLenum>(12), cmd.attachment);
+ EXPECT_EQ(static_cast<GLuint>(13), cmd.texture);
+ EXPECT_EQ(static_cast<GLint>(14), cmd.level);
+ EXPECT_EQ(static_cast<GLint>(15), cmd.layer);
+ CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd));
+}
+
TEST_F(GLES2FormatTest, FrontFace) {
cmds::FrontFace& cmd = *GetBufferAs<cmds::FrontFace>();
void* next_cmd = cmd.Set(&cmd, static_cast<GLenum>(11));
@@ -925,6 +959,24 @@
CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd));
}
+TEST_F(GLES2FormatTest, GetInternalformativ) {
+ cmds::GetInternalformativ& cmd = *GetBufferAs<cmds::GetInternalformativ>();
+ void* next_cmd =
+ cmd.Set(&cmd, static_cast<GLenum>(11), static_cast<GLenum>(12),
+ static_cast<GLenum>(13), static_cast<GLsizei>(14),
+ static_cast<uint32_t>(15), static_cast<uint32_t>(16));
+ EXPECT_EQ(static_cast<uint32_t>(cmds::GetInternalformativ::kCmdId),
+ cmd.header.command);
+ EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u);
+ EXPECT_EQ(static_cast<GLenum>(11), cmd.target);
+ EXPECT_EQ(static_cast<GLenum>(12), cmd.format);
+ EXPECT_EQ(static_cast<GLenum>(13), cmd.pname);
+ EXPECT_EQ(static_cast<GLsizei>(14), cmd.bufSize);
+ EXPECT_EQ(static_cast<uint32_t>(15), cmd.params_shm_id);
+ EXPECT_EQ(static_cast<uint32_t>(16), cmd.params_shm_offset);
+ CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd));
+}
+
TEST_F(GLES2FormatTest, GetProgramiv) {
cmds::GetProgramiv& cmd = *GetBufferAs<cmds::GetProgramiv>();
void* next_cmd =
@@ -1574,6 +1626,24 @@
// TODO(gman): Check that data was inserted;
}
+TEST_F(GLES2FormatTest, TexStorage3D) {
+ cmds::TexStorage3D& cmd = *GetBufferAs<cmds::TexStorage3D>();
+ void* next_cmd =
+ cmd.Set(&cmd, static_cast<GLenum>(11), static_cast<GLsizei>(12),
+ static_cast<GLenum>(13), static_cast<GLsizei>(14),
+ static_cast<GLsizei>(15), static_cast<GLsizei>(16));
+ EXPECT_EQ(static_cast<uint32_t>(cmds::TexStorage3D::kCmdId),
+ cmd.header.command);
+ EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u);
+ EXPECT_EQ(static_cast<GLenum>(11), cmd.target);
+ EXPECT_EQ(static_cast<GLsizei>(12), cmd.levels);
+ EXPECT_EQ(static_cast<GLenum>(13), cmd.internalFormat);
+ EXPECT_EQ(static_cast<GLsizei>(14), cmd.width);
+ EXPECT_EQ(static_cast<GLsizei>(15), cmd.height);
+ EXPECT_EQ(static_cast<GLsizei>(16), cmd.depth);
+ CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd));
+}
+
TEST_F(GLES2FormatTest, TexSubImage2D) {
cmds::TexSubImage2D& cmd = *GetBufferAs<cmds::TexSubImage2D>();
void* next_cmd = cmd.Set(
@@ -1665,6 +1735,40 @@
// TODO(gman): Check that data was inserted;
}
+TEST_F(GLES2FormatTest, Uniform1ui) {
+ cmds::Uniform1ui& cmd = *GetBufferAs<cmds::Uniform1ui>();
+ void* next_cmd =
+ cmd.Set(&cmd, static_cast<GLint>(11), static_cast<GLuint>(12));
+ EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform1ui::kCmdId),
+ cmd.header.command);
+ EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u);
+ EXPECT_EQ(static_cast<GLint>(11), cmd.location);
+ EXPECT_EQ(static_cast<GLuint>(12), cmd.x);
+ CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd));
+}
+
+TEST_F(GLES2FormatTest, Uniform1uivImmediate) {
+ const int kSomeBaseValueToTestWith = 51;
+ static GLuint data[] = {
+ static_cast<GLuint>(kSomeBaseValueToTestWith + 0),
+ static_cast<GLuint>(kSomeBaseValueToTestWith + 1),
+ };
+ cmds::Uniform1uivImmediate& cmd = *GetBufferAs<cmds::Uniform1uivImmediate>();
+ const GLsizei kNumElements = 2;
+ const size_t kExpectedCmdSize =
+ sizeof(cmd) + kNumElements * sizeof(GLuint) * 1;
+ void* next_cmd =
+ cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), data);
+ EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform1uivImmediate::kCmdId),
+ cmd.header.command);
+ EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
+ EXPECT_EQ(static_cast<GLint>(1), cmd.location);
+ EXPECT_EQ(static_cast<GLsizei>(2), cmd.count);
+ CheckBytesWrittenMatchesExpectedSize(
+ next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+ // TODO(gman): Check that data was inserted;
+}
+
TEST_F(GLES2FormatTest, Uniform2f) {
cmds::Uniform2f& cmd = *GetBufferAs<cmds::Uniform2f>();
void* next_cmd = cmd.Set(&cmd, static_cast<GLint>(11),
@@ -1737,6 +1841,43 @@
// TODO(gman): Check that data was inserted;
}
+TEST_F(GLES2FormatTest, Uniform2ui) {
+ cmds::Uniform2ui& cmd = *GetBufferAs<cmds::Uniform2ui>();
+ void* next_cmd = cmd.Set(&cmd, static_cast<GLint>(11),
+ static_cast<GLuint>(12), static_cast<GLuint>(13));
+ EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform2ui::kCmdId),
+ cmd.header.command);
+ EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u);
+ EXPECT_EQ(static_cast<GLint>(11), cmd.location);
+ EXPECT_EQ(static_cast<GLuint>(12), cmd.x);
+ EXPECT_EQ(static_cast<GLuint>(13), cmd.y);
+ CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd));
+}
+
+TEST_F(GLES2FormatTest, Uniform2uivImmediate) {
+ const int kSomeBaseValueToTestWith = 51;
+ static GLuint data[] = {
+ static_cast<GLuint>(kSomeBaseValueToTestWith + 0),
+ static_cast<GLuint>(kSomeBaseValueToTestWith + 1),
+ static_cast<GLuint>(kSomeBaseValueToTestWith + 2),
+ static_cast<GLuint>(kSomeBaseValueToTestWith + 3),
+ };
+ cmds::Uniform2uivImmediate& cmd = *GetBufferAs<cmds::Uniform2uivImmediate>();
+ const GLsizei kNumElements = 2;
+ const size_t kExpectedCmdSize =
+ sizeof(cmd) + kNumElements * sizeof(GLuint) * 2;
+ void* next_cmd =
+ cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), data);
+ EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform2uivImmediate::kCmdId),
+ cmd.header.command);
+ EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
+ EXPECT_EQ(static_cast<GLint>(1), cmd.location);
+ EXPECT_EQ(static_cast<GLsizei>(2), cmd.count);
+ CheckBytesWrittenMatchesExpectedSize(
+ next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+ // TODO(gman): Check that data was inserted;
+}
+
TEST_F(GLES2FormatTest, Uniform3f) {
cmds::Uniform3f& cmd = *GetBufferAs<cmds::Uniform3f>();
void* next_cmd =
@@ -1816,6 +1957,47 @@
// TODO(gman): Check that data was inserted;
}
+TEST_F(GLES2FormatTest, Uniform3ui) {
+ cmds::Uniform3ui& cmd = *GetBufferAs<cmds::Uniform3ui>();
+ void* next_cmd =
+ cmd.Set(&cmd, static_cast<GLint>(11), static_cast<GLuint>(12),
+ static_cast<GLuint>(13), static_cast<GLuint>(14));
+ EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform3ui::kCmdId),
+ cmd.header.command);
+ EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u);
+ EXPECT_EQ(static_cast<GLint>(11), cmd.location);
+ EXPECT_EQ(static_cast<GLuint>(12), cmd.x);
+ EXPECT_EQ(static_cast<GLuint>(13), cmd.y);
+ EXPECT_EQ(static_cast<GLuint>(14), cmd.z);
+ CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd));
+}
+
+TEST_F(GLES2FormatTest, Uniform3uivImmediate) {
+ const int kSomeBaseValueToTestWith = 51;
+ static GLuint data[] = {
+ static_cast<GLuint>(kSomeBaseValueToTestWith + 0),
+ static_cast<GLuint>(kSomeBaseValueToTestWith + 1),
+ static_cast<GLuint>(kSomeBaseValueToTestWith + 2),
+ static_cast<GLuint>(kSomeBaseValueToTestWith + 3),
+ static_cast<GLuint>(kSomeBaseValueToTestWith + 4),
+ static_cast<GLuint>(kSomeBaseValueToTestWith + 5),
+ };
+ cmds::Uniform3uivImmediate& cmd = *GetBufferAs<cmds::Uniform3uivImmediate>();
+ const GLsizei kNumElements = 2;
+ const size_t kExpectedCmdSize =
+ sizeof(cmd) + kNumElements * sizeof(GLuint) * 3;
+ void* next_cmd =
+ cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), data);
+ EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform3uivImmediate::kCmdId),
+ cmd.header.command);
+ EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
+ EXPECT_EQ(static_cast<GLint>(1), cmd.location);
+ EXPECT_EQ(static_cast<GLsizei>(2), cmd.count);
+ CheckBytesWrittenMatchesExpectedSize(
+ next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+ // TODO(gman): Check that data was inserted;
+}
+
TEST_F(GLES2FormatTest, Uniform4f) {
cmds::Uniform4f& cmd = *GetBufferAs<cmds::Uniform4f>();
void* next_cmd = cmd.Set(&cmd, static_cast<GLint>(11),
@@ -1902,6 +2084,50 @@
// TODO(gman): Check that data was inserted;
}
+TEST_F(GLES2FormatTest, Uniform4ui) {
+ cmds::Uniform4ui& cmd = *GetBufferAs<cmds::Uniform4ui>();
+ void* next_cmd = cmd.Set(&cmd, static_cast<GLint>(11),
+ static_cast<GLuint>(12), static_cast<GLuint>(13),
+ static_cast<GLuint>(14), static_cast<GLuint>(15));
+ EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform4ui::kCmdId),
+ cmd.header.command);
+ EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u);
+ EXPECT_EQ(static_cast<GLint>(11), cmd.location);
+ EXPECT_EQ(static_cast<GLuint>(12), cmd.x);
+ EXPECT_EQ(static_cast<GLuint>(13), cmd.y);
+ EXPECT_EQ(static_cast<GLuint>(14), cmd.z);
+ EXPECT_EQ(static_cast<GLuint>(15), cmd.w);
+ CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd));
+}
+
+TEST_F(GLES2FormatTest, Uniform4uivImmediate) {
+ const int kSomeBaseValueToTestWith = 51;
+ static GLuint data[] = {
+ static_cast<GLuint>(kSomeBaseValueToTestWith + 0),
+ static_cast<GLuint>(kSomeBaseValueToTestWith + 1),
+ static_cast<GLuint>(kSomeBaseValueToTestWith + 2),
+ static_cast<GLuint>(kSomeBaseValueToTestWith + 3),
+ static_cast<GLuint>(kSomeBaseValueToTestWith + 4),
+ static_cast<GLuint>(kSomeBaseValueToTestWith + 5),
+ static_cast<GLuint>(kSomeBaseValueToTestWith + 6),
+ static_cast<GLuint>(kSomeBaseValueToTestWith + 7),
+ };
+ cmds::Uniform4uivImmediate& cmd = *GetBufferAs<cmds::Uniform4uivImmediate>();
+ const GLsizei kNumElements = 2;
+ const size_t kExpectedCmdSize =
+ sizeof(cmd) + kNumElements * sizeof(GLuint) * 4;
+ void* next_cmd =
+ cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), data);
+ EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform4uivImmediate::kCmdId),
+ cmd.header.command);
+ EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
+ EXPECT_EQ(static_cast<GLint>(1), cmd.location);
+ EXPECT_EQ(static_cast<GLsizei>(2), cmd.count);
+ CheckBytesWrittenMatchesExpectedSize(
+ next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+ // TODO(gman): Check that data was inserted;
+}
+
TEST_F(GLES2FormatTest, UniformMatrix2fvImmediate) {
const int kSomeBaseValueToTestWith = 51;
static GLfloat data[] = {
@@ -1931,6 +2157,76 @@
// TODO(gman): Check that data was inserted;
}
+TEST_F(GLES2FormatTest, UniformMatrix2x3fvImmediate) {
+ const int kSomeBaseValueToTestWith = 51;
+ static GLfloat data[] = {
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 0),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 1),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 2),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 3),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 4),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 5),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 6),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 7),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 8),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 9),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 10),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 11),
+ };
+ cmds::UniformMatrix2x3fvImmediate& cmd =
+ *GetBufferAs<cmds::UniformMatrix2x3fvImmediate>();
+ const GLsizei kNumElements = 2;
+ const size_t kExpectedCmdSize =
+ sizeof(cmd) + kNumElements * sizeof(GLfloat) * 6;
+ void* next_cmd =
+ cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), data);
+ EXPECT_EQ(static_cast<uint32_t>(cmds::UniformMatrix2x3fvImmediate::kCmdId),
+ cmd.header.command);
+ EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
+ EXPECT_EQ(static_cast<GLint>(1), cmd.location);
+ EXPECT_EQ(static_cast<GLsizei>(2), cmd.count);
+ CheckBytesWrittenMatchesExpectedSize(
+ next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+ // TODO(gman): Check that data was inserted;
+}
+
+TEST_F(GLES2FormatTest, UniformMatrix2x4fvImmediate) {
+ const int kSomeBaseValueToTestWith = 51;
+ static GLfloat data[] = {
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 0),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 1),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 2),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 3),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 4),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 5),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 6),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 7),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 8),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 9),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 10),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 11),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 12),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 13),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 14),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 15),
+ };
+ cmds::UniformMatrix2x4fvImmediate& cmd =
+ *GetBufferAs<cmds::UniformMatrix2x4fvImmediate>();
+ const GLsizei kNumElements = 2;
+ const size_t kExpectedCmdSize =
+ sizeof(cmd) + kNumElements * sizeof(GLfloat) * 8;
+ void* next_cmd =
+ cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), data);
+ EXPECT_EQ(static_cast<uint32_t>(cmds::UniformMatrix2x4fvImmediate::kCmdId),
+ cmd.header.command);
+ EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
+ EXPECT_EQ(static_cast<GLint>(1), cmd.location);
+ EXPECT_EQ(static_cast<GLsizei>(2), cmd.count);
+ CheckBytesWrittenMatchesExpectedSize(
+ next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+ // TODO(gman): Check that data was inserted;
+}
+
TEST_F(GLES2FormatTest, UniformMatrix3fvImmediate) {
const int kSomeBaseValueToTestWith = 51;
static GLfloat data[] = {
@@ -1970,6 +2266,84 @@
// TODO(gman): Check that data was inserted;
}
+TEST_F(GLES2FormatTest, UniformMatrix3x2fvImmediate) {
+ const int kSomeBaseValueToTestWith = 51;
+ static GLfloat data[] = {
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 0),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 1),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 2),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 3),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 4),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 5),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 6),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 7),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 8),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 9),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 10),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 11),
+ };
+ cmds::UniformMatrix3x2fvImmediate& cmd =
+ *GetBufferAs<cmds::UniformMatrix3x2fvImmediate>();
+ const GLsizei kNumElements = 2;
+ const size_t kExpectedCmdSize =
+ sizeof(cmd) + kNumElements * sizeof(GLfloat) * 6;
+ void* next_cmd =
+ cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), data);
+ EXPECT_EQ(static_cast<uint32_t>(cmds::UniformMatrix3x2fvImmediate::kCmdId),
+ cmd.header.command);
+ EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
+ EXPECT_EQ(static_cast<GLint>(1), cmd.location);
+ EXPECT_EQ(static_cast<GLsizei>(2), cmd.count);
+ CheckBytesWrittenMatchesExpectedSize(
+ next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+ // TODO(gman): Check that data was inserted;
+}
+
+TEST_F(GLES2FormatTest, UniformMatrix3x4fvImmediate) {
+ const int kSomeBaseValueToTestWith = 51;
+ static GLfloat data[] = {
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 0),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 1),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 2),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 3),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 4),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 5),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 6),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 7),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 8),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 9),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 10),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 11),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 12),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 13),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 14),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 15),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 16),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 17),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 18),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 19),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 20),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 21),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 22),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 23),
+ };
+ cmds::UniformMatrix3x4fvImmediate& cmd =
+ *GetBufferAs<cmds::UniformMatrix3x4fvImmediate>();
+ const GLsizei kNumElements = 2;
+ const size_t kExpectedCmdSize =
+ sizeof(cmd) + kNumElements * sizeof(GLfloat) * 12;
+ void* next_cmd =
+ cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), data);
+ EXPECT_EQ(static_cast<uint32_t>(cmds::UniformMatrix3x4fvImmediate::kCmdId),
+ cmd.header.command);
+ EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
+ EXPECT_EQ(static_cast<GLint>(1), cmd.location);
+ EXPECT_EQ(static_cast<GLsizei>(2), cmd.count);
+ CheckBytesWrittenMatchesExpectedSize(
+ next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+ // TODO(gman): Check that data was inserted;
+}
+
TEST_F(GLES2FormatTest, UniformMatrix4fvImmediate) {
const int kSomeBaseValueToTestWith = 51;
static GLfloat data[] = {
@@ -2023,6 +2397,88 @@
// TODO(gman): Check that data was inserted;
}
+TEST_F(GLES2FormatTest, UniformMatrix4x2fvImmediate) {
+ const int kSomeBaseValueToTestWith = 51;
+ static GLfloat data[] = {
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 0),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 1),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 2),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 3),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 4),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 5),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 6),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 7),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 8),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 9),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 10),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 11),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 12),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 13),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 14),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 15),
+ };
+ cmds::UniformMatrix4x2fvImmediate& cmd =
+ *GetBufferAs<cmds::UniformMatrix4x2fvImmediate>();
+ const GLsizei kNumElements = 2;
+ const size_t kExpectedCmdSize =
+ sizeof(cmd) + kNumElements * sizeof(GLfloat) * 8;
+ void* next_cmd =
+ cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), data);
+ EXPECT_EQ(static_cast<uint32_t>(cmds::UniformMatrix4x2fvImmediate::kCmdId),
+ cmd.header.command);
+ EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
+ EXPECT_EQ(static_cast<GLint>(1), cmd.location);
+ EXPECT_EQ(static_cast<GLsizei>(2), cmd.count);
+ CheckBytesWrittenMatchesExpectedSize(
+ next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+ // TODO(gman): Check that data was inserted;
+}
+
+TEST_F(GLES2FormatTest, UniformMatrix4x3fvImmediate) {
+ const int kSomeBaseValueToTestWith = 51;
+ static GLfloat data[] = {
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 0),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 1),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 2),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 3),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 4),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 5),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 6),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 7),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 8),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 9),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 10),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 11),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 12),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 13),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 14),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 15),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 16),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 17),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 18),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 19),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 20),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 21),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 22),
+ static_cast<GLfloat>(kSomeBaseValueToTestWith + 23),
+ };
+ cmds::UniformMatrix4x3fvImmediate& cmd =
+ *GetBufferAs<cmds::UniformMatrix4x3fvImmediate>();
+ const GLsizei kNumElements = 2;
+ const size_t kExpectedCmdSize =
+ sizeof(cmd) + kNumElements * sizeof(GLfloat) * 12;
+ void* next_cmd =
+ cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), data);
+ EXPECT_EQ(static_cast<uint32_t>(cmds::UniformMatrix4x3fvImmediate::kCmdId),
+ cmd.header.command);
+ EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
+ EXPECT_EQ(static_cast<GLint>(1), cmd.location);
+ EXPECT_EQ(static_cast<GLsizei>(2), cmd.count);
+ CheckBytesWrittenMatchesExpectedSize(
+ next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+ // TODO(gman): Check that data was inserted;
+}
+
TEST_F(GLES2FormatTest, UseProgram) {
cmds::UseProgram& cmd = *GetBufferAs<cmds::UseProgram>();
void* next_cmd = cmd.Set(&cmd, static_cast<GLuint>(11));
@@ -2177,6 +2633,96 @@
// TODO(gman): Check that data was inserted;
}
+TEST_F(GLES2FormatTest, VertexAttribI4i) {
+ cmds::VertexAttribI4i& cmd = *GetBufferAs<cmds::VertexAttribI4i>();
+ void* next_cmd = cmd.Set(&cmd, static_cast<GLuint>(11),
+ static_cast<GLint>(12), static_cast<GLint>(13),
+ static_cast<GLint>(14), static_cast<GLint>(15));
+ EXPECT_EQ(static_cast<uint32_t>(cmds::VertexAttribI4i::kCmdId),
+ cmd.header.command);
+ EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u);
+ EXPECT_EQ(static_cast<GLuint>(11), cmd.indx);
+ EXPECT_EQ(static_cast<GLint>(12), cmd.x);
+ EXPECT_EQ(static_cast<GLint>(13), cmd.y);
+ EXPECT_EQ(static_cast<GLint>(14), cmd.z);
+ EXPECT_EQ(static_cast<GLint>(15), cmd.w);
+ CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd));
+}
+
+TEST_F(GLES2FormatTest, VertexAttribI4ivImmediate) {
+ const int kSomeBaseValueToTestWith = 51;
+ static GLint data[] = {
+ static_cast<GLint>(kSomeBaseValueToTestWith + 0),
+ static_cast<GLint>(kSomeBaseValueToTestWith + 1),
+ static_cast<GLint>(kSomeBaseValueToTestWith + 2),
+ static_cast<GLint>(kSomeBaseValueToTestWith + 3),
+ };
+ cmds::VertexAttribI4ivImmediate& cmd =
+ *GetBufferAs<cmds::VertexAttribI4ivImmediate>();
+ void* next_cmd = cmd.Set(&cmd, static_cast<GLuint>(11), data);
+ EXPECT_EQ(static_cast<uint32_t>(cmds::VertexAttribI4ivImmediate::kCmdId),
+ cmd.header.command);
+ EXPECT_EQ(sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)),
+ cmd.header.size * 4u);
+ EXPECT_EQ(static_cast<GLuint>(11), cmd.indx);
+ CheckBytesWrittenMatchesExpectedSize(
+ next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+ // TODO(gman): Check that data was inserted;
+}
+
+TEST_F(GLES2FormatTest, VertexAttribI4ui) {
+ cmds::VertexAttribI4ui& cmd = *GetBufferAs<cmds::VertexAttribI4ui>();
+ void* next_cmd = cmd.Set(&cmd, static_cast<GLuint>(11),
+ static_cast<GLuint>(12), static_cast<GLuint>(13),
+ static_cast<GLuint>(14), static_cast<GLuint>(15));
+ EXPECT_EQ(static_cast<uint32_t>(cmds::VertexAttribI4ui::kCmdId),
+ cmd.header.command);
+ EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u);
+ EXPECT_EQ(static_cast<GLuint>(11), cmd.indx);
+ EXPECT_EQ(static_cast<GLuint>(12), cmd.x);
+ EXPECT_EQ(static_cast<GLuint>(13), cmd.y);
+ EXPECT_EQ(static_cast<GLuint>(14), cmd.z);
+ EXPECT_EQ(static_cast<GLuint>(15), cmd.w);
+ CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd));
+}
+
+TEST_F(GLES2FormatTest, VertexAttribI4uivImmediate) {
+ const int kSomeBaseValueToTestWith = 51;
+ static GLuint data[] = {
+ static_cast<GLuint>(kSomeBaseValueToTestWith + 0),
+ static_cast<GLuint>(kSomeBaseValueToTestWith + 1),
+ static_cast<GLuint>(kSomeBaseValueToTestWith + 2),
+ static_cast<GLuint>(kSomeBaseValueToTestWith + 3),
+ };
+ cmds::VertexAttribI4uivImmediate& cmd =
+ *GetBufferAs<cmds::VertexAttribI4uivImmediate>();
+ void* next_cmd = cmd.Set(&cmd, static_cast<GLuint>(11), data);
+ EXPECT_EQ(static_cast<uint32_t>(cmds::VertexAttribI4uivImmediate::kCmdId),
+ cmd.header.command);
+ EXPECT_EQ(sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)),
+ cmd.header.size * 4u);
+ EXPECT_EQ(static_cast<GLuint>(11), cmd.indx);
+ CheckBytesWrittenMatchesExpectedSize(
+ next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+ // TODO(gman): Check that data was inserted;
+}
+
+TEST_F(GLES2FormatTest, VertexAttribIPointer) {
+ cmds::VertexAttribIPointer& cmd = *GetBufferAs<cmds::VertexAttribIPointer>();
+ void* next_cmd = cmd.Set(&cmd, static_cast<GLuint>(11),
+ static_cast<GLint>(12), static_cast<GLenum>(13),
+ static_cast<GLsizei>(14), static_cast<GLuint>(15));
+ EXPECT_EQ(static_cast<uint32_t>(cmds::VertexAttribIPointer::kCmdId),
+ cmd.header.command);
+ EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u);
+ EXPECT_EQ(static_cast<GLuint>(11), cmd.indx);
+ EXPECT_EQ(static_cast<GLint>(12), cmd.size);
+ EXPECT_EQ(static_cast<GLenum>(13), cmd.type);
+ EXPECT_EQ(static_cast<GLsizei>(14), cmd.stride);
+ EXPECT_EQ(static_cast<GLuint>(15), cmd.offset);
+ CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd));
+}
+
TEST_F(GLES2FormatTest, VertexAttribPointer) {
cmds::VertexAttribPointer& cmd = *GetBufferAs<cmds::VertexAttribPointer>();
void* next_cmd =
diff --git a/gpu/command_buffer/common/gles2_cmd_ids_autogen.h b/gpu/command_buffer/common/gles2_cmd_ids_autogen.h
index 9c98f51..f1bb286 100644
--- a/gpu/command_buffer/common/gles2_cmd_ids_autogen.h
+++ b/gpu/command_buffer/common/gles2_cmd_ids_autogen.h
@@ -37,186 +37,209 @@
OP(CompressedTexImage2D) /* 278 */ \
OP(CompressedTexSubImage2DBucket) /* 279 */ \
OP(CompressedTexSubImage2D) /* 280 */ \
- OP(CopyTexImage2D) /* 281 */ \
- OP(CopyTexSubImage2D) /* 282 */ \
- OP(CreateProgram) /* 283 */ \
- OP(CreateShader) /* 284 */ \
- OP(CullFace) /* 285 */ \
- OP(DeleteBuffersImmediate) /* 286 */ \
- OP(DeleteFramebuffersImmediate) /* 287 */ \
- OP(DeleteProgram) /* 288 */ \
- OP(DeleteRenderbuffersImmediate) /* 289 */ \
- OP(DeleteShader) /* 290 */ \
- OP(DeleteTexturesImmediate) /* 291 */ \
- OP(DepthFunc) /* 292 */ \
- OP(DepthMask) /* 293 */ \
- OP(DepthRangef) /* 294 */ \
- OP(DetachShader) /* 295 */ \
- OP(Disable) /* 296 */ \
- OP(DisableVertexAttribArray) /* 297 */ \
- OP(DrawArrays) /* 298 */ \
- OP(DrawElements) /* 299 */ \
- OP(Enable) /* 300 */ \
- OP(EnableVertexAttribArray) /* 301 */ \
- OP(Finish) /* 302 */ \
- OP(Flush) /* 303 */ \
- OP(FramebufferRenderbuffer) /* 304 */ \
- OP(FramebufferTexture2D) /* 305 */ \
- OP(FrontFace) /* 306 */ \
- OP(GenBuffersImmediate) /* 307 */ \
- OP(GenerateMipmap) /* 308 */ \
- OP(GenFramebuffersImmediate) /* 309 */ \
- OP(GenRenderbuffersImmediate) /* 310 */ \
- OP(GenTexturesImmediate) /* 311 */ \
- OP(GetActiveAttrib) /* 312 */ \
- OP(GetActiveUniform) /* 313 */ \
- OP(GetAttachedShaders) /* 314 */ \
- OP(GetAttribLocation) /* 315 */ \
- OP(GetBooleanv) /* 316 */ \
- OP(GetBufferParameteriv) /* 317 */ \
- OP(GetError) /* 318 */ \
- OP(GetFloatv) /* 319 */ \
- OP(GetFramebufferAttachmentParameteriv) /* 320 */ \
- OP(GetIntegerv) /* 321 */ \
- OP(GetProgramiv) /* 322 */ \
- OP(GetProgramInfoLog) /* 323 */ \
- OP(GetRenderbufferParameteriv) /* 324 */ \
- OP(GetShaderiv) /* 325 */ \
- OP(GetShaderInfoLog) /* 326 */ \
- OP(GetShaderPrecisionFormat) /* 327 */ \
- OP(GetShaderSource) /* 328 */ \
- OP(GetString) /* 329 */ \
- OP(GetTexParameterfv) /* 330 */ \
- OP(GetTexParameteriv) /* 331 */ \
- OP(GetUniformfv) /* 332 */ \
- OP(GetUniformiv) /* 333 */ \
- OP(GetUniformLocation) /* 334 */ \
- OP(GetVertexAttribfv) /* 335 */ \
- OP(GetVertexAttribiv) /* 336 */ \
- OP(GetVertexAttribPointerv) /* 337 */ \
- OP(Hint) /* 338 */ \
- OP(IsBuffer) /* 339 */ \
- OP(IsEnabled) /* 340 */ \
- OP(IsFramebuffer) /* 341 */ \
- OP(IsProgram) /* 342 */ \
- OP(IsRenderbuffer) /* 343 */ \
- OP(IsShader) /* 344 */ \
- OP(IsTexture) /* 345 */ \
- OP(LineWidth) /* 346 */ \
- OP(LinkProgram) /* 347 */ \
- OP(PixelStorei) /* 348 */ \
- OP(PolygonOffset) /* 349 */ \
- OP(ReadPixels) /* 350 */ \
- OP(ReleaseShaderCompiler) /* 351 */ \
- OP(RenderbufferStorage) /* 352 */ \
- OP(SampleCoverage) /* 353 */ \
- OP(Scissor) /* 354 */ \
- OP(ShaderBinary) /* 355 */ \
- OP(ShaderSourceBucket) /* 356 */ \
- OP(StencilFunc) /* 357 */ \
- OP(StencilFuncSeparate) /* 358 */ \
- OP(StencilMask) /* 359 */ \
- OP(StencilMaskSeparate) /* 360 */ \
- OP(StencilOp) /* 361 */ \
- OP(StencilOpSeparate) /* 362 */ \
- OP(TexImage2D) /* 363 */ \
- OP(TexParameterf) /* 364 */ \
- OP(TexParameterfvImmediate) /* 365 */ \
- OP(TexParameteri) /* 366 */ \
- OP(TexParameterivImmediate) /* 367 */ \
- OP(TexSubImage2D) /* 368 */ \
- OP(Uniform1f) /* 369 */ \
- OP(Uniform1fvImmediate) /* 370 */ \
- OP(Uniform1i) /* 371 */ \
- OP(Uniform1ivImmediate) /* 372 */ \
- OP(Uniform2f) /* 373 */ \
- OP(Uniform2fvImmediate) /* 374 */ \
- OP(Uniform2i) /* 375 */ \
- OP(Uniform2ivImmediate) /* 376 */ \
- OP(Uniform3f) /* 377 */ \
- OP(Uniform3fvImmediate) /* 378 */ \
- OP(Uniform3i) /* 379 */ \
- OP(Uniform3ivImmediate) /* 380 */ \
- OP(Uniform4f) /* 381 */ \
- OP(Uniform4fvImmediate) /* 382 */ \
- OP(Uniform4i) /* 383 */ \
- OP(Uniform4ivImmediate) /* 384 */ \
- OP(UniformMatrix2fvImmediate) /* 385 */ \
- OP(UniformMatrix3fvImmediate) /* 386 */ \
- OP(UniformMatrix4fvImmediate) /* 387 */ \
- OP(UseProgram) /* 388 */ \
- OP(ValidateProgram) /* 389 */ \
- OP(VertexAttrib1f) /* 390 */ \
- OP(VertexAttrib1fvImmediate) /* 391 */ \
- OP(VertexAttrib2f) /* 392 */ \
- OP(VertexAttrib2fvImmediate) /* 393 */ \
- OP(VertexAttrib3f) /* 394 */ \
- OP(VertexAttrib3fvImmediate) /* 395 */ \
- OP(VertexAttrib4f) /* 396 */ \
- OP(VertexAttrib4fvImmediate) /* 397 */ \
- OP(VertexAttribPointer) /* 398 */ \
- OP(Viewport) /* 399 */ \
- OP(BlitFramebufferCHROMIUM) /* 400 */ \
- OP(RenderbufferStorageMultisampleCHROMIUM) /* 401 */ \
- OP(RenderbufferStorageMultisampleEXT) /* 402 */ \
- OP(FramebufferTexture2DMultisampleEXT) /* 403 */ \
- OP(TexStorage2DEXT) /* 404 */ \
- OP(GenQueriesEXTImmediate) /* 405 */ \
- OP(DeleteQueriesEXTImmediate) /* 406 */ \
- OP(BeginQueryEXT) /* 407 */ \
- OP(EndQueryEXT) /* 408 */ \
- OP(InsertEventMarkerEXT) /* 409 */ \
- OP(PushGroupMarkerEXT) /* 410 */ \
- OP(PopGroupMarkerEXT) /* 411 */ \
- OP(GenVertexArraysOESImmediate) /* 412 */ \
- OP(DeleteVertexArraysOESImmediate) /* 413 */ \
- OP(IsVertexArrayOES) /* 414 */ \
- OP(BindVertexArrayOES) /* 415 */ \
- OP(SwapBuffers) /* 416 */ \
- OP(GetMaxValueInBufferCHROMIUM) /* 417 */ \
- OP(EnableFeatureCHROMIUM) /* 418 */ \
- OP(ResizeCHROMIUM) /* 419 */ \
- OP(GetRequestableExtensionsCHROMIUM) /* 420 */ \
- OP(RequestExtensionCHROMIUM) /* 421 */ \
- OP(GetProgramInfoCHROMIUM) /* 422 */ \
- OP(GetTranslatedShaderSourceANGLE) /* 423 */ \
- OP(PostSubBufferCHROMIUM) /* 424 */ \
- OP(TexImageIOSurface2DCHROMIUM) /* 425 */ \
- OP(CopyTextureCHROMIUM) /* 426 */ \
- OP(DrawArraysInstancedANGLE) /* 427 */ \
- OP(DrawElementsInstancedANGLE) /* 428 */ \
- OP(VertexAttribDivisorANGLE) /* 429 */ \
- OP(GenMailboxCHROMIUM) /* 430 */ \
- OP(ProduceTextureCHROMIUMImmediate) /* 431 */ \
- OP(ProduceTextureDirectCHROMIUMImmediate) /* 432 */ \
- OP(ConsumeTextureCHROMIUMImmediate) /* 433 */ \
- OP(CreateAndConsumeTextureCHROMIUMImmediate) /* 434 */ \
- OP(BindUniformLocationCHROMIUMBucket) /* 435 */ \
- OP(GenValuebuffersCHROMIUMImmediate) /* 436 */ \
- OP(DeleteValuebuffersCHROMIUMImmediate) /* 437 */ \
- OP(IsValuebufferCHROMIUM) /* 438 */ \
- OP(BindValuebufferCHROMIUM) /* 439 */ \
- OP(SubscribeValueCHROMIUM) /* 440 */ \
- OP(PopulateSubscribedValuesCHROMIUM) /* 441 */ \
- OP(UniformValuebufferCHROMIUM) /* 442 */ \
- OP(BindTexImage2DCHROMIUM) /* 443 */ \
- OP(ReleaseTexImage2DCHROMIUM) /* 444 */ \
- OP(TraceBeginCHROMIUM) /* 445 */ \
- OP(TraceEndCHROMIUM) /* 446 */ \
- OP(AsyncTexSubImage2DCHROMIUM) /* 447 */ \
- OP(AsyncTexImage2DCHROMIUM) /* 448 */ \
- OP(WaitAsyncTexImage2DCHROMIUM) /* 449 */ \
- OP(WaitAllAsyncTexImage2DCHROMIUM) /* 450 */ \
- OP(DiscardFramebufferEXTImmediate) /* 451 */ \
- OP(LoseContextCHROMIUM) /* 452 */ \
- OP(InsertSyncPointCHROMIUM) /* 453 */ \
- OP(WaitSyncPointCHROMIUM) /* 454 */ \
- OP(DrawBuffersEXTImmediate) /* 455 */ \
- OP(DiscardBackbufferCHROMIUM) /* 456 */ \
- OP(ScheduleOverlayPlaneCHROMIUM) /* 457 */ \
- OP(MatrixLoadfCHROMIUMImmediate) /* 458 */ \
- OP(MatrixLoadIdentityCHROMIUM) /* 459 */ \
- OP(BlendBarrierKHR) /* 460 */
+ OP(CopyBufferSubData) /* 281 */ \
+ OP(CopyTexImage2D) /* 282 */ \
+ OP(CopyTexSubImage2D) /* 283 */ \
+ OP(CreateProgram) /* 284 */ \
+ OP(CreateShader) /* 285 */ \
+ OP(CullFace) /* 286 */ \
+ OP(DeleteBuffersImmediate) /* 287 */ \
+ OP(DeleteFramebuffersImmediate) /* 288 */ \
+ OP(DeleteProgram) /* 289 */ \
+ OP(DeleteRenderbuffersImmediate) /* 290 */ \
+ OP(DeleteShader) /* 291 */ \
+ OP(DeleteTexturesImmediate) /* 292 */ \
+ OP(DepthFunc) /* 293 */ \
+ OP(DepthMask) /* 294 */ \
+ OP(DepthRangef) /* 295 */ \
+ OP(DetachShader) /* 296 */ \
+ OP(Disable) /* 297 */ \
+ OP(DisableVertexAttribArray) /* 298 */ \
+ OP(DrawArrays) /* 299 */ \
+ OP(DrawElements) /* 300 */ \
+ OP(Enable) /* 301 */ \
+ OP(EnableVertexAttribArray) /* 302 */ \
+ OP(Finish) /* 303 */ \
+ OP(Flush) /* 304 */ \
+ OP(FramebufferRenderbuffer) /* 305 */ \
+ OP(FramebufferTexture2D) /* 306 */ \
+ OP(FramebufferTextureLayer) /* 307 */ \
+ OP(FrontFace) /* 308 */ \
+ OP(GenBuffersImmediate) /* 309 */ \
+ OP(GenerateMipmap) /* 310 */ \
+ OP(GenFramebuffersImmediate) /* 311 */ \
+ OP(GenRenderbuffersImmediate) /* 312 */ \
+ OP(GenTexturesImmediate) /* 313 */ \
+ OP(GetActiveAttrib) /* 314 */ \
+ OP(GetActiveUniform) /* 315 */ \
+ OP(GetAttachedShaders) /* 316 */ \
+ OP(GetAttribLocation) /* 317 */ \
+ OP(GetBooleanv) /* 318 */ \
+ OP(GetBufferParameteriv) /* 319 */ \
+ OP(GetError) /* 320 */ \
+ OP(GetFloatv) /* 321 */ \
+ OP(GetFramebufferAttachmentParameteriv) /* 322 */ \
+ OP(GetIntegerv) /* 323 */ \
+ OP(GetInternalformativ) /* 324 */ \
+ OP(GetProgramiv) /* 325 */ \
+ OP(GetProgramInfoLog) /* 326 */ \
+ OP(GetRenderbufferParameteriv) /* 327 */ \
+ OP(GetShaderiv) /* 328 */ \
+ OP(GetShaderInfoLog) /* 329 */ \
+ OP(GetShaderPrecisionFormat) /* 330 */ \
+ OP(GetShaderSource) /* 331 */ \
+ OP(GetString) /* 332 */ \
+ OP(GetTexParameterfv) /* 333 */ \
+ OP(GetTexParameteriv) /* 334 */ \
+ OP(GetUniformfv) /* 335 */ \
+ OP(GetUniformiv) /* 336 */ \
+ OP(GetUniformLocation) /* 337 */ \
+ OP(GetVertexAttribfv) /* 338 */ \
+ OP(GetVertexAttribiv) /* 339 */ \
+ OP(GetVertexAttribPointerv) /* 340 */ \
+ OP(Hint) /* 341 */ \
+ OP(IsBuffer) /* 342 */ \
+ OP(IsEnabled) /* 343 */ \
+ OP(IsFramebuffer) /* 344 */ \
+ OP(IsProgram) /* 345 */ \
+ OP(IsRenderbuffer) /* 346 */ \
+ OP(IsShader) /* 347 */ \
+ OP(IsTexture) /* 348 */ \
+ OP(LineWidth) /* 349 */ \
+ OP(LinkProgram) /* 350 */ \
+ OP(PixelStorei) /* 351 */ \
+ OP(PolygonOffset) /* 352 */ \
+ OP(ReadPixels) /* 353 */ \
+ OP(ReleaseShaderCompiler) /* 354 */ \
+ OP(RenderbufferStorage) /* 355 */ \
+ OP(SampleCoverage) /* 356 */ \
+ OP(Scissor) /* 357 */ \
+ OP(ShaderBinary) /* 358 */ \
+ OP(ShaderSourceBucket) /* 359 */ \
+ OP(StencilFunc) /* 360 */ \
+ OP(StencilFuncSeparate) /* 361 */ \
+ OP(StencilMask) /* 362 */ \
+ OP(StencilMaskSeparate) /* 363 */ \
+ OP(StencilOp) /* 364 */ \
+ OP(StencilOpSeparate) /* 365 */ \
+ OP(TexImage2D) /* 366 */ \
+ OP(TexParameterf) /* 367 */ \
+ OP(TexParameterfvImmediate) /* 368 */ \
+ OP(TexParameteri) /* 369 */ \
+ OP(TexParameterivImmediate) /* 370 */ \
+ OP(TexStorage3D) /* 371 */ \
+ OP(TexSubImage2D) /* 372 */ \
+ OP(Uniform1f) /* 373 */ \
+ OP(Uniform1fvImmediate) /* 374 */ \
+ OP(Uniform1i) /* 375 */ \
+ OP(Uniform1ivImmediate) /* 376 */ \
+ OP(Uniform1ui) /* 377 */ \
+ OP(Uniform1uivImmediate) /* 378 */ \
+ OP(Uniform2f) /* 379 */ \
+ OP(Uniform2fvImmediate) /* 380 */ \
+ OP(Uniform2i) /* 381 */ \
+ OP(Uniform2ivImmediate) /* 382 */ \
+ OP(Uniform2ui) /* 383 */ \
+ OP(Uniform2uivImmediate) /* 384 */ \
+ OP(Uniform3f) /* 385 */ \
+ OP(Uniform3fvImmediate) /* 386 */ \
+ OP(Uniform3i) /* 387 */ \
+ OP(Uniform3ivImmediate) /* 388 */ \
+ OP(Uniform3ui) /* 389 */ \
+ OP(Uniform3uivImmediate) /* 390 */ \
+ OP(Uniform4f) /* 391 */ \
+ OP(Uniform4fvImmediate) /* 392 */ \
+ OP(Uniform4i) /* 393 */ \
+ OP(Uniform4ivImmediate) /* 394 */ \
+ OP(Uniform4ui) /* 395 */ \
+ OP(Uniform4uivImmediate) /* 396 */ \
+ OP(UniformMatrix2fvImmediate) /* 397 */ \
+ OP(UniformMatrix2x3fvImmediate) /* 398 */ \
+ OP(UniformMatrix2x4fvImmediate) /* 399 */ \
+ OP(UniformMatrix3fvImmediate) /* 400 */ \
+ OP(UniformMatrix3x2fvImmediate) /* 401 */ \
+ OP(UniformMatrix3x4fvImmediate) /* 402 */ \
+ OP(UniformMatrix4fvImmediate) /* 403 */ \
+ OP(UniformMatrix4x2fvImmediate) /* 404 */ \
+ OP(UniformMatrix4x3fvImmediate) /* 405 */ \
+ OP(UseProgram) /* 406 */ \
+ OP(ValidateProgram) /* 407 */ \
+ OP(VertexAttrib1f) /* 408 */ \
+ OP(VertexAttrib1fvImmediate) /* 409 */ \
+ OP(VertexAttrib2f) /* 410 */ \
+ OP(VertexAttrib2fvImmediate) /* 411 */ \
+ OP(VertexAttrib3f) /* 412 */ \
+ OP(VertexAttrib3fvImmediate) /* 413 */ \
+ OP(VertexAttrib4f) /* 414 */ \
+ OP(VertexAttrib4fvImmediate) /* 415 */ \
+ OP(VertexAttribI4i) /* 416 */ \
+ OP(VertexAttribI4ivImmediate) /* 417 */ \
+ OP(VertexAttribI4ui) /* 418 */ \
+ OP(VertexAttribI4uivImmediate) /* 419 */ \
+ OP(VertexAttribIPointer) /* 420 */ \
+ OP(VertexAttribPointer) /* 421 */ \
+ OP(Viewport) /* 422 */ \
+ OP(BlitFramebufferCHROMIUM) /* 423 */ \
+ OP(RenderbufferStorageMultisampleCHROMIUM) /* 424 */ \
+ OP(RenderbufferStorageMultisampleEXT) /* 425 */ \
+ OP(FramebufferTexture2DMultisampleEXT) /* 426 */ \
+ OP(TexStorage2DEXT) /* 427 */ \
+ OP(GenQueriesEXTImmediate) /* 428 */ \
+ OP(DeleteQueriesEXTImmediate) /* 429 */ \
+ OP(BeginQueryEXT) /* 430 */ \
+ OP(EndQueryEXT) /* 431 */ \
+ OP(InsertEventMarkerEXT) /* 432 */ \
+ OP(PushGroupMarkerEXT) /* 433 */ \
+ OP(PopGroupMarkerEXT) /* 434 */ \
+ OP(GenVertexArraysOESImmediate) /* 435 */ \
+ OP(DeleteVertexArraysOESImmediate) /* 436 */ \
+ OP(IsVertexArrayOES) /* 437 */ \
+ OP(BindVertexArrayOES) /* 438 */ \
+ OP(SwapBuffers) /* 439 */ \
+ OP(GetMaxValueInBufferCHROMIUM) /* 440 */ \
+ OP(EnableFeatureCHROMIUM) /* 441 */ \
+ OP(ResizeCHROMIUM) /* 442 */ \
+ OP(GetRequestableExtensionsCHROMIUM) /* 443 */ \
+ OP(RequestExtensionCHROMIUM) /* 444 */ \
+ OP(GetProgramInfoCHROMIUM) /* 445 */ \
+ OP(GetTranslatedShaderSourceANGLE) /* 446 */ \
+ OP(PostSubBufferCHROMIUM) /* 447 */ \
+ OP(TexImageIOSurface2DCHROMIUM) /* 448 */ \
+ OP(CopyTextureCHROMIUM) /* 449 */ \
+ OP(DrawArraysInstancedANGLE) /* 450 */ \
+ OP(DrawElementsInstancedANGLE) /* 451 */ \
+ OP(VertexAttribDivisorANGLE) /* 452 */ \
+ OP(GenMailboxCHROMIUM) /* 453 */ \
+ OP(ProduceTextureCHROMIUMImmediate) /* 454 */ \
+ OP(ProduceTextureDirectCHROMIUMImmediate) /* 455 */ \
+ OP(ConsumeTextureCHROMIUMImmediate) /* 456 */ \
+ OP(CreateAndConsumeTextureCHROMIUMImmediate) /* 457 */ \
+ OP(BindUniformLocationCHROMIUMBucket) /* 458 */ \
+ OP(GenValuebuffersCHROMIUMImmediate) /* 459 */ \
+ OP(DeleteValuebuffersCHROMIUMImmediate) /* 460 */ \
+ OP(IsValuebufferCHROMIUM) /* 461 */ \
+ OP(BindValuebufferCHROMIUM) /* 462 */ \
+ OP(SubscribeValueCHROMIUM) /* 463 */ \
+ OP(PopulateSubscribedValuesCHROMIUM) /* 464 */ \
+ OP(UniformValuebufferCHROMIUM) /* 465 */ \
+ OP(BindTexImage2DCHROMIUM) /* 466 */ \
+ OP(ReleaseTexImage2DCHROMIUM) /* 467 */ \
+ OP(TraceBeginCHROMIUM) /* 468 */ \
+ OP(TraceEndCHROMIUM) /* 469 */ \
+ OP(AsyncTexSubImage2DCHROMIUM) /* 470 */ \
+ OP(AsyncTexImage2DCHROMIUM) /* 471 */ \
+ OP(WaitAsyncTexImage2DCHROMIUM) /* 472 */ \
+ OP(WaitAllAsyncTexImage2DCHROMIUM) /* 473 */ \
+ OP(DiscardFramebufferEXTImmediate) /* 474 */ \
+ OP(LoseContextCHROMIUM) /* 475 */ \
+ OP(InsertSyncPointCHROMIUM) /* 476 */ \
+ OP(WaitSyncPointCHROMIUM) /* 477 */ \
+ OP(DrawBuffersEXTImmediate) /* 478 */ \
+ OP(DiscardBackbufferCHROMIUM) /* 479 */ \
+ OP(ScheduleOverlayPlaneCHROMIUM) /* 480 */ \
+ OP(MatrixLoadfCHROMIUMImmediate) /* 481 */ \
+ OP(MatrixLoadIdentityCHROMIUM) /* 482 */ \
+ OP(BlendBarrierKHR) /* 483 */
enum CommandId {
kStartPoint = cmd::kLastCommonId, // All GLES2 commands start after this.
diff --git a/gpu/command_buffer/common/gles2_cmd_utils.cc b/gpu/command_buffer/common/gles2_cmd_utils.cc
index 6b34f39..0c2f493 100644
--- a/gpu/command_buffer/common/gles2_cmd_utils.cc
+++ b/gpu/command_buffer/common/gles2_cmd_utils.cc
@@ -9,7 +9,9 @@
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#include <GLES2/gl2extchromium.h>
+#include <GLES3/gl3.h>
+#include "base/numerics/safe_math.h"
#include "gpu/command_buffer/common/gles2_cmd_format.h"
#include "gpu/command_buffer/common/gles2_cmd_utils.h"
@@ -360,6 +362,7 @@
case GL_SRGB_EXT:
return 3;
case GL_LUMINANCE_ALPHA:
+ case GL_RG_EXT:
return 2;
case GL_RGBA:
case GL_BGRA_EXT:
@@ -373,6 +376,7 @@
case GL_DEPTH_COMPONENT16:
case GL_DEPTH24_STENCIL8_OES:
case GL_DEPTH_STENCIL_OES:
+ case GL_RED_EXT:
return 1;
default:
return 0;
@@ -704,6 +708,10 @@
case GL_DEPTH_STENCIL_OES:
case GL_DEPTH24_STENCIL8_OES:
return kDepth | kStencil;
+ case GL_RED_EXT:
+ return kRed;
+ case GL_RG_EXT:
+ return kRed | kGreen;
default:
return 0x0000;
}
@@ -770,7 +778,7 @@
bool* getting_array) {
bool getting_array_location = false;
size_t open_pos = std::string::npos;
- int index = 0;
+ base::CheckedNumeric<int> index = 0;
if (name[name.size() - 1] == ']') {
if (name.size() < 3) {
return false;
@@ -788,10 +796,13 @@
}
index = index * 10 + digit;
}
+ if (!index.IsValid()) {
+ return false;
+ }
getting_array_location = true;
}
*getting_array = getting_array_location;
- *element_index = index;
+ *element_index = index.ValueOrDie();
*array_pos = open_pos;
return true;
}
diff --git a/gpu/command_buffer/common/gles2_cmd_utils_autogen.h b/gpu/command_buffer/common/gles2_cmd_utils_autogen.h
index e8631e6..bb809fc 100644
--- a/gpu/command_buffer/common/gles2_cmd_utils_autogen.h
+++ b/gpu/command_buffer/common/gles2_cmd_utils_autogen.h
@@ -56,6 +56,7 @@
static std::string GetStringStencilOp(uint32_t value);
static std::string GetStringStringType(uint32_t value);
static std::string GetStringSubscriptionTarget(uint32_t value);
+static std::string GetStringTexture3DTarget(uint32_t value);
static std::string GetStringTextureBindTarget(uint32_t value);
static std::string GetStringTextureFormat(uint32_t value);
static std::string GetStringTextureInternalFormat(uint32_t value);
diff --git a/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h b/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h
index 3176cc8..b205347 100644
--- a/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h
+++ b/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h
@@ -13,6 +13,14 @@
static const GLES2Util::EnumToString enum_to_string_table[] = {
{
+ 0x8D77,
+ "GL_RGB16UI",
+ },
+ {
+ 0x8D76,
+ "GL_RGBA16UI",
+ },
+ {
0x9260,
"GL_GCCSO_SHADER_BINARY_FJ",
},
@@ -21,10 +29,26 @@
"GL_TEXTURE_CUBE_MAP_ARRAY_EXT",
},
{
+ 0x8D71,
+ "GL_RGB32UI",
+ },
+ {
+ 0x8D70,
+ "GL_RGBA32UI",
+ },
+ {
+ 0x8C76,
+ "GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH",
+ },
+ {
0x8825,
"GL_DRAW_BUFFER0_EXT",
},
{
+ 0x8D94,
+ "GL_RED_INTEGER",
+ },
+ {
0x0BC1,
"GL_ALPHA_TEST_FUNC_QCOM",
},
@@ -85,6 +109,10 @@
"GL_BGRA8_EXT",
},
{
+ 0x813C,
+ "GL_TEXTURE_BASE_LEVEL",
+ },
+ {
0,
"GL_FALSE",
},
@@ -93,6 +121,10 @@
"GL_STENCIL_BUFFER_BIT6_QCOM",
},
{
+ 64,
+ "GL_MAILBOX_SIZE_CHROMIUM",
+ },
+ {
0x9500,
"GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL",
},
@@ -137,6 +169,14 @@
"GL_TEXTURE_SAMPLES_IMG",
},
{
+ 0x8D88,
+ "GL_RGBA16I",
+ },
+ {
+ 0x8D89,
+ "GL_RGB16I",
+ },
+ {
0x00000020,
"GL_COLOR_BUFFER_BIT5_QCOM",
},
@@ -181,6 +221,10 @@
"GL_LINES",
},
{
+ 0x8D7D,
+ "GL_RGB8UI",
+ },
+ {
0x93F0,
"GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV2_IMG",
},
@@ -189,6 +233,10 @@
"GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV2_IMG",
},
{
+ 0x0D04,
+ "GL_PACK_SKIP_PIXELS",
+ },
+ {
0x900E,
"GL_INT_SAMPLER_CUBE_MAP_ARRAY_EXT",
},
@@ -197,6 +245,10 @@
"GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_EXT",
},
{
+ 0x8C7F,
+ "GL_TRANSFORM_FEEDBACK_BUFFER_MODE",
+ },
+ {
0x900F,
"GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_EXT",
},
@@ -209,8 +261,8 @@
"GL_SAMPLER_CUBE_MAP_ARRAY_EXT",
},
{
- 0x88B8,
- "GL_READ_ONLY",
+ 0x8213,
+ "GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE",
},
{
0x88B9,
@@ -233,6 +285,10 @@
"GL_Z400_BINARY_AMD",
},
{
+ 0x8215,
+ "GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE",
+ },
+ {
0x8C4D,
"GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV",
},
@@ -337,6 +393,14 @@
"GL_FLOAT_VEC2",
},
{
+ 0x806D,
+ "GL_UNPACK_SKIP_IMAGES",
+ },
+ {
+ 0x806E,
+ "GL_UNPACK_IMAGE_HEIGHT",
+ },
+ {
0x806F,
"GL_TEXTURE_3D_OES",
},
@@ -353,10 +417,18 @@
"GL_TEXTURE_BINDING_3D_OES",
},
{
+ 0x8D8E,
+ "GL_RGBA8I",
+ },
+ {
0x8CE3,
"GL_COLOR_ATTACHMENT3_EXT",
},
{
+ 0x9274,
+ "GL_COMPRESSED_RGB8_ETC2",
+ },
+ {
0x1904,
"GL_GREEN_NV",
},
@@ -369,6 +441,14 @@
"GL_TEXTURE_BINDING_2D",
},
{
+ 0x8A2E,
+ "GL_MAX_COMBINED_UNIFORM_BLOCKS",
+ },
+ {
+ 0x8F96,
+ "GL_RGB8_SNORM",
+ },
+ {
0x8260,
"GL_UNDEFINED_VERTEX_EXT",
},
@@ -377,6 +457,10 @@
"GL_NO_RESET_NOTIFICATION_KHR",
},
{
+ 0x0D02,
+ "GL_PACK_ROW_LENGTH",
+ },
+ {
0x8DFA,
"GL_SHADER_COMPILER",
},
@@ -417,6 +501,10 @@
"GL_NUM_PROGRAM_BINARY_FORMATS_OES",
},
{
+ 0x8A41,
+ "GL_UNIFORM_BLOCK_NAME_LENGTH",
+ },
+ {
0x2600,
"GL_NEAREST",
},
@@ -429,10 +517,26 @@
"GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG",
},
{
+ 0x821B,
+ "GL_MAJOR_VERSION",
+ },
+ {
+ 0x821A,
+ "GL_DEPTH_STENCIL_ATTACHMENT",
+ },
+ {
+ 0x8A40,
+ "GL_UNIFORM_BLOCK_DATA_SIZE",
+ },
+ {
0x9242,
"GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM",
},
{
+ 0x821D,
+ "GL_NUM_EXTENSIONS",
+ },
+ {
0x88BB,
"GL_BUFFER_ACCESS_OES",
},
@@ -449,10 +553,18 @@
"GL_TIME_ELAPSED_EXT",
},
{
+ 0x8A46,
+ "GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER",
+ },
+ {
0x6003,
"GL_GET_ERROR_QUERY_CHROMIUM",
},
{
+ 0x8F94,
+ "GL_R8_SNORM",
+ },
+ {
0x0C10,
"GL_SCISSOR_BOX",
},
@@ -525,6 +637,10 @@
"GL_STENCIL_BUFFER_BIT5_QCOM",
},
{
+ 0x8D9F,
+ "GL_INT_2_10_10_10_REV",
+ },
+ {
0x8B8A,
"GL_ACTIVE_ATTRIBUTE_MAX_LENGTH",
},
@@ -597,6 +713,10 @@
"GL_VALIDATE_STATUS",
},
{
+ 0x9380,
+ "GL_NUM_SAMPLE_COUNTS",
+ },
+ {
0x8D48,
"GL_STENCIL_INDEX8",
},
@@ -633,6 +753,14 @@
"GL_RENDERBUFFER",
},
{
+ 0x8A3A,
+ "GL_UNIFORM_BLOCK_INDEX",
+ },
+ {
+ 0x88B8,
+ "GL_READ_ONLY",
+ },
+ {
0x0BD0,
"GL_DITHER",
},
@@ -661,6 +789,10 @@
"GL_SRC_OVER_NV",
},
{
+ 0x9120,
+ "GL_BUFFER_MAP_LENGTH",
+ },
+ {
0x0B21,
"GL_LINE_WIDTH",
},
@@ -681,10 +813,18 @@
"GL_DEPTH_COMPONENT32_OES",
},
{
+ 0x88FD,
+ "GL_VERTEX_ATTRIB_ARRAY_INTEGER",
+ },
+ {
0x88FE,
"GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE",
},
{
+ 0x88FF,
+ "GL_MAX_ARRAY_TEXTURE_LAYERS",
+ },
+ {
0x8B6A,
"GL_FLOAT_MAT4x3_NV",
},
@@ -829,6 +969,10 @@
"GL_COMMANDS_COMPLETED_CHROMIUM",
},
{
+ 0x8F9C,
+ "GL_SIGNED_NORMALIZED",
+ },
+ {
0x92D5,
"GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT",
},
@@ -1041,6 +1185,10 @@
"GL_SRC_ALPHA",
},
{
+ 0x8212,
+ "GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE",
+ },
+ {
0x0308,
"GL_SRC_ALPHA_SATURATE",
},
@@ -1089,10 +1237,22 @@
"GL_RGB32F_EXT",
},
{
+ 0x8A35,
+ "GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH",
+ },
+ {
0x8814,
"GL_RGBA32F_EXT",
},
{
+ 0x6006,
+ "GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM",
+ },
+ {
+ 0x9277,
+ "GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2",
+ },
+ {
0x6004,
"GL_COMMANDS_ISSUED_CHROMIUM",
},
@@ -1105,6 +1265,10 @@
"GL_ALPHA32F_EXT",
},
{
+ 0x813B,
+ "GL_TEXTURE_MAX_LOD",
+ },
+ {
0x8CDD,
"GL_FRAMEBUFFER_UNSUPPORTED",
},
@@ -1133,6 +1297,10 @@
"GL_ALPHA8_OES",
},
{
+ 0x8904,
+ "GL_MIN_PROGRAM_TEXEL_OFFSET",
+ },
+ {
0x84F5,
"GL_TEXTURE_RECTANGLE_ARB",
},
@@ -1197,16 +1365,52 @@
"GL_FRACTIONAL_EVEN_EXT",
},
{
+ 0x8C8E,
+ "GL_TRANSFORM_FEEDBACK_BUFFER",
+ },
+ {
+ 0x8C8D,
+ "GL_SEPARATE_ATTRIBS",
+ },
+ {
+ 0x8C8F,
+ "GL_TRANSFORM_FEEDBACK_BUFFER_BINDING",
+ },
+ {
+ 0x8C8A,
+ "GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS",
+ },
+ {
+ 0x8C8C,
+ "GL_INTERLEAVED_ATTRIBS",
+ },
+ {
+ 0x8C8B,
+ "GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS",
+ },
+ {
0x8C17,
"GL_UNSIGNED_NORMALIZED_EXT",
},
{
+ 0x8A3E,
+ "GL_UNIFORM_IS_ROW_MAJOR",
+ },
+ {
0x8E7A,
"GL_ISOLINES_EXT",
},
{
- 0x6006,
- "GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM",
+ 0x8F95,
+ "GL_RG8_SNORM",
+ },
+ {
+ 0x8D99,
+ "GL_RGBA_INTEGER",
+ },
+ {
+ 0x8D98,
+ "GL_RGB_INTEGER",
},
{
0x8A4A,
@@ -1229,6 +1433,10 @@
"GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT",
},
{
+ 0x8919,
+ "GL_SAMPLER_BINDING",
+ },
+ {
0x92CD,
"GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_EXT",
},
@@ -1237,10 +1445,22 @@
"GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_EXT",
},
{
+ 0x8C85,
+ "GL_TRANSFORM_FEEDBACK_BUFFER_SIZE",
+ },
+ {
+ 0x8D7C,
+ "GL_RGBA8UI",
+ },
+ {
0x6007,
"GL_LATENCY_QUERY_CHROMIUM",
},
{
+ 0x8D83,
+ "GL_RGB32I",
+ },
+ {
0x8916,
"GL_GEOMETRY_LINKED_VERTICES_OUT_EXT",
},
@@ -1253,12 +1473,20 @@
"GL_LUMINANCE_ALPHA16F_EXT",
},
{
+ 0x84FD,
+ "GL_MAX_TEXTURE_LOD_BIAS",
+ },
+ {
0x882D,
"GL_DRAW_BUFFER8_EXT",
},
{
- 0x0BA6,
- "GL_PATH_MODELVIEW_MATRIX_CHROMIUM",
+ 0x8A43,
+ "GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES",
+ },
+ {
+ 0x8A42,
+ "GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS",
},
{
0x8F37,
@@ -1273,6 +1501,14 @@
"GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT",
},
{
+ 0x8A3C,
+ "GL_UNIFORM_ARRAY_STRIDE",
+ },
+ {
+ 0x8A44,
+ "GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER",
+ },
+ {
0x6000,
"GL_TEXTURE_POOL_CHROMIUM",
},
@@ -1317,6 +1553,18 @@
"GL_PRIMITIVES_GENERATED_EXT",
},
{
+ 0x8C80,
+ "GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS",
+ },
+ {
+ 0x8C83,
+ "GL_TRANSFORM_FEEDBACK_VARYINGS",
+ },
+ {
+ 0x8D69,
+ "GL_PRIMITIVE_RESTART_FIXED_INDEX",
+ },
+ {
0x882E,
"GL_DRAW_BUFFER9_EXT",
},
@@ -1325,6 +1573,22 @@
"GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT",
},
{
+ 0x8A31,
+ "GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS",
+ },
+ {
+ 0x8C89,
+ "GL_RASTERIZER_DISCARD",
+ },
+ {
+ 0x8C88,
+ "GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN",
+ },
+ {
+ 0x8C1A,
+ "GL_TEXTURE_2D_ARRAY",
+ },
+ {
0x910D,
"GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES",
},
@@ -1401,10 +1665,30 @@
"GL_COVERAGE_COMPONENT_NV",
},
{
+ 0x8217,
+ "GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE",
+ },
+ {
0x8E89,
"GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS_EXT",
},
{
+ 0x8216,
+ "GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE",
+ },
+ {
+ 0x8A36,
+ "GL_ACTIVE_UNIFORM_BLOCKS",
+ },
+ {
+ 0x8A37,
+ "GL_UNIFORM_TYPE",
+ },
+ {
+ 0x8A34,
+ "GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT",
+ },
+ {
0x3006,
"GL_CLIP_DISTANCE6_APPLE",
},
@@ -1413,6 +1697,10 @@
"GL_FUNC_REVERSE_SUBTRACT",
},
{
+ 0x8A33,
+ "GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS",
+ },
+ {
0x00000400,
"GL_STENCIL_BUFFER_BIT",
},
@@ -1421,6 +1709,18 @@
"GL_FUNC_SUBTRACT",
},
{
+ 0x8214,
+ "GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE",
+ },
+ {
+ 0x8A38,
+ "GL_UNIFORM_SIZE",
+ },
+ {
+ 0x8A39,
+ "GL_UNIFORM_NAME_LENGTH",
+ },
+ {
0x8E2C,
"GL_DEPTH_COMPONENT16_NONLINEAR_NV",
},
@@ -1433,10 +1733,18 @@
"GL_FRAMEBUFFER_UNDEFINED_OES",
},
{
+ 0x8E23,
+ "GL_TRANSFORM_FEEDBACK_PAUSED",
+ },
+ {
0x8E22,
"GL_TRANSFORM_FEEDBACK",
},
{
+ 0x8E25,
+ "GL_TRANSFORM_FEEDBACK_BINDING",
+ },
+ {
0x9054,
"GL_IMAGE_CUBE_MAP_ARRAY_EXT",
},
@@ -1509,6 +1817,10 @@
"GL_TEXTURE_FORMAT_QCOM",
},
{
+ 0x8228,
+ "GL_RG_INTEGER",
+ },
+ {
0x2901,
"GL_REPEAT",
},
@@ -1625,8 +1937,12 @@
"GL_VIVIDLIGHT_NV",
},
{
- 0x78F1,
- "GL_MAP_CHROMIUM",
+ 0x8DCC,
+ "GL_INT_SAMPLER_CUBE",
+ },
+ {
+ 0x8905,
+ "GL_MAX_PROGRAM_TEXEL_OFFSET",
},
{
0x00080000,
@@ -1637,6 +1953,10 @@
"GL_LINEARLIGHT_NV",
},
{
+ 0x8DCF,
+ "GL_INT_SAMPLER_2D_ARRAY",
+ },
+ {
0x886A,
"GL_VERTEX_ATTRIB_ARRAY_NORMALIZED",
},
@@ -1657,6 +1977,10 @@
"GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS_EXT",
},
{
+ 0x8DCA,
+ "GL_INT_SAMPLER_2D",
+ },
+ {
0x93C7,
"GL_COMPRESSED_RGBA_ASTC_6x5x5_OES",
},
@@ -1685,6 +2009,10 @@
"GL_DMP_PROGRAM_BINARY_DMP",
},
{
+ 0x8DC8,
+ "GL_UNSIGNED_INT_VEC4",
+ },
+ {
0x3000,
"GL_CLIP_DISTANCE0_APPLE",
},
@@ -1693,6 +2021,10 @@
"GL_ATC_RGB_AMD",
},
{
+ 0x8DC1,
+ "GL_SAMPLER_2D_ARRAY",
+ },
+ {
0x9154,
"GL_VERTEX_ARRAY_OBJECT_EXT",
},
@@ -1717,6 +2049,10 @@
"GL_CONTEXT_FLAG_DEBUG_BIT_KHR",
},
{
+ 0x8A3F,
+ "GL_UNIFORM_BLOCK_BINDING",
+ },
+ {
0x00000000,
"GL_PERFQUERY_SINGLE_CONTEXT_INTEL",
},
@@ -1749,6 +2085,10 @@
"GL_BOOL_VEC3",
},
{
+ 0x8A3D,
+ "GL_UNIFORM_MATRIX_STRIDE",
+ },
+ {
0x8828,
"GL_DRAW_BUFFER3_EXT",
},
@@ -1849,6 +2189,14 @@
"GL_FLOAT_VEC4",
},
{
+ 0x8239,
+ "GL_RG16I",
+ },
+ {
+ 0x8238,
+ "GL_RG8UI",
+ },
+ {
0x9240,
"GL_UNPACK_FLIP_Y_CHROMIUM",
},
@@ -1857,16 +2205,44 @@
"GL_UNSIGNED_INT_10_10_10_2_OES",
},
{
+ 0x8A30,
+ "GL_MAX_UNIFORM_BLOCK_SIZE",
+ },
+ {
+ 0x9273,
+ "GL_COMPRESSED_SIGNED_RG11_EAC",
+ },
+ {
+ 0x8231,
+ "GL_R8I",
+ },
+ {
0x8866,
"GL_QUERY_RESULT_EXT",
},
{
+ 0x8233,
+ "GL_R16I",
+ },
+ {
0x8DF7,
"GL_INT_10_10_10_2_OES",
},
{
- 0x9246,
- "GL_OVERLAY_TRANSFORM_FLIP_HORIZONTAL_CHROMIUM",
+ 0x8235,
+ "GL_R32I",
+ },
+ {
+ 0x8234,
+ "GL_R16UI",
+ },
+ {
+ 0x8237,
+ "GL_RG8I",
+ },
+ {
+ 0x8236,
+ "GL_R32UI",
},
{
0x8B69,
@@ -1897,10 +2273,22 @@
"GL_COMPRESSED_TEXTURE_FORMATS",
},
{
+ 0x8DD4,
+ "GL_UNSIGNED_INT_SAMPLER_CUBE",
+ },
+ {
0x9244,
"GL_BIND_GENERATES_RESOURCE_CHROMIUM",
},
{
+ 0x8DD2,
+ "GL_UNSIGNED_INT_SAMPLER_2D",
+ },
+ {
+ 0x8DD3,
+ "GL_UNSIGNED_INT_SAMPLER_3D",
+ },
+ {
0x8DD0,
"GL_INT_SAMPLER_BUFFER_EXT",
},
@@ -1921,6 +2309,10 @@
"GL_FIXED",
},
{
+ 0x140B,
+ "GL_HALF_FLOAT",
+ },
+ {
0x8008,
"GL_MAX_EXT",
},
@@ -1933,10 +2325,18 @@
"GL_QUERY_RESULT_AVAILABLE_EXT",
},
{
+ 0x8D82,
+ "GL_RGBA32I",
+ },
+ {
0x8009,
"GL_BLEND_EQUATION",
},
{
+ 0x911F,
+ "GL_BUFFER_ACCESS_FLAGS",
+ },
+ {
0x1401,
"GL_UNSIGNED_BYTE",
},
@@ -1965,6 +2365,10 @@
"GL_FLOAT",
},
{
+ 0x8C1D,
+ "GL_TEXTURE_BINDING_2D_ARRAY",
+ },
+ {
0x8DDF,
"GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT",
},
@@ -1993,10 +2397,18 @@
"GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE",
},
{
+ 0x823A,
+ "GL_RG16UI",
+ },
+ {
0x8CE4,
"GL_COLOR_ATTACHMENT4_EXT",
},
{
+ 0x823B,
+ "GL_RG32I",
+ },
+ {
0x8CD3,
"GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE",
},
@@ -2333,6 +2745,10 @@
"GL_TEXTURE_CUBE_MAP_POSITIVE_Y",
},
{
+ 0x8218,
+ "GL_FRAMEBUFFER_DEFAULT",
+ },
+ {
0x8513,
"GL_TEXTURE_CUBE_MAP",
},
@@ -2445,6 +2861,10 @@
"GL_DEBUG_TYPE_PORTABILITY_KHR",
},
{
+ 0x8DD7,
+ "GL_UNSIGNED_INT_SAMPLER_2D_ARRAY",
+ },
+ {
0x8B31,
"GL_VERTEX_SHADER",
},
@@ -2585,6 +3005,18 @@
"GL_PERFQUERY_COUNTER_RAW_INTEL",
},
{
+ 0x823C,
+ "GL_RG32UI",
+ },
+ {
+ 0x8A29,
+ "GL_UNIFORM_BUFFER_START",
+ },
+ {
+ 0x8A28,
+ "GL_UNIFORM_BUFFER_BINDING",
+ },
+ {
0x92BE,
"GL_PRIMITIVE_BOUNDING_BOX_EXT",
},
@@ -2613,6 +3045,10 @@
"GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT",
},
{
+ 0x906F,
+ "GL_RGB10_A2UI",
+ },
+ {
0x8E72,
"GL_PATCH_VERTICES_EXT",
},
@@ -2629,6 +3065,10 @@
"GL_TEXTURE4",
},
{
+ 0x821C,
+ "GL_MINOR_VERSION",
+ },
+ {
0x8E8A,
"GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS_EXT",
},
@@ -2641,6 +3081,10 @@
"GL_GUILTY_CONTEXT_RESET_KHR",
},
{
+ 0x8D6B,
+ "GL_MAX_ELEMENT_INDEX",
+ },
+ {
0x8D6C,
"GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT",
},
@@ -2821,6 +3265,10 @@
"GL_COLOR_ATTACHMENT14_EXT",
},
{
+ 0x8DC7,
+ "GL_UNSIGNED_INT_VEC3",
+ },
+ {
0x1701,
"GL_PATH_PROJECTION_CHROMIUM",
},
@@ -2841,6 +3289,10 @@
"GL_TEXTURE_WRAP_T",
},
{
+ 0x8DCB,
+ "GL_INT_SAMPLER_3D",
+ },
+ {
0x3007,
"GL_CLIP_DISTANCE7_APPLE",
},
@@ -2913,6 +3365,14 @@
"GL_STENCIL_FAIL",
},
{
+ 0x8B4A,
+ "GL_MAX_VERTEX_UNIFORM_COMPONENTS",
+ },
+ {
+ 0x8B4B,
+ "GL_MAX_VARYING_COMPONENTS",
+ },
+ {
0x8B4C,
"GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS",
},
@@ -2925,6 +3385,10 @@
"GL_SHADER_TYPE",
},
{
+ 0x9122,
+ "GL_MAX_VERTEX_OUTPUT_COMPONENTS",
+ },
+ {
0x9123,
"GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT",
},
@@ -2933,10 +3397,18 @@
"GL_PERFQUERY_WAIT_INTEL",
},
{
+ 0x9121,
+ "GL_BUFFER_MAP_OFFSET",
+ },
+ {
0x00004000,
"GL_COLOR_BUFFER_BIT",
},
{
+ 0x9125,
+ "GL_MAX_FRAGMENT_INPUT_COMPONENTS",
+ },
+ {
0x00000010,
"GL_TESS_EVALUATION_SHADER_BIT_EXT",
},
@@ -3005,10 +3477,18 @@
"GL_PERFQUERY_FLUSH_INTEL",
},
{
+ 0x0D03,
+ "GL_PACK_SKIP_ROWS",
+ },
+ {
0x84F3,
"GL_FENCE_STATUS_NV",
},
{
+ 0x88E6,
+ "GL_STATIC_COPY",
+ },
+ {
0x0B93,
"GL_STENCIL_VALUE_MASK",
},
@@ -3073,10 +3553,22 @@
"GL_TEXTURE_BORDER_COLOR_EXT",
},
{
+ 0x8A2D,
+ "GL_MAX_FRAGMENT_UNIFORM_BLOCKS",
+ },
+ {
0x8B48,
"GL_SHADER_OBJECT_EXT",
},
{
+ 0x8B49,
+ "GL_MAX_FRAGMENT_UNIFORM_COMPONENTS",
+ },
+ {
+ 0x813A,
+ "GL_TEXTURE_MIN_LOD",
+ },
+ {
0x8DE1,
"GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT",
},
@@ -3097,12 +3589,16 @@
"GL_OVERLAY_TRANSFORM_ROTATE_270_CHROMIUM",
},
{
+ 0x8A2F,
+ "GL_MAX_UNIFORM_BUFFER_BINDINGS",
+ },
+ {
0x20000000,
"GL_MULTISAMPLE_BUFFER_BIT5_QCOM",
},
{
- 64,
- "GL_MAILBOX_SIZE_CHROMIUM",
+ 0x8A2A,
+ "GL_UNIFORM_BUFFER_SIZE",
},
{
0x0DE1,
@@ -3125,6 +3621,22 @@
"GL_TEXTURE_IMMUTABLE_FORMAT_EXT",
},
{
+ 0x8A2B,
+ "GL_MAX_VERTEX_UNIFORM_BLOCKS",
+ },
+ {
+ 0x9246,
+ "GL_OVERLAY_TRANSFORM_FLIP_HORIZONTAL_CHROMIUM",
+ },
+ {
+ 0x88EC,
+ "GL_PIXEL_UNPACK_BUFFER",
+ },
+ {
+ 0x8D8F,
+ "GL_RGB8I",
+ },
+ {
0x8059,
"GL_RGB10_A2_EXT",
},
@@ -3137,6 +3649,10 @@
"GL_PALETTE4_RGBA4_OES",
},
{
+ 0x88EB,
+ "GL_PIXEL_PACK_BUFFER",
+ },
+ {
0x8E83,
"GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS_EXT",
},
@@ -3145,6 +3661,10 @@
"GL_RGB8_OES",
},
{
+ 0x8CAD,
+ "GL_DEPTH32F_STENCIL8",
+ },
+ {
0x8052,
"GL_RGB10_EXT",
},
@@ -3153,6 +3673,10 @@
"GL_RENDERBUFFER_SAMPLES_ANGLE",
},
{
+ 0x8CAC,
+ "GL_DEPTH_COMPONENT32F",
+ },
+ {
0x8057,
"GL_RGB5_A1",
},
@@ -3161,6 +3685,10 @@
"GL_RGBA4",
},
{
+ 0x8232,
+ "GL_R8UI",
+ },
+ {
0x150A,
"GL_INVERT",
},
@@ -3201,6 +3729,26 @@
"GL_FIRST_VERTEX_CONVENTION_EXT",
},
{
+ 0x8E24,
+ "GL_TRANSFORM_FEEDBACK_ACTIVE",
+ },
+ {
+ 0x8E45,
+ "GL_TEXTURE_SWIZZLE_A",
+ },
+ {
+ 0x8E44,
+ "GL_TEXTURE_SWIZZLE_B",
+ },
+ {
+ 0x8E43,
+ "GL_TEXTURE_SWIZZLE_G",
+ },
+ {
+ 0x8E42,
+ "GL_TEXTURE_SWIZZLE_R",
+ },
+ {
0x8D20,
"GL_STENCIL_ATTACHMENT",
},
@@ -3213,6 +3761,10 @@
"GL_DEPTH_BUFFER_BIT1_QCOM",
},
{
+ 0x78EC,
+ "GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM",
+ },
+ {
0x00008000,
"GL_COVERAGE_BUFFER_BIT_NV",
},
@@ -3253,6 +3805,10 @@
"GL_STENCIL_BACK_REF",
},
{
+ 0x80E8,
+ "GL_MAX_ELEMENTS_VERTICES",
+ },
+ {
0x80CB,
"GL_BLEND_SRC_ALPHA",
},
@@ -3305,10 +3861,22 @@
"GL_COMPRESSED_RGBA_ASTC_10x6_KHR",
},
{
+ 0x80E9,
+ "GL_MAX_ELEMENTS_INDICES",
+ },
+ {
0x8CE5,
"GL_COLOR_ATTACHMENT5_EXT",
},
{
+ 0x8C84,
+ "GL_TRANSFORM_FEEDBACK_BUFFER_START",
+ },
+ {
+ 0x0BA6,
+ "GL_PATH_MODELVIEW_MATRIX_CHROMIUM",
+ },
+ {
0x8DC2,
"GL_SAMPLER_BUFFER_EXT",
},
@@ -3321,10 +3889,18 @@
"GL_MIN_SAMPLE_SHADING_VALUE_OES",
},
{
+ 0x8F97,
+ "GL_RGBA8_SNORM",
+ },
+ {
0x8CE9,
"GL_COLOR_ATTACHMENT9_EXT",
},
{
+ 0x8DAD,
+ "GL_FLOAT_32_UNSIGNED_INT_24_8_REV",
+ },
+ {
0x8B96,
"GL_PALETTE8_RGBA8_OES",
},
@@ -3333,6 +3909,10 @@
"GL_MAX_TEXTURE_IMAGE_UNITS",
},
{
+ 0x8DC6,
+ "GL_UNSIGNED_INT_VEC2",
+ },
+ {
0x8508,
"GL_DECR_WRAP",
},
@@ -3429,18 +4009,50 @@
"GL_TEXTURE_IMAGE_VALID_QCOM",
},
{
+ 0x9278,
+ "GL_COMPRESSED_RGBA8_ETC2_EAC",
+ },
+ {
+ 0x9279,
+ "GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC",
+ },
+ {
0x8DA7,
"GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT",
},
{
+ 0x9272,
+ "GL_COMPRESSED_RG11_EAC",
+ },
+ {
0x8DA8,
"GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT",
},
{
+ 0x9270,
+ "GL_COMPRESSED_R11_EAC",
+ },
+ {
+ 0x9271,
+ "GL_COMPRESSED_SIGNED_R11_EAC",
+ },
+ {
+ 0x9276,
+ "GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2",
+ },
+ {
0x887F,
"GL_GEOMETRY_SHADER_INVOCATIONS_EXT",
},
{
+ 0x8A3B,
+ "GL_UNIFORM_OFFSET",
+ },
+ {
+ 0x9275,
+ "GL_COMPRESSED_SRGB8_ETC2",
+ },
+ {
0x84D5,
"GL_TEXTURE21",
},
@@ -3553,6 +4165,10 @@
"GL_PROGRAM_SEPARABLE_EXT",
},
{
+ 0x8257,
+ "GL_PROGRAM_BINARY_RETRIEVABLE_HINT",
+ },
+ {
0x8256,
"GL_RESET_NOTIFICATION_STRATEGY_KHR",
},
@@ -3625,6 +4241,14 @@
"GL_STREAM_DRAW",
},
{
+ 0x88E2,
+ "GL_STREAM_COPY",
+ },
+ {
+ 0x88E5,
+ "GL_STATIC_READ",
+ },
+ {
0x88E4,
"GL_STATIC_DRAW",
},
@@ -3633,6 +4257,10 @@
"GL_COMPRESSED_RGBA_ASTC_5x5x5_OES",
},
{
+ 0x88E9,
+ "GL_DYNAMIC_READ",
+ },
+ {
0x88E8,
"GL_DYNAMIC_DRAW",
},
@@ -3653,6 +4281,10 @@
"GL_MULTISAMPLE_BUFFER_BIT6_QCOM",
},
{
+ 0x88EA,
+ "GL_DYNAMIC_COPY",
+ },
+ {
0x9116,
"GL_SYNC_FENCE_APPLE",
},
@@ -3665,8 +4297,12 @@
"GL_ETC1_SRGB8_NV",
},
{
- 0x78EC,
- "GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM",
+ 0x88ED,
+ "GL_PIXEL_PACK_BUFFER_BINDING",
+ },
+ {
+ 0x88EF,
+ "GL_PIXEL_UNPACK_BUFFER_BINDING",
},
{
0x93C3,
@@ -3737,10 +4373,18 @@
"GL_COLOR_CLEAR_VALUE",
},
{
+ 0x8A11,
+ "GL_UNIFORM_BUFFER",
+ },
+ {
0x8823,
"GL_WRITEONLY_RENDERING_QCOM",
},
{
+ 0x78F1,
+ "GL_MAP_CHROMIUM",
+ },
+ {
0x8824,
"GL_MAX_DRAW_BUFFERS_EXT",
},
@@ -4391,6 +5035,15 @@
arraysize(string_table), value);
}
+std::string GLES2Util::GetStringTexture3DTarget(uint32_t value) {
+ static const EnumToString string_table[] = {
+ {GL_TEXTURE_3D, "GL_TEXTURE_3D"},
+ {GL_TEXTURE_2D_ARRAY, "GL_TEXTURE_2D_ARRAY"},
+ };
+ return GLES2Util::GetQualifiedEnumString(string_table,
+ arraysize(string_table), value);
+}
+
std::string GLES2Util::GetStringTextureBindTarget(uint32_t value) {
static const EnumToString string_table[] = {
{GL_TEXTURE_2D, "GL_TEXTURE_2D"},
diff --git a/gpu/command_buffer/common/value_state.cc b/gpu/command_buffer/common/value_state.cc
new file mode 100644
index 0000000..d4dcdc2
--- /dev/null
+++ b/gpu/command_buffer/common/value_state.cc
@@ -0,0 +1,24 @@
+// Copyright (c) 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "gpu/command_buffer/common/value_state.h"
+
+namespace gpu {
+
+ValueStateMap::ValueStateMap() {
+}
+
+ValueStateMap::~ValueStateMap() {
+}
+
+const ValueState* ValueStateMap::GetState(unsigned int target) const {
+ Map::const_iterator it = state_map_.find(target);
+ return it != state_map_.end() ? &it->second : NULL;
+}
+
+void ValueStateMap::UpdateState(unsigned int target, const ValueState& state) {
+ state_map_[target] = state;
+}
+
+} // namespace gpu
diff --git a/gpu/command_buffer/common/value_state.h b/gpu/command_buffer/common/value_state.h
new file mode 100644
index 0000000..4789245
--- /dev/null
+++ b/gpu/command_buffer/common/value_state.h
@@ -0,0 +1,46 @@
+// Copyright (c) 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef GPU_COMMAND_BUFFER_COMMON_VALUE_STATE_H_
+#define GPU_COMMAND_BUFFER_COMMON_VALUE_STATE_H_
+
+#include "base/containers/hash_tables.h"
+#include "base/memory/ref_counted.h"
+#include "gpu/gpu_export.h"
+
+namespace gpu {
+
+// Used to maintain Valuebuffer state, exposed to browser to
+// support passing ValueStates via IPC.
+union GPU_EXPORT ValueState {
+ float float_value[4];
+ int int_value[4];
+};
+
+// Refcounted wrapper for a hash_map of subscription targets to ValueStates
+class GPU_EXPORT ValueStateMap : public base::RefCounted<ValueStateMap> {
+ public:
+ ValueStateMap();
+
+ // Returns NULL if there is not ValueState for the target
+ const ValueState* GetState(unsigned int target) const;
+
+ void UpdateState(unsigned int target, const ValueState& state);
+
+ protected:
+ virtual ~ValueStateMap();
+
+ private:
+ friend class base::RefCounted<ValueStateMap>;
+
+ typedef base::hash_map<unsigned int, ValueState> Map;
+
+ Map state_map_;
+
+ DISALLOW_COPY_AND_ASSIGN(ValueStateMap);
+};
+
+} // namespace gpu
+
+#endif // GPU_COMMAND_BUFFER_COMMON_VALUE_STATE_H_
diff --git a/gpu/command_buffer/service/context_group.cc b/gpu/command_buffer/service/context_group.cc
index 6ee57e4..0206d88 100644
--- a/gpu/command_buffer/service/context_group.cc
+++ b/gpu/command_buffer/service/context_group.cc
@@ -32,10 +32,12 @@
const scoped_refptr<MemoryTracker>& memory_tracker,
const scoped_refptr<ShaderTranslatorCache>& shader_translator_cache,
const scoped_refptr<FeatureInfo>& feature_info,
+ const scoped_refptr<ValueStateMap>& pending_valuebuffer_state,
bool bind_generates_resource)
: mailbox_manager_(mailbox_manager),
memory_tracker_(memory_tracker),
shader_translator_cache_(shader_translator_cache),
+ pending_valuebuffer_state_(pending_valuebuffer_state),
enforce_gl_minimums_(CommandLine::ForCurrentProcess()->HasSwitch(
switches::kEnforceGLMinimums)),
bind_generates_resource_(bind_generates_resource),
@@ -54,6 +56,8 @@
{
if (!mailbox_manager_.get())
mailbox_manager_ = new MailboxManagerImpl;
+ if (!pending_valuebuffer_state_.get())
+ pending_valuebuffer_state_ = new ValueStateMap();
if (!feature_info.get())
feature_info_ = new FeatureInfo;
TransferBufferManager* manager = new TransferBufferManager();
@@ -122,8 +126,9 @@
renderbuffer_manager_.reset(new RenderbufferManager(
memory_tracker_.get(), max_renderbuffer_size, max_samples,
depth24_supported));
- valuebuffer_manager_.reset(new ValuebufferManager());
shader_manager_.reset(new ShaderManager());
+ valuebuffer_manager_.reset(
+ new ValuebufferManager(pending_valuebuffer_state_.get()));
// Lookup GL things we need to know.
const GLint kGLES2RequiredMinimumVertexAttribs = 8u;
@@ -302,11 +307,6 @@
renderbuffer_manager_.reset();
}
- if (valuebuffer_manager_ != NULL) {
- valuebuffer_manager_->Destroy();
- valuebuffer_manager_.reset();
- }
-
if (texture_manager_ != NULL) {
texture_manager_->Destroy(have_context);
texture_manager_.reset();
@@ -322,6 +322,11 @@
shader_manager_.reset();
}
+ if (valuebuffer_manager_ != NULL) {
+ valuebuffer_manager_->Destroy();
+ valuebuffer_manager_.reset();
+ }
+
memory_tracker_ = NULL;
}
diff --git a/gpu/command_buffer/service/context_group.h b/gpu/command_buffer/service/context_group.h
index eb53252..b6b6483 100644
--- a/gpu/command_buffer/service/context_group.h
+++ b/gpu/command_buffer/service/context_group.h
@@ -22,6 +22,7 @@
namespace gpu {
class TransferBufferManagerInterface;
+class ValueStateMap;
namespace gles2 {
@@ -47,6 +48,7 @@
const scoped_refptr<MemoryTracker>& memory_tracker,
const scoped_refptr<ShaderTranslatorCache>& shader_translator_cache,
const scoped_refptr<FeatureInfo>& feature_info,
+ const scoped_refptr<ValueStateMap>& pending_valuebuffer_state,
bool bind_generates_resource);
// This should only be called by GLES2Decoder. This must be paired with a
@@ -131,6 +133,10 @@
return valuebuffer_manager_.get();
}
+ ValueStateMap* pending_valuebuffer_state() const {
+ return pending_valuebuffer_state_.get();
+ }
+
TextureManager* texture_manager() const {
return texture_manager_.get();
}
@@ -182,6 +188,7 @@
scoped_refptr<MemoryTracker> memory_tracker_;
scoped_refptr<ShaderTranslatorCache> shader_translator_cache_;
scoped_ptr<TransferBufferManagerInterface> transfer_buffer_manager_;
+ scoped_refptr<gpu::ValueStateMap> pending_valuebuffer_state_;
bool enforce_gl_minimums_;
bool bind_generates_resource_;
@@ -204,14 +211,14 @@
scoped_ptr<RenderbufferManager> renderbuffer_manager_;
- scoped_ptr<ValuebufferManager> valuebuffer_manager_;
-
scoped_ptr<TextureManager> texture_manager_;
scoped_ptr<ProgramManager> program_manager_;
scoped_ptr<ShaderManager> shader_manager_;
+ scoped_ptr<ValuebufferManager> valuebuffer_manager_;
+
scoped_refptr<FeatureInfo> feature_info_;
std::vector<base::WeakPtr<gles2::GLES2Decoder> > decoders_;
diff --git a/gpu/command_buffer/service/context_group_unittest.cc b/gpu/command_buffer/service/context_group_unittest.cc
index 13e5dc8..98e8e3c 100644
--- a/gpu/command_buffer/service/context_group_unittest.cc
+++ b/gpu/command_buffer/service/context_group_unittest.cc
@@ -5,6 +5,7 @@
#include "gpu/command_buffer/service/context_group.h"
#include "base/memory/scoped_ptr.h"
+#include "gpu/command_buffer/common/value_state.h"
#include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h"
#include "gpu/command_buffer/service/gpu_service_test.h"
#include "gpu/command_buffer/service/mailbox_manager.h"
@@ -39,7 +40,7 @@
GpuServiceTest::SetUp();
decoder_.reset(new MockGLES2Decoder());
group_ = scoped_refptr<ContextGroup>(
- new ContextGroup(NULL, NULL, NULL, NULL, kBindGeneratesResource));
+ new ContextGroup(NULL, NULL, NULL, NULL, NULL, kBindGeneratesResource));
}
scoped_ptr<MockGLES2Decoder> decoder_;
diff --git a/gpu/command_buffer/service/feature_info.cc b/gpu/command_buffer/service/feature_info.cc
index 6dd1f34..9fec2e1 100644
--- a/gpu/command_buffer/service/feature_info.cc
+++ b/gpu/command_buffer/service/feature_info.cc
@@ -145,7 +145,9 @@
ext_texture_storage(false),
chromium_path_rendering(false),
blend_equation_advanced(false),
- blend_equation_advanced_coherent(false) {
+ blend_equation_advanced_coherent(false),
+ ext_texture_rg(false),
+ enable_subscribe_uniform(false) {
}
FeatureInfo::Workarounds::Workarounds() :
@@ -179,6 +181,9 @@
feature_flags_.is_swiftshader =
(command_line.GetSwitchValueASCII(switches::kUseGL) == "swiftshader");
+ feature_flags_.enable_subscribe_uniform =
+ command_line.HasSwitch(switches::kEnableSubscribeUniformExtension);
+
static const GLenum kAlphaTypes[] = {
GL_UNSIGNED_BYTE,
};
@@ -226,6 +231,39 @@
return true;
}
+bool IsGL_REDSupportedOnFBOs() {
+ // Skia uses GL_RED with frame buffers, unfortunately, Mesa claims to support
+ // GL_EXT_texture_rg, but it doesn't support it on frame buffers. To fix
+ // this, we try it, and if it fails, we don't expose GL_EXT_texture_rg.
+ GLint fb_binding = 0;
+ GLint tex_binding = 0;
+ glGetIntegerv(GL_FRAMEBUFFER_BINDING, &fb_binding);
+ glGetIntegerv(GL_TEXTURE_BINDING_2D, &tex_binding);
+
+ GLuint textureId = 0;
+ glGenTextures(1, &textureId);
+ glBindTexture(GL_TEXTURE_2D, textureId);
+ GLubyte data[1] = {0};
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RED_EXT, 1, 1, 0, GL_RED_EXT,
+ GL_UNSIGNED_BYTE, data);
+ GLuint textureFBOID = 0;
+ glGenFramebuffersEXT(1, &textureFBOID);
+ glBindFramebufferEXT(GL_FRAMEBUFFER, textureFBOID);
+ glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
+ textureId, 0);
+ bool result =
+ glCheckFramebufferStatusEXT(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_UNSUPPORTED;
+ glDeleteFramebuffersEXT(1, &textureFBOID);
+ glDeleteTextures(1, &textureId);
+
+ glBindFramebufferEXT(GL_FRAMEBUFFER, static_cast<GLuint>(fb_binding));
+ glBindTexture(GL_TEXTURE_2D, static_cast<GLuint>(tex_binding));
+
+ DCHECK(glGetError() == GL_NO_ERROR);
+
+ return result;
+}
+
void FeatureInfo::InitializeFeatures() {
// Figure out what extensions to turn on.
StringSet extensions(
@@ -261,6 +299,10 @@
AddExtensionString("GL_CHROMIUM_texture_mailbox");
AddExtensionString("GL_EXT_debug_marker");
+ if (feature_flags_.enable_subscribe_uniform) {
+ AddExtensionString("GL_CHROMIUM_subscribe_uniform");
+ }
+
// OES_vertex_array_object is emulated if not present natively,
// so the extension string is always exposed.
AddExtensionString("GL_OES_vertex_array_object");
@@ -394,8 +436,14 @@
validators_.index_type.AddValue(GL_UNSIGNED_INT);
}
- if (is_es3 || extensions.Contains("GL_EXT_sRGB") ||
- gfx::HasDesktopGLFeatures()) {
+ // With EXT_sRGB, unsized SRGB_EXT and SRGB_ALPHA_EXT are accepted by the
+ // <format> and <internalformat> parameter of TexImage2D. GLES3 adds support
+ // for SRGB Textures but the accepted internal formats for TexImage2D are only
+ // sized formats GL_SRGB8 and GL_SRGB8_ALPHA8. Also, SRGB_EXT isn't a valid
+ // <format> in this case. So, even with GLES3 explicitly check for
+ // GL_EXT_sRGB.
+ if (((is_es3 || extensions.Contains("GL_OES_rgb8_rgba8")) &&
+ extensions.Contains("GL_EXT_sRGB")) || gfx::HasDesktopGLFeatures()) {
AddExtensionString("GL_EXT_sRGB");
texture_format_validators_[GL_SRGB_EXT].AddValue(GL_UNSIGNED_BYTE);
texture_format_validators_[GL_SRGB_ALPHA_EXT].AddValue(GL_UNSIGNED_BYTE);
@@ -933,6 +981,34 @@
validators_.g_l_state.AddValue(GL_PATH_PROJECTION_MATRIX_CHROMIUM);
}
}
+
+ if ((is_es3 || extensions.Contains("GL_EXT_texture_rg") ||
+ extensions.Contains("GL_ARB_texture_rg")) &&
+ IsGL_REDSupportedOnFBOs()) {
+ feature_flags_.ext_texture_rg = true;
+ AddExtensionString("GL_EXT_texture_rg");
+
+ validators_.texture_format.AddValue(GL_RED_EXT);
+ validators_.texture_format.AddValue(GL_RG_EXT);
+ validators_.texture_internal_format.AddValue(GL_RED_EXT);
+ validators_.texture_internal_format.AddValue(GL_RG_EXT);
+ validators_.read_pixel_format.AddValue(GL_RED_EXT);
+ validators_.read_pixel_format.AddValue(GL_RG_EXT);
+ validators_.render_buffer_format.AddValue(GL_R8_EXT);
+ validators_.render_buffer_format.AddValue(GL_RG8_EXT);
+
+ texture_format_validators_[GL_RED_EXT].AddValue(GL_UNSIGNED_BYTE);
+ texture_format_validators_[GL_RG_EXT].AddValue(GL_UNSIGNED_BYTE);
+
+ if (enable_texture_float) {
+ texture_format_validators_[GL_RED_EXT].AddValue(GL_FLOAT);
+ texture_format_validators_[GL_RG_EXT].AddValue(GL_FLOAT);
+ }
+ if (enable_texture_half_float) {
+ texture_format_validators_[GL_RED_EXT].AddValue(GL_HALF_FLOAT_OES);
+ texture_format_validators_[GL_RG_EXT].AddValue(GL_HALF_FLOAT_OES);
+ }
+ }
}
void FeatureInfo::AddExtensionString(const char* s) {
diff --git a/gpu/command_buffer/service/feature_info.h b/gpu/command_buffer/service/feature_info.h
index b69f2e4..816ab49 100644
--- a/gpu/command_buffer/service/feature_info.h
+++ b/gpu/command_buffer/service/feature_info.h
@@ -73,6 +73,8 @@
bool chromium_path_rendering;
bool blend_equation_advanced;
bool blend_equation_advanced_coherent;
+ bool ext_texture_rg;
+ bool enable_subscribe_uniform;
};
struct Workarounds {
diff --git a/gpu/command_buffer/service/feature_info_unittest.cc b/gpu/command_buffer/service/feature_info_unittest.cc
index 53dbf6c..b314262 100644
--- a/gpu/command_buffer/service/feature_info_unittest.cc
+++ b/gpu/command_buffer/service/feature_info_unittest.cc
@@ -455,7 +455,7 @@
}
TEST_F(FeatureInfoTest, InitializeEXT_sRGB) {
- SetupInitExpectations("GL_EXT_sRGB");
+ SetupInitExpectations("GL_EXT_sRGB GL_OES_rgb8_rgba8");
EXPECT_THAT(info_->extensions(),
HasSubstr("GL_EXT_sRGB"));
EXPECT_TRUE(info_->GetTextureFormatValidator(GL_SRGB_EXT).IsValid(
@@ -690,6 +690,27 @@
GL_FLOAT));
}
+TEST_F(FeatureInfoTest, Initialize_sRGBGLES3) {
+ SetupInitExpectationsWithGLVersion("", "", "OpenGL ES 3.0");
+ EXPECT_THAT(info_->extensions(), Not(HasSubstr("GL_EXT_sRGB")));
+ EXPECT_FALSE(info_->GetTextureFormatValidator(GL_SRGB_EXT).IsValid(
+ GL_UNSIGNED_BYTE));
+ EXPECT_FALSE(info_->GetTextureFormatValidator(GL_SRGB_ALPHA_EXT).IsValid(
+ GL_UNSIGNED_BYTE));
+ EXPECT_FALSE(info_->validators()->texture_format.IsValid(
+ GL_SRGB_EXT));
+ EXPECT_FALSE(info_->validators()->texture_format.IsValid(
+ GL_SRGB_ALPHA_EXT));
+ EXPECT_FALSE(info_->validators()->texture_internal_format.IsValid(
+ GL_SRGB_EXT));
+ EXPECT_FALSE(info_->validators()->texture_internal_format.IsValid(
+ GL_SRGB_ALPHA_EXT));
+ EXPECT_FALSE(info_->validators()->render_buffer_format.IsValid(
+ GL_SRGB8_ALPHA8_EXT));
+ EXPECT_FALSE(info_->validators()->frame_buffer_parameter.IsValid(
+ GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT));
+}
+
TEST_F(FeatureInfoTest, InitializeOES_texture_floatGLES2) {
SetupInitExpectations("GL_OES_texture_float");
EXPECT_FALSE(info_->feature_flags().enable_texture_float_linear);
@@ -1402,5 +1423,57 @@
EXPECT_TRUE(info_->feature_flags().blend_equation_advanced_coherent);
}
+TEST_F(FeatureInfoTest, InitializeEXT_texture_rgWithFloat) {
+ SetupInitExpectations(
+ "GL_EXT_texture_rg GL_OES_texture_float GL_OES_texture_half_float");
+ EXPECT_TRUE(info_->feature_flags().ext_texture_rg);
+
+ EXPECT_TRUE(info_->validators()->texture_format.IsValid(GL_RED_EXT));
+ EXPECT_TRUE(info_->validators()->texture_format.IsValid(GL_RG_EXT));
+ EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid(GL_RED_EXT));
+ EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid(GL_RG_EXT));
+ EXPECT_TRUE(info_->validators()->read_pixel_format.IsValid(GL_RED_EXT));
+ EXPECT_TRUE(info_->validators()->read_pixel_format.IsValid(GL_RG_EXT));
+ EXPECT_TRUE(info_->validators()->render_buffer_format.IsValid(GL_R8_EXT));
+ EXPECT_TRUE(info_->validators()->render_buffer_format.IsValid(GL_RG8_EXT));
+
+ EXPECT_TRUE(
+ info_->GetTextureFormatValidator(GL_RED_EXT).IsValid(GL_HALF_FLOAT_OES));
+ EXPECT_TRUE(
+ info_->GetTextureFormatValidator(GL_RG_EXT).IsValid(GL_HALF_FLOAT_OES));
+ EXPECT_TRUE(
+ info_->GetTextureFormatValidator(GL_RED_EXT).IsValid(GL_UNSIGNED_BYTE));
+ EXPECT_TRUE(
+ info_->GetTextureFormatValidator(GL_RG_EXT).IsValid(GL_UNSIGNED_BYTE));
+
+ EXPECT_FALSE(info_->GetTextureFormatValidator(GL_RED_EXT).IsValid(GL_BYTE));
+ EXPECT_FALSE(info_->GetTextureFormatValidator(GL_RG_EXT).IsValid(GL_BYTE));
+ EXPECT_FALSE(info_->GetTextureFormatValidator(GL_RED_EXT).IsValid(GL_SHORT));
+ EXPECT_FALSE(info_->GetTextureFormatValidator(GL_RG_EXT).IsValid(GL_SHORT));
+}
+
+TEST_F(FeatureInfoTest, InitializeARB_texture_rgNoFloat) {
+ SetupInitExpectations("GL_ARB_texture_rg");
+ EXPECT_TRUE(info_->feature_flags().ext_texture_rg);
+
+ EXPECT_TRUE(info_->validators()->texture_format.IsValid(GL_RED_EXT));
+ EXPECT_TRUE(info_->validators()->texture_format.IsValid(GL_RG_EXT));
+ EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid(GL_RED_EXT));
+ EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid(GL_RG_EXT));
+ EXPECT_TRUE(info_->validators()->read_pixel_format.IsValid(GL_RED_EXT));
+ EXPECT_TRUE(info_->validators()->read_pixel_format.IsValid(GL_RG_EXT));
+ EXPECT_TRUE(info_->validators()->render_buffer_format.IsValid(GL_R8_EXT));
+ EXPECT_TRUE(info_->validators()->render_buffer_format.IsValid(GL_RG8_EXT));
+
+ EXPECT_FALSE(
+ info_->GetTextureFormatValidator(GL_RED_EXT).IsValid(GL_HALF_FLOAT_OES));
+ EXPECT_FALSE(
+ info_->GetTextureFormatValidator(GL_RG_EXT).IsValid(GL_HALF_FLOAT_OES));
+ EXPECT_TRUE(
+ info_->GetTextureFormatValidator(GL_RED_EXT).IsValid(GL_UNSIGNED_BYTE));
+ EXPECT_TRUE(
+ info_->GetTextureFormatValidator(GL_RG_EXT).IsValid(GL_UNSIGNED_BYTE));
+}
+
} // namespace gles2
} // namespace gpu
diff --git a/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc b/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc
index 49bba9b..ffb9370 100644
--- a/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc
+++ b/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc
@@ -218,6 +218,7 @@
GLuint source_id,
GLuint dest_id,
GLint dest_level,
+ GLenum dest_internal_format,
GLsizei width,
GLsizei height,
GLuint framebuffer) {
@@ -230,8 +231,14 @@
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glCopyTexSubImage2D(GL_TEXTURE_2D, dest_level, 0 /* xoffset */,
- 0 /* yoffset */, 0 /* x */, 0 /* y */, width, height);
+ glCopyTexImage2D(GL_TEXTURE_2D,
+ dest_level,
+ dest_internal_format,
+ 0 /* x */,
+ 0 /* y */,
+ width,
+ height,
+ 0 /* border */);
}
decoder->RestoreTextureState(source_id);
@@ -325,15 +332,16 @@
bool source_format_contain_superset_of_dest_format =
source_internal_format == dest_internal_format ||
(source_internal_format == GL_RGBA && dest_internal_format == GL_RGB);
- bool source_target_allowed = source_target == GL_TEXTURE_2D ||
- source_target == GL_TEXTURE_RECTANGLE_ARB;
- if (source_target_allowed && !flip_y && !premultiply_alpha_change &&
+ // GL_TEXTURE_RECTANGLE_ARB on FBO is supported by OpenGL, not GLES2,
+ // so restrict this to GL_TEXTURE_2D.
+ if (source_target == GL_TEXTURE_2D && !flip_y && !premultiply_alpha_change &&
source_format_contain_superset_of_dest_format) {
DoCopyTexImage2D(decoder,
source_target,
source_id,
dest_id,
dest_level,
+ dest_internal_format,
width,
height,
framebuffer_);
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index dec594b..422168c 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -542,7 +542,8 @@
GLES2Decoder::GLES2Decoder()
: initialized_(false),
debug_(false),
- log_commands_(false) {
+ log_commands_(false),
+ unsafe_es3_apis_enabled_(false) {
}
GLES2Decoder::~GLES2Decoder() {
@@ -629,7 +630,13 @@
return vertex_array_manager_.get();
}
ImageManager* GetImageManager() override { return image_manager_.get(); }
+
+ ValuebufferManager* GetValuebufferManager() override {
+ return valuebuffer_manager();
+ }
+
bool ProcessPendingQueries(bool did_finish) override;
+
bool HasMoreIdleWork() override;
void PerformIdleWork() override;
@@ -1366,6 +1373,11 @@
GLenum target, GLenum attachment, GLenum textarget,
GLuint texture, GLint level, GLsizei samples);
+ // Wrapper for glFramebufferTextureLayer.
+ void DoFramebufferTextureLayer(
+ GLenum target, GLenum attachment, GLuint texture, GLint level,
+ GLint layer);
+
// Wrapper for glGenerateMipmap
void DoGenerateMipmap(GLenum target);
@@ -2427,10 +2439,14 @@
set_log_commands(true);
}
+ if (CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kEnableUnsafeES3APIs)) {
+ set_unsafe_es3_apis_enabled(true);
+ }
+
compile_shader_always_succeeds_ = CommandLine::ForCurrentProcess()->HasSwitch(
switches::kCompileShaderAlwaysSucceeds);
-
// Take ownership of the context and surface. The surface can be replaced with
// SetSurface.
context_ = context;
@@ -2839,6 +2855,7 @@
feature_info_->feature_flags().blend_equation_advanced;
caps.blend_equation_advanced_coherent =
feature_info_->feature_flags().blend_equation_advanced_coherent;
+ caps.texture_rg = feature_info_->feature_flags().ext_texture_rg;
return caps;
}
@@ -5364,6 +5381,25 @@
OnFboChanged();
}
+void GLES2DecoderImpl::DoFramebufferTextureLayer(
+ GLenum target, GLenum attachment, GLuint client_texture_id,
+ GLint level, GLint layer) {
+ // TODO(zmo): Unsafe ES3 API, missing states update.
+ GLuint service_id = 0;
+ TextureRef* texture_ref = NULL;
+ if (client_texture_id) {
+ texture_ref = GetTexture(client_texture_id);
+ if (!texture_ref) {
+ LOCAL_SET_GL_ERROR(
+ GL_INVALID_OPERATION,
+ "glFramebufferTextureLayer", "unknown texture_ref");
+ return;
+ }
+ service_id = texture_ref->service_id();
+ }
+ glFramebufferTextureLayer(target, attachment, service_id, level, layer);
+}
+
void GLES2DecoderImpl::DoGetFramebufferAttachmentParameteriv(
GLenum target, GLenum attachment, GLenum pname, GLint* params) {
Framebuffer* framebuffer = GetFramebufferInfoForTarget(target);
@@ -7415,6 +7451,24 @@
}
}
+error::Error GLES2DecoderImpl::HandleVertexAttribIPointer(
+ uint32 immediate_data_size,
+ const void* cmd_data) {
+ // TODO(zmo): Unsafe ES3 API, missing states update.
+ if (!unsafe_es3_apis_enabled())
+ return error::kUnknownCommand;
+ const gles2::cmds::VertexAttribIPointer& c =
+ *static_cast<const gles2::cmds::VertexAttribIPointer*>(cmd_data);
+ GLuint indx = c.indx;
+ GLint size = c.size;
+ GLenum type = c.type;
+ GLsizei stride = c.stride;
+ GLsizei offset = c.offset;
+ const void* ptr = reinterpret_cast<const void*>(offset);
+ glVertexAttribIPointer(indx, size, type, stride, ptr);
+ return error::kNoError;
+}
+
error::Error GLES2DecoderImpl::HandleVertexAttribPointer(
uint32 immediate_data_size,
const void* cmd_data) {
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.h b/gpu/command_buffer/service/gles2_cmd_decoder.h
index 63618c2..670ce75 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.h
@@ -39,6 +39,7 @@
class Logger;
class QueryManager;
class VertexArrayManager;
+class ValuebufferManager;
struct ContextState;
struct DisallowedFeatures {
@@ -78,6 +79,14 @@
initialized_ = true;
}
+ bool unsafe_es3_apis_enabled() const {
+ return unsafe_es3_apis_enabled_;
+ }
+
+ void set_unsafe_es3_apis_enabled(bool enabled) {
+ unsafe_es3_apis_enabled_ = enabled;
+ }
+
bool debug() const {
return debug_;
}
@@ -170,6 +179,9 @@
// Gets the ImageManager for this context.
virtual ImageManager* GetImageManager() = 0;
+ // Gets the ValuebufferManager for this context.
+ virtual ValuebufferManager* GetValuebufferManager() = 0;
+
// Process any pending queries. Returns false if there are no pending queries.
virtual bool ProcessPendingQueries(bool did_finish) = 0;
@@ -251,6 +263,7 @@
bool initialized_;
bool debug_;
bool log_commands_;
+ bool unsafe_es3_apis_enabled_;
DISALLOW_COPY_AND_ASSIGN(GLES2Decoder);
};
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
index ee3bba5..ebdb625 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
@@ -416,6 +416,27 @@
return error::kNoError;
}
+error::Error GLES2DecoderImpl::HandleCopyBufferSubData(
+ uint32_t immediate_data_size,
+ const void* cmd_data) {
+ if (!unsafe_es3_apis_enabled())
+ return error::kUnknownCommand;
+ const gles2::cmds::CopyBufferSubData& c =
+ *static_cast<const gles2::cmds::CopyBufferSubData*>(cmd_data);
+ (void)c;
+ GLenum readtarget = static_cast<GLenum>(c.readtarget);
+ GLenum writetarget = static_cast<GLenum>(c.writetarget);
+ GLintptr readoffset = static_cast<GLintptr>(c.readoffset);
+ GLintptr writeoffset = static_cast<GLintptr>(c.writeoffset);
+ GLsizeiptr size = static_cast<GLsizeiptr>(c.size);
+ if (size < 0) {
+ LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopyBufferSubData", "size < 0");
+ return error::kNoError;
+ }
+ glCopyBufferSubData(readtarget, writetarget, readoffset, writeoffset, size);
+ return error::kNoError;
+}
+
error::Error GLES2DecoderImpl::HandleCopyTexImage2D(
uint32_t immediate_data_size,
const void* cmd_data) {
@@ -798,6 +819,23 @@
return error::kNoError;
}
+error::Error GLES2DecoderImpl::HandleFramebufferTextureLayer(
+ uint32_t immediate_data_size,
+ const void* cmd_data) {
+ if (!unsafe_es3_apis_enabled())
+ return error::kUnknownCommand;
+ const gles2::cmds::FramebufferTextureLayer& c =
+ *static_cast<const gles2::cmds::FramebufferTextureLayer*>(cmd_data);
+ (void)c;
+ GLenum target = static_cast<GLenum>(c.target);
+ GLenum attachment = static_cast<GLenum>(c.attachment);
+ GLuint texture = c.texture;
+ GLint level = static_cast<GLint>(c.level);
+ GLint layer = static_cast<GLint>(c.layer);
+ DoFramebufferTextureLayer(target, attachment, texture, level, layer);
+ return error::kNoError;
+}
+
error::Error GLES2DecoderImpl::HandleFrontFace(uint32_t immediate_data_size,
const void* cmd_data) {
const gles2::cmds::FrontFace& c =
@@ -1117,6 +1155,47 @@
return error::kNoError;
}
+error::Error GLES2DecoderImpl::HandleGetInternalformativ(
+ uint32_t immediate_data_size,
+ const void* cmd_data) {
+ if (!unsafe_es3_apis_enabled())
+ return error::kUnknownCommand;
+ const gles2::cmds::GetInternalformativ& c =
+ *static_cast<const gles2::cmds::GetInternalformativ*>(cmd_data);
+ (void)c;
+ GLenum target = static_cast<GLenum>(c.target);
+ GLenum format = static_cast<GLenum>(c.format);
+ GLenum pname = static_cast<GLenum>(c.pname);
+ GLsizei bufSize = static_cast<GLsizei>(c.bufSize);
+ typedef cmds::GetInternalformativ::Result Result;
+ GLsizei num_values = 0;
+ GetNumValuesReturnedForGLGet(pname, &num_values);
+ Result* result = GetSharedMemoryAs<Result*>(
+ c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
+ GLint* params = result ? result->GetData() : NULL;
+ if (bufSize < 0) {
+ LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glGetInternalformativ",
+ "bufSize < 0");
+ return error::kNoError;
+ }
+ if (params == NULL) {
+ return error::kOutOfBounds;
+ }
+ LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetInternalformativ");
+ // Check that the client initialized the result.
+ if (result->size != 0) {
+ return error::kInvalidArguments;
+ }
+ glGetInternalformativ(target, format, pname, bufSize, params);
+ GLenum error = glGetError();
+ if (error == GL_NO_ERROR) {
+ result->SetNumResults(num_values);
+ } else {
+ LOCAL_SET_GL_ERROR(error, "GetInternalformativ", "");
+ }
+ return error::kNoError;
+}
+
error::Error GLES2DecoderImpl::HandleGetProgramiv(uint32_t immediate_data_size,
const void* cmd_data) {
const gles2::cmds::GetProgramiv& c =
@@ -1966,6 +2045,39 @@
return error::kNoError;
}
+error::Error GLES2DecoderImpl::HandleTexStorage3D(uint32_t immediate_data_size,
+ const void* cmd_data) {
+ if (!unsafe_es3_apis_enabled())
+ return error::kUnknownCommand;
+ const gles2::cmds::TexStorage3D& c =
+ *static_cast<const gles2::cmds::TexStorage3D*>(cmd_data);
+ (void)c;
+ GLenum target = static_cast<GLenum>(c.target);
+ GLsizei levels = static_cast<GLsizei>(c.levels);
+ GLenum internalFormat = static_cast<GLenum>(c.internalFormat);
+ GLsizei width = static_cast<GLsizei>(c.width);
+ GLsizei height = static_cast<GLsizei>(c.height);
+ GLsizei depth = static_cast<GLsizei>(c.depth);
+ if (levels < 0) {
+ LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glTexStorage3D", "levels < 0");
+ return error::kNoError;
+ }
+ if (width < 0) {
+ LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glTexStorage3D", "width < 0");
+ return error::kNoError;
+ }
+ if (height < 0) {
+ LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glTexStorage3D", "height < 0");
+ return error::kNoError;
+ }
+ if (depth < 0) {
+ LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glTexStorage3D", "depth < 0");
+ return error::kNoError;
+ }
+ glTexStorage3D(target, levels, internalFormat, width, height, depth);
+ return error::kNoError;
+}
+
error::Error GLES2DecoderImpl::HandleUniform1f(uint32_t immediate_data_size,
const void* cmd_data) {
const gles2::cmds::Uniform1f& c =
@@ -2039,6 +2151,48 @@
return error::kNoError;
}
+error::Error GLES2DecoderImpl::HandleUniform1ui(uint32_t immediate_data_size,
+ const void* cmd_data) {
+ if (!unsafe_es3_apis_enabled())
+ return error::kUnknownCommand;
+ const gles2::cmds::Uniform1ui& c =
+ *static_cast<const gles2::cmds::Uniform1ui*>(cmd_data);
+ (void)c;
+ GLint location = static_cast<GLint>(c.location);
+ GLuint x = static_cast<GLuint>(c.x);
+ GLuint temp[1] = {
+ x,
+ };
+ glUniform1uiv(location, 1, &temp[0]);
+ return error::kNoError;
+}
+
+error::Error GLES2DecoderImpl::HandleUniform1uivImmediate(
+ uint32_t immediate_data_size,
+ const void* cmd_data) {
+ if (!unsafe_es3_apis_enabled())
+ return error::kUnknownCommand;
+ const gles2::cmds::Uniform1uivImmediate& c =
+ *static_cast<const gles2::cmds::Uniform1uivImmediate*>(cmd_data);
+ (void)c;
+ GLint location = static_cast<GLint>(c.location);
+ GLsizei count = static_cast<GLsizei>(c.count);
+ uint32_t data_size;
+ if (!ComputeDataSize(count, sizeof(GLuint), 1, &data_size)) {
+ return error::kOutOfBounds;
+ }
+ if (data_size > immediate_data_size) {
+ return error::kOutOfBounds;
+ }
+ const GLuint* v =
+ GetImmediateDataAs<const GLuint*>(c, data_size, immediate_data_size);
+ if (v == NULL) {
+ return error::kOutOfBounds;
+ }
+ glUniform1uiv(location, count, v);
+ return error::kNoError;
+}
+
error::Error GLES2DecoderImpl::HandleUniform2f(uint32_t immediate_data_size,
const void* cmd_data) {
const gles2::cmds::Uniform2f& c =
@@ -2117,6 +2271,49 @@
return error::kNoError;
}
+error::Error GLES2DecoderImpl::HandleUniform2ui(uint32_t immediate_data_size,
+ const void* cmd_data) {
+ if (!unsafe_es3_apis_enabled())
+ return error::kUnknownCommand;
+ const gles2::cmds::Uniform2ui& c =
+ *static_cast<const gles2::cmds::Uniform2ui*>(cmd_data);
+ (void)c;
+ GLint location = static_cast<GLint>(c.location);
+ GLuint x = static_cast<GLuint>(c.x);
+ GLuint y = static_cast<GLuint>(c.y);
+ GLuint temp[2] = {
+ x, y,
+ };
+ glUniform2uiv(location, 1, &temp[0]);
+ return error::kNoError;
+}
+
+error::Error GLES2DecoderImpl::HandleUniform2uivImmediate(
+ uint32_t immediate_data_size,
+ const void* cmd_data) {
+ if (!unsafe_es3_apis_enabled())
+ return error::kUnknownCommand;
+ const gles2::cmds::Uniform2uivImmediate& c =
+ *static_cast<const gles2::cmds::Uniform2uivImmediate*>(cmd_data);
+ (void)c;
+ GLint location = static_cast<GLint>(c.location);
+ GLsizei count = static_cast<GLsizei>(c.count);
+ uint32_t data_size;
+ if (!ComputeDataSize(count, sizeof(GLuint), 2, &data_size)) {
+ return error::kOutOfBounds;
+ }
+ if (data_size > immediate_data_size) {
+ return error::kOutOfBounds;
+ }
+ const GLuint* v =
+ GetImmediateDataAs<const GLuint*>(c, data_size, immediate_data_size);
+ if (v == NULL) {
+ return error::kOutOfBounds;
+ }
+ glUniform2uiv(location, count, v);
+ return error::kNoError;
+}
+
error::Error GLES2DecoderImpl::HandleUniform3f(uint32_t immediate_data_size,
const void* cmd_data) {
const gles2::cmds::Uniform3f& c =
@@ -2197,6 +2394,50 @@
return error::kNoError;
}
+error::Error GLES2DecoderImpl::HandleUniform3ui(uint32_t immediate_data_size,
+ const void* cmd_data) {
+ if (!unsafe_es3_apis_enabled())
+ return error::kUnknownCommand;
+ const gles2::cmds::Uniform3ui& c =
+ *static_cast<const gles2::cmds::Uniform3ui*>(cmd_data);
+ (void)c;
+ GLint location = static_cast<GLint>(c.location);
+ GLuint x = static_cast<GLuint>(c.x);
+ GLuint y = static_cast<GLuint>(c.y);
+ GLuint z = static_cast<GLuint>(c.z);
+ GLuint temp[3] = {
+ x, y, z,
+ };
+ glUniform3uiv(location, 1, &temp[0]);
+ return error::kNoError;
+}
+
+error::Error GLES2DecoderImpl::HandleUniform3uivImmediate(
+ uint32_t immediate_data_size,
+ const void* cmd_data) {
+ if (!unsafe_es3_apis_enabled())
+ return error::kUnknownCommand;
+ const gles2::cmds::Uniform3uivImmediate& c =
+ *static_cast<const gles2::cmds::Uniform3uivImmediate*>(cmd_data);
+ (void)c;
+ GLint location = static_cast<GLint>(c.location);
+ GLsizei count = static_cast<GLsizei>(c.count);
+ uint32_t data_size;
+ if (!ComputeDataSize(count, sizeof(GLuint), 3, &data_size)) {
+ return error::kOutOfBounds;
+ }
+ if (data_size > immediate_data_size) {
+ return error::kOutOfBounds;
+ }
+ const GLuint* v =
+ GetImmediateDataAs<const GLuint*>(c, data_size, immediate_data_size);
+ if (v == NULL) {
+ return error::kOutOfBounds;
+ }
+ glUniform3uiv(location, count, v);
+ return error::kNoError;
+}
+
error::Error GLES2DecoderImpl::HandleUniform4f(uint32_t immediate_data_size,
const void* cmd_data) {
const gles2::cmds::Uniform4f& c =
@@ -2279,6 +2520,51 @@
return error::kNoError;
}
+error::Error GLES2DecoderImpl::HandleUniform4ui(uint32_t immediate_data_size,
+ const void* cmd_data) {
+ if (!unsafe_es3_apis_enabled())
+ return error::kUnknownCommand;
+ const gles2::cmds::Uniform4ui& c =
+ *static_cast<const gles2::cmds::Uniform4ui*>(cmd_data);
+ (void)c;
+ GLint location = static_cast<GLint>(c.location);
+ GLuint x = static_cast<GLuint>(c.x);
+ GLuint y = static_cast<GLuint>(c.y);
+ GLuint z = static_cast<GLuint>(c.z);
+ GLuint w = static_cast<GLuint>(c.w);
+ GLuint temp[4] = {
+ x, y, z, w,
+ };
+ glUniform4uiv(location, 1, &temp[0]);
+ return error::kNoError;
+}
+
+error::Error GLES2DecoderImpl::HandleUniform4uivImmediate(
+ uint32_t immediate_data_size,
+ const void* cmd_data) {
+ if (!unsafe_es3_apis_enabled())
+ return error::kUnknownCommand;
+ const gles2::cmds::Uniform4uivImmediate& c =
+ *static_cast<const gles2::cmds::Uniform4uivImmediate*>(cmd_data);
+ (void)c;
+ GLint location = static_cast<GLint>(c.location);
+ GLsizei count = static_cast<GLsizei>(c.count);
+ uint32_t data_size;
+ if (!ComputeDataSize(count, sizeof(GLuint), 4, &data_size)) {
+ return error::kOutOfBounds;
+ }
+ if (data_size > immediate_data_size) {
+ return error::kOutOfBounds;
+ }
+ const GLuint* v =
+ GetImmediateDataAs<const GLuint*>(c, data_size, immediate_data_size);
+ if (v == NULL) {
+ return error::kOutOfBounds;
+ }
+ glUniform4uiv(location, count, v);
+ return error::kNoError;
+}
+
error::Error GLES2DecoderImpl::HandleUniformMatrix2fvImmediate(
uint32_t immediate_data_size,
const void* cmd_data) {
@@ -2304,6 +2590,60 @@
return error::kNoError;
}
+error::Error GLES2DecoderImpl::HandleUniformMatrix2x3fvImmediate(
+ uint32_t immediate_data_size,
+ const void* cmd_data) {
+ if (!unsafe_es3_apis_enabled())
+ return error::kUnknownCommand;
+ const gles2::cmds::UniformMatrix2x3fvImmediate& c =
+ *static_cast<const gles2::cmds::UniformMatrix2x3fvImmediate*>(cmd_data);
+ (void)c;
+ GLint location = static_cast<GLint>(c.location);
+ GLsizei count = static_cast<GLsizei>(c.count);
+ GLboolean transpose = static_cast<GLboolean>(c.transpose);
+ uint32_t data_size;
+ if (!ComputeDataSize(count, sizeof(GLfloat), 6, &data_size)) {
+ return error::kOutOfBounds;
+ }
+ if (data_size > immediate_data_size) {
+ return error::kOutOfBounds;
+ }
+ const GLfloat* value =
+ GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size);
+ if (value == NULL) {
+ return error::kOutOfBounds;
+ }
+ glUniformMatrix2x3fv(location, count, transpose, value);
+ return error::kNoError;
+}
+
+error::Error GLES2DecoderImpl::HandleUniformMatrix2x4fvImmediate(
+ uint32_t immediate_data_size,
+ const void* cmd_data) {
+ if (!unsafe_es3_apis_enabled())
+ return error::kUnknownCommand;
+ const gles2::cmds::UniformMatrix2x4fvImmediate& c =
+ *static_cast<const gles2::cmds::UniformMatrix2x4fvImmediate*>(cmd_data);
+ (void)c;
+ GLint location = static_cast<GLint>(c.location);
+ GLsizei count = static_cast<GLsizei>(c.count);
+ GLboolean transpose = static_cast<GLboolean>(c.transpose);
+ uint32_t data_size;
+ if (!ComputeDataSize(count, sizeof(GLfloat), 8, &data_size)) {
+ return error::kOutOfBounds;
+ }
+ if (data_size > immediate_data_size) {
+ return error::kOutOfBounds;
+ }
+ const GLfloat* value =
+ GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size);
+ if (value == NULL) {
+ return error::kOutOfBounds;
+ }
+ glUniformMatrix2x4fv(location, count, transpose, value);
+ return error::kNoError;
+}
+
error::Error GLES2DecoderImpl::HandleUniformMatrix3fvImmediate(
uint32_t immediate_data_size,
const void* cmd_data) {
@@ -2329,6 +2669,60 @@
return error::kNoError;
}
+error::Error GLES2DecoderImpl::HandleUniformMatrix3x2fvImmediate(
+ uint32_t immediate_data_size,
+ const void* cmd_data) {
+ if (!unsafe_es3_apis_enabled())
+ return error::kUnknownCommand;
+ const gles2::cmds::UniformMatrix3x2fvImmediate& c =
+ *static_cast<const gles2::cmds::UniformMatrix3x2fvImmediate*>(cmd_data);
+ (void)c;
+ GLint location = static_cast<GLint>(c.location);
+ GLsizei count = static_cast<GLsizei>(c.count);
+ GLboolean transpose = static_cast<GLboolean>(c.transpose);
+ uint32_t data_size;
+ if (!ComputeDataSize(count, sizeof(GLfloat), 6, &data_size)) {
+ return error::kOutOfBounds;
+ }
+ if (data_size > immediate_data_size) {
+ return error::kOutOfBounds;
+ }
+ const GLfloat* value =
+ GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size);
+ if (value == NULL) {
+ return error::kOutOfBounds;
+ }
+ glUniformMatrix3x2fv(location, count, transpose, value);
+ return error::kNoError;
+}
+
+error::Error GLES2DecoderImpl::HandleUniformMatrix3x4fvImmediate(
+ uint32_t immediate_data_size,
+ const void* cmd_data) {
+ if (!unsafe_es3_apis_enabled())
+ return error::kUnknownCommand;
+ const gles2::cmds::UniformMatrix3x4fvImmediate& c =
+ *static_cast<const gles2::cmds::UniformMatrix3x4fvImmediate*>(cmd_data);
+ (void)c;
+ GLint location = static_cast<GLint>(c.location);
+ GLsizei count = static_cast<GLsizei>(c.count);
+ GLboolean transpose = static_cast<GLboolean>(c.transpose);
+ uint32_t data_size;
+ if (!ComputeDataSize(count, sizeof(GLfloat), 12, &data_size)) {
+ return error::kOutOfBounds;
+ }
+ if (data_size > immediate_data_size) {
+ return error::kOutOfBounds;
+ }
+ const GLfloat* value =
+ GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size);
+ if (value == NULL) {
+ return error::kOutOfBounds;
+ }
+ glUniformMatrix3x4fv(location, count, transpose, value);
+ return error::kNoError;
+}
+
error::Error GLES2DecoderImpl::HandleUniformMatrix4fvImmediate(
uint32_t immediate_data_size,
const void* cmd_data) {
@@ -2354,6 +2748,60 @@
return error::kNoError;
}
+error::Error GLES2DecoderImpl::HandleUniformMatrix4x2fvImmediate(
+ uint32_t immediate_data_size,
+ const void* cmd_data) {
+ if (!unsafe_es3_apis_enabled())
+ return error::kUnknownCommand;
+ const gles2::cmds::UniformMatrix4x2fvImmediate& c =
+ *static_cast<const gles2::cmds::UniformMatrix4x2fvImmediate*>(cmd_data);
+ (void)c;
+ GLint location = static_cast<GLint>(c.location);
+ GLsizei count = static_cast<GLsizei>(c.count);
+ GLboolean transpose = static_cast<GLboolean>(c.transpose);
+ uint32_t data_size;
+ if (!ComputeDataSize(count, sizeof(GLfloat), 8, &data_size)) {
+ return error::kOutOfBounds;
+ }
+ if (data_size > immediate_data_size) {
+ return error::kOutOfBounds;
+ }
+ const GLfloat* value =
+ GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size);
+ if (value == NULL) {
+ return error::kOutOfBounds;
+ }
+ glUniformMatrix4x2fv(location, count, transpose, value);
+ return error::kNoError;
+}
+
+error::Error GLES2DecoderImpl::HandleUniformMatrix4x3fvImmediate(
+ uint32_t immediate_data_size,
+ const void* cmd_data) {
+ if (!unsafe_es3_apis_enabled())
+ return error::kUnknownCommand;
+ const gles2::cmds::UniformMatrix4x3fvImmediate& c =
+ *static_cast<const gles2::cmds::UniformMatrix4x3fvImmediate*>(cmd_data);
+ (void)c;
+ GLint location = static_cast<GLint>(c.location);
+ GLsizei count = static_cast<GLsizei>(c.count);
+ GLboolean transpose = static_cast<GLboolean>(c.transpose);
+ uint32_t data_size;
+ if (!ComputeDataSize(count, sizeof(GLfloat), 12, &data_size)) {
+ return error::kOutOfBounds;
+ }
+ if (data_size > immediate_data_size) {
+ return error::kOutOfBounds;
+ }
+ const GLfloat* value =
+ GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size);
+ if (value == NULL) {
+ return error::kOutOfBounds;
+ }
+ glUniformMatrix4x3fv(location, count, transpose, value);
+ return error::kNoError;
+}
+
error::Error GLES2DecoderImpl::HandleUseProgram(uint32_t immediate_data_size,
const void* cmd_data) {
const gles2::cmds::UseProgram& c =
@@ -2521,6 +2969,90 @@
return error::kNoError;
}
+error::Error GLES2DecoderImpl::HandleVertexAttribI4i(
+ uint32_t immediate_data_size,
+ const void* cmd_data) {
+ if (!unsafe_es3_apis_enabled())
+ return error::kUnknownCommand;
+ const gles2::cmds::VertexAttribI4i& c =
+ *static_cast<const gles2::cmds::VertexAttribI4i*>(cmd_data);
+ (void)c;
+ GLuint indx = static_cast<GLuint>(c.indx);
+ GLint x = static_cast<GLint>(c.x);
+ GLint y = static_cast<GLint>(c.y);
+ GLint z = static_cast<GLint>(c.z);
+ GLint w = static_cast<GLint>(c.w);
+ glVertexAttribI4i(indx, x, y, z, w);
+ return error::kNoError;
+}
+
+error::Error GLES2DecoderImpl::HandleVertexAttribI4ivImmediate(
+ uint32_t immediate_data_size,
+ const void* cmd_data) {
+ if (!unsafe_es3_apis_enabled())
+ return error::kUnknownCommand;
+ const gles2::cmds::VertexAttribI4ivImmediate& c =
+ *static_cast<const gles2::cmds::VertexAttribI4ivImmediate*>(cmd_data);
+ (void)c;
+ GLuint indx = static_cast<GLuint>(c.indx);
+ uint32_t data_size;
+ if (!ComputeDataSize(1, sizeof(GLint), 4, &data_size)) {
+ return error::kOutOfBounds;
+ }
+ if (data_size > immediate_data_size) {
+ return error::kOutOfBounds;
+ }
+ const GLint* values =
+ GetImmediateDataAs<const GLint*>(c, data_size, immediate_data_size);
+ if (values == NULL) {
+ return error::kOutOfBounds;
+ }
+ glVertexAttribI4iv(indx, values);
+ return error::kNoError;
+}
+
+error::Error GLES2DecoderImpl::HandleVertexAttribI4ui(
+ uint32_t immediate_data_size,
+ const void* cmd_data) {
+ if (!unsafe_es3_apis_enabled())
+ return error::kUnknownCommand;
+ const gles2::cmds::VertexAttribI4ui& c =
+ *static_cast<const gles2::cmds::VertexAttribI4ui*>(cmd_data);
+ (void)c;
+ GLuint indx = static_cast<GLuint>(c.indx);
+ GLuint x = static_cast<GLuint>(c.x);
+ GLuint y = static_cast<GLuint>(c.y);
+ GLuint z = static_cast<GLuint>(c.z);
+ GLuint w = static_cast<GLuint>(c.w);
+ glVertexAttribI4ui(indx, x, y, z, w);
+ return error::kNoError;
+}
+
+error::Error GLES2DecoderImpl::HandleVertexAttribI4uivImmediate(
+ uint32_t immediate_data_size,
+ const void* cmd_data) {
+ if (!unsafe_es3_apis_enabled())
+ return error::kUnknownCommand;
+ const gles2::cmds::VertexAttribI4uivImmediate& c =
+ *static_cast<const gles2::cmds::VertexAttribI4uivImmediate*>(cmd_data);
+ (void)c;
+ GLuint indx = static_cast<GLuint>(c.indx);
+ uint32_t data_size;
+ if (!ComputeDataSize(1, sizeof(GLuint), 4, &data_size)) {
+ return error::kOutOfBounds;
+ }
+ if (data_size > immediate_data_size) {
+ return error::kOutOfBounds;
+ }
+ const GLuint* values =
+ GetImmediateDataAs<const GLuint*>(c, data_size, immediate_data_size);
+ if (values == NULL) {
+ return error::kOutOfBounds;
+ }
+ glVertexAttribI4uiv(indx, values);
+ return error::kNoError;
+}
+
error::Error GLES2DecoderImpl::HandleViewport(uint32_t immediate_data_size,
const void* cmd_data) {
const gles2::cmds::Viewport& c =
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_mock.h b/gpu/command_buffer/service/gles2_cmd_decoder_mock.h
index d855c87..4428a40 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_mock.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_mock.h
@@ -78,6 +78,7 @@
MOCK_METHOD0(GetQueryManager, gpu::gles2::QueryManager*());
MOCK_METHOD0(GetVertexArrayManager, gpu::gles2::VertexArrayManager*());
MOCK_METHOD0(GetImageManager, gpu::gles2::ImageManager*());
+ MOCK_METHOD0(GetValuebufferManager, gpu::gles2::ValuebufferManager*());
MOCK_METHOD1(
SetResizeCallback, void(const base::Callback<void(gfx::Size, float)>&));
MOCK_METHOD0(GetAsyncPixelTransferDelegate,
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1.cc
index 912e908..db1c62f 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1.cc
@@ -278,26 +278,6 @@
}
};
-template <>
-void GLES2DecoderTestBase::SpecializedSetup<cmds::RenderbufferStorage, 0>(
- bool valid) {
- DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_,
- kServiceRenderbufferId);
- if (valid) {
- EnsureRenderbufferBound(false);
- EXPECT_CALL(*gl_, GetError())
- .WillOnce(Return(GL_NO_ERROR))
- .RetiresOnSaturation();
- EXPECT_CALL(*gl_,
- RenderbufferStorageEXT(GL_RENDERBUFFER, _, 3, 4))
- .Times(1)
- .RetiresOnSaturation();
- EXPECT_CALL(*gl_, GetError())
- .WillOnce(Return(GL_NO_ERROR))
- .RetiresOnSaturation();
- }
-}
-
#include "gpu/command_buffer/service/gles2_cmd_decoder_unittest_1_autogen.h"
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1_autogen.h
index 6fe923c..f9b450e 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1_autogen.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1_autogen.h
@@ -352,6 +352,18 @@
// TODO(gman): CompressedTexSubImage2DBucket
// TODO(gman): CompressedTexSubImage2D
+TEST_P(GLES2DecoderTest1, CopyBufferSubDataValidArgs) {
+ EXPECT_CALL(*gl_,
+ CopyBufferSubData(GL_ARRAY_BUFFER, GL_ARRAY_BUFFER, 3, 4, 5));
+ SpecializedSetup<cmds::CopyBufferSubData, 0>(true);
+ cmds::CopyBufferSubData cmd;
+ cmd.Init(GL_ARRAY_BUFFER, GL_ARRAY_BUFFER, 3, 4, 5);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));
+}
// TODO(gman): CopyTexImage2D
TEST_P(GLES2DecoderTest1, CopyTexSubImage2DValidArgs) {
@@ -745,6 +757,20 @@
EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
}
+TEST_P(GLES2DecoderTest1, FramebufferTextureLayerValidArgs) {
+ EXPECT_CALL(*gl_,
+ FramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+ kServiceTextureId, 4, 5));
+ SpecializedSetup<cmds::FramebufferTextureLayer, 0>(true);
+ cmds::FramebufferTextureLayer cmd;
+ cmd.Init(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, client_texture_id_, 4, 5);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));
+}
+
TEST_P(GLES2DecoderTest1, FrontFaceValidArgs) {
EXPECT_CALL(*gl_, FrontFace(GL_CW));
SpecializedSetup<cmds::FrontFace, 0>(true);
@@ -1218,6 +1244,31 @@
EXPECT_EQ(0u, result->size);
}
+TEST_P(GLES2DecoderTest1, GetInternalformativValidArgs) {
+ EXPECT_CALL(*gl_, GetError())
+ .WillOnce(Return(GL_NO_ERROR))
+ .WillOnce(Return(GL_NO_ERROR))
+ .RetiresOnSaturation();
+ SpecializedSetup<cmds::GetInternalformativ, 0>(true);
+ typedef cmds::GetInternalformativ::Result Result;
+ Result* result = static_cast<Result*>(shared_memory_address_);
+ EXPECT_CALL(*gl_, GetInternalformativ(GL_RENDERBUFFER, GL_RGBA4,
+ GL_RENDERBUFFER_RED_SIZE, 4,
+ result->GetData()));
+ result->size = 0;
+ cmds::GetInternalformativ cmd;
+ cmd.Init(GL_RENDERBUFFER, GL_RGBA4, GL_RENDERBUFFER_RED_SIZE, 4,
+ shared_memory_id_, shared_memory_offset_);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(
+ GL_RENDERBUFFER_RED_SIZE),
+ result->GetNumResults());
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));
+}
+
TEST_P(GLES2DecoderTest1, GetProgramivValidArgs) {
SpecializedSetup<cmds::GetProgramiv, 0>(true);
typedef cmds::GetProgramiv::Result Result;
@@ -1834,49 +1885,4 @@
}
// TODO(gman): ReadPixels
-// TODO(gman): ReleaseShaderCompiler
-
-TEST_P(GLES2DecoderTest1, RenderbufferStorageValidArgs) {
- SpecializedSetup<cmds::RenderbufferStorage, 0>(true);
- cmds::RenderbufferStorage cmd;
- cmd.Init(GL_RENDERBUFFER, GL_RGBA4, 3, 4);
- EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
- EXPECT_EQ(GL_NO_ERROR, GetGLError());
-}
-
-TEST_P(GLES2DecoderTest1, RenderbufferStorageInvalidArgs0_0) {
- EXPECT_CALL(*gl_, RenderbufferStorageEXT(_, _, _, _)).Times(0);
- SpecializedSetup<cmds::RenderbufferStorage, 0>(false);
- cmds::RenderbufferStorage cmd;
- cmd.Init(GL_FRAMEBUFFER, GL_RGBA4, 3, 4);
- EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
- EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
-}
-
-TEST_P(GLES2DecoderTest1, RenderbufferStorageInvalidArgs2_0) {
- EXPECT_CALL(*gl_, RenderbufferStorageEXT(_, _, _, _)).Times(0);
- SpecializedSetup<cmds::RenderbufferStorage, 0>(false);
- cmds::RenderbufferStorage cmd;
- cmd.Init(GL_RENDERBUFFER, GL_RGBA4, -1, 4);
- EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
- EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
-}
-
-TEST_P(GLES2DecoderTest1, RenderbufferStorageInvalidArgs3_0) {
- EXPECT_CALL(*gl_, RenderbufferStorageEXT(_, _, _, _)).Times(0);
- SpecializedSetup<cmds::RenderbufferStorage, 0>(false);
- cmds::RenderbufferStorage cmd;
- cmd.Init(GL_RENDERBUFFER, GL_RGBA4, 3, -1);
- EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
- EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
-}
-
-TEST_P(GLES2DecoderTest1, SampleCoverageValidArgs) {
- EXPECT_CALL(*gl_, SampleCoverage(1, true));
- SpecializedSetup<cmds::SampleCoverage, 0>(true);
- cmds::SampleCoverage cmd;
- cmd.Init(1, true);
- EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
- EXPECT_EQ(GL_NO_ERROR, GetGLError());
-}
#endif // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_1_AUTOGEN_H_
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_2.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_2.cc
index 1d8ac40..5d0ce3f 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_2.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_2.cc
@@ -252,6 +252,26 @@
INSTANTIATE_TEST_CASE_P(Service, GLES2DecoderTest2, ::testing::Bool());
template <>
+void GLES2DecoderTestBase::SpecializedSetup<cmds::RenderbufferStorage, 0>(
+ bool valid) {
+ DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_,
+ kServiceRenderbufferId);
+ if (valid) {
+ EnsureRenderbufferBound(false);
+ EXPECT_CALL(*gl_, GetError())
+ .WillOnce(Return(GL_NO_ERROR))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl_,
+ RenderbufferStorageEXT(GL_RENDERBUFFER, _, 3, 4))
+ .Times(1)
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl_, GetError())
+ .WillOnce(Return(GL_NO_ERROR))
+ .RetiresOnSaturation();
+ }
+}
+
+template <>
void GLES2DecoderTestBase::SpecializedSetup<cmds::GenQueriesEXTImmediate, 0>(
bool valid) {
if (!valid) {
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_2_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_2_autogen.h
index 9397f45..b69197f 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_2_autogen.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_2_autogen.h
@@ -12,6 +12,52 @@
#ifndef GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_2_AUTOGEN_H_
#define GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_2_AUTOGEN_H_
+// TODO(gman): ReleaseShaderCompiler
+
+TEST_P(GLES2DecoderTest2, RenderbufferStorageValidArgs) {
+ SpecializedSetup<cmds::RenderbufferStorage, 0>(true);
+ cmds::RenderbufferStorage cmd;
+ cmd.Init(GL_RENDERBUFFER, GL_RGBA4, 3, 4);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+}
+
+TEST_P(GLES2DecoderTest2, RenderbufferStorageInvalidArgs0_0) {
+ EXPECT_CALL(*gl_, RenderbufferStorageEXT(_, _, _, _)).Times(0);
+ SpecializedSetup<cmds::RenderbufferStorage, 0>(false);
+ cmds::RenderbufferStorage cmd;
+ cmd.Init(GL_FRAMEBUFFER, GL_RGBA4, 3, 4);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
+}
+
+TEST_P(GLES2DecoderTest2, RenderbufferStorageInvalidArgs2_0) {
+ EXPECT_CALL(*gl_, RenderbufferStorageEXT(_, _, _, _)).Times(0);
+ SpecializedSetup<cmds::RenderbufferStorage, 0>(false);
+ cmds::RenderbufferStorage cmd;
+ cmd.Init(GL_RENDERBUFFER, GL_RGBA4, -1, 4);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
+}
+
+TEST_P(GLES2DecoderTest2, RenderbufferStorageInvalidArgs3_0) {
+ EXPECT_CALL(*gl_, RenderbufferStorageEXT(_, _, _, _)).Times(0);
+ SpecializedSetup<cmds::RenderbufferStorage, 0>(false);
+ cmds::RenderbufferStorage cmd;
+ cmd.Init(GL_RENDERBUFFER, GL_RGBA4, 3, -1);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
+}
+
+TEST_P(GLES2DecoderTest2, SampleCoverageValidArgs) {
+ EXPECT_CALL(*gl_, SampleCoverage(1, true));
+ SpecializedSetup<cmds::SampleCoverage, 0>(true);
+ cmds::SampleCoverage cmd;
+ cmd.Init(1, true);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+}
+
TEST_P(GLES2DecoderTest2, ScissorValidArgs) {
EXPECT_CALL(*gl_, Scissor(1, 2, 3, 4));
SpecializedSetup<cmds::Scissor, 0>(true);
@@ -277,6 +323,18 @@
EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp)));
EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
}
+
+TEST_P(GLES2DecoderTest2, TexStorage3DValidArgs) {
+ EXPECT_CALL(*gl_, TexStorage3D(GL_TEXTURE_3D, 2, GL_RGB565, 4, 5, 6));
+ SpecializedSetup<cmds::TexStorage3D, 0>(true);
+ cmds::TexStorage3D cmd;
+ cmd.Init(GL_TEXTURE_3D, 2, GL_RGB565, 4, 5, 6);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));
+}
// TODO(gman): TexSubImage2D
TEST_P(GLES2DecoderTest2, Uniform1fValidArgs) {
@@ -304,6 +362,36 @@
// TODO(gman): Uniform1i
// TODO(gman): Uniform1ivImmediate
+TEST_P(GLES2DecoderTest2, Uniform1uiValidArgs) {
+ EXPECT_CALL(*gl_, Uniform1uiv(1, 1, _));
+ SpecializedSetup<cmds::Uniform1ui, 0>(true);
+ cmds::Uniform1ui cmd;
+ cmd.Init(1, 2);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));
+}
+
+TEST_P(GLES2DecoderTest2, Uniform1uivImmediateValidArgs) {
+ cmds::Uniform1uivImmediate& cmd =
+ *GetImmediateAs<cmds::Uniform1uivImmediate>();
+ EXPECT_CALL(
+ *gl_,
+ Uniform1uiv(1, 2, reinterpret_cast<GLuint*>(ImmediateDataAddress(&cmd))));
+ SpecializedSetup<cmds::Uniform1uivImmediate, 0>(true);
+ GLuint temp[1 * 2] = {
+ 0,
+ };
+ cmd.Init(1, 2, &temp[0]);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp)));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteImmediateCmd(cmd, sizeof(temp)));
+}
+
TEST_P(GLES2DecoderTest2, Uniform2fValidArgs) {
EXPECT_CALL(*gl_, Uniform2fv(1, 1, _));
SpecializedSetup<cmds::Uniform2f, 0>(true);
@@ -350,6 +438,36 @@
EXPECT_EQ(GL_NO_ERROR, GetGLError());
}
+TEST_P(GLES2DecoderTest2, Uniform2uiValidArgs) {
+ EXPECT_CALL(*gl_, Uniform2uiv(1, 1, _));
+ SpecializedSetup<cmds::Uniform2ui, 0>(true);
+ cmds::Uniform2ui cmd;
+ cmd.Init(1, 2, 3);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));
+}
+
+TEST_P(GLES2DecoderTest2, Uniform2uivImmediateValidArgs) {
+ cmds::Uniform2uivImmediate& cmd =
+ *GetImmediateAs<cmds::Uniform2uivImmediate>();
+ EXPECT_CALL(
+ *gl_,
+ Uniform2uiv(1, 2, reinterpret_cast<GLuint*>(ImmediateDataAddress(&cmd))));
+ SpecializedSetup<cmds::Uniform2uivImmediate, 0>(true);
+ GLuint temp[2 * 2] = {
+ 0,
+ };
+ cmd.Init(1, 2, &temp[0]);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp)));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteImmediateCmd(cmd, sizeof(temp)));
+}
+
TEST_P(GLES2DecoderTest2, Uniform3fValidArgs) {
EXPECT_CALL(*gl_, Uniform3fv(1, 1, _));
SpecializedSetup<cmds::Uniform3f, 0>(true);
@@ -396,6 +514,36 @@
EXPECT_EQ(GL_NO_ERROR, GetGLError());
}
+TEST_P(GLES2DecoderTest2, Uniform3uiValidArgs) {
+ EXPECT_CALL(*gl_, Uniform3uiv(1, 1, _));
+ SpecializedSetup<cmds::Uniform3ui, 0>(true);
+ cmds::Uniform3ui cmd;
+ cmd.Init(1, 2, 3, 4);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));
+}
+
+TEST_P(GLES2DecoderTest2, Uniform3uivImmediateValidArgs) {
+ cmds::Uniform3uivImmediate& cmd =
+ *GetImmediateAs<cmds::Uniform3uivImmediate>();
+ EXPECT_CALL(
+ *gl_,
+ Uniform3uiv(1, 2, reinterpret_cast<GLuint*>(ImmediateDataAddress(&cmd))));
+ SpecializedSetup<cmds::Uniform3uivImmediate, 0>(true);
+ GLuint temp[3 * 2] = {
+ 0,
+ };
+ cmd.Init(1, 2, &temp[0]);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp)));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteImmediateCmd(cmd, sizeof(temp)));
+}
+
TEST_P(GLES2DecoderTest2, Uniform4fValidArgs) {
EXPECT_CALL(*gl_, Uniform4fv(1, 1, _));
SpecializedSetup<cmds::Uniform4f, 0>(true);
@@ -442,6 +590,36 @@
EXPECT_EQ(GL_NO_ERROR, GetGLError());
}
+TEST_P(GLES2DecoderTest2, Uniform4uiValidArgs) {
+ EXPECT_CALL(*gl_, Uniform4uiv(1, 1, _));
+ SpecializedSetup<cmds::Uniform4ui, 0>(true);
+ cmds::Uniform4ui cmd;
+ cmd.Init(1, 2, 3, 4, 5);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));
+}
+
+TEST_P(GLES2DecoderTest2, Uniform4uivImmediateValidArgs) {
+ cmds::Uniform4uivImmediate& cmd =
+ *GetImmediateAs<cmds::Uniform4uivImmediate>();
+ EXPECT_CALL(
+ *gl_,
+ Uniform4uiv(1, 2, reinterpret_cast<GLuint*>(ImmediateDataAddress(&cmd))));
+ SpecializedSetup<cmds::Uniform4uivImmediate, 0>(true);
+ GLuint temp[4 * 2] = {
+ 0,
+ };
+ cmd.Init(1, 2, &temp[0]);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp)));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteImmediateCmd(cmd, sizeof(temp)));
+}
+
TEST_P(GLES2DecoderTest2, UniformMatrix2fvImmediateValidArgs) {
cmds::UniformMatrix2fvImmediate& cmd =
*GetImmediateAs<cmds::UniformMatrix2fvImmediate>();
@@ -457,6 +635,42 @@
EXPECT_EQ(GL_NO_ERROR, GetGLError());
}
+TEST_P(GLES2DecoderTest2, UniformMatrix2x3fvImmediateValidArgs) {
+ cmds::UniformMatrix2x3fvImmediate& cmd =
+ *GetImmediateAs<cmds::UniformMatrix2x3fvImmediate>();
+ EXPECT_CALL(*gl_,
+ UniformMatrix2x3fv(1, 2, false, reinterpret_cast<GLfloat*>(
+ ImmediateDataAddress(&cmd))));
+ SpecializedSetup<cmds::UniformMatrix2x3fvImmediate, 0>(true);
+ GLfloat temp[6 * 2] = {
+ 0,
+ };
+ cmd.Init(1, 2, &temp[0]);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp)));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteImmediateCmd(cmd, sizeof(temp)));
+}
+
+TEST_P(GLES2DecoderTest2, UniformMatrix2x4fvImmediateValidArgs) {
+ cmds::UniformMatrix2x4fvImmediate& cmd =
+ *GetImmediateAs<cmds::UniformMatrix2x4fvImmediate>();
+ EXPECT_CALL(*gl_,
+ UniformMatrix2x4fv(1, 2, false, reinterpret_cast<GLfloat*>(
+ ImmediateDataAddress(&cmd))));
+ SpecializedSetup<cmds::UniformMatrix2x4fvImmediate, 0>(true);
+ GLfloat temp[8 * 2] = {
+ 0,
+ };
+ cmd.Init(1, 2, &temp[0]);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp)));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteImmediateCmd(cmd, sizeof(temp)));
+}
+
TEST_P(GLES2DecoderTest2, UniformMatrix3fvImmediateValidArgs) {
cmds::UniformMatrix3fvImmediate& cmd =
*GetImmediateAs<cmds::UniformMatrix3fvImmediate>();
@@ -472,6 +686,42 @@
EXPECT_EQ(GL_NO_ERROR, GetGLError());
}
+TEST_P(GLES2DecoderTest2, UniformMatrix3x2fvImmediateValidArgs) {
+ cmds::UniformMatrix3x2fvImmediate& cmd =
+ *GetImmediateAs<cmds::UniformMatrix3x2fvImmediate>();
+ EXPECT_CALL(*gl_,
+ UniformMatrix3x2fv(1, 2, false, reinterpret_cast<GLfloat*>(
+ ImmediateDataAddress(&cmd))));
+ SpecializedSetup<cmds::UniformMatrix3x2fvImmediate, 0>(true);
+ GLfloat temp[6 * 2] = {
+ 0,
+ };
+ cmd.Init(1, 2, &temp[0]);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp)));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteImmediateCmd(cmd, sizeof(temp)));
+}
+
+TEST_P(GLES2DecoderTest2, UniformMatrix3x4fvImmediateValidArgs) {
+ cmds::UniformMatrix3x4fvImmediate& cmd =
+ *GetImmediateAs<cmds::UniformMatrix3x4fvImmediate>();
+ EXPECT_CALL(*gl_,
+ UniformMatrix3x4fv(1, 2, false, reinterpret_cast<GLfloat*>(
+ ImmediateDataAddress(&cmd))));
+ SpecializedSetup<cmds::UniformMatrix3x4fvImmediate, 0>(true);
+ GLfloat temp[12 * 2] = {
+ 0,
+ };
+ cmd.Init(1, 2, &temp[0]);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp)));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteImmediateCmd(cmd, sizeof(temp)));
+}
+
TEST_P(GLES2DecoderTest2, UniformMatrix4fvImmediateValidArgs) {
cmds::UniformMatrix4fvImmediate& cmd =
*GetImmediateAs<cmds::UniformMatrix4fvImmediate>();
@@ -487,6 +737,42 @@
EXPECT_EQ(GL_NO_ERROR, GetGLError());
}
+TEST_P(GLES2DecoderTest2, UniformMatrix4x2fvImmediateValidArgs) {
+ cmds::UniformMatrix4x2fvImmediate& cmd =
+ *GetImmediateAs<cmds::UniformMatrix4x2fvImmediate>();
+ EXPECT_CALL(*gl_,
+ UniformMatrix4x2fv(1, 2, false, reinterpret_cast<GLfloat*>(
+ ImmediateDataAddress(&cmd))));
+ SpecializedSetup<cmds::UniformMatrix4x2fvImmediate, 0>(true);
+ GLfloat temp[8 * 2] = {
+ 0,
+ };
+ cmd.Init(1, 2, &temp[0]);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp)));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteImmediateCmd(cmd, sizeof(temp)));
+}
+
+TEST_P(GLES2DecoderTest2, UniformMatrix4x3fvImmediateValidArgs) {
+ cmds::UniformMatrix4x3fvImmediate& cmd =
+ *GetImmediateAs<cmds::UniformMatrix4x3fvImmediate>();
+ EXPECT_CALL(*gl_,
+ UniformMatrix4x3fv(1, 2, false, reinterpret_cast<GLfloat*>(
+ ImmediateDataAddress(&cmd))));
+ SpecializedSetup<cmds::UniformMatrix4x3fvImmediate, 0>(true);
+ GLfloat temp[12 * 2] = {
+ 0,
+ };
+ cmd.Init(1, 2, &temp[0]);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp)));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteImmediateCmd(cmd, sizeof(temp)));
+}
+
TEST_P(GLES2DecoderTest2, UseProgramValidArgs) {
EXPECT_CALL(*gl_, UseProgram(kServiceProgramId));
SpecializedSetup<cmds::UseProgram, 0>(true);
@@ -605,6 +891,66 @@
EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp)));
EXPECT_EQ(GL_NO_ERROR, GetGLError());
}
+
+TEST_P(GLES2DecoderTest2, VertexAttribI4iValidArgs) {
+ EXPECT_CALL(*gl_, VertexAttribI4i(1, 2, 3, 4, 5));
+ SpecializedSetup<cmds::VertexAttribI4i, 0>(true);
+ cmds::VertexAttribI4i cmd;
+ cmd.Init(1, 2, 3, 4, 5);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));
+}
+
+TEST_P(GLES2DecoderTest2, VertexAttribI4ivImmediateValidArgs) {
+ cmds::VertexAttribI4ivImmediate& cmd =
+ *GetImmediateAs<cmds::VertexAttribI4ivImmediate>();
+ SpecializedSetup<cmds::VertexAttribI4ivImmediate, 0>(true);
+ GLint temp[4] = {
+ 0,
+ };
+ cmd.Init(1, &temp[0]);
+ EXPECT_CALL(*gl_, VertexAttribI4iv(1, reinterpret_cast<GLint*>(
+ ImmediateDataAddress(&cmd))));
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp)));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteImmediateCmd(cmd, sizeof(temp)));
+}
+
+TEST_P(GLES2DecoderTest2, VertexAttribI4uiValidArgs) {
+ EXPECT_CALL(*gl_, VertexAttribI4ui(1, 2, 3, 4, 5));
+ SpecializedSetup<cmds::VertexAttribI4ui, 0>(true);
+ cmds::VertexAttribI4ui cmd;
+ cmd.Init(1, 2, 3, 4, 5);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));
+}
+
+TEST_P(GLES2DecoderTest2, VertexAttribI4uivImmediateValidArgs) {
+ cmds::VertexAttribI4uivImmediate& cmd =
+ *GetImmediateAs<cmds::VertexAttribI4uivImmediate>();
+ SpecializedSetup<cmds::VertexAttribI4uivImmediate, 0>(true);
+ GLuint temp[4] = {
+ 0,
+ };
+ cmd.Init(1, &temp[0]);
+ EXPECT_CALL(*gl_, VertexAttribI4uiv(1, reinterpret_cast<GLuint*>(
+ ImmediateDataAddress(&cmd))));
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp)));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteImmediateCmd(cmd, sizeof(temp)));
+}
+// TODO(gman): VertexAttribIPointer
+
// TODO(gman): VertexAttribPointer
TEST_P(GLES2DecoderTest2, ViewportValidArgs) {
@@ -672,50 +1018,4 @@
// TODO(gman): CopyTextureCHROMIUM
// TODO(gman): DrawArraysInstancedANGLE
// TODO(gman): DrawElementsInstancedANGLE
-// TODO(gman): VertexAttribDivisorANGLE
-// TODO(gman): GenMailboxCHROMIUM
-
-// TODO(gman): ProduceTextureCHROMIUMImmediate
-// TODO(gman): ProduceTextureDirectCHROMIUMImmediate
-// TODO(gman): ConsumeTextureCHROMIUMImmediate
-// TODO(gman): CreateAndConsumeTextureCHROMIUMImmediate
-// TODO(gman): BindUniformLocationCHROMIUMBucket
-// TODO(gman): GenValuebuffersCHROMIUMImmediate
-// TODO(gman): DeleteValuebuffersCHROMIUMImmediate
-
-TEST_P(GLES2DecoderTest2, IsValuebufferCHROMIUMValidArgs) {
- SpecializedSetup<cmds::IsValuebufferCHROMIUM, 0>(true);
- cmds::IsValuebufferCHROMIUM cmd;
- cmd.Init(client_valuebuffer_id_, shared_memory_id_, shared_memory_offset_);
- EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
- EXPECT_EQ(GL_NO_ERROR, GetGLError());
-}
-
-TEST_P(GLES2DecoderTest2, IsValuebufferCHROMIUMInvalidArgsBadSharedMemoryId) {
- SpecializedSetup<cmds::IsValuebufferCHROMIUM, 0>(false);
- cmds::IsValuebufferCHROMIUM cmd;
- cmd.Init(client_valuebuffer_id_, kInvalidSharedMemoryId,
- shared_memory_offset_);
- EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd));
- cmd.Init(client_valuebuffer_id_, shared_memory_id_,
- kInvalidSharedMemoryOffset);
- EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd));
-}
-// TODO(gman): BindValuebufferCHROMIUM
-// TODO(gman): SubscribeValueCHROMIUM
-// TODO(gman): PopulateSubscribedValuesCHROMIUM
-// TODO(gman): UniformValuebufferCHROMIUM
-// TODO(gman): BindTexImage2DCHROMIUM
-// TODO(gman): ReleaseTexImage2DCHROMIUM
-// TODO(gman): TraceBeginCHROMIUM
-
-// TODO(gman): TraceEndCHROMIUM
-// TODO(gman): AsyncTexSubImage2DCHROMIUM
-
-// TODO(gman): AsyncTexImage2DCHROMIUM
-
-// TODO(gman): WaitAsyncTexImage2DCHROMIUM
-
-// TODO(gman): WaitAllAsyncTexImage2DCHROMIUM
-
#endif // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_2_AUTOGEN_H_
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h
index 1c98b68..0ee2ba5 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h
@@ -12,6 +12,52 @@
#ifndef GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_3_AUTOGEN_H_
#define GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_3_AUTOGEN_H_
+// TODO(gman): VertexAttribDivisorANGLE
+// TODO(gman): GenMailboxCHROMIUM
+
+// TODO(gman): ProduceTextureCHROMIUMImmediate
+// TODO(gman): ProduceTextureDirectCHROMIUMImmediate
+// TODO(gman): ConsumeTextureCHROMIUMImmediate
+// TODO(gman): CreateAndConsumeTextureCHROMIUMImmediate
+// TODO(gman): BindUniformLocationCHROMIUMBucket
+// TODO(gman): GenValuebuffersCHROMIUMImmediate
+// TODO(gman): DeleteValuebuffersCHROMIUMImmediate
+
+TEST_P(GLES2DecoderTest3, IsValuebufferCHROMIUMValidArgs) {
+ SpecializedSetup<cmds::IsValuebufferCHROMIUM, 0>(true);
+ cmds::IsValuebufferCHROMIUM cmd;
+ cmd.Init(client_valuebuffer_id_, shared_memory_id_, shared_memory_offset_);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+}
+
+TEST_P(GLES2DecoderTest3, IsValuebufferCHROMIUMInvalidArgsBadSharedMemoryId) {
+ SpecializedSetup<cmds::IsValuebufferCHROMIUM, 0>(false);
+ cmds::IsValuebufferCHROMIUM cmd;
+ cmd.Init(client_valuebuffer_id_, kInvalidSharedMemoryId,
+ shared_memory_offset_);
+ EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd));
+ cmd.Init(client_valuebuffer_id_, shared_memory_id_,
+ kInvalidSharedMemoryOffset);
+ EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd));
+}
+// TODO(gman): BindValuebufferCHROMIUM
+// TODO(gman): SubscribeValueCHROMIUM
+// TODO(gman): PopulateSubscribedValuesCHROMIUM
+// TODO(gman): UniformValuebufferCHROMIUM
+// TODO(gman): BindTexImage2DCHROMIUM
+// TODO(gman): ReleaseTexImage2DCHROMIUM
+// TODO(gman): TraceBeginCHROMIUM
+
+// TODO(gman): TraceEndCHROMIUM
+// TODO(gman): AsyncTexSubImage2DCHROMIUM
+
+// TODO(gman): AsyncTexImage2DCHROMIUM
+
+// TODO(gman): WaitAsyncTexImage2DCHROMIUM
+
+// TODO(gman): WaitAllAsyncTexImage2DCHROMIUM
+
// TODO(gman): LoseContextCHROMIUM
// TODO(gman): InsertSyncPointCHROMIUM
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc
index a27bb3d..017f36c 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc
@@ -12,6 +12,7 @@
#include "base/strings/string_split.h"
#include "gpu/command_buffer/common/gles2_cmd_format.h"
#include "gpu/command_buffer/common/gles2_cmd_utils.h"
+#include "gpu/command_buffer/common/value_state.h"
#include "gpu/command_buffer/service/cmd_buffer_engine.h"
#include "gpu/command_buffer/service/context_group.h"
#include "gpu/command_buffer/service/logger.h"
@@ -173,6 +174,7 @@
memory_tracker_,
new ShaderTranslatorCache,
feature_info.get(),
+ new ValueStateMap,
normalized_init.bind_generates_resource));
bool use_default_textures = normalized_init.bind_generates_resource;
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h
index 1a2b54a..459f1e0 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h
@@ -145,6 +145,10 @@
return group_->valuebuffer_manager();
}
+ ValueStateMap* pending_valuebuffer_state() {
+ return group_->pending_valuebuffer_state();
+ }
+
ImageManager* GetImageManager() { return decoder_->GetImageManager(); }
void DoCreateProgram(GLuint client_id, GLuint service_id);
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_valuebuffer.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_valuebuffer.cc
index 012d504..47e6a6b 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_valuebuffer.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_valuebuffer.cc
@@ -8,7 +8,6 @@
#include "gpu/command_buffer/common/gles2_cmd_format.h"
#include "gpu/command_buffer/common/gles2_cmd_utils.h"
#include "gpu/command_buffer/service/gles2_cmd_decoder_unittest.h"
-
#include "gpu/command_buffer/service/test_helper.h"
#include "gpu/command_buffer/service/valuebuffer_manager.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -30,7 +29,7 @@
valuestate.int_value[0] = 111;
valuestate.int_value[1] = 222;
valuebuffer_manager()->CreateValuebuffer(kBufferId);
- valuebuffer_manager()->UpdateValueState(
+ pending_valuebuffer_state()->UpdateState(
GL_MOUSE_POSITION_CHROMIUM, valuestate);
BindValuebufferCHROMIUM cmd1;
cmd1.Init(GL_SUBSCRIBED_VALUES_BUFFER_CHROMIUM, kBufferId);
@@ -54,7 +53,7 @@
valuestate.int_value[0] = 111;
valuestate.int_value[1] = 222;
valuebuffer_manager()->CreateValuebuffer(kBufferId);
- valuebuffer_manager()->UpdateValueState(
+ pending_valuebuffer_state()->UpdateState(
GL_MOUSE_POSITION_CHROMIUM, valuestate);
SubscribeValueCHROMIUM cmd1;
cmd1.Init(GL_SUBSCRIBED_VALUES_BUFFER_CHROMIUM, GL_MOUSE_POSITION_CHROMIUM);
@@ -68,7 +67,7 @@
valuestate.int_value[0] = 111;
valuestate.int_value[1] = 222;
valuebuffer_manager()->CreateValuebuffer(kBufferId);
- valuebuffer_manager()->UpdateValueState(
+ pending_valuebuffer_state()->UpdateState(
GL_MOUSE_POSITION_CHROMIUM, valuestate);
BindValuebufferCHROMIUM cmd1;
cmd1.Init(GL_SUBSCRIBED_VALUES_BUFFER_CHROMIUM, kBufferId);
@@ -85,7 +84,7 @@
valuestate.int_value[0] = 111;
valuestate.int_value[1] = 222;
valuebuffer_manager()->CreateValuebuffer(kBufferId);
- valuebuffer_manager()->UpdateValueState(
+ pending_valuebuffer_state()->UpdateState(
GL_MOUSE_POSITION_CHROMIUM, valuestate);
BindValuebufferCHROMIUM cmd1;
cmd1.Init(GL_SUBSCRIBED_VALUES_BUFFER_CHROMIUM, kBufferId);
@@ -107,7 +106,7 @@
valuestate.int_value[0] = 111;
valuestate.int_value[1] = 222;
valuebuffer_manager()->CreateValuebuffer(kBufferId);
- valuebuffer_manager()->UpdateValueState(
+ pending_valuebuffer_state()->UpdateState(
GL_MOUSE_POSITION_CHROMIUM, valuestate);
BindValuebufferCHROMIUM cmd1;
cmd1.Init(GL_SUBSCRIBED_VALUES_BUFFER_CHROMIUM, kBufferId);
diff --git a/gpu/command_buffer/service/gles2_cmd_validation_autogen.h b/gpu/command_buffer/service/gles2_cmd_validation_autogen.h
index c72bcf8..3436e96 100644
--- a/gpu/command_buffer/service/gles2_cmd_validation_autogen.h
+++ b/gpu/command_buffer/service/gles2_cmd_validation_autogen.h
@@ -57,6 +57,7 @@
ValueValidator<GLenum> stencil_op;
ValueValidator<GLenum> string_type;
ValueValidator<GLenum> subscription_target;
+ValueValidator<GLenum> texture_3_d_target;
ValueValidator<GLenum> texture_bind_target;
ValueValidator<GLenum> texture_format;
ValueValidator<GLenum> texture_internal_format;
diff --git a/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h b/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h
index 6a646ac..d718391 100644
--- a/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h
+++ b/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h
@@ -417,6 +417,11 @@
GL_MOUSE_POSITION_CHROMIUM,
};
+static const GLenum valid_texture_3_d_target_table[] = {
+ GL_TEXTURE_3D,
+ GL_TEXTURE_2D_ARRAY,
+};
+
static const GLenum valid_texture_bind_target_table[] = {
GL_TEXTURE_2D,
GL_TEXTURE_CUBE_MAP,
@@ -603,6 +608,8 @@
string_type(valid_string_type_table, arraysize(valid_string_type_table)),
subscription_target(valid_subscription_target_table,
arraysize(valid_subscription_target_table)),
+ texture_3_d_target(valid_texture_3_d_target_table,
+ arraysize(valid_texture_3_d_target_table)),
texture_bind_target(valid_texture_bind_target_table,
arraysize(valid_texture_bind_target_table)),
texture_format(valid_texture_format_table,
diff --git a/gpu/command_buffer/service/gpu_switches.cc b/gpu/command_buffer/service/gpu_switches.cc
index 8f5bc35..7298140 100644
--- a/gpu/command_buffer/service/gpu_switches.cc
+++ b/gpu/command_buffer/service/gpu_switches.cc
@@ -56,11 +56,18 @@
const char kEnableShareGroupAsyncTextureUpload[] =
"enable-share-group-async-texture-upload";
+// Enable WebGL subscribe uniform extension.
+const char kEnableSubscribeUniformExtension[] =
+ "enable-subscribe-uniform-extension";
+
// Simulates shared textures when share groups are not available. Not available
// everywhere.
const char kEnableThreadedTextureMailboxes[] =
"enable-threaded-texture-mailboxes";
+// Enable OpenGL ES 3 APIs without proper service side validation.
+const char kEnableUnsafeES3APIs[] = "enable-unsafe-es3-apis";
+
const char* kGpuSwitches[] = {
kCompileShaderAlwaysSucceeds,
kDisableGLErrorLimit,
@@ -77,6 +84,8 @@
kGpuProgramCacheSizeKb,
kDisableGpuShaderDiskCache,
kEnableShareGroupAsyncTextureUpload,
+ kEnableUnsafeES3APIs,
+ kEnableSubscribeUniformExtension,
};
const int kNumGpuSwitches = arraysize(kGpuSwitches);
diff --git a/gpu/command_buffer/service/gpu_switches.h b/gpu/command_buffer/service/gpu_switches.h
index 2645543..c7a34f6 100644
--- a/gpu/command_buffer/service/gpu_switches.h
+++ b/gpu/command_buffer/service/gpu_switches.h
@@ -26,7 +26,9 @@
GPU_EXPORT extern const char kGpuProgramCacheSizeKb[];
GPU_EXPORT extern const char kDisableGpuShaderDiskCache[];
GPU_EXPORT extern const char kEnableShareGroupAsyncTextureUpload[];
+GPU_EXPORT extern const char kEnableSubscribeUniformExtension[];
GPU_EXPORT extern const char kEnableThreadedTextureMailboxes[];
+GPU_EXPORT extern const char kEnableUnsafeES3APIs[];
GPU_EXPORT extern const char* kGpuSwitches[];
GPU_EXPORT extern const int kNumGpuSwitches;
diff --git a/gpu/command_buffer/service/in_process_command_buffer.cc b/gpu/command_buffer/service/in_process_command_buffer.cc
index 815b197..8836904 100644
--- a/gpu/command_buffer/service/in_process_command_buffer.cc
+++ b/gpu/command_buffer/service/in_process_command_buffer.cc
@@ -19,6 +19,7 @@
#include "base/synchronization/condition_variable.h"
#include "base/threading/thread.h"
#include "gpu/command_buffer/client/gpu_memory_buffer_manager.h"
+#include "gpu/command_buffer/common/value_state.h"
#include "gpu/command_buffer/service/command_buffer_service.h"
#include "gpu/command_buffer/service/context_group.h"
#include "gpu/command_buffer/service/gl_context_virtual.h"
@@ -105,9 +106,12 @@
return shader_translator_cache_;
}
-base::LazyInstance<std::set<InProcessCommandBuffer*> > default_thread_clients_ =
- LAZY_INSTANCE_INITIALIZER;
-base::LazyInstance<base::Lock> default_thread_clients_lock_ =
+struct GpuInProcessThreadHolder {
+ GpuInProcessThreadHolder() : gpu_thread(new GpuInProcessThread) {}
+ scoped_refptr<InProcessCommandBuffer::Service> gpu_thread;
+};
+
+base::LazyInstance<GpuInProcessThreadHolder> g_default_service =
LAZY_INSTANCE_INITIALIZER;
class ScopedEvent {
@@ -194,18 +198,12 @@
return mailbox_manager_;
}
-scoped_refptr<InProcessCommandBuffer::Service>
-InProcessCommandBuffer::GetDefaultService() {
- base::AutoLock lock(default_thread_clients_lock_.Get());
- scoped_refptr<Service> service;
- if (!default_thread_clients_.Get().empty()) {
- InProcessCommandBuffer* other = *default_thread_clients_.Get().begin();
- service = other->service_;
- DCHECK(service.get());
- } else {
- service = new GpuInProcessThread;
+scoped_refptr<gpu::ValueStateMap>
+InProcessCommandBuffer::Service::pending_valuebuffer_state() {
+ if (!pending_valuebuffer_state_.get()) {
+ pending_valuebuffer_state_ = new gpu::ValueStateMap();
}
- return service;
+ return pending_valuebuffer_state_;
}
InProcessCommandBuffer::InProcessCommandBuffer(
@@ -216,19 +214,14 @@
last_put_offset_(-1),
gpu_memory_buffer_manager_(nullptr),
flush_event_(false, false),
- service_(service.get() ? service : GetDefaultService()),
+ service_(service.get() ? service : g_default_service.Get().gpu_thread),
gpu_thread_weak_ptr_factory_(this) {
- if (!service.get()) {
- base::AutoLock lock(default_thread_clients_lock_.Get());
- default_thread_clients_.Get().insert(this);
- }
+ DCHECK(service_.get());
next_image_id_.GetNext();
}
InProcessCommandBuffer::~InProcessCommandBuffer() {
Destroy();
- base::AutoLock lock(default_thread_clients_lock_.Get());
- default_thread_clients_.Get().erase(this);
}
void InProcessCommandBuffer::OnResizeView(gfx::Size size, float scale_factor) {
@@ -358,6 +351,7 @@
NULL,
service_->shader_translator_cache(),
NULL,
+ service_->pending_valuebuffer_state(),
bind_generates_resource)));
gpu_scheduler_.reset(
diff --git a/gpu/command_buffer/service/in_process_command_buffer.h b/gpu/command_buffer/service/in_process_command_buffer.h
index cb1ab28..b1abd4c 100644
--- a/gpu/command_buffer/service/in_process_command_buffer.h
+++ b/gpu/command_buffer/service/in_process_command_buffer.h
@@ -46,6 +46,7 @@
#endif
namespace gpu {
+class ValueStateMap;
namespace gles2 {
class GLES2Decoder;
@@ -138,9 +139,11 @@
virtual scoped_refptr<gles2::ShaderTranslatorCache>
shader_translator_cache() = 0;
scoped_refptr<gles2::MailboxManager> mailbox_manager();
+ scoped_refptr<gpu::ValueStateMap> pending_valuebuffer_state();
private:
scoped_refptr<gles2::MailboxManager> mailbox_manager_;
+ scoped_refptr<gpu::ValueStateMap> pending_valuebuffer_state_;
};
#if defined(OS_ANDROID)
@@ -207,8 +210,6 @@
void PumpCommands();
void PerformIdleWork();
- static scoped_refptr<Service> GetDefaultService();
-
// Members accessed on the gpu thread (possibly with the exception of
// creation):
bool context_lost_;
diff --git a/gpu/command_buffer/service/program_manager.cc b/gpu/command_buffer/service/program_manager.cc
index f3c447c..1de61bb 100644
--- a/gpu/command_buffer/service/program_manager.cc
+++ b/gpu/command_buffer/service/program_manager.cc
@@ -14,6 +14,7 @@
#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
#include "base/metrics/histogram.h"
+#include "base/numerics/safe_math.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/time/time.h"
@@ -66,7 +67,7 @@
return false;
}
- GLint index = 0;
+ base::CheckedNumeric<GLint> index = 0;
size_t last = name.size() - 1;
for (size_t pos = open_pos + 1; pos < last; ++pos) {
int8 digit = name[pos] - '0';
@@ -75,8 +76,11 @@
}
index = index * 10 + digit;
}
+ if (!index.IsValid()) {
+ return false;
+ }
- *element_index = index;
+ *element_index = index.ValueOrDie();
*new_name = name.substr(0, open_pos);
return true;
}
diff --git a/gpu/command_buffer/service/test_helper.cc b/gpu/command_buffer/service/test_helper.cc
index cea7b8a..7d9fb6f 100644
--- a/gpu/command_buffer/service/test_helper.cc
+++ b/gpu/command_buffer/service/test_helper.cc
@@ -344,21 +344,22 @@
if (strstr(extensions, "GL_ARB_texture_float") ||
(is_es3 && strstr(extensions, "GL_EXT_color_buffer_float"))) {
- static const GLuint gl_ids[] = {101, 102};
+ static const GLuint tx_ids[] = {101, 102};
+ static const GLuint fb_ids[] = {103, 104};
const GLsizei width = 16;
EXPECT_CALL(*gl, GetIntegerv(GL_FRAMEBUFFER_BINDING, _))
- .WillOnce(SetArgumentPointee<1>(gl_ids[0]))
+ .WillOnce(SetArgumentPointee<1>(fb_ids[0]))
.RetiresOnSaturation();
EXPECT_CALL(*gl, GetIntegerv(GL_TEXTURE_BINDING_2D, _))
- .WillOnce(SetArgumentPointee<1>(gl_ids[0]))
+ .WillOnce(SetArgumentPointee<1>(tx_ids[0]))
.RetiresOnSaturation();
EXPECT_CALL(*gl, GenTextures(1, _))
- .WillOnce(SetArrayArgument<1>(gl_ids + 1, gl_ids + 2))
+ .WillOnce(SetArrayArgument<1>(tx_ids + 1, tx_ids + 2))
.RetiresOnSaturation();
EXPECT_CALL(*gl, GenFramebuffersEXT(1, _))
- .WillOnce(SetArrayArgument<1>(gl_ids + 1, gl_ids + 2))
+ .WillOnce(SetArrayArgument<1>(fb_ids + 1, fb_ids + 2))
.RetiresOnSaturation();
- EXPECT_CALL(*gl, BindTexture(GL_TEXTURE_2D, gl_ids[1]))
+ EXPECT_CALL(*gl, BindTexture(GL_TEXTURE_2D, tx_ids[1]))
.Times(1)
.RetiresOnSaturation();
EXPECT_CALL(*gl, TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
@@ -369,11 +370,11 @@
GL_RGBA, GL_FLOAT, _))
.Times(1)
.RetiresOnSaturation();
- EXPECT_CALL(*gl, BindFramebufferEXT(GL_FRAMEBUFFER, gl_ids[1]))
+ EXPECT_CALL(*gl, BindFramebufferEXT(GL_FRAMEBUFFER, fb_ids[1]))
.Times(1)
.RetiresOnSaturation();
EXPECT_CALL(*gl, FramebufferTexture2DEXT(GL_FRAMEBUFFER,
- GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, gl_ids[1], 0))
+ GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tx_ids[1], 0))
.Times(1)
.RetiresOnSaturation();
EXPECT_CALL(*gl, CheckFramebufferStatusEXT(GL_FRAMEBUFFER))
@@ -398,10 +399,10 @@
EXPECT_CALL(*gl, DeleteTextures(1, _))
.Times(1)
.RetiresOnSaturation();
- EXPECT_CALL(*gl, BindFramebufferEXT(GL_FRAMEBUFFER, gl_ids[0]))
+ EXPECT_CALL(*gl, BindFramebufferEXT(GL_FRAMEBUFFER, fb_ids[0]))
.Times(1)
.RetiresOnSaturation();
- EXPECT_CALL(*gl, BindTexture(GL_TEXTURE_2D, gl_ids[0]))
+ EXPECT_CALL(*gl, BindTexture(GL_TEXTURE_2D, tx_ids[0]))
.Times(1)
.RetiresOnSaturation();
#if DCHECK_IS_ON
@@ -421,6 +422,59 @@
.WillOnce(SetArgumentPointee<1>(8))
.RetiresOnSaturation();
}
+
+ if (is_es3 || strstr(extensions, "GL_EXT_texture_rg") ||
+ (strstr(extensions, "GL_ARB_texture_rg"))) {
+ static const GLuint tx_ids[] = {101, 102};
+ static const GLuint fb_ids[] = {103, 104};
+ const GLsizei width = 1;
+ EXPECT_CALL(*gl, GetIntegerv(GL_FRAMEBUFFER_BINDING, _))
+ .WillOnce(SetArgumentPointee<1>(fb_ids[0]))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl, GetIntegerv(GL_TEXTURE_BINDING_2D, _))
+ .WillOnce(SetArgumentPointee<1>(tx_ids[0]))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl, GenTextures(1, _))
+ .WillOnce(SetArrayArgument<1>(tx_ids + 1, tx_ids + 2))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl, BindTexture(GL_TEXTURE_2D, tx_ids[1]))
+ .Times(1)
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl, TexImage2D(GL_TEXTURE_2D, 0, GL_RED_EXT, width, width, 0,
+ GL_RED_EXT, GL_UNSIGNED_BYTE, _))
+ .Times(1)
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl, GenFramebuffersEXT(1, _))
+ .WillOnce(SetArrayArgument<1>(fb_ids + 1, fb_ids + 2))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl, BindFramebufferEXT(GL_FRAMEBUFFER, fb_ids[1]))
+ .Times(1)
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl, FramebufferTexture2DEXT(GL_FRAMEBUFFER,
+ GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tx_ids[1], 0))
+ .Times(1)
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl, CheckFramebufferStatusEXT(GL_FRAMEBUFFER))
+ .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl, DeleteFramebuffersEXT(1, _))
+ .Times(1)
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl, DeleteTextures(1, _))
+ .Times(1)
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl, BindFramebufferEXT(GL_FRAMEBUFFER, fb_ids[0]))
+ .Times(1)
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl, BindTexture(GL_TEXTURE_2D, tx_ids[0]))
+ .Times(1)
+ .RetiresOnSaturation();
+#if DCHECK_IS_ON
+ EXPECT_CALL(*gl, GetError())
+ .WillOnce(Return(GL_NO_ERROR))
+ .RetiresOnSaturation();
+#endif
+ }
}
void TestHelper::SetupExpectationsForClearingUniforms(
diff --git a/gpu/command_buffer/service/valuebuffer_manager.cc b/gpu/command_buffer/service/valuebuffer_manager.cc
index eb4db09..21de3f8 100644
--- a/gpu/command_buffer/service/valuebuffer_manager.cc
+++ b/gpu/command_buffer/service/valuebuffer_manager.cc
@@ -2,16 +2,17 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "gpu/command_buffer/service/valuebuffer_manager.h"
-
+#include "gpu/command_buffer/service/gl_utils.h"
#include "gpu/command_buffer/service/program_manager.h"
+#include "gpu/command_buffer/service/valuebuffer_manager.h"
namespace gpu {
namespace gles2 {
-Valuebuffer::Valuebuffer(ValuebufferManager* manager, GLuint client_id)
+Valuebuffer::Valuebuffer(ValuebufferManager* manager, unsigned int client_id)
: manager_(manager), client_id_(client_id), has_been_bound_(false) {
manager_->StartTracking(this);
+ active_state_map_ = new ValueStateMap();
}
Valuebuffer::~Valuebuffer() {
@@ -21,40 +22,40 @@
}
}
-void Valuebuffer::AddSubscription(GLenum subscription) {
+void Valuebuffer::AddSubscription(unsigned int subscription) {
subscriptions_.insert(subscription);
}
-void Valuebuffer::RemoveSubscription(GLenum subscription) {
+void Valuebuffer::RemoveSubscription(unsigned int subscription) {
subscriptions_.erase(subscription);
}
-bool Valuebuffer::IsSubscribed(GLenum subscription) {
+bool Valuebuffer::IsSubscribed(unsigned int subscription) {
return subscriptions_.find(subscription) != subscriptions_.end();
}
-const ValueState *Valuebuffer::GetState(GLenum target) const {
- StateMap::const_iterator it = active_state_map_.find(target);
- return it != active_state_map_.end() ? &it->second : NULL;
+const ValueState* Valuebuffer::GetState(unsigned int target) const {
+ return active_state_map_->GetState(target);
}
-void Valuebuffer::UpdateState(const StateMap& pending_state) {
+void Valuebuffer::UpdateState(const ValueStateMap* pending_state) {
+ DCHECK(pending_state);
for (SubscriptionSet::const_iterator it = subscriptions_.begin();
it != subscriptions_.end(); ++it) {
- StateMap::const_iterator pending_state_it = pending_state.find((*it));
- if (pending_state_it != pending_state.end()) {
- active_state_map_[pending_state_it->first] = pending_state_it->second;
+ const ValueState *state = pending_state->GetState(*it);
+ if (state != NULL) {
+ active_state_map_->UpdateState(*it, *state);
}
}
}
-ValuebufferManager::ValuebufferManager()
- : valuebuffer_count_(0) {
+ValuebufferManager::ValuebufferManager(ValueStateMap* state_map)
+ : valuebuffer_count_(0),
+ pending_state_map_(state_map) {
}
ValuebufferManager::~ValuebufferManager() {
DCHECK(valuebuffer_map_.empty());
- DCHECK(pending_state_map_.empty());
// If this triggers, that means something is keeping a reference to
// a Valuebuffer belonging to this.
CHECK_EQ(valuebuffer_count_, 0u);
@@ -62,7 +63,6 @@
void ValuebufferManager::Destroy() {
valuebuffer_map_.clear();
- pending_state_map_.clear();
}
void ValuebufferManager::StartTracking(Valuebuffer* /* valuebuffer */) {
@@ -73,19 +73,19 @@
--valuebuffer_count_;
}
-void ValuebufferManager::CreateValuebuffer(GLuint client_id) {
+void ValuebufferManager::CreateValuebuffer(unsigned int client_id) {
scoped_refptr<Valuebuffer> valuebuffer(new Valuebuffer(this, client_id));
std::pair<ValuebufferMap::iterator, bool> result =
valuebuffer_map_.insert(std::make_pair(client_id, valuebuffer));
DCHECK(result.second);
}
-Valuebuffer* ValuebufferManager::GetValuebuffer(GLuint client_id) {
+Valuebuffer* ValuebufferManager::GetValuebuffer(unsigned int client_id) {
ValuebufferMap::iterator it = valuebuffer_map_.find(client_id);
return it != valuebuffer_map_.end() ? it->second.get() : NULL;
}
-void ValuebufferManager::RemoveValuebuffer(GLuint client_id) {
+void ValuebufferManager::RemoveValuebuffer(unsigned int client_id) {
ValuebufferMap::iterator it = valuebuffer_map_.find(client_id);
if (it != valuebuffer_map_.end()) {
Valuebuffer* valuebuffer = it->second.get();
@@ -96,15 +96,10 @@
void ValuebufferManager::UpdateValuebufferState(Valuebuffer* valuebuffer) {
DCHECK(valuebuffer);
- valuebuffer->UpdateState(pending_state_map_);
+ valuebuffer->UpdateState(pending_state_map_.get());
}
-void ValuebufferManager::UpdateValueState(
- GLenum target, const ValueState& state) {
- pending_state_map_[target] = state;
-}
-
-uint32 ValuebufferManager::ApiTypeForSubscriptionTarget(GLenum target) {
+uint32 ValuebufferManager::ApiTypeForSubscriptionTarget(unsigned int target) {
switch (target) {
case GL_MOUSE_POSITION_CHROMIUM:
return Program::kUniform2i;
diff --git a/gpu/command_buffer/service/valuebuffer_manager.h b/gpu/command_buffer/service/valuebuffer_manager.h
index 3cc4ac1..022bf41 100644
--- a/gpu/command_buffer/service/valuebuffer_manager.h
+++ b/gpu/command_buffer/service/valuebuffer_manager.h
@@ -9,7 +9,7 @@
#include "base/containers/hash_tables.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
-#include "gpu/command_buffer/service/gl_utils.h"
+#include "gpu/command_buffer/common/value_state.h"
#include "gpu/gpu_export.h"
namespace gpu {
@@ -17,16 +17,11 @@
class ValuebufferManager;
-union ValueState {
- float float_value[4];
- int int_value[4];
-};
-
class GPU_EXPORT Valuebuffer : public base::RefCounted<Valuebuffer> {
public:
- Valuebuffer(ValuebufferManager* manager, GLuint client_id);
+ Valuebuffer(ValuebufferManager* manager, unsigned int client_id);
- GLuint client_id() const { return client_id_; }
+ unsigned int client_id() const { return client_id_; }
bool IsDeleted() const { return client_id_ == 0; }
@@ -34,26 +29,25 @@
bool IsValid() const { return has_been_bound_ && !IsDeleted(); }
- void AddSubscription(GLenum subscription);
- void RemoveSubscription(GLenum subscription);
+ void AddSubscription(unsigned int subscription);
+ void RemoveSubscription(unsigned int subscription);
// Returns true if this Valuebuffer is subscribed to subscription
- bool IsSubscribed(GLenum subscription);
+ bool IsSubscribed(unsigned int subscription);
// Returns the active state for a given target in this Valuebuffer
// returns NULL if target state doesn't exist
- const ValueState* GetState(GLenum target) const;
+ const ValueState* GetState(unsigned int target) const;
private:
friend class ValuebufferManager;
friend class base::RefCounted<Valuebuffer>;
- typedef base::hash_map<GLenum, ValueState> StateMap;
- typedef base::hash_set<GLenum> SubscriptionSet;
+ typedef base::hash_set<unsigned int> SubscriptionSet;
~Valuebuffer();
- void UpdateState(const StateMap& pending_state);
+ void UpdateState(const ValueStateMap* pending_state);
void MarkAsDeleted() { client_id_ = 0; }
@@ -61,58 +55,57 @@
ValuebufferManager* manager_;
// Client side Valuebuffer id.
- GLuint client_id_;
+ unsigned int client_id_;
// Whether this Valuebuffer has ever been bound.
bool has_been_bound_;
SubscriptionSet subscriptions_;
- StateMap active_state_map_;
+ scoped_refptr<ValueStateMap> active_state_map_;
};
class GPU_EXPORT ValuebufferManager {
public:
- ValuebufferManager();
+ ValuebufferManager(ValueStateMap* state_map);
~ValuebufferManager();
// Must call before destruction.
void Destroy();
// Creates a Valuebuffer for the given Valuebuffer ids.
- void CreateValuebuffer(GLuint client_id);
+ void CreateValuebuffer(unsigned int client_id);
// Gets the Valuebuffer for the given Valuebuffer id.
- Valuebuffer* GetValuebuffer(GLuint client_id);
+ Valuebuffer* GetValuebuffer(unsigned int client_id);
// Removes a Valuebuffer for the given Valuebuffer id.
- void RemoveValuebuffer(GLuint client_id);
+ void RemoveValuebuffer(unsigned int client_id);
// Updates the value state for the given Valuebuffer
void UpdateValuebufferState(Valuebuffer* valuebuffer);
- // Gets the state for the given subscription target
- void UpdateValueState(GLenum target, const ValueState& state);
-
- static uint32 ApiTypeForSubscriptionTarget(GLenum target);
+ static uint32 ApiTypeForSubscriptionTarget(unsigned int target);
private:
friend class Valuebuffer;
- typedef base::hash_map<GLuint, scoped_refptr<Valuebuffer>> ValuebufferMap;
+ typedef base::hash_map<unsigned int, scoped_refptr<Valuebuffer>>
+ ValuebufferMap;
void StartTracking(Valuebuffer* valuebuffer);
void StopTracking(Valuebuffer* valuebuffer);
// Counts the number of Valuebuffer allocated with 'this' as its manager.
// Allows to check no Valuebuffer will outlive this.
- unsigned valuebuffer_count_;
+ unsigned int valuebuffer_count_;
// Info for each Valuebuffer in the system.
ValuebufferMap valuebuffer_map_;
// Current value state in the system
- Valuebuffer::StateMap pending_state_map_;
+ // Updated by GpuChannel
+ scoped_refptr<ValueStateMap> pending_state_map_;
DISALLOW_COPY_AND_ASSIGN(ValuebufferManager);
};
diff --git a/gpu/command_buffer/service/valuebuffer_manager_unittest.cc b/gpu/command_buffer/service/valuebuffer_manager_unittest.cc
index ead5df5..44cc2f7 100644
--- a/gpu/command_buffer/service/valuebuffer_manager_unittest.cc
+++ b/gpu/command_buffer/service/valuebuffer_manager_unittest.cc
@@ -9,6 +9,7 @@
#include "base/strings/string_util.h"
#include "gpu/command_buffer/common/gles2_cmd_format.h"
#include "gpu/command_buffer/common/gles2_cmd_utils.h"
+#include "gpu/command_buffer/common/value_state.h"
#include "gpu/command_buffer/service/common_decoder.h"
#include "gpu/command_buffer/service/feature_info.h"
#include "gpu/command_buffer/service/gpu_service_test.h"
@@ -23,47 +24,59 @@
class ValuebufferManagerTest : public GpuServiceTest {
public:
- ValuebufferManagerTest() : manager_() {}
- ~ValuebufferManagerTest() override { manager_.Destroy(); }
+ ValuebufferManagerTest() {}
+ ~ValuebufferManagerTest() {}
+
+ void SetUp() override {
+ GpuServiceTest::SetUp();
+ pending_state_map_ = new ValueStateMap();
+ manager_.reset(new ValuebufferManager(pending_state_map_.get()));
+ }
+
+ void TearDown() override {
+ manager_->Destroy();
+ GpuServiceTest::TearDown();
+ }
protected:
- ValuebufferManager manager_;
+ scoped_refptr<ValueStateMap> pending_state_map_;
+ scoped_ptr<ValuebufferManager> manager_;
};
TEST_F(ValuebufferManagerTest, Basic) {
const GLuint kClient1Id = 1;
const GLuint kClient2Id = 2;
// Check we can create a Valuebuffer
- manager_.CreateValuebuffer(kClient1Id);
- Valuebuffer* valuebuffer0 = manager_.GetValuebuffer(kClient1Id);
+ manager_->CreateValuebuffer(kClient1Id);
+ Valuebuffer* valuebuffer0 = manager_->GetValuebuffer(kClient1Id);
ASSERT_TRUE(valuebuffer0 != NULL);
EXPECT_EQ(kClient1Id, valuebuffer0->client_id());
// Check we get nothing for a non-existent Valuebuffer.
// Check trying to a remove non-existent Valuebuffer does not crash
- manager_.RemoveValuebuffer(kClient2Id);
+ manager_->RemoveValuebuffer(kClient2Id);
// Check we can't get the renderbuffer after we remove it.
- manager_.RemoveValuebuffer(kClient1Id);
- EXPECT_TRUE(manager_.GetValuebuffer(kClient1Id) == NULL);
+ manager_->RemoveValuebuffer(kClient1Id);
+ EXPECT_TRUE(manager_->GetValuebuffer(kClient1Id) == NULL);
}
TEST_F(ValuebufferManagerTest, Destroy) {
const GLuint kClient1Id = 1;
// Check we can create Valuebuffer.
- manager_.CreateValuebuffer(kClient1Id);
- Valuebuffer* valuebuffer0 = manager_.GetValuebuffer(kClient1Id);
+ manager_->CreateValuebuffer(kClient1Id);
+ Valuebuffer* valuebuffer0 = manager_->GetValuebuffer(kClient1Id);
ASSERT_TRUE(valuebuffer0 != NULL);
EXPECT_EQ(kClient1Id, valuebuffer0->client_id());
- manager_.Destroy();
+ manager_->Destroy();
// Check the resources were released.
- Valuebuffer* valuebuffer1 = manager_.GetValuebuffer(kClient1Id);
+ Valuebuffer* valuebuffer1 = manager_->GetValuebuffer(kClient1Id);
ASSERT_TRUE(valuebuffer1 == NULL);
}
TEST_F(ValuebufferManagerTest, ValueBuffer) {
const GLuint kClient1Id = 1;
// Check we can create a Valuebuffer
- manager_.CreateValuebuffer(kClient1Id);
- Valuebuffer* valuebuffer0 = manager_.GetValuebuffer(kClient1Id);
+ manager_->CreateValuebuffer(kClient1Id);
+ Valuebuffer* valuebuffer0 = manager_->GetValuebuffer(kClient1Id);
ASSERT_TRUE(valuebuffer0 != NULL);
EXPECT_EQ(kClient1Id, valuebuffer0->client_id());
EXPECT_FALSE(valuebuffer0->IsValid());
@@ -75,21 +88,21 @@
valuestate1.int_value[0] = 111;
ValueState valuestate2;
valuestate2.int_value[0] = 222;
- manager_.CreateValuebuffer(kClient1Id);
- Valuebuffer* valuebuffer0 = manager_.GetValuebuffer(kClient1Id);
+ manager_->CreateValuebuffer(kClient1Id);
+ Valuebuffer* valuebuffer0 = manager_->GetValuebuffer(kClient1Id);
ASSERT_TRUE(valuebuffer0 != NULL);
EXPECT_EQ(kClient1Id, valuebuffer0->client_id());
valuebuffer0->AddSubscription(GL_MOUSE_POSITION_CHROMIUM);
ASSERT_TRUE(valuebuffer0->GetState(GL_MOUSE_POSITION_CHROMIUM) == NULL);
- manager_.UpdateValueState(GL_MOUSE_POSITION_CHROMIUM, valuestate1);
- manager_.UpdateValuebufferState(valuebuffer0);
+ pending_state_map_->UpdateState(GL_MOUSE_POSITION_CHROMIUM, valuestate1);
+ manager_->UpdateValuebufferState(valuebuffer0);
const ValueState* new_state1 =
valuebuffer0->GetState(GL_MOUSE_POSITION_CHROMIUM);
ASSERT_TRUE(new_state1 != NULL);
ASSERT_TRUE(new_state1->int_value[0] == 111);
// Ensure state changes
- manager_.UpdateValueState(GL_MOUSE_POSITION_CHROMIUM, valuestate2);
- manager_.UpdateValuebufferState(valuebuffer0);
+ pending_state_map_->UpdateState(GL_MOUSE_POSITION_CHROMIUM, valuestate2);
+ manager_->UpdateValuebufferState(valuebuffer0);
const ValueState* new_state2 =
valuebuffer0->GetState(GL_MOUSE_POSITION_CHROMIUM);
ASSERT_TRUE(new_state2 != NULL);
diff --git a/gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc b/gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc
index a8cbb66..2c44e1a 100644
--- a/gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc
+++ b/gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc
@@ -76,43 +76,6 @@
EXPECT_TRUE(GL_NO_ERROR == glGetError());
}
-TEST_F(GLCopyTextureCHROMIUMTest, ImmutableTexture) {
- if (!GLTestHelper::HasExtension("GL_EXT_texture_storage")) {
- LOG(INFO) << "GL_EXT_texture_storage not supported. Skipping test...";
- return;
- }
-
- uint8 pixels[1 * 4] = {255u, 0u, 0u, 255u};
-
- glBindTexture(GL_TEXTURE_2D, textures_[0]);
- glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8_OES, 1, 1);
- glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE,
- pixels);
-
- glBindTexture(GL_TEXTURE_2D, textures_[1]);
- glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8_OES, 1, 1);
- glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
- textures_[1], 0);
- EXPECT_TRUE(glGetError() == GL_NO_ERROR);
-
- glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA,
- GL_UNSIGNED_BYTE);
- EXPECT_TRUE(glGetError() == GL_NO_ERROR);
-
- // Check the FB is still bound.
- GLint value = 0;
- glGetIntegerv(GL_FRAMEBUFFER_BINDING, &value);
- GLuint fb_id = value;
- EXPECT_EQ(framebuffer_id_, fb_id);
-
- // Check that FB is complete.
- EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
- glCheckFramebufferStatus(GL_FRAMEBUFFER));
-
- GLTestHelper::CheckPixels(0, 0, 1, 1, 0, pixels);
- EXPECT_TRUE(GL_NO_ERROR == glGetError());
-}
-
TEST_F(GLCopyTextureCHROMIUMTest, InternalFormat) {
GLint src_formats[] = {GL_ALPHA, GL_RGB, GL_RGBA,
GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_BGRA_EXT};
diff --git a/gpu/command_buffer/tests/gl_manager.cc b/gpu/command_buffer/tests/gl_manager.cc
index c09901f..6e5e58e 100644
--- a/gpu/command_buffer/tests/gl_manager.cc
+++ b/gpu/command_buffer/tests/gl_manager.cc
@@ -18,6 +18,7 @@
#include "gpu/command_buffer/client/transfer_buffer.h"
#include "gpu/command_buffer/common/constants.h"
#include "gpu/command_buffer/common/gles2_cmd_utils.h"
+#include "gpu/command_buffer/common/value_state.h"
#include "gpu/command_buffer/service/command_buffer_service.h"
#include "gpu/command_buffer/service/context_group.h"
#include "gpu/command_buffer/service/gl_context_virtual.h"
@@ -203,6 +204,7 @@
NULL,
new gpu::gles2::ShaderTranslatorCache,
feature_info,
+ NULL,
options.bind_generates_resource);
}
diff --git a/gpu/command_buffer/tests/gl_test_utils.cc b/gpu/command_buffer/tests/gl_test_utils.cc
index 0ab71da..d3272ca 100644
--- a/gpu/command_buffer/tests/gl_test_utils.cc
+++ b/gpu/command_buffer/tests/gl_test_utils.cc
@@ -7,7 +7,6 @@
#include <stdio.h>
#include "base/basictypes.h"
#include "base/memory/scoped_ptr.h"
-#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
// GCC requires these declarations, but MSVC requires they not be present.
@@ -240,8 +239,3 @@
fclose(fp);
return true;
}
-
-int GLTestHelper::RunTests(int argc, char** argv) {
- testing::InitGoogleMock(&argc, argv);
- return RUN_ALL_TESTS();
-}
diff --git a/gpu/command_buffer/tests/gl_test_utils.h b/gpu/command_buffer/tests/gl_test_utils.h
index 972ea0a..15a726e 100644
--- a/gpu/command_buffer/tests/gl_test_utils.h
+++ b/gpu/command_buffer/tests/gl_test_utils.h
@@ -47,9 +47,6 @@
// Uses ReadPixels to save an area of the current FBO/Backbuffer.
static bool SaveBackbufferAsBMP(const char* filename, int width, int height);
-
- // Run unit tests.
- static int RunTests(int argc, char** argv);
};
#endif // GPU_COMMAND_BUFFER_TESTS_GL_TEST_UTILS_H_
diff --git a/gpu/command_buffer/tests/gl_tests_main.cc b/gpu/command_buffer/tests/gl_tests_main.cc
index 460ecae..8952e44 100644
--- a/gpu/command_buffer/tests/gl_tests_main.cc
+++ b/gpu/command_buffer/tests/gl_tests_main.cc
@@ -3,14 +3,17 @@
// found in the LICENSE file.
#include "base/at_exit.h"
+#include "base/bind.h"
#include "base/command_line.h"
#include "base/message_loop/message_loop.h"
#if defined(OS_MACOSX)
#include "base/mac/scoped_nsautorelease_pool.h"
#endif
+#include "base/test/launcher/unit_test_launcher.h"
+#include "base/test/test_suite.h"
#include "gpu/command_buffer/client/gles2_lib.h"
-#include "gpu/command_buffer/tests/gl_test_utils.h"
#include "gpu/config/gpu_util.h"
+#include "testing/gmock/include/gmock/gmock.h"
#include "ui/gl/gl_surface.h"
#if defined(OS_ANDROID)
@@ -18,12 +21,20 @@
#include "ui/gl/android/gl_jni_registrar.h"
#endif
+namespace {
+
+int RunHelper(base::TestSuite* testSuite) {
+ base::MessageLoopForIO message_loop;
+ return testSuite->Run();
+}
+
+} // namespace
+
int main(int argc, char** argv) {
#if defined(OS_ANDROID)
ui::gl::android::RegisterJni(base::android::AttachCurrentThread());
-#else
- base::AtExitManager exit_manager;
#endif
+ base::TestSuite test_suite(argc, argv);
CommandLine::Init(argc, argv);
#if defined(OS_MACOSX)
base::mac::ScopedNSAutoreleasePool pool;
@@ -31,8 +42,9 @@
gfx::GLSurface::InitializeOneOff();
::gles2::Initialize();
gpu::ApplyGpuDriverBugWorkarounds(CommandLine::ForCurrentProcess());
- base::MessageLoop main_message_loop;
- return GLTestHelper::RunTests(argc, argv);
+ testing::InitGoogleMock(&argc, argv);
+ return base::LaunchUnitTestsSerially(
+ argc,
+ argv,
+ base::Bind(&RunHelper, base::Unretained(&test_suite)));
}
-
-
diff --git a/gpu/command_buffer/tests/gl_unittest.cc b/gpu/command_buffer/tests/gl_unittest.cc
index 9915190..49eb002 100644
--- a/gpu/command_buffer/tests/gl_unittest.cc
+++ b/gpu/command_buffer/tests/gl_unittest.cc
@@ -5,6 +5,7 @@
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
+#include "gpu/command_buffer/service/feature_info.h"
#include "gpu/command_buffer/tests/gl_manager.h"
#include "gpu/command_buffer/tests/gl_test_utils.h"
#include "testing/gmock/include/gmock/gmock.h"
@@ -88,6 +89,25 @@
EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, 1, 1, 0, expected_draw));
}
+TEST_F(GLTest, FeatureFlagsMatchCapabilities) {
+ scoped_refptr<gles2::FeatureInfo> features = new gles2::FeatureInfo;
+ EXPECT_TRUE(features->Initialize());
+ const auto& caps = gl_.GetCapabilities();
+ const auto& flags = features->feature_flags();
+ EXPECT_EQ(caps.egl_image_external, flags.oes_egl_image_external);
+ EXPECT_EQ(caps.texture_format_bgra8888, flags.ext_texture_format_bgra8888);
+ EXPECT_EQ(caps.texture_format_etc1, flags.oes_compressed_etc1_rgb8_texture);
+ EXPECT_EQ(caps.texture_rectangle, flags.arb_texture_rectangle);
+ EXPECT_EQ(caps.texture_usage, flags.angle_texture_usage);
+ EXPECT_EQ(caps.texture_storage, flags.ext_texture_storage);
+ EXPECT_EQ(caps.discard_framebuffer, flags.ext_discard_framebuffer);
+ EXPECT_EQ(caps.sync_query, flags.chromium_sync_query);
+ EXPECT_EQ(caps.blend_equation_advanced, flags.blend_equation_advanced);
+ EXPECT_EQ(caps.blend_equation_advanced_coherent,
+ flags.blend_equation_advanced_coherent);
+ EXPECT_EQ(caps.texture_rg, flags.ext_texture_rg);
+}
+
TEST_F(GLTest, GetString) {
EXPECT_STREQ(
"OpenGL ES 2.0 Chromium",
diff --git a/gpu/command_buffer_common.gypi b/gpu/command_buffer_common.gypi
index 7c9d2ec..d793b48 100644
--- a/gpu/command_buffer_common.gypi
+++ b/gpu/command_buffer_common.gypi
@@ -31,5 +31,7 @@
'command_buffer/common/mailbox_holder.h',
'command_buffer/common/thread_local.h',
'command_buffer/common/time.h',
+ 'command_buffer/common/value_state.cc',
+ 'command_buffer/common/value_state.h',
],
}
diff --git a/gpu/config/gpu_driver_bug_list_json.cc b/gpu/config/gpu_driver_bug_list_json.cc
index 3db1ff9..b447c1a 100644
--- a/gpu/config/gpu_driver_bug_list_json.cc
+++ b/gpu/config/gpu_driver_bug_list_json.cc
@@ -19,7 +19,7 @@
{
"name": "gpu driver bug list",
// Please update the version number whenever you change this file.
- "version": "7.9",
+ "version": "7.11",
"entries": [
{
"id": 1,
@@ -175,7 +175,11 @@
"id": 11,
"description": "Limit max texure size to 4096 on Macs with Intel GPUs",
"os": {
- "type": "macosx"
+ "type": "macosx",
+ "version": {
+ "op": "<",
+ "value": "10.9"
+ }
},
"vendor_id": "0x8086",
"features": [
@@ -212,7 +216,11 @@
"id": 14,
"description": "Limit max texure size and cube map texture size to 4096 on Macs with AMD GPUs",
"os": {
- "type": "macosx"
+ "type": "macosx",
+ "version": {
+ "op": "<",
+ "value": "10.9"
+ }
},
"vendor_id": "0x1002",
"features": [
@@ -1044,7 +1052,7 @@
"type": "android",
"version": {
"op": "<=",
- "value": "5.0.0"
+ "value": "5.0.1"
}
},
"gl_vendor": "NVIDIA.*",
diff --git a/gpu/config/gpu_info_collector_linux.cc b/gpu/config/gpu_info_collector_linux.cc
index 061fe35..ac5660a 100644
--- a/gpu/config/gpu_info_collector_linux.cc
+++ b/gpu/config/gpu_info_collector_linux.cc
@@ -31,6 +31,7 @@
namespace {
+#if defined(USE_LIBPCI)
// This checks if a system supports PCI bus.
// We check the existence of /sys/bus/pci or /sys/bug/pci_express.
bool IsPciSupported() {
@@ -39,6 +40,7 @@
return (base::PathExists(pci_path) ||
base::PathExists(pcie_path));
}
+#endif // defined(USE_LIBPCI)
// Scan /etc/ati/amdpcsdb.default for "ReleaseVersion".
// Return empty string on failing.
diff --git a/gpu/config/software_rendering_list_json.cc b/gpu/config/software_rendering_list_json.cc
index 11e8e81..b9f5e3a 100644
--- a/gpu/config/software_rendering_list_json.cc
+++ b/gpu/config/software_rendering_list_json.cc
@@ -18,7 +18,7 @@
{
"name": "software rendering list",
// Please update the version number whenever you change this file.
- "version": "9.12",
+ "version": "9.13",
"entries": [
{
"id": 1,
@@ -1165,6 +1165,23 @@
"features": [
"all"
]
+ },
+ {
+ "id": 104,
+ "description": "GPU raster broken on PowerVR Rogue",
+ "cr_bugs": [436331],
+ "os": {
+ "type": "android",
+ "version": {
+ "op": "<",
+ "value": "5.0"
+ }
+ },
+ "gl_renderer": "PowerVR Rogue.*",
+ "features": [
+ "accelerated_2d_canvas",
+ "gpu_rasterization"
+ ]
}
]
}
diff --git a/gpu/gles2_conform_support/egl/display.cc b/gpu/gles2_conform_support/egl/display.cc
index 3fc17b9..e471c69 100644
--- a/gpu/gles2_conform_support/egl/display.cc
+++ b/gpu/gles2_conform_support/egl/display.cc
@@ -10,6 +10,7 @@
#include "gpu/command_buffer/client/gles2_implementation.h"
#include "gpu/command_buffer/client/gles2_lib.h"
#include "gpu/command_buffer/client/transfer_buffer.h"
+#include "gpu/command_buffer/common/value_state.h"
#include "gpu/command_buffer/service/context_group.h"
#include "gpu/command_buffer/service/mailbox_manager.h"
#include "gpu/command_buffer/service/memory_tracking.h"
@@ -115,7 +116,7 @@
return NULL;
scoped_refptr<gpu::gles2::ContextGroup> group(new gpu::gles2::ContextGroup(
- NULL, NULL, new gpu::gles2::ShaderTranslatorCache, NULL, true));
+ NULL, NULL, new gpu::gles2::ShaderTranslatorCache, NULL, NULL, true));
decoder_.reset(gpu::gles2::GLES2Decoder::Create(group.get()));
if (!decoder_.get())
diff --git a/gpu/gpu.gyp b/gpu/gpu.gyp
index 5a9deb1..40eb5f9 100644
--- a/gpu/gpu.gyp
+++ b/gpu/gpu.gyp
@@ -128,6 +128,7 @@
'type': '<(gtest_target_type)',
'dependencies': [
'../base/base.gyp:base',
+ '../base/base.gyp:test_support_base',
'../base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations',
'../testing/gmock.gyp:gmock',
'../testing/gtest.gyp:gtest',
@@ -293,6 +294,7 @@
'type': '<(gtest_target_type)',
'dependencies': [
'../base/base.gyp:base',
+ '../base/base.gyp:test_support_base',
'../base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations',
'../testing/gmock.gyp:gmock',
'../testing/gtest.gyp:gtest',
diff --git a/gpu/ipc/gpu_command_buffer_traits.cc b/gpu/ipc/gpu_command_buffer_traits.cc
index 1b30034..ade1e1d 100644
--- a/gpu/ipc/gpu_command_buffer_traits.cc
+++ b/gpu/ipc/gpu_command_buffer_traits.cc
@@ -5,6 +5,7 @@
#include "gpu/ipc/gpu_command_buffer_traits.h"
#include "gpu/command_buffer/common/mailbox_holder.h"
+#include "gpu/command_buffer/common/value_state.h"
// Generate param traits write methods.
#include "ipc/param_traits_write_macros.h"
@@ -95,4 +96,31 @@
*l += base::StringPrintf(":%04x@%d", p.texture_target, p.sync_point);
}
+void ParamTraits<gpu::ValueState>::Write(Message* m, const param_type& p) {
+ m->WriteData(reinterpret_cast<const char*>(&p),
+ sizeof(gpu::ValueState));
+}
+
+bool ParamTraits<gpu::ValueState>::Read(const Message* m,
+ PickleIterator* iter,
+ param_type* p) {
+ int length;
+ const char* data = NULL;
+ if (!m->ReadData(iter, &data, &length) || length != sizeof(gpu::ValueState))
+ return false;
+ DCHECK(data);
+ memcpy(p, data, sizeof(gpu::ValueState));
+ return true;
+}
+
+void ParamTraits<gpu::ValueState>::Log(const param_type& p, std::string* l) {
+ l->append("<ValueState (");
+ for (size_t i = 0; i < sizeof(p.int_value); ++i)
+ *l += base::StringPrintf("%i ", p.int_value[i]);
+ l->append(" int values ");
+ for (size_t i = 0; i < sizeof(p.float_value); ++i)
+ *l += base::StringPrintf("%f ", p.float_value[i]);
+ l->append(" float values)>");
+}
+
} // namespace IPC
diff --git a/gpu/ipc/gpu_command_buffer_traits.h b/gpu/ipc/gpu_command_buffer_traits.h
index 3451639..1c7e02e 100644
--- a/gpu/ipc/gpu_command_buffer_traits.h
+++ b/gpu/ipc/gpu_command_buffer_traits.h
@@ -13,6 +13,7 @@
namespace gpu {
struct Mailbox;
struct MailboxHolder;
+union ValueState;
}
namespace IPC {
@@ -41,6 +42,14 @@
static void Log(const param_type& p, std::string* l);
};
+template <>
+struct GPU_EXPORT ParamTraits<gpu::ValueState> {
+ typedef gpu::ValueState param_type;
+ static void Write(Message* m, const param_type& p);
+ static bool Read(const Message* m, PickleIterator* iter, param_type* p);
+ static void Log(const param_type& p, std::string* l);
+};
+
} // namespace IPC
#endif // GPU_IPC_GPU_PARAM_TRAITS_H_
diff --git a/gpu/ipc/gpu_command_buffer_traits_multi.h b/gpu/ipc/gpu_command_buffer_traits_multi.h
index 0978f79..8201f32 100644
--- a/gpu/ipc/gpu_command_buffer_traits_multi.h
+++ b/gpu/ipc/gpu_command_buffer_traits_multi.h
@@ -56,4 +56,5 @@
IPC_STRUCT_TRAITS_MEMBER(image)
IPC_STRUCT_TRAITS_MEMBER(blend_equation_advanced)
IPC_STRUCT_TRAITS_MEMBER(blend_equation_advanced_coherent)
+ IPC_STRUCT_TRAITS_MEMBER(texture_rg)
IPC_STRUCT_TRAITS_END()
diff --git a/mojo/tools/roll/cc_strip_video.patch b/mojo/tools/roll/cc_strip_video.patch
index 90bb220..8e92de1 100644
--- a/mojo/tools/roll/cc_strip_video.patch
+++ b/mojo/tools/roll/cc_strip_video.patch
@@ -1,5 +1,5 @@
diff --git a/cc/BUILD.gn b/cc/BUILD.gn
-index a296bb0..ab3aab4 100644
+index c744c5b..16a1589 100644
--- a/cc/BUILD.gn
+++ b/cc/BUILD.gn
@@ -212,13 +212,6 @@ component("cc") {
@@ -16,7 +16,7 @@
"output/begin_frame_args.cc",
"output/begin_frame_args.h",
"output/bsp_tree.cc",
-@@ -429,8 +422,6 @@ component("cc") {
+@@ -453,8 +446,6 @@ component("cc") {
"resources/ui_resource_client.h",
"resources/ui_resource_request.cc",
"resources/ui_resource_request.h",
@@ -25,15 +25,7 @@
"resources/zero_copy_raster_worker_pool.cc",
"resources/zero_copy_raster_worker_pool.h",
"scheduler/begin_frame_source.cc",
-@@ -492,7 +483,6 @@ component("cc") {
- "//gpu",
- "//gpu/command_buffer/client:gles2_interface",
- "//gpu/command_buffer/client:gpu_memory_buffer_manager",
-- "//media",
- "//ui/events:events_base",
- "//ui/gfx",
- "//ui/gfx/geometry",
-@@ -563,8 +553,6 @@ source_set("test_support") {
+@@ -588,8 +579,6 @@ source_set("test_support") {
"test/fake_tile_manager_client.h",
"test/fake_ui_resource_layer_tree_host_impl.cc",
"test/fake_ui_resource_layer_tree_host_impl.h",
@@ -42,7 +34,7 @@
"test/geometry_test_utils.cc",
"test/geometry_test_utils.h",
"test/test_in_process_context_provider.cc",
-@@ -717,7 +705,6 @@ test("cc_unittests") {
+@@ -744,7 +733,6 @@ test("cc_unittests") {
"layers/tiled_layer_unittest.cc",
"layers/ui_resource_layer_impl_unittest.cc",
"layers/ui_resource_layer_unittest.cc",
@@ -50,7 +42,7 @@
"output/begin_frame_args_unittest.cc",
"output/delegating_renderer_unittest.cc",
"output/filter_operations_unittest.cc",
-@@ -747,7 +734,6 @@ test("cc_unittests") {
+@@ -775,7 +763,6 @@ test("cc_unittests") {
"resources/texture_uploader_unittest.cc",
"resources/tile_manager_unittest.cc",
"resources/tile_priority_unittest.cc",
@@ -58,7 +50,7 @@
"scheduler/begin_frame_source_unittest.cc",
"scheduler/delay_based_time_source_unittest.cc",
"scheduler/scheduler_state_machine_unittest.cc",
-@@ -776,7 +762,6 @@ test("cc_unittests") {
+@@ -804,7 +791,6 @@ test("cc_unittests") {
"trees/layer_tree_host_unittest_picture.cc",
"trees/layer_tree_host_unittest_proxy.cc",
"trees/layer_tree_host_unittest_scroll.cc",
@@ -66,22 +58,6 @@
"trees/layer_tree_impl_unittest.cc",
"trees/occlusion_tracker_unittest.cc",
"trees/occlusion_unittest.cc",
-@@ -803,7 +788,6 @@ test("cc_unittests") {
- "//gpu:test_support",
- "//gpu/command_buffer/client:gles2_interface",
- "//gpu/command_buffer/common:gles2_utils",
-- "//media",
- "//testing/gmock",
- "//testing/gtest",
- "//ui/events:events_base",
-@@ -835,7 +819,6 @@ test("cc_perftests") {
- "//gpu",
- "//gpu:test_support",
- "//gpu/command_buffer/common:gles2_utils",
-- "//media",
- "//skia",
- "//testing/gmock",
- "//testing/gtest",
diff --git a/cc/layers/video_frame_provider.h b/cc/layers/video_frame_provider.h
deleted file mode 100644
index 784d951..0000000
@@ -253,7 +229,7 @@
-
-} // namespace cc
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc
-index 75dcfe8..cb6189e 100644
+index 27f40eb..49af1c3 100644
--- a/cc/output/gl_renderer.cc
+++ b/cc/output/gl_renderer.cc
@@ -13,7 +13,6 @@
@@ -635,8 +611,20 @@
#include "cc/quads/draw_quad.h"
namespace cc {
+diff --git a/cc/resources/drawing_display_item.cc b/cc/resources/drawing_display_item.cc
+index ecf7a75..9466d5c 100644
+--- a/cc/resources/drawing_display_item.cc
++++ b/cc/resources/drawing_display_item.cc
+@@ -4,6 +4,7 @@
+
+ #include "cc/resources/drawing_display_item.h"
+
++#include "base/logging.h"
+ #include "third_party/skia/include/core/SkCanvas.h"
+ #include "third_party/skia/include/core/SkMatrix.h"
+ #include "third_party/skia/include/core/SkPicture.h"
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
-index e128013..0b9d976 100644
+index f31cde0..4e070e2 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -27,7 +27,6 @@
@@ -679,7 +667,7 @@
}
LayerTreeSettings DefaultSettings() {
-@@ -5151,18 +5146,6 @@ TEST_F(LayerTreeHostImplTest, LayersFreeTextures) {
+@@ -5247,18 +5242,6 @@ TEST_F(LayerTreeHostImplTest, LayersFreeTextures) {
LayerImpl::Create(host_impl_->active_tree(), 1);
root_layer->SetBounds(gfx::Size(10, 10));
@@ -698,7 +686,7 @@
scoped_ptr<IOSurfaceLayerImpl> io_surface_layer =
IOSurfaceLayerImpl::Create(host_impl_->active_tree(), 5);
io_surface_layer->SetBounds(gfx::Size(10, 10));
-@@ -6225,16 +6208,6 @@ TEST_F(LayerTreeHostImplTest,
+@@ -6321,16 +6304,6 @@ TEST_F(LayerTreeHostImplTest,
scoped_ptr<SolidColorLayerImpl> root_layer =
SolidColorLayerImpl::Create(host_impl_->active_tree(), 1);
@@ -716,7 +704,7 @@
EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc
-index 2abf6d3..b0ce5a5 100644
+index 712909f..51c5d7e 100644
--- a/cc/trees/layer_tree_host_unittest.cc
+++ b/cc/trees/layer_tree_host_unittest.cc
@@ -18,7 +18,6 @@
@@ -735,7 +723,7 @@
#include "cc/test/geometry_test_utils.h"
#include "cc/test/layer_tree_test.h"
#include "cc/test/test_shared_bitmap_manager.h"
-@@ -4149,28 +4147,6 @@ class LayerInvalidateCausesDraw : public LayerTreeHostTest {
+@@ -4189,28 +4187,6 @@ class LayerInvalidateCausesDraw : public LayerTreeHostTest {
int num_draws_;
};
@@ -765,7 +753,7 @@
// to the compositor thread, even though no resources are updated in
// response to that invalidation.
diff --git a/cc/trees/layer_tree_host_unittest_context.cc b/cc/trees/layer_tree_host_unittest_context.cc
-index 134d928..dc34d3c 100644
+index 2d23d75..b646e6a 100644
--- a/cc/trees/layer_tree_host_unittest_context.cc
+++ b/cc/trees/layer_tree_host_unittest_context.cc
@@ -15,8 +15,6 @@
@@ -883,3 +871,893 @@
};
SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestDontUseLostResources);
+diff --git a/mojo/tools/roll/cc_strip_video.patch b/mojo/tools/roll/cc_strip_video.patch
+index 90bb220..c7cb034 100644
+--- a/mojo/tools/roll/cc_strip_video.patch
++++ b/mojo/tools/roll/cc_strip_video.patch
+@@ -1,885 +0,0 @@
+-diff --git a/cc/BUILD.gn b/cc/BUILD.gn
+-index a296bb0..ab3aab4 100644
+---- a/cc/BUILD.gn
+-+++ b/cc/BUILD.gn
+-@@ -212,13 +212,6 @@ component("cc") {
+- "layers/ui_resource_layer.h",
+- "layers/ui_resource_layer_impl.cc",
+- "layers/ui_resource_layer_impl.h",
+-- "layers/video_frame_provider.h",
+-- "layers/video_frame_provider_client_impl.cc",
+-- "layers/video_frame_provider_client_impl.h",
+-- "layers/video_layer.cc",
+-- "layers/video_layer.h",
+-- "layers/video_layer_impl.cc",
+-- "layers/video_layer_impl.h",
+- "output/begin_frame_args.cc",
+- "output/begin_frame_args.h",
+- "output/bsp_tree.cc",
+-@@ -429,8 +422,6 @@ component("cc") {
+- "resources/ui_resource_client.h",
+- "resources/ui_resource_request.cc",
+- "resources/ui_resource_request.h",
+-- "resources/video_resource_updater.cc",
+-- "resources/video_resource_updater.h",
+- "resources/zero_copy_raster_worker_pool.cc",
+- "resources/zero_copy_raster_worker_pool.h",
+- "scheduler/begin_frame_source.cc",
+-@@ -492,7 +483,6 @@ component("cc") {
+- "//gpu",
+- "//gpu/command_buffer/client:gles2_interface",
+- "//gpu/command_buffer/client:gpu_memory_buffer_manager",
+-- "//media",
+- "//ui/events:events_base",
+- "//ui/gfx",
+- "//ui/gfx/geometry",
+-@@ -563,8 +553,6 @@ source_set("test_support") {
+- "test/fake_tile_manager_client.h",
+- "test/fake_ui_resource_layer_tree_host_impl.cc",
+- "test/fake_ui_resource_layer_tree_host_impl.h",
+-- "test/fake_video_frame_provider.cc",
+-- "test/fake_video_frame_provider.h",
+- "test/geometry_test_utils.cc",
+- "test/geometry_test_utils.h",
+- "test/test_in_process_context_provider.cc",
+-@@ -717,7 +705,6 @@ test("cc_unittests") {
+- "layers/tiled_layer_unittest.cc",
+- "layers/ui_resource_layer_impl_unittest.cc",
+- "layers/ui_resource_layer_unittest.cc",
+-- "layers/video_layer_impl_unittest.cc",
+- "output/begin_frame_args_unittest.cc",
+- "output/delegating_renderer_unittest.cc",
+- "output/filter_operations_unittest.cc",
+-@@ -747,7 +734,6 @@ test("cc_unittests") {
+- "resources/texture_uploader_unittest.cc",
+- "resources/tile_manager_unittest.cc",
+- "resources/tile_priority_unittest.cc",
+-- "resources/video_resource_updater_unittest.cc",
+- "scheduler/begin_frame_source_unittest.cc",
+- "scheduler/delay_based_time_source_unittest.cc",
+- "scheduler/scheduler_state_machine_unittest.cc",
+-@@ -776,7 +762,6 @@ test("cc_unittests") {
+- "trees/layer_tree_host_unittest_picture.cc",
+- "trees/layer_tree_host_unittest_proxy.cc",
+- "trees/layer_tree_host_unittest_scroll.cc",
+-- "trees/layer_tree_host_unittest_video.cc",
+- "trees/layer_tree_impl_unittest.cc",
+- "trees/occlusion_tracker_unittest.cc",
+- "trees/occlusion_unittest.cc",
+-@@ -803,7 +788,6 @@ test("cc_unittests") {
+- "//gpu:test_support",
+- "//gpu/command_buffer/client:gles2_interface",
+- "//gpu/command_buffer/common:gles2_utils",
+-- "//media",
+- "//testing/gmock",
+- "//testing/gtest",
+- "//ui/events:events_base",
+-@@ -835,7 +819,6 @@ test("cc_perftests") {
+- "//gpu",
+- "//gpu:test_support",
+- "//gpu/command_buffer/common:gles2_utils",
+-- "//media",
+- "//skia",
+- "//testing/gmock",
+- "//testing/gtest",
+-diff --git a/cc/layers/video_frame_provider.h b/cc/layers/video_frame_provider.h
+-deleted file mode 100644
+-index 784d951..0000000
+---- a/cc/layers/video_frame_provider.h
+-+++ /dev/null
+-@@ -1,63 +0,0 @@
+--// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+--// Use of this source code is governed by a BSD-style license that can be
+--// found in the LICENSE file.
+--
+--#ifndef CC_LAYERS_VIDEO_FRAME_PROVIDER_H_
+--#define CC_LAYERS_VIDEO_FRAME_PROVIDER_H_
+--
+--#include "base/memory/ref_counted.h"
+--
+--namespace media {
+--class VideoFrame;
+--}
+--
+--namespace cc {
+--
+--// Threading notes: This class may be used in a multi threaded manner.
+--// Specifically, the implementation may call GetCurrentFrame() or
+--// PutCurrentFrame() from the compositor thread. If so, the caller is
+--// responsible for making sure Client::DidReceiveFrame() and
+--// Client::DidUpdateMatrix() are only called from this same thread.
+--class VideoFrameProvider {
+-- public:
+-- virtual ~VideoFrameProvider() {}
+--
+-- class Client {
+-- public:
+-- // Provider will call this method to tell the client to stop using it.
+-- // StopUsingProvider() may be called from any thread. The client should
+-- // block until it has PutCurrentFrame() any outstanding frames.
+-- virtual void StopUsingProvider() = 0;
+--
+-- // Notifies the provider's client that a call to GetCurrentFrame() will
+-- // return new data.
+-- virtual void DidReceiveFrame() = 0;
+--
+-- // Notifies the provider's client of a new UV transform matrix to be used.
+-- virtual void DidUpdateMatrix(const float* matrix) = 0;
+--
+-- protected:
+-- virtual ~Client() {}
+-- };
+--
+-- // May be called from any thread, but there must be some external guarantee
+-- // that the provider is not destroyed before this call returns.
+-- virtual void SetVideoFrameProviderClient(Client* client) = 0;
+--
+-- // This function places a lock on the current frame and returns a pointer to
+-- // it. Calls to this method should always be followed with a call to
+-- // PutCurrentFrame().
+-- // Only the current provider client should call this function.
+-- virtual scoped_refptr<media::VideoFrame> GetCurrentFrame() = 0;
+--
+-- // This function releases the lock on the video frame. It should always be
+-- // called after GetCurrentFrame(). Frames passed into this method
+-- // should no longer be referenced after the call is made. Only the current
+-- // provider client should call this function.
+-- virtual void PutCurrentFrame(
+-- const scoped_refptr<media::VideoFrame>& frame) = 0;
+--};
+--
+--} // namespace cc
+--
+--#endif // CC_LAYERS_VIDEO_FRAME_PROVIDER_H_
+-diff --git a/cc/layers/video_frame_provider_client_impl.cc b/cc/layers/video_frame_provider_client_impl.cc
+-deleted file mode 100644
+-index 50333c1..0000000
+---- a/cc/layers/video_frame_provider_client_impl.cc
+-+++ /dev/null
+-@@ -1,95 +0,0 @@
+--// Copyright 2013 The Chromium Authors. All rights reserved.
+--// Use of this source code is governed by a BSD-style license that can be
+--// found in the LICENSE file.
+--
+--#include "cc/layers/video_frame_provider_client_impl.h"
+--
+--#include "base/debug/trace_event.h"
+--#include "cc/base/math_util.h"
+--#include "cc/layers/video_layer_impl.h"
+--#include "media/base/video_frame.h"
+--
+--namespace cc {
+--
+--// static
+--scoped_refptr<VideoFrameProviderClientImpl>
+-- VideoFrameProviderClientImpl::Create(
+-- VideoFrameProvider* provider) {
+-- return make_scoped_refptr(
+-- new VideoFrameProviderClientImpl(provider));
+--}
+--
+--VideoFrameProviderClientImpl::~VideoFrameProviderClientImpl() {}
+--
+--VideoFrameProviderClientImpl::VideoFrameProviderClientImpl(
+-- VideoFrameProvider* provider)
+-- : active_video_layer_(nullptr), provider_(provider) {
+-- // This only happens during a commit on the compositor thread while the main
+-- // thread is blocked. That makes this a thread-safe call to set the video
+-- // frame provider client that does not require a lock. The same is true of
+-- // the call to Stop().
+-- provider_->SetVideoFrameProviderClient(this);
+--
+-- // This matrix is the default transformation for stream textures, and flips
+-- // on the Y axis.
+-- stream_texture_matrix_ = gfx::Transform(
+-- 1.0, 0.0, 0.0, 0.0,
+-- 0.0, -1.0, 0.0, 1.0,
+-- 0.0, 0.0, 1.0, 0.0,
+-- 0.0, 0.0, 0.0, 1.0);
+--}
+--
+--void VideoFrameProviderClientImpl::Stop() {
+-- if (!provider_)
+-- return;
+-- provider_->SetVideoFrameProviderClient(nullptr);
+-- provider_ = nullptr;
+--}
+--
+--scoped_refptr<media::VideoFrame>
+--VideoFrameProviderClientImpl::AcquireLockAndCurrentFrame() {
+-- provider_lock_.Acquire(); // Balanced by call to ReleaseLock().
+-- if (!provider_)
+-- return nullptr;
+--
+-- return provider_->GetCurrentFrame();
+--}
+--
+--void VideoFrameProviderClientImpl::PutCurrentFrame(
+-- const scoped_refptr<media::VideoFrame>& frame) {
+-- provider_lock_.AssertAcquired();
+-- provider_->PutCurrentFrame(frame);
+--}
+--
+--void VideoFrameProviderClientImpl::ReleaseLock() {
+-- provider_lock_.AssertAcquired();
+-- provider_lock_.Release();
+--}
+--
+--void VideoFrameProviderClientImpl::StopUsingProvider() {
+-- // Block the provider from shutting down until this client is done
+-- // using the frame.
+-- base::AutoLock locker(provider_lock_);
+-- provider_ = nullptr;
+--}
+--
+--void VideoFrameProviderClientImpl::DidReceiveFrame() {
+-- TRACE_EVENT1("cc",
+-- "VideoFrameProviderClientImpl::DidReceiveFrame",
+-- "active_video_layer",
+-- !!active_video_layer_);
+-- if (active_video_layer_)
+-- active_video_layer_->SetNeedsRedraw();
+--}
+--
+--void VideoFrameProviderClientImpl::DidUpdateMatrix(const float* matrix) {
+-- stream_texture_matrix_ = gfx::Transform(
+-- matrix[0], matrix[4], matrix[8], matrix[12],
+-- matrix[1], matrix[5], matrix[9], matrix[13],
+-- matrix[2], matrix[6], matrix[10], matrix[14],
+-- matrix[3], matrix[7], matrix[11], matrix[15]);
+-- if (active_video_layer_)
+-- active_video_layer_->SetNeedsRedraw();
+--}
+--
+--} // namespace cc
+-diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc
+-index 75dcfe8..cb6189e 100644
+---- a/cc/output/gl_renderer.cc
+-+++ b/cc/output/gl_renderer.cc
+-@@ -13,7 +13,6 @@
+- #include "base/debug/trace_event.h"
+- #include "base/logging.h"
+- #include "cc/base/math_util.h"
+--#include "cc/layers/video_layer_impl.h"
+- #include "cc/output/compositor_frame.h"
+- #include "cc/output/compositor_frame_metadata.h"
+- #include "cc/output/context_provider.h"
+-diff --git a/cc/output/renderer_pixeltest.cc b/cc/output/renderer_pixeltest.cc
+-index 0c2bc3d..d112ed1 100644
+---- a/cc/output/renderer_pixeltest.cc
+-+++ b/cc/output/renderer_pixeltest.cc
+-@@ -12,7 +12,6 @@
+- #include "cc/test/fake_picture_pile_impl.h"
+- #include "cc/test/pixel_test.h"
+- #include "gpu/command_buffer/client/gles2_interface.h"
+--#include "media/base/video_frame.h"
+- #include "third_party/skia/include/core/SkColorPriv.h"
+- #include "third_party/skia/include/core/SkImageFilter.h"
+- #include "third_party/skia/include/core/SkMatrix.h"
+-@@ -385,346 +384,6 @@ TEST_F(GLRendererPixelTest, NonPremultipliedTextureWithBackground) {
+- FuzzyPixelOffByOneComparator(true)));
+- }
+-
+--class VideoGLRendererPixelTest : public GLRendererPixelTest {
+-- protected:
+-- void CreateTestYUVVideoDrawQuad_Striped(const SharedQuadState* shared_state,
+-- media::VideoFrame::Format format,
+-- bool is_transparent,
+-- const gfx::RectF& tex_coord_rect,
+-- RenderPass* render_pass) {
+-- const gfx::Rect rect(this->device_viewport_size_);
+--
+-- scoped_refptr<media::VideoFrame> video_frame =
+-- media::VideoFrame::CreateFrame(
+-- format, rect.size(), rect, rect.size(), base::TimeDelta());
+--
+-- // YUV values representing a striped pattern, for validating texture
+-- // coordinates for sampling.
+-- uint8_t y_value = 0;
+-- uint8_t u_value = 0;
+-- uint8_t v_value = 0;
+-- for (int i = 0; i < video_frame->rows(media::VideoFrame::kYPlane); ++i) {
+-- uint8_t* y_row = video_frame->data(media::VideoFrame::kYPlane) +
+-- video_frame->stride(media::VideoFrame::kYPlane) * i;
+-- for (int j = 0; j < video_frame->row_bytes(media::VideoFrame::kYPlane);
+-- ++j) {
+-- y_row[j] = (y_value += 1);
+-- }
+-- }
+-- for (int i = 0; i < video_frame->rows(media::VideoFrame::kUPlane); ++i) {
+-- uint8_t* u_row = video_frame->data(media::VideoFrame::kUPlane) +
+-- video_frame->stride(media::VideoFrame::kUPlane) * i;
+-- uint8_t* v_row = video_frame->data(media::VideoFrame::kVPlane) +
+-- video_frame->stride(media::VideoFrame::kVPlane) * i;
+-- for (int j = 0; j < video_frame->row_bytes(media::VideoFrame::kUPlane);
+-- ++j) {
+-- u_row[j] = (u_value += 3);
+-- v_row[j] = (v_value += 5);
+-- }
+-- }
+-- CreateTestYUVVideoDrawQuad_FromVideoFrame(
+-- shared_state, video_frame, is_transparent, tex_coord_rect, render_pass);
+-- }
+--
+-- void CreateTestYUVVideoDrawQuad_Solid(const SharedQuadState* shared_state,
+-- media::VideoFrame::Format format,
+-- bool is_transparent,
+-- const gfx::RectF& tex_coord_rect,
+-- uint8 y,
+-- uint8 u,
+-- uint8 v,
+-- RenderPass* render_pass) {
+-- const gfx::Rect rect(this->device_viewport_size_);
+--
+-- scoped_refptr<media::VideoFrame> video_frame =
+-- media::VideoFrame::CreateFrame(
+-- format, rect.size(), rect, rect.size(), base::TimeDelta());
+--
+-- // YUV values of a solid, constant, color. Useful for testing that color
+-- // space/color range are being handled properly.
+-- memset(video_frame->data(media::VideoFrame::kYPlane),
+-- y,
+-- video_frame->stride(media::VideoFrame::kYPlane) *
+-- video_frame->rows(media::VideoFrame::kYPlane));
+-- memset(video_frame->data(media::VideoFrame::kUPlane),
+-- u,
+-- video_frame->stride(media::VideoFrame::kUPlane) *
+-- video_frame->rows(media::VideoFrame::kUPlane));
+-- memset(video_frame->data(media::VideoFrame::kVPlane),
+-- v,
+-- video_frame->stride(media::VideoFrame::kVPlane) *
+-- video_frame->rows(media::VideoFrame::kVPlane));
+--
+-- CreateTestYUVVideoDrawQuad_FromVideoFrame(
+-- shared_state, video_frame, is_transparent, tex_coord_rect, render_pass);
+-- }
+--
+-- void CreateTestYUVVideoDrawQuad_FromVideoFrame(
+-- const SharedQuadState* shared_state,
+-- scoped_refptr<media::VideoFrame> video_frame,
+-- bool is_transparent,
+-- const gfx::RectF& tex_coord_rect,
+-- RenderPass* render_pass) {
+-- const bool with_alpha = (video_frame->format() == media::VideoFrame::YV12A);
+-- const YUVVideoDrawQuad::ColorSpace color_space =
+-- (video_frame->format() == media::VideoFrame::YV12J
+-- ? YUVVideoDrawQuad::REC_601_JPEG
+-- : YUVVideoDrawQuad::REC_601);
+-- const gfx::Rect rect(this->device_viewport_size_);
+-- const gfx::Rect opaque_rect(0, 0, 0, 0);
+--
+-- if (with_alpha)
+-- memset(video_frame->data(media::VideoFrame::kAPlane),
+-- is_transparent ? 0 : 128,
+-- video_frame->stride(media::VideoFrame::kAPlane) *
+-- video_frame->rows(media::VideoFrame::kAPlane));
+--
+-- VideoFrameExternalResources resources =
+-- video_resource_updater_->CreateExternalResourcesFromVideoFrame(
+-- video_frame);
+--
+-- EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type);
+-- EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame->format()),
+-- resources.mailboxes.size());
+-- EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame->format()),
+-- resources.release_callbacks.size());
+--
+-- ResourceProvider::ResourceId y_resource =
+-- resource_provider_->CreateResourceFromTextureMailbox(
+-- resources.mailboxes[media::VideoFrame::kYPlane],
+-- SingleReleaseCallbackImpl::Create(
+-- resources.release_callbacks[media::VideoFrame::kYPlane]));
+-- ResourceProvider::ResourceId u_resource =
+-- resource_provider_->CreateResourceFromTextureMailbox(
+-- resources.mailboxes[media::VideoFrame::kUPlane],
+-- SingleReleaseCallbackImpl::Create(
+-- resources.release_callbacks[media::VideoFrame::kUPlane]));
+-- ResourceProvider::ResourceId v_resource =
+-- resource_provider_->CreateResourceFromTextureMailbox(
+-- resources.mailboxes[media::VideoFrame::kVPlane],
+-- SingleReleaseCallbackImpl::Create(
+-- resources.release_callbacks[media::VideoFrame::kVPlane]));
+-- ResourceProvider::ResourceId a_resource = 0;
+-- if (with_alpha) {
+-- a_resource = resource_provider_->CreateResourceFromTextureMailbox(
+-- resources.mailboxes[media::VideoFrame::kAPlane],
+-- SingleReleaseCallbackImpl::Create(
+-- resources.release_callbacks[media::VideoFrame::kAPlane]));
+-- }
+--
+-- YUVVideoDrawQuad* yuv_quad =
+-- render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>();
+-- yuv_quad->SetNew(shared_state,
+-- rect,
+-- opaque_rect,
+-- rect,
+-- tex_coord_rect,
+-- y_resource,
+-- u_resource,
+-- v_resource,
+-- a_resource,
+-- color_space);
+-- }
+--
+-- void SetUp() override {
+-- GLRendererPixelTest::SetUp();
+-- video_resource_updater_.reset(new VideoResourceUpdater(
+-- output_surface_->context_provider(), resource_provider_.get()));
+-- }
+--
+-- private:
+-- scoped_ptr<VideoResourceUpdater> video_resource_updater_;
+--};
+--
+--TEST_F(VideoGLRendererPixelTest, SimpleYUVRect) {
+-- gfx::Rect rect(this->device_viewport_size_);
+--
+-- RenderPassId id(1, 1);
+-- scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
+--
+-- SharedQuadState* shared_state =
+-- CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
+--
+-- CreateTestYUVVideoDrawQuad_Striped(shared_state,
+-- media::VideoFrame::YV12,
+-- false,
+-- gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f),
+-- pass.get());
+--
+-- RenderPassList pass_list;
+-- pass_list.push_back(pass.Pass());
+--
+-- EXPECT_TRUE(
+-- this->RunPixelTest(&pass_list,
+-- base::FilePath(FILE_PATH_LITERAL("yuv_stripes.png")),
+-- FuzzyPixelOffByOneComparator(true)));
+--}
+--
+--TEST_F(VideoGLRendererPixelTest, OffsetYUVRect) {
+-- gfx::Rect rect(this->device_viewport_size_);
+--
+-- RenderPassId id(1, 1);
+-- scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
+--
+-- SharedQuadState* shared_state =
+-- CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
+--
+-- // Intentionally sets frame format to I420 for testing coverage.
+-- CreateTestYUVVideoDrawQuad_Striped(shared_state,
+-- media::VideoFrame::I420,
+-- false,
+-- gfx::RectF(0.125f, 0.25f, 0.75f, 0.5f),
+-- pass.get());
+--
+-- RenderPassList pass_list;
+-- pass_list.push_back(pass.Pass());
+--
+-- EXPECT_TRUE(this->RunPixelTest(
+-- &pass_list,
+-- base::FilePath(FILE_PATH_LITERAL("yuv_stripes_offset.png")),
+-- FuzzyPixelOffByOneComparator(true)));
+--}
+--
+--TEST_F(VideoGLRendererPixelTest, SimpleYUVRectBlack) {
+-- gfx::Rect rect(this->device_viewport_size_);
+--
+-- RenderPassId id(1, 1);
+-- scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
+--
+-- SharedQuadState* shared_state =
+-- CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
+--
+-- // In MPEG color range YUV values of (15,128,128) should produce black.
+-- CreateTestYUVVideoDrawQuad_Solid(shared_state,
+-- media::VideoFrame::YV12,
+-- false,
+-- gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f),
+-- 15,
+-- 128,
+-- 128,
+-- pass.get());
+--
+-- RenderPassList pass_list;
+-- pass_list.push_back(pass.Pass());
+--
+-- // If we didn't get black out of the YUV values above, then we probably have a
+-- // color range issue.
+-- EXPECT_TRUE(this->RunPixelTest(&pass_list,
+-- base::FilePath(FILE_PATH_LITERAL("black.png")),
+-- FuzzyPixelOffByOneComparator(true)));
+--}
+--
+--TEST_F(VideoGLRendererPixelTest, SimpleYUVJRect) {
+-- gfx::Rect rect(this->device_viewport_size_);
+--
+-- RenderPassId id(1, 1);
+-- scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
+--
+-- SharedQuadState* shared_state =
+-- CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
+--
+-- // YUV of (149,43,21) should be green (0,255,0) in RGB.
+-- CreateTestYUVVideoDrawQuad_Solid(shared_state,
+-- media::VideoFrame::YV12J,
+-- false,
+-- gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f),
+-- 149,
+-- 43,
+-- 21,
+-- pass.get());
+--
+-- RenderPassList pass_list;
+-- pass_list.push_back(pass.Pass());
+--
+-- EXPECT_TRUE(this->RunPixelTest(&pass_list,
+-- base::FilePath(FILE_PATH_LITERAL("green.png")),
+-- FuzzyPixelOffByOneComparator(true)));
+--}
+--
+--TEST_F(VideoGLRendererPixelTest, SimpleYUVJRectGrey) {
+-- gfx::Rect rect(this->device_viewport_size_);
+--
+-- RenderPassId id(1, 1);
+-- scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
+--
+-- SharedQuadState* shared_state =
+-- CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
+--
+-- // Dark grey in JPEG color range (in MPEG, this is black).
+-- CreateTestYUVVideoDrawQuad_Solid(shared_state,
+-- media::VideoFrame::YV12J,
+-- false,
+-- gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f),
+-- 15,
+-- 128,
+-- 128,
+-- pass.get());
+--
+-- RenderPassList pass_list;
+-- pass_list.push_back(pass.Pass());
+--
+-- EXPECT_TRUE(
+-- this->RunPixelTest(&pass_list,
+-- base::FilePath(FILE_PATH_LITERAL("dark_grey.png")),
+-- FuzzyPixelOffByOneComparator(true)));
+--}
+--
+--TEST_F(VideoGLRendererPixelTest, SimpleYUVARect) {
+-- gfx::Rect rect(this->device_viewport_size_);
+--
+-- RenderPassId id(1, 1);
+-- scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
+--
+-- SharedQuadState* shared_state =
+-- CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
+--
+-- CreateTestYUVVideoDrawQuad_Striped(shared_state,
+-- media::VideoFrame::YV12A,
+-- false,
+-- gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f),
+-- pass.get());
+--
+-- SolidColorDrawQuad* color_quad =
+-- pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
+-- color_quad->SetNew(shared_state, rect, rect, SK_ColorWHITE, false);
+--
+-- RenderPassList pass_list;
+-- pass_list.push_back(pass.Pass());
+--
+-- EXPECT_TRUE(this->RunPixelTest(
+-- &pass_list,
+-- base::FilePath(FILE_PATH_LITERAL("yuv_stripes_alpha.png")),
+-- FuzzyPixelOffByOneComparator(true)));
+--}
+--
+--TEST_F(VideoGLRendererPixelTest, FullyTransparentYUVARect) {
+-- gfx::Rect rect(this->device_viewport_size_);
+--
+-- RenderPassId id(1, 1);
+-- scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
+--
+-- SharedQuadState* shared_state =
+-- CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
+--
+-- CreateTestYUVVideoDrawQuad_Striped(shared_state,
+-- media::VideoFrame::YV12A,
+-- true,
+-- gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f),
+-- pass.get());
+--
+-- SolidColorDrawQuad* color_quad =
+-- pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
+-- color_quad->SetNew(shared_state, rect, rect, SK_ColorBLACK, false);
+--
+-- RenderPassList pass_list;
+-- pass_list.push_back(pass.Pass());
+--
+-- EXPECT_TRUE(this->RunPixelTest(
+-- &pass_list,
+-- base::FilePath(FILE_PATH_LITERAL("black.png")),
+-- ExactPixelComparator(true)));
+--}
+--
+- TYPED_TEST(RendererPixelTest, FastPassColorFilterAlpha) {
+- gfx::Rect viewport_rect(this->device_viewport_size_);
+-
+-diff --git a/cc/quads/yuv_video_draw_quad.h b/cc/quads/yuv_video_draw_quad.h
+-index e1c5410..edda34a 100644
+---- a/cc/quads/yuv_video_draw_quad.h
+-+++ b/cc/quads/yuv_video_draw_quad.h
+-@@ -8,7 +8,6 @@
+- #include "base/basictypes.h"
+- #include "base/memory/scoped_ptr.h"
+- #include "cc/base/cc_export.h"
+--#include "cc/layers/video_layer_impl.h"
+- #include "cc/quads/draw_quad.h"
+-
+- namespace cc {
+-diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
+-index e128013..0b9d976 100644
+---- a/cc/trees/layer_tree_host_impl_unittest.cc
+-+++ b/cc/trees/layer_tree_host_impl_unittest.cc
+-@@ -27,7 +27,6 @@
+- #include "cc/layers/solid_color_scrollbar_layer_impl.h"
+- #include "cc/layers/texture_layer_impl.h"
+- #include "cc/layers/tiled_layer_impl.h"
+--#include "cc/layers/video_layer_impl.h"
+- #include "cc/output/begin_frame_args.h"
+- #include "cc/output/compositor_frame_ack.h"
+- #include "cc/output/compositor_frame_metadata.h"
+-@@ -47,7 +46,6 @@
+- #include "cc/test/fake_picture_layer_impl.h"
+- #include "cc/test/fake_picture_pile_impl.h"
+- #include "cc/test/fake_proxy.h"
+--#include "cc/test/fake_video_frame_provider.h"
+- #include "cc/test/geometry_test_utils.h"
+- #include "cc/test/layer_test_common.h"
+- #include "cc/test/render_pass_test_common.h"
+-@@ -56,7 +54,6 @@
+- #include "cc/test/test_web_graphics_context_3d.h"
+- #include "cc/trees/layer_tree_impl.h"
+- #include "cc/trees/single_thread_proxy.h"
+--#include "media/base/media.h"
+- #include "testing/gmock/include/gmock/gmock.h"
+- #include "testing/gtest/include/gtest/gtest.h"
+- #include "third_party/skia/include/core/SkMallocPixelRef.h"
+-@@ -70,7 +67,6 @@ using ::testing::Return;
+- using ::testing::AnyNumber;
+- using ::testing::AtLeast;
+- using ::testing::_;
+--using media::VideoFrame;
+-
+- namespace cc {
+- namespace {
+-@@ -94,7 +90,6 @@ class LayerTreeHostImplTest : public testing::Test,
+- reduce_memory_result_(true),
+- current_limit_bytes_(0),
+- current_priority_cutoff_value_(0) {
+-- media::InitializeMediaLibraryForTesting();
+- }
+-
+- LayerTreeSettings DefaultSettings() {
+-@@ -5151,18 +5146,6 @@ TEST_F(LayerTreeHostImplTest, LayersFreeTextures) {
+- LayerImpl::Create(host_impl_->active_tree(), 1);
+- root_layer->SetBounds(gfx::Size(10, 10));
+-
+-- scoped_refptr<VideoFrame> softwareFrame =
+-- media::VideoFrame::CreateColorFrame(
+-- gfx::Size(4, 4), 0x80, 0x80, 0x80, base::TimeDelta());
+-- FakeVideoFrameProvider provider;
+-- provider.set_frame(softwareFrame);
+-- scoped_ptr<VideoLayerImpl> video_layer = VideoLayerImpl::Create(
+-- host_impl_->active_tree(), 4, &provider, media::VIDEO_ROTATION_0);
+-- video_layer->SetBounds(gfx::Size(10, 10));
+-- video_layer->SetContentBounds(gfx::Size(10, 10));
+-- video_layer->SetDrawsContent(true);
+-- root_layer->AddChild(video_layer.Pass());
+--
+- scoped_ptr<IOSurfaceLayerImpl> io_surface_layer =
+- IOSurfaceLayerImpl::Create(host_impl_->active_tree(), 5);
+- io_surface_layer->SetBounds(gfx::Size(10, 10));
+-@@ -6225,16 +6208,6 @@ TEST_F(LayerTreeHostImplTest,
+- scoped_ptr<SolidColorLayerImpl> root_layer =
+- SolidColorLayerImpl::Create(host_impl_->active_tree(), 1);
+-
+-- // VideoLayerImpl will not be drawn.
+-- FakeVideoFrameProvider provider;
+-- scoped_ptr<VideoLayerImpl> video_layer = VideoLayerImpl::Create(
+-- host_impl_->active_tree(), 2, &provider, media::VIDEO_ROTATION_0);
+-- video_layer->SetBounds(gfx::Size(10, 10));
+-- video_layer->SetContentBounds(gfx::Size(10, 10));
+-- video_layer->SetDrawsContent(true);
+-- root_layer->AddChild(video_layer.Pass());
+-- SetupRootLayerImpl(root_layer.Pass());
+--
+- LayerTreeHostImpl::FrameData frame;
+- EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
+- host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
+-diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc
+-index 2abf6d3..b0ce5a5 100644
+---- a/cc/trees/layer_tree_host_unittest.cc
+-+++ b/cc/trees/layer_tree_host_unittest.cc
+-@@ -18,7 +18,6 @@
+- #include "cc/layers/painted_scrollbar_layer.h"
+- #include "cc/layers/picture_layer.h"
+- #include "cc/layers/solid_color_layer.h"
+--#include "cc/layers/video_layer.h"
+- #include "cc/output/begin_frame_args.h"
+- #include "cc/output/compositor_frame_ack.h"
+- #include "cc/output/copy_output_request.h"
+-@@ -41,7 +40,6 @@
+- #include "cc/test/fake_picture_pile.h"
+- #include "cc/test/fake_proxy.h"
+- #include "cc/test/fake_scoped_ui_resource.h"
+--#include "cc/test/fake_video_frame_provider.h"
+- #include "cc/test/geometry_test_utils.h"
+- #include "cc/test/layer_tree_test.h"
+- #include "cc/test/test_shared_bitmap_manager.h"
+-@@ -4149,28 +4147,6 @@ class LayerInvalidateCausesDraw : public LayerTreeHostTest {
+- int num_draws_;
+- };
+-
+--// VideoLayer must support being invalidated and then passing that along
+--// to the compositor thread, even though no resources are updated in
+--// response to that invalidation.
+--class LayerTreeHostTestVideoLayerInvalidate : public LayerInvalidateCausesDraw {
+-- public:
+-- void SetupTree() override {
+-- LayerTreeHostTest::SetupTree();
+-- scoped_refptr<VideoLayer> video_layer =
+-- VideoLayer::Create(&provider_, media::VIDEO_ROTATION_0);
+-- video_layer->SetBounds(gfx::Size(10, 10));
+-- video_layer->SetIsDrawable(true);
+-- layer_tree_host()->root_layer()->AddChild(video_layer);
+--
+-- invalidate_layer_ = video_layer;
+-- }
+--
+-- private:
+-- FakeVideoFrameProvider provider_;
+--};
+--
+--SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestVideoLayerInvalidate);
+--
+- // IOSurfaceLayer must support being invalidated and then passing that along
+- // to the compositor thread, even though no resources are updated in
+- // response to that invalidation.
+-diff --git a/cc/trees/layer_tree_host_unittest_context.cc b/cc/trees/layer_tree_host_unittest_context.cc
+-index 134d928..dc34d3c 100644
+---- a/cc/trees/layer_tree_host_unittest_context.cc
+-+++ b/cc/trees/layer_tree_host_unittest_context.cc
+-@@ -15,8 +15,6 @@
+- #include "cc/layers/picture_layer.h"
+- #include "cc/layers/texture_layer.h"
+- #include "cc/layers/texture_layer_impl.h"
+--#include "cc/layers/video_layer.h"
+--#include "cc/layers/video_layer_impl.h"
+- #include "cc/output/filter_operations.h"
+- #include "cc/resources/single_release_callback.h"
+- #include "cc/test/fake_content_layer.h"
+-@@ -32,7 +30,6 @@
+- #include "cc/test/fake_picture_layer_impl.h"
+- #include "cc/test/fake_scoped_ui_resource.h"
+- #include "cc/test/fake_scrollbar.h"
+--#include "cc/test/fake_video_frame_provider.h"
+- #include "cc/test/layer_tree_test.h"
+- #include "cc/test/render_pass_test_common.h"
+- #include "cc/test/test_context_provider.h"
+-@@ -42,9 +39,6 @@
+- #include "cc/trees/layer_tree_impl.h"
+- #include "cc/trees/single_thread_proxy.h"
+- #include "gpu/GLES2/gl2extchromium.h"
+--#include "media/base/media.h"
+--
+--using media::VideoFrame;
+-
+- namespace cc {
+- namespace {
+-@@ -65,7 +59,6 @@ class LayerTreeHostContextTest : public LayerTreeTest {
+- context_should_support_io_surface_(false),
+- fallback_context_works_(false),
+- async_output_surface_creation_(false) {
+-- media::InitializeMediaLibraryForTesting();
+- }
+-
+- void LoseContext() {
+-@@ -1083,49 +1076,6 @@ class LayerTreeHostContextTestDontUseLostResources
+- layer_with_mask->SetMaskLayer(mask.get());
+- root->AddChild(layer_with_mask);
+-
+-- scoped_refptr<VideoLayer> video_color =
+-- VideoLayer::Create(&color_frame_provider_, media::VIDEO_ROTATION_0);
+-- video_color->SetBounds(gfx::Size(10, 10));
+-- video_color->SetIsDrawable(true);
+-- root->AddChild(video_color);
+--
+-- scoped_refptr<VideoLayer> video_hw =
+-- VideoLayer::Create(&hw_frame_provider_, media::VIDEO_ROTATION_0);
+-- video_hw->SetBounds(gfx::Size(10, 10));
+-- video_hw->SetIsDrawable(true);
+-- root->AddChild(video_hw);
+--
+-- scoped_refptr<VideoLayer> video_scaled_hw =
+-- VideoLayer::Create(&scaled_hw_frame_provider_, media::VIDEO_ROTATION_0);
+-- video_scaled_hw->SetBounds(gfx::Size(10, 10));
+-- video_scaled_hw->SetIsDrawable(true);
+-- root->AddChild(video_scaled_hw);
+--
+-- color_video_frame_ = VideoFrame::CreateColorFrame(
+-- gfx::Size(4, 4), 0x80, 0x80, 0x80, base::TimeDelta());
+-- hw_video_frame_ =
+-- VideoFrame::WrapNativeTexture(make_scoped_ptr(new gpu::MailboxHolder(
+-- mailbox, GL_TEXTURE_2D, sync_point)),
+-- media::VideoFrame::ReleaseMailboxCB(),
+-- gfx::Size(4, 4),
+-- gfx::Rect(0, 0, 4, 4),
+-- gfx::Size(4, 4),
+-- base::TimeDelta(),
+-- VideoFrame::ReadPixelsCB());
+-- scaled_hw_video_frame_ =
+-- VideoFrame::WrapNativeTexture(make_scoped_ptr(new gpu::MailboxHolder(
+-- mailbox, GL_TEXTURE_2D, sync_point)),
+-- media::VideoFrame::ReleaseMailboxCB(),
+-- gfx::Size(4, 4),
+-- gfx::Rect(0, 0, 3, 2),
+-- gfx::Size(4, 4),
+-- base::TimeDelta(),
+-- VideoFrame::ReadPixelsCB());
+--
+-- color_frame_provider_.set_frame(color_video_frame_);
+-- hw_frame_provider_.set_frame(hw_video_frame_);
+-- scaled_hw_frame_provider_.set_frame(scaled_hw_video_frame_);
+--
+- if (!delegating_renderer()) {
+- // TODO(danakj): IOSurface layer can not be transported. crbug.com/239335
+- scoped_refptr<IOSurfaceLayer> io_surface = IOSurfaceLayer::Create();
+-@@ -1155,14 +1105,6 @@ class LayerTreeHostContextTestDontUseLostResources
+-
+- void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) override {
+- LayerTreeHostContextTest::CommitCompleteOnThread(host_impl);
+--
+-- if (host_impl->active_tree()->source_frame_number() == 3) {
+-- // On the third commit we're recovering from context loss. Hardware
+-- // video frames should not be reused by the VideoFrameProvider, but
+-- // software frames can be.
+-- hw_frame_provider_.set_frame(NULL);
+-- scaled_hw_frame_provider_.set_frame(NULL);
+-- }
+- }
+-
+- DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl,
+-@@ -1212,14 +1154,6 @@ class LayerTreeHostContextTestDontUseLostResources
+- scoped_refptr<DelegatedFrameResourceCollection>
+- delegated_resource_collection_;
+- scoped_refptr<DelegatedFrameProvider> delegated_frame_provider_;
+--
+-- scoped_refptr<VideoFrame> color_video_frame_;
+-- scoped_refptr<VideoFrame> hw_video_frame_;
+-- scoped_refptr<VideoFrame> scaled_hw_video_frame_;
+--
+-- FakeVideoFrameProvider color_frame_provider_;
+-- FakeVideoFrameProvider hw_frame_provider_;
+-- FakeVideoFrameProvider scaled_hw_frame_provider_;
+- };
+-
+- SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestDontUseLostResources);
diff --git a/mojo/tools/roll/patch.py b/mojo/tools/roll/patch.py
index 30e5a96..5711627 100755
--- a/mojo/tools/roll/patch.py
+++ b/mojo/tools/roll/patch.py
@@ -14,7 +14,10 @@
utils.commit("filter gyp_environment out of build/landmines.py")
utils.filter_file("gpu/BUILD.gn", lambda line: not "//gpu/ipc" in line)
- utils.commit("filter gpu/ipc out of gpu/BUILD.gn")
+ utils.commit("filter //gpu/ipc out of gpu/BUILD.gn")
+
+ utils.filter_file("cc/BUILD.gn", lambda line: not "//media" in line)
+ utils.commit("filter //media out of cc/BUILD.gn")
for p in utils.find(["*.patch"], os.path.dirname(os.path.realpath(__file__))):
print "applying patch %s" % os.path.basename(p)
diff --git a/net/PRESUBMIT.py b/net/PRESUBMIT.py
new file mode 100644
index 0000000..207cad0
--- /dev/null
+++ b/net/PRESUBMIT.py
@@ -0,0 +1,12 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Top-level presubmit script for src/net.
+
+See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
+for more details about the presubmit API built into depot_tools.
+"""
+
+def CheckChangeOnUpload(input_api, output_api):
+ return input_api.canned_checks.CheckPatchFormatted(input_api, output_api)
diff --git a/net/android/BUILD.gn b/net/android/BUILD.gn
index 8c803a1..f583e7f 100644
--- a/net/android/BUILD.gn
+++ b/net/android/BUILD.gn
@@ -52,12 +52,15 @@
java_cpp_enum("net_android_java_enums_srcjar") {
sources = [
"../base/mime_util.h",
+ "../base/network_change_notifier.h",
"cert_verify_result_android.h",
"keystore.h"
]
outputs = [
"org/chromium/net/CertificateMimeType.java",
"org/chromium/net/CertVerifyStatusAndroid.java",
+ "org/chromium/net/ConnectionSubtype.java",
+ "org/chromium/net/ConnectionType.java",
"org/chromium/net/PrivateKeyType.java",
]
}
diff --git a/net/android/java/src/org/chromium/net/NetworkChangeNotifier.java b/net/android/java/src/org/chromium/net/NetworkChangeNotifier.java
index 1008b7e..928af78 100644
--- a/net/android/java/src/org/chromium/net/NetworkChangeNotifier.java
+++ b/net/android/java/src/org/chromium/net/NetworkChangeNotifier.java
@@ -33,21 +33,12 @@
public void onConnectionTypeChanged(int connectionType);
}
- // These constants must always match the ones in network_change_notifier.h.
- public static final int CONNECTION_UNKNOWN = 0;
- public static final int CONNECTION_ETHERNET = 1;
- public static final int CONNECTION_WIFI = 2;
- public static final int CONNECTION_2G = 3;
- public static final int CONNECTION_3G = 4;
- public static final int CONNECTION_4G = 5;
- public static final int CONNECTION_NONE = 6;
- public static final int CONNECTION_BLUETOOTH = 7;
-
private final Context mContext;
private final ArrayList<Long> mNativeChangeNotifiers;
private final ObserverList<ConnectionTypeObserver> mConnectionTypeObservers;
private NetworkChangeNotifierAutoDetect mAutoDetector;
- private int mCurrentConnectionType = CONNECTION_UNKNOWN;
+ private int mCurrentConnectionType = ConnectionType.CONNECTION_UNKNOWN;
+ private double mCurrentMaxBandwidth = Double.POSITIVE_INFINITY;
private static NetworkChangeNotifier sInstance;
@@ -81,6 +72,18 @@
return mCurrentConnectionType;
}
+ @CalledByNative
+ public double getCurrentMaxBandwidth() {
+ return mCurrentMaxBandwidth;
+ }
+
+ /**
+ * Calls a native map lookup of subtype to max bandwidth.
+ */
+ public static double getMaxBandwidthForConnectionSubtype(int subtype) {
+ return nativeGetMaxBandwidthForConnectionSubtype(subtype);
+ }
+
/**
* Adds a native-side observer.
*/
@@ -144,11 +147,13 @@
new NetworkChangeNotifierAutoDetect.Observer() {
@Override
public void onConnectionTypeChanged(int newConnectionType) {
+ updateCurrentMaxBandwidth(mAutoDetector.getCurrentMaxBandwidthInMbps());
updateCurrentConnectionType(newConnectionType);
}
},
mContext,
alwaysWatchForChanges);
+ updateCurrentMaxBandwidth(mAutoDetector.getCurrentMaxBandwidthInMbps());
updateCurrentConnectionType(mAutoDetector.getCurrentConnectionType());
}
} else {
@@ -169,9 +174,12 @@
}
private void forceConnectivityStateInternal(boolean forceOnline) {
- boolean connectionCurrentlyExists = mCurrentConnectionType != CONNECTION_NONE;
+ boolean connectionCurrentlyExists =
+ mCurrentConnectionType != ConnectionType.CONNECTION_NONE;
if (connectionCurrentlyExists != forceOnline) {
- updateCurrentConnectionType(forceOnline ? CONNECTION_UNKNOWN : CONNECTION_NONE);
+ updateCurrentMaxBandwidth(forceOnline ? Double.POSITIVE_INFINITY : 0.0);
+ updateCurrentConnectionType(forceOnline ? ConnectionType.CONNECTION_UNKNOWN
+ : ConnectionType.CONNECTION_NONE);
}
}
@@ -180,6 +188,10 @@
notifyObserversOfConnectionTypeChange(newConnectionType);
}
+ private void updateCurrentMaxBandwidth(double maxBandwidth) {
+ mCurrentMaxBandwidth = maxBandwidth;
+ }
+
/**
* Alerts all observers of a connection change.
*/
@@ -217,6 +229,8 @@
@NativeClassQualifiedName("NetworkChangeNotifierDelegateAndroid")
private native void nativeNotifyConnectionTypeChanged(long nativePtr, int newConnectionType);
+ private static native double nativeGetMaxBandwidthForConnectionSubtype(int subtype);
+
// For testing only.
public static NetworkChangeNotifierAutoDetect getAutoDetectorForTest() {
return getInstance().mAutoDetector;
@@ -227,6 +241,7 @@
*/
public static boolean isOnline() {
int connectionType = getInstance().getCurrentConnectionType();
- return connectionType != CONNECTION_UNKNOWN && connectionType != CONNECTION_NONE;
+ return connectionType != ConnectionType.CONNECTION_UNKNOWN
+ && connectionType != ConnectionType.CONNECTION_NONE;
}
}
diff --git a/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java b/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java
index 9db46e2..12ae465 100644
--- a/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java
+++ b/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java
@@ -4,11 +4,14 @@
package org.chromium.net;
+import android.Manifest.permission;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.pm.PackageManager;
import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.telephony.TelephonyManager;
@@ -25,6 +28,30 @@
public class NetworkChangeNotifierAutoDetect extends BroadcastReceiver
implements ApplicationStatus.ApplicationStateListener {
+ static class NetworkState {
+ private final boolean mConnected;
+ private final int mType;
+ private final int mSubtype;
+
+ public NetworkState(boolean connected, int type, int subtype) {
+ mConnected = connected;
+ mType = type;
+ mSubtype = subtype;
+ }
+
+ public boolean isConnected() {
+ return mConnected;
+ }
+
+ public int getNetworkType() {
+ return mType;
+ }
+
+ public int getNetworkSubType() {
+ return mSubtype;
+ }
+ }
+
/** Queries the ConnectivityManager for information about the current connection. */
static class ConnectivityManagerDelegate {
private final ConnectivityManager mConnectivityManager;
@@ -40,48 +67,73 @@
mConnectivityManager = null;
}
- boolean activeNetworkExists() {
- return mConnectivityManager.getActiveNetworkInfo() != null;
- }
-
- boolean isConnected() {
- return mConnectivityManager.getActiveNetworkInfo().isConnected();
- }
-
- int getNetworkType() {
- return mConnectivityManager.getActiveNetworkInfo().getType();
- }
-
- int getNetworkSubtype() {
- return mConnectivityManager.getActiveNetworkInfo().getSubtype();
+ NetworkState getNetworkState() {
+ final NetworkInfo networkInfo = mConnectivityManager.getActiveNetworkInfo();
+ if (networkInfo == null || !networkInfo.isConnected()) {
+ return new NetworkState(false, -1, -1);
+ }
+ return new NetworkState(true, networkInfo.getType(), networkInfo.getSubtype());
}
}
/** Queries the WifiManager for SSID of the current Wifi connection. */
static class WifiManagerDelegate {
+ private final Context mContext;
private final WifiManager mWifiManager;
+ private final boolean mHasWifiPermission;
WifiManagerDelegate(Context context) {
- mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
+ mContext = context;
+ // TODO(jkarlin): If the embedder doesn't have ACCESS_WIFI_STATE permission then inform
+ // native code and fail if native NetworkChangeNotifierAndroid::GetMaxBandwidth() is
+ // called.
+ mHasWifiPermission = mContext.getPackageManager().checkPermission(
+ permission.ACCESS_WIFI_STATE, mContext.getPackageName())
+ == PackageManager.PERMISSION_GRANTED;
+ mWifiManager = mHasWifiPermission
+ ? (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE) : null;
}
// For testing.
WifiManagerDelegate() {
// All the methods below should be overridden.
+ mContext = null;
mWifiManager = null;
+ mHasWifiPermission = false;
}
String getWifiSSID() {
- WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
- if (wifiInfo == null)
- return "";
- String ssid = wifiInfo.getSSID();
- return ssid == null ? "" : ssid;
+ final Intent intent = mContext.registerReceiver(null,
+ new IntentFilter(WifiManager.NETWORK_STATE_CHANGED_ACTION));
+ if (intent != null) {
+ final WifiInfo wifiInfo = intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO);
+ if (wifiInfo != null) {
+ final String ssid = wifiInfo.getSSID();
+ if (ssid != null) {
+ return ssid;
+ }
+ }
+ }
+ return "";
+ }
+
+ /*
+ * Requires ACCESS_WIFI_STATE permission to get the real link speed, else returns
+ * UNKNOWN_LINK_SPEED.
+ */
+ int getLinkSpeedInMbps() {
+ if (!mHasWifiPermission || mWifiManager == null) return UNKNOWN_LINK_SPEED;
+ final WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
+ if (wifiInfo == null) return UNKNOWN_LINK_SPEED;
+
+ // wifiInfo.getLinkSpeed returns the current wifi linkspeed, which can change even
+ // though the connection type hasn't changed.
+ return wifiInfo.getLinkSpeed();
}
}
private static final String TAG = "NetworkChangeNotifierAutoDetect";
-
+ private static final int UNKNOWN_LINK_SPEED = -1;
private final NetworkConnectivityIntentFilter mIntentFilter =
new NetworkConnectivityIntentFilter();
@@ -161,29 +213,29 @@
public int getCurrentConnectionType() {
// Track exactly what type of connection we have.
- if (!mConnectivityManagerDelegate.activeNetworkExists()
- || !mConnectivityManagerDelegate.isConnected()) {
- return NetworkChangeNotifier.CONNECTION_NONE;
+ final NetworkState networkState = mConnectivityManagerDelegate.getNetworkState();
+ if (!networkState.isConnected()) {
+ return ConnectionType.CONNECTION_NONE;
}
- switch (mConnectivityManagerDelegate.getNetworkType()) {
+ switch (networkState.getNetworkType()) {
case ConnectivityManager.TYPE_ETHERNET:
- return NetworkChangeNotifier.CONNECTION_ETHERNET;
+ return ConnectionType.CONNECTION_ETHERNET;
case ConnectivityManager.TYPE_WIFI:
- return NetworkChangeNotifier.CONNECTION_WIFI;
+ return ConnectionType.CONNECTION_WIFI;
case ConnectivityManager.TYPE_WIMAX:
- return NetworkChangeNotifier.CONNECTION_4G;
+ return ConnectionType.CONNECTION_4G;
case ConnectivityManager.TYPE_BLUETOOTH:
- return NetworkChangeNotifier.CONNECTION_BLUETOOTH;
+ return ConnectionType.CONNECTION_BLUETOOTH;
case ConnectivityManager.TYPE_MOBILE:
// Use information from TelephonyManager to classify the connection.
- switch (mConnectivityManagerDelegate.getNetworkSubtype()) {
+ switch (networkState.getNetworkSubType()) {
case TelephonyManager.NETWORK_TYPE_GPRS:
case TelephonyManager.NETWORK_TYPE_EDGE:
case TelephonyManager.NETWORK_TYPE_CDMA:
case TelephonyManager.NETWORK_TYPE_1xRTT:
case TelephonyManager.NETWORK_TYPE_IDEN:
- return NetworkChangeNotifier.CONNECTION_2G;
+ return ConnectionType.CONNECTION_2G;
case TelephonyManager.NETWORK_TYPE_UMTS:
case TelephonyManager.NETWORK_TYPE_EVDO_0:
case TelephonyManager.NETWORK_TYPE_EVDO_A:
@@ -193,19 +245,94 @@
case TelephonyManager.NETWORK_TYPE_EVDO_B:
case TelephonyManager.NETWORK_TYPE_EHRPD:
case TelephonyManager.NETWORK_TYPE_HSPAP:
- return NetworkChangeNotifier.CONNECTION_3G;
+ return ConnectionType.CONNECTION_3G;
case TelephonyManager.NETWORK_TYPE_LTE:
- return NetworkChangeNotifier.CONNECTION_4G;
+ return ConnectionType.CONNECTION_4G;
default:
- return NetworkChangeNotifier.CONNECTION_UNKNOWN;
+ return ConnectionType.CONNECTION_UNKNOWN;
}
default:
- return NetworkChangeNotifier.CONNECTION_UNKNOWN;
+ return ConnectionType.CONNECTION_UNKNOWN;
+ }
+ }
+
+ /*
+ * Returns the bandwidth of the current connection in Mbps. The result is
+ * derived from the NetInfo v3 specification's mapping from network type to
+ * max link speed. In cases where more information is available, such as wifi,
+ * that is used instead. For more on NetInfo, see http://w3c.github.io/netinfo/.
+ *
+ * TODO(jkarlin): Add a notification of bandwidth change to the NetworkChangeNotifier.
+ * Without that the MaxBandwidth value will be stale until the network type or address
+ * changes again.
+ */
+ public double getCurrentMaxBandwidthInMbps() {
+ if (getCurrentConnectionType() == ConnectionType.CONNECTION_WIFI) {
+ final int link_speed = mWifiManagerDelegate.getLinkSpeedInMbps();
+ if (link_speed != UNKNOWN_LINK_SPEED) {
+ return link_speed;
+ }
+ }
+
+ return NetworkChangeNotifier.getMaxBandwidthForConnectionSubtype(
+ getCurrentConnectionSubtype());
+ }
+
+ private int getCurrentConnectionSubtype() {
+ final NetworkState networkState = mConnectivityManagerDelegate.getNetworkState();
+ if (!networkState.isConnected()) {
+ return ConnectionSubtype.SUBTYPE_NONE;
+ }
+
+ switch (networkState.getNetworkType()) {
+ case ConnectivityManager.TYPE_ETHERNET:
+ case ConnectivityManager.TYPE_WIFI:
+ case ConnectivityManager.TYPE_WIMAX:
+ case ConnectivityManager.TYPE_BLUETOOTH:
+ return ConnectionSubtype.SUBTYPE_UNKNOWN;
+ case ConnectivityManager.TYPE_MOBILE:
+ // Use information from TelephonyManager to classify the connection.
+ switch (networkState.getNetworkSubType()) {
+ case TelephonyManager.NETWORK_TYPE_GPRS:
+ return ConnectionSubtype.SUBTYPE_GPRS;
+ case TelephonyManager.NETWORK_TYPE_EDGE:
+ return ConnectionSubtype.SUBTYPE_EDGE;
+ case TelephonyManager.NETWORK_TYPE_CDMA:
+ return ConnectionSubtype.SUBTYPE_CDMA;
+ case TelephonyManager.NETWORK_TYPE_1xRTT:
+ return ConnectionSubtype.SUBTYPE_1XRTT;
+ case TelephonyManager.NETWORK_TYPE_IDEN:
+ return ConnectionSubtype.SUBTYPE_IDEN;
+ case TelephonyManager.NETWORK_TYPE_UMTS:
+ return ConnectionSubtype.SUBTYPE_UMTS;
+ case TelephonyManager.NETWORK_TYPE_EVDO_0:
+ return ConnectionSubtype.SUBTYPE_EVDO_REV_0;
+ case TelephonyManager.NETWORK_TYPE_EVDO_A:
+ return ConnectionSubtype.SUBTYPE_EVDO_REV_A;
+ case TelephonyManager.NETWORK_TYPE_HSDPA:
+ return ConnectionSubtype.SUBTYPE_HSDPA;
+ case TelephonyManager.NETWORK_TYPE_HSUPA:
+ return ConnectionSubtype.SUBTYPE_HSUPA;
+ case TelephonyManager.NETWORK_TYPE_HSPA:
+ return ConnectionSubtype.SUBTYPE_HSPA;
+ case TelephonyManager.NETWORK_TYPE_EVDO_B:
+ return ConnectionSubtype.SUBTYPE_EVDO_REV_B;
+ case TelephonyManager.NETWORK_TYPE_EHRPD:
+ return ConnectionSubtype.SUBTYPE_EHRPD;
+ case TelephonyManager.NETWORK_TYPE_HSPAP:
+ return ConnectionSubtype.SUBTYPE_HSPAP;
+ case TelephonyManager.NETWORK_TYPE_LTE:
+ return ConnectionSubtype.SUBTYPE_LTE;
+ default:
+ return ConnectionSubtype.SUBTYPE_UNKNOWN;
+ }
+ default:
+ return ConnectionSubtype.SUBTYPE_UNKNOWN;
}
}
private String getCurrentWifiSSID() {
- if (getCurrentConnectionType() != NetworkChangeNotifier.CONNECTION_WIFI)
+ if (getCurrentConnectionType() != ConnectionType.CONNECTION_WIFI)
return "";
return mWifiManagerDelegate.getWifiSSID();
}
diff --git a/net/android/javatests/src/org/chromium/net/NetworkChangeNotifierTest.java b/net/android/javatests/src/org/chromium/net/NetworkChangeNotifierTest.java
index 887bc3b..f4eafd9 100644
--- a/net/android/javatests/src/org/chromium/net/NetworkChangeNotifierTest.java
+++ b/net/android/javatests/src/org/chromium/net/NetworkChangeNotifierTest.java
@@ -13,7 +13,9 @@
import android.test.suitebuilder.annotation.MediumTest;
import org.chromium.base.ApplicationState;
+import org.chromium.base.library_loader.LibraryLoader;
import org.chromium.base.test.util.Feature;
+import org.chromium.net.NetworkChangeNotifierAutoDetect.NetworkState;
/**
* Tests for org.chromium.net.NetworkChangeNotifier.
@@ -50,33 +52,18 @@
private int mNetworkSubtype;
@Override
- boolean activeNetworkExists() {
- return mActiveNetworkExists;
- }
-
- @Override
- boolean isConnected() {
- return getNetworkType() != NetworkChangeNotifier.CONNECTION_NONE;
+ NetworkState getNetworkState() {
+ return new NetworkState(mActiveNetworkExists, mNetworkType, mNetworkSubtype);
}
void setActiveNetworkExists(boolean networkExists) {
mActiveNetworkExists = networkExists;
}
- @Override
- int getNetworkType() {
- return mNetworkType;
- }
-
void setNetworkType(int networkType) {
mNetworkType = networkType;
}
- @Override
- int getNetworkSubtype() {
- return mNetworkSubtype;
- }
-
void setNetworkSubtype(int networkSubtype) {
mNetworkSubtype = networkSubtype;
}
@@ -88,6 +75,7 @@
class MockWifiManagerDelegate
extends NetworkChangeNotifierAutoDetect.WifiManagerDelegate {
private String mWifiSSID;
+ private int mLinkSpeedMbps;
@Override
String getWifiSSID() {
@@ -97,6 +85,104 @@
void setWifiSSID(String wifiSSID) {
mWifiSSID = wifiSSID;
}
+
+ @Override
+ int getLinkSpeedInMbps() {
+ return mLinkSpeedMbps;
+ }
+
+ void setLinkSpeedInMbps(int linkSpeedInMbps) {
+ mLinkSpeedMbps = linkSpeedInMbps;
+ }
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ LibraryLoader.ensureInitialized();
+ createTestNotifier();
+ }
+
+ private NetworkChangeNotifierAutoDetect mReceiver;
+ private MockConnectivityManagerDelegate mConnectivityDelegate;
+ private MockWifiManagerDelegate mWifiDelegate;
+
+ private void createTestNotifier() {
+ Context context = getInstrumentation().getTargetContext();
+ NetworkChangeNotifier.resetInstanceForTests(context);
+ NetworkChangeNotifier.setAutoDetectConnectivityState(true);
+
+ mReceiver = NetworkChangeNotifier.getAutoDetectorForTest();
+ assertNotNull(mReceiver);
+
+ mConnectivityDelegate =
+ new MockConnectivityManagerDelegate();
+ mConnectivityDelegate.setActiveNetworkExists(true);
+ mReceiver.setConnectivityManagerDelegateForTests(mConnectivityDelegate);
+
+ mWifiDelegate = new MockWifiManagerDelegate();
+ mReceiver.setWifiManagerDelegateForTests(mWifiDelegate);
+ mWifiDelegate.setWifiSSID("foo");
+ }
+
+ /**
+ * Tests that changing the network type changes the maxBandwidth.
+ */
+ @UiThreadTest
+ @MediumTest
+ @Feature({"Android-AppBase"})
+ public void testNetworkChangeNotifierMaxBandwidthEthernet() throws InterruptedException {
+ // Show that for Ethernet the link speed is unknown (+Infinity).
+ mConnectivityDelegate.setNetworkType(ConnectivityManager.TYPE_ETHERNET);
+ assertEquals(ConnectionType.CONNECTION_ETHERNET,
+ mReceiver.getCurrentConnectionType());
+ assertEquals(Double.POSITIVE_INFINITY, mReceiver.getCurrentMaxBandwidthInMbps());
+ }
+
+ @UiThreadTest
+ @MediumTest
+ @Feature({"Android-AppBase"})
+ public void testNetworkChangeNotifierMaxBandwidthWifi() throws InterruptedException {
+ // Test that for wifi types the link speed is read from the WifiManager.
+ mWifiDelegate.setLinkSpeedInMbps(42);
+ mConnectivityDelegate.setNetworkType(ConnectivityManager.TYPE_WIFI);
+ assertEquals(ConnectionType.CONNECTION_WIFI, mReceiver.getCurrentConnectionType());
+ assertEquals(42.0, mReceiver.getCurrentMaxBandwidthInMbps());
+ }
+
+ @UiThreadTest
+ @MediumTest
+ @Feature({"Android-AppBase"})
+ public void testNetworkChangeNotifierMaxBandwidthWiMax() throws InterruptedException {
+ // Show that for WiMax the link speed is unknown (+Infinity), although the type is 4g.
+ // TODO(jkarlin): Add support for CONNECTION_WIMAX as specified in
+ // http://w3c.github.io/netinfo/.
+ mConnectivityDelegate.setNetworkType(ConnectivityManager.TYPE_WIMAX);
+ assertEquals(ConnectionType.CONNECTION_4G,
+ mReceiver.getCurrentConnectionType());
+ assertEquals(Double.POSITIVE_INFINITY, mReceiver.getCurrentMaxBandwidthInMbps());
+ }
+
+ @UiThreadTest
+ @MediumTest
+ @Feature({"Android-AppBase"})
+ public void testNetworkChangeNotifierMaxBandwidthBluetooth() throws InterruptedException {
+ // Show that for bluetooth the link speed is unknown (+Infinity).
+ mConnectivityDelegate.setNetworkType(ConnectivityManager.TYPE_BLUETOOTH);
+ assertEquals(ConnectionType.CONNECTION_BLUETOOTH,
+ mReceiver.getCurrentConnectionType());
+ assertEquals(Double.POSITIVE_INFINITY, mReceiver.getCurrentMaxBandwidthInMbps());
+ }
+
+ @UiThreadTest
+ @MediumTest
+ @Feature({"Android-AppBase"})
+ public void testNetworkChangeNotifierMaxBandwidthMobile() throws InterruptedException {
+ // Test that for mobile types the subtype is used to determine the maxBandwidth.
+ mConnectivityDelegate.setNetworkType(ConnectivityManager.TYPE_MOBILE);
+ mConnectivityDelegate.setNetworkSubtype(TelephonyManager.NETWORK_TYPE_LTE);
+ assertEquals(ConnectionType.CONNECTION_4G, mReceiver.getCurrentConnectionType());
+ assertEquals(100.0, mReceiver.getCurrentMaxBandwidthInMbps());
}
/**
@@ -107,70 +193,50 @@
@MediumTest
@Feature({"Android-AppBase"})
public void testNetworkChangeNotifierJavaObservers() throws InterruptedException {
- // Create a new notifier that doesn't have a native-side counterpart.
- Context context = getInstrumentation().getTargetContext();
- NetworkChangeNotifier.resetInstanceForTests(context);
-
- NetworkChangeNotifier.setAutoDetectConnectivityState(true);
- NetworkChangeNotifierAutoDetect receiver = NetworkChangeNotifier.getAutoDetectorForTest();
- assertTrue(receiver != null);
-
- MockConnectivityManagerDelegate connectivityDelegate =
- new MockConnectivityManagerDelegate();
- connectivityDelegate.setActiveNetworkExists(true);
- connectivityDelegate.setNetworkType(NetworkChangeNotifier.CONNECTION_UNKNOWN);
- connectivityDelegate.setNetworkSubtype(TelephonyManager.NETWORK_TYPE_UNKNOWN);
- receiver.setConnectivityManagerDelegateForTests(connectivityDelegate);
-
- MockWifiManagerDelegate wifiDelegate = new MockWifiManagerDelegate();
- wifiDelegate.setWifiSSID("foo");
- receiver.setWifiManagerDelegateForTests(wifiDelegate);
-
// Initialize the NetworkChangeNotifier with a connection.
Intent connectivityIntent = new Intent(ConnectivityManager.CONNECTIVITY_ACTION);
- receiver.onReceive(getInstrumentation().getTargetContext(), connectivityIntent);
+ mReceiver.onReceive(getInstrumentation().getTargetContext(), connectivityIntent);
// We shouldn't be re-notified if the connection hasn't actually changed.
NetworkChangeNotifierTestObserver observer = new NetworkChangeNotifierTestObserver();
NetworkChangeNotifier.addConnectionTypeObserver(observer);
- receiver.onReceive(getInstrumentation().getTargetContext(), connectivityIntent);
+ mReceiver.onReceive(getInstrumentation().getTargetContext(), connectivityIntent);
assertFalse(observer.hasReceivedNotification());
// We shouldn't be notified if we're connected to non-Wifi and the Wifi SSID changes.
- wifiDelegate.setWifiSSID("bar");
- receiver.onReceive(getInstrumentation().getTargetContext(), connectivityIntent);
+ mWifiDelegate.setWifiSSID("bar");
+ mReceiver.onReceive(getInstrumentation().getTargetContext(), connectivityIntent);
assertFalse(observer.hasReceivedNotification());
// We should be notified when we change to Wifi.
- connectivityDelegate.setNetworkType(ConnectivityManager.TYPE_WIFI);
- receiver.onReceive(getInstrumentation().getTargetContext(), connectivityIntent);
+ mConnectivityDelegate.setNetworkType(ConnectivityManager.TYPE_WIFI);
+ mReceiver.onReceive(getInstrumentation().getTargetContext(), connectivityIntent);
assertTrue(observer.hasReceivedNotification());
observer.resetHasReceivedNotification();
// We should be notified when the Wifi SSID changes.
- wifiDelegate.setWifiSSID("foo");
- receiver.onReceive(getInstrumentation().getTargetContext(), connectivityIntent);
+ mWifiDelegate.setWifiSSID("foo");
+ mReceiver.onReceive(getInstrumentation().getTargetContext(), connectivityIntent);
assertTrue(observer.hasReceivedNotification());
observer.resetHasReceivedNotification();
// We shouldn't be re-notified if the Wifi SSID hasn't actually changed.
- receiver.onReceive(getInstrumentation().getTargetContext(), connectivityIntent);
+ mReceiver.onReceive(getInstrumentation().getTargetContext(), connectivityIntent);
assertFalse(observer.hasReceivedNotification());
// Mimic that connectivity has been lost and ensure that Chrome notifies our observer.
- connectivityDelegate.setActiveNetworkExists(false);
- connectivityDelegate.setNetworkType(NetworkChangeNotifier.CONNECTION_NONE);
+ mConnectivityDelegate.setActiveNetworkExists(false);
Intent noConnectivityIntent = new Intent(ConnectivityManager.CONNECTIVITY_ACTION);
- receiver.onReceive(getInstrumentation().getTargetContext(), noConnectivityIntent);
+ mReceiver.onReceive(getInstrumentation().getTargetContext(), noConnectivityIntent);
assertTrue(observer.hasReceivedNotification());
observer.resetHasReceivedNotification();
// Pretend we got moved to the background.
- receiver.onApplicationStateChange(ApplicationState.HAS_PAUSED_ACTIVITIES);
+ mReceiver.onApplicationStateChange(ApplicationState.HAS_PAUSED_ACTIVITIES);
// Change the state.
- connectivityDelegate.setActiveNetworkExists(true);
- connectivityDelegate.setNetworkType(NetworkChangeNotifier.CONNECTION_WIFI);
+ mConnectivityDelegate.setActiveNetworkExists(true);
+ mConnectivityDelegate.setNetworkType(ConnectivityManager.TYPE_WIFI);
// The NetworkChangeNotifierAutoDetect doesn't receive any notification while we are in the
// background, but when we get back to the foreground the state changed should be detected
// and a notification sent.
- receiver.onApplicationStateChange(ApplicationState.HAS_RUNNING_ACTIVITIES);
+ mReceiver.onApplicationStateChange(ApplicationState.HAS_RUNNING_ACTIVITIES);
assertTrue(observer.hasReceivedNotification());
}
}
diff --git a/net/android/network_change_notifier_android.cc b/net/android/network_change_notifier_android.cc
index 410d1fb..2063e7b 100644
--- a/net/android/network_change_notifier_android.cc
+++ b/net/android/network_change_notifier_android.cc
@@ -114,6 +114,10 @@
return delegate_->GetCurrentConnectionType();
}
+double NetworkChangeNotifierAndroid::GetCurrentMaxBandwidth() const {
+ return delegate_->GetCurrentMaxBandwidth();
+}
+
void NetworkChangeNotifierAndroid::OnConnectionTypeChanged() {
DnsConfigServiceThread::NotifyNetworkChangeNotifierObservers();
}
diff --git a/net/android/network_change_notifier_android.h b/net/android/network_change_notifier_android.h
index 57d29b8..7710c26 100644
--- a/net/android/network_change_notifier_android.h
+++ b/net/android/network_change_notifier_android.h
@@ -46,12 +46,19 @@
// NetworkChangeNotifier:
virtual ConnectionType GetCurrentConnectionType() const override;
+ // Requires ACCESS_WIFI_STATE permission in order to provide precise WiFi link
+ // speed.
+ virtual double GetCurrentMaxBandwidth() const override;
// NetworkChangeNotifierDelegateAndroid::Observer:
virtual void OnConnectionTypeChanged() override;
static bool Register(JNIEnv* env);
+ // Promote GetMaxBandwidthForConnectionSubtype to public for the Android
+ // delegate class.
+ using NetworkChangeNotifier::GetMaxBandwidthForConnectionSubtype;
+
private:
friend class NetworkChangeNotifierAndroidTest;
friend class NetworkChangeNotifierFactoryAndroid;
diff --git a/net/android/network_change_notifier_android_unittest.cc b/net/android/network_change_notifier_android_unittest.cc
index 6aadb54..0818d5a 100644
--- a/net/android/network_change_notifier_android_unittest.cc
+++ b/net/android/network_change_notifier_android_unittest.cc
@@ -213,4 +213,17 @@
other_connection_type_observer_.notifications_count());
}
+TEST_F(NetworkChangeNotifierAndroidTest, MaxBandwidth) {
+ SetOnline();
+ EXPECT_EQ(NetworkChangeNotifier::CONNECTION_UNKNOWN,
+ notifier_.GetConnectionType());
+ EXPECT_EQ(std::numeric_limits<double>::infinity(),
+ notifier_.GetMaxBandwidth());
+
+ SetOffline();
+ EXPECT_EQ(NetworkChangeNotifier::CONNECTION_NONE,
+ notifier_.GetConnectionType());
+ EXPECT_EQ(0.0, notifier_.GetMaxBandwidth());
+}
+
} // namespace net
diff --git a/net/android/network_change_notifier_delegate_android.cc b/net/android/network_change_notifier_delegate_android.cc
index fbbaced..a6a7132 100644
--- a/net/android/network_change_notifier_delegate_android.cc
+++ b/net/android/network_change_notifier_delegate_android.cc
@@ -6,6 +6,7 @@
#include "base/logging.h"
#include "jni/NetworkChangeNotifier_jni.h"
+#include "net/android/network_change_notifier_android.h"
namespace net {
@@ -32,8 +33,24 @@
return static_cast<NetworkChangeNotifier::ConnectionType>(connection_type);
}
+// Converts a Java side connection type (integer) to
+// the native side NetworkChangeNotifier::ConnectionType.
+NetworkChangeNotifier::ConnectionSubtype ConvertConnectionSubtype(
+ jint subtype) {
+ DCHECK(subtype >= 0 && subtype <= NetworkChangeNotifier::SUBTYPE_LAST);
+
+ return static_cast<NetworkChangeNotifier::ConnectionSubtype>(subtype);
+}
+
} // namespace
+jdouble GetMaxBandwidthForConnectionSubtype(JNIEnv* env,
+ jclass caller,
+ jint subtype) {
+ return NetworkChangeNotifierAndroid::GetMaxBandwidthForConnectionSubtype(
+ ConvertConnectionSubtype(subtype));
+}
+
NetworkChangeNotifierDelegateAndroid::NetworkChangeNotifierDelegateAndroid()
: observers_(new ObserverListThreadSafe<Observer>()) {
JNIEnv* env = base::android::AttachCurrentThread();
@@ -47,6 +64,8 @@
ConvertConnectionType(
Java_NetworkChangeNotifier_getCurrentConnectionType(
env, java_network_change_notifier_.obj())));
+ SetCurrentMaxBandwidth(Java_NetworkChangeNotifier_getCurrentMaxBandwidth(
+ env, java_network_change_notifier_.obj()));
}
NetworkChangeNotifierDelegateAndroid::~NetworkChangeNotifierDelegateAndroid() {
@@ -60,10 +79,15 @@
NetworkChangeNotifier::ConnectionType
NetworkChangeNotifierDelegateAndroid::GetCurrentConnectionType() const {
- base::AutoLock auto_lock(connection_type_lock_);
+ base::AutoLock auto_lock(connection_lock_);
return connection_type_;
}
+double NetworkChangeNotifierDelegateAndroid::GetCurrentMaxBandwidth() const {
+ base::AutoLock auto_lock(connection_lock_);
+ return connection_max_bandwidth_;
+}
+
void NetworkChangeNotifierDelegateAndroid::NotifyConnectionTypeChanged(
JNIEnv* env,
jobject obj,
@@ -72,6 +96,8 @@
const ConnectionType actual_connection_type = ConvertConnectionType(
new_connection_type);
SetCurrentConnectionType(actual_connection_type);
+ SetCurrentMaxBandwidth(Java_NetworkChangeNotifier_getCurrentMaxBandwidth(
+ env, java_network_change_notifier_.obj()));
observers_->Notify(&Observer::OnConnectionTypeChanged);
}
@@ -98,10 +124,16 @@
void NetworkChangeNotifierDelegateAndroid::SetCurrentConnectionType(
ConnectionType new_connection_type) {
- base::AutoLock auto_lock(connection_type_lock_);
+ base::AutoLock auto_lock(connection_lock_);
connection_type_ = new_connection_type;
}
+void NetworkChangeNotifierDelegateAndroid::SetCurrentMaxBandwidth(
+ double max_bandwidth) {
+ base::AutoLock auto_lock(connection_lock_);
+ connection_max_bandwidth_ = max_bandwidth;
+}
+
void NetworkChangeNotifierDelegateAndroid::SetOnline() {
JNIEnv* env = base::android::AttachCurrentThread();
Java_NetworkChangeNotifier_forceConnectivityState(env, true);
diff --git a/net/android/network_change_notifier_delegate_android.h b/net/android/network_change_notifier_delegate_android.h
index f93c30b..f561888 100644
--- a/net/android/network_change_notifier_delegate_android.h
+++ b/net/android/network_change_notifier_delegate_android.h
@@ -55,6 +55,9 @@
// Can be called from any thread.
ConnectionType GetCurrentConnectionType() const;
+ // Can be called from any thread.
+ double GetCurrentMaxBandwidth() const;
+
// Initializes JNI bindings.
static bool Register(JNIEnv* env);
@@ -62,6 +65,7 @@
friend class BaseNetworkChangeNotifierAndroidTest;
void SetCurrentConnectionType(ConnectionType connection_type);
+ void SetCurrentMaxBandwidth(double max_bandwidth);
// Methods calling the Java side exposed for testing.
void SetOnline();
@@ -71,8 +75,9 @@
scoped_refptr<ObserverListThreadSafe<Observer> > observers_;
scoped_refptr<base::SingleThreadTaskRunner> jni_task_runner_;
base::android::ScopedJavaGlobalRef<jobject> java_network_change_notifier_;
- mutable base::Lock connection_type_lock_; // Protects the state below.
+ mutable base::Lock connection_lock_; // Protects the state below.
ConnectionType connection_type_;
+ double connection_max_bandwidth_;
DISALLOW_COPY_AND_ASSIGN(NetworkChangeNotifierDelegateAndroid);
};
diff --git a/net/base/dns_util.cc b/net/base/dns_util.cc
index c095eb8..f75cd95 100644
--- a/net/base/dns_util.cc
+++ b/net/base/dns_util.cc
@@ -13,9 +13,9 @@
const char* buf = dotted.data();
unsigned n = dotted.size();
char label[63];
- unsigned int labellen = 0; /* <= sizeof label */
+ size_t labellen = 0; /* <= sizeof label */
char name[255];
- unsigned int namelen = 0; /* <= sizeof name */
+ size_t namelen = 0; /* <= sizeof name */
char ch;
for (;;) {
@@ -27,7 +27,7 @@
if (labellen) {
if (namelen + labellen + 1 > sizeof name)
return false;
- name[namelen++] = labellen;
+ name[namelen++] = static_cast<char>(labellen);
memcpy(name + namelen, label, labellen);
namelen += labellen;
labellen = 0;
@@ -42,7 +42,7 @@
if (labellen) {
if (namelen + labellen + 1 > sizeof name)
return false;
- name[namelen++] = labellen;
+ name[namelen++] = static_cast<char>(labellen);
memcpy(name + namelen, label, labellen);
namelen += labellen;
labellen = 0;
diff --git a/net/base/elements_upload_data_stream.cc b/net/base/elements_upload_data_stream.cc
index 86ea28c..e8d33ee 100644
--- a/net/base/elements_upload_data_stream.cc
+++ b/net/base/elements_upload_data_stream.cc
@@ -129,10 +129,10 @@
if (read_failed_) {
// If an error occured during read operation, then pad with zero.
// Otherwise the server will hang waiting for the rest of the data.
- int num_bytes_to_fill = std::min(
+ int num_bytes_to_fill = static_cast<int>(std::min(
static_cast<uint64>(buf->BytesRemaining()),
- size() - position() - buf->BytesConsumed());
- DCHECK_LE(0, num_bytes_to_fill);
+ size() - position() - buf->BytesConsumed()));
+ DCHECK_GE(num_bytes_to_fill, 0);
memset(buf->data(), 0, num_bytes_to_fill);
buf->DidConsume(num_bytes_to_fill);
}
diff --git a/net/base/file_stream_context.cc b/net/base/file_stream_context.cc
index 8909b2c..5acaab6 100644
--- a/net/base/file_stream_context.cc
+++ b/net/base/file_stream_context.cc
@@ -33,14 +33,15 @@
os_error(0) {
}
-FileStream::Context::IOResult::IOResult(int64 result, int os_error)
+FileStream::Context::IOResult::IOResult(int64 result,
+ logging::SystemErrorCode os_error)
: result(result),
os_error(os_error) {
}
// static
FileStream::Context::IOResult FileStream::Context::IOResult::FromOSError(
- int64 os_error) {
+ logging::SystemErrorCode os_error) {
return IOResult(MapSystemError(os_error), os_error);
}
diff --git a/net/base/file_stream_context.h b/net/base/file_stream_context.h
index 5493e25..82a2412 100644
--- a/net/base/file_stream_context.h
+++ b/net/base/file_stream_context.h
@@ -100,11 +100,11 @@
private:
struct IOResult {
IOResult();
- IOResult(int64 result, int os_error);
- static IOResult FromOSError(int64 os_error);
+ IOResult(int64 result, logging::SystemErrorCode os_error);
+ static IOResult FromOSError(logging::SystemErrorCode os_error);
int64 result;
- int os_error; // Set only when result < 0.
+ logging::SystemErrorCode os_error; // Set only when result < 0.
};
struct OpenResult {
diff --git a/net/base/host_port_pair.cc b/net/base/host_port_pair.cc
index 1570bbb..1550c36 100644
--- a/net/base/host_port_pair.cc
+++ b/net/base/host_port_pair.cc
@@ -47,7 +47,10 @@
}
std::string HostPortPair::ToString() const {
- return base::StringPrintf("%s:%u", HostForURL().c_str(), port_);
+ std::string ret(HostForURL());
+ ret += ':';
+ ret += base::IntToString(port_);
+ return ret;
}
std::string HostPortPair::HostForURL() const {
diff --git a/net/base/mime_util.cc b/net/base/mime_util.cc
index 27f3c70..c35e24c 100644
--- a/net/base/mime_util.cc
+++ b/net/base/mime_util.cc
@@ -59,7 +59,8 @@
MPEG2_AAC_MAIN,
MPEG2_AAC_SSR,
MPEG4_AAC_LC,
- MPEG4_AAC_SBRv1,
+ MPEG4_AAC_SBR_v1,
+ MPEG4_AAC_SBR_PS_v2,
VORBIS,
OPUS,
H264_BASELINE,
@@ -475,7 +476,8 @@
case MimeUtil::PCM:
case MimeUtil::MP3:
case MimeUtil::MPEG4_AAC_LC:
- case MimeUtil::MPEG4_AAC_SBRv1:
+ case MimeUtil::MPEG4_AAC_SBR_v1:
+ case MimeUtil::MPEG4_AAC_SBR_PS_v2:
case MimeUtil::H264_BASELINE:
case MimeUtil::H264_MAIN:
case MimeUtil::H264_HIGH:
@@ -528,16 +530,17 @@
// mp4a.69 - MPEG-2 extension to MPEG-1
// mp4a.6B - MPEG-1 audio
// mp4a.40.2 - MPEG-4 AAC LC
-// mp4a.40.5 - MPEG-4 AAC SBRv1
+// mp4a.40.5 - MPEG-4 HE-AAC v1 (AAC LC + SBR)
+// mp4a.40.29 - MPEG-4 HE-AAC v2 (AAC LC + SBR + PS)
//
// avc1.42E0xx - H.264 Baseline
// avc1.4D40xx - H.264 Main
// avc1.6400xx - H.264 High
static const char kMP4AudioCodecsExpression[] =
- "mp4a.66,mp4a.67,mp4a.68,mp4a.69,mp4a.6B,mp4a.40.2,mp4a.40.5";
+ "mp4a.66,mp4a.67,mp4a.68,mp4a.69,mp4a.6B,mp4a.40.2,mp4a.40.5,mp4a.40.29";
static const char kMP4VideoCodecsExpression[] =
"avc1.42E00A,avc1.4D400A,avc1.64000A," \
- "mp4a.66,mp4a.67,mp4a.68,mp4a.69,mp4a.6B,mp4a.40.2,mp4a.40.5";
+ "mp4a.66,mp4a.67,mp4a.68,mp4a.69,mp4a.6B,mp4a.40.2,mp4a.40.5,mp4a.40.29";
static const MediaFormatStrict format_codec_mappings[] = {
{ "video/webm", "opus,vorbis,vp8,vp8.0,vp9,vp9.0" },
@@ -576,7 +579,8 @@
{ "mp4a.69", MimeUtil::MP3 },
{ "mp4a.6B", MimeUtil::MP3 },
{ "mp4a.40.2", MimeUtil::MPEG4_AAC_LC },
- { "mp4a.40.5", MimeUtil::MPEG4_AAC_SBRv1 },
+ { "mp4a.40.5", MimeUtil::MPEG4_AAC_SBR_v1 },
+ { "mp4a.40.29", MimeUtil::MPEG4_AAC_SBR_PS_v2 },
{ "vorbis", MimeUtil::VORBIS },
{ "opus", MimeUtil::OPUS },
{ "vp8", MimeUtil::VP8 },
@@ -1044,7 +1048,8 @@
case MPEG2_AAC_MAIN:
case MPEG2_AAC_SSR:
case MPEG4_AAC_LC:
- case MPEG4_AAC_SBRv1:
+ case MPEG4_AAC_SBR_v1:
+ case MPEG4_AAC_SBR_PS_v2:
case H264_BASELINE:
case H264_MAIN:
case H264_HIGH:
diff --git a/net/base/net_errors.h b/net/base/net_errors.h
index 29b7742..64343f1 100644
--- a/net/base/net_errors.h
+++ b/net/base/net_errors.h
@@ -10,6 +10,7 @@
#include "base/basictypes.h"
#include "base/files/file.h"
+#include "base/logging.h"
#include "net/base/net_export.h"
namespace net {
@@ -45,7 +46,7 @@
NET_EXPORT bool IsClientCertificateError(int error);
// Map system error code to Error.
-NET_EXPORT Error MapSystemError(int os_error);
+NET_EXPORT Error MapSystemError(logging::SystemErrorCode os_error);
// Returns a list of all the possible net error codes (not counting OK). This
// is intended for use with UMA histograms that are reporting the result of
diff --git a/net/base/net_errors_posix.cc b/net/base/net_errors_posix.cc
index 751e448..a8573fd 100644
--- a/net/base/net_errors_posix.cc
+++ b/net/base/net_errors_posix.cc
@@ -14,7 +14,7 @@
namespace net {
-Error MapSystemError(int os_error) {
+Error MapSystemError(logging::SystemErrorCode os_error) {
if (os_error != 0)
DVLOG(2) << "Error " << os_error;
diff --git a/net/base/net_errors_win.cc b/net/base/net_errors_win.cc
index 7f27dee..4bc9685 100644
--- a/net/base/net_errors_win.cc
+++ b/net/base/net_errors_win.cc
@@ -11,7 +11,7 @@
namespace net {
// Map winsock and system errors to Chromium errors.
-Error MapSystemError(int os_error) {
+Error MapSystemError(logging::SystemErrorCode os_error) {
if (os_error != 0)
DVLOG(2) << "Error " << os_error;
diff --git a/net/base/net_log_event_type_list.h b/net/base/net_log_event_type_list.h
index d6e6187..ce30360 100644
--- a/net/base/net_log_event_type_list.h
+++ b/net/base/net_log_event_type_list.h
@@ -2418,3 +2418,64 @@
// "net_error": <error created>
// }
EVENT_TYPE(SDCH_DICTIONARY_FETCH_IMPLIED_ERROR)
+
+// -----------------------------------------------------------------------------
+// Data Reduction Proxy events.
+// -----------------------------------------------------------------------------
+
+// This event is created when the data reduction proxy has been turned on or
+// off. It always contains the parameter:
+// {
+// "enabled": <true if the proxy is enabled>
+// }
+//
+// If it is enabled, it contains additional parameters:
+// {
+// "primary_restricted": <Whether the primary proxy is restricted or not>,
+// "fallback_restricted": <Whether the fallback proxy is restricted or not>,
+// "primary_origin": <The primary proxy origin address>,
+// "fallback_origin": <The fallback proxy origin address>,
+// "ssl_origin": <The SSL proxy origin address>,
+// }
+EVENT_TYPE(DATA_REDUCTION_PROXY_ENABLED)
+
+// The start/end of a canary request is sent to the data reduction proxy.
+//
+// The BEGIN phase contains the following parameters:
+// {
+// "url": <The URL of the canary endpoint>,
+// }
+//
+// The END phase contains the following parameters:
+// {
+// "net_error": <The net_error of the completion of the canary request>,
+// }
+EVENT_TYPE(DATA_REDUCTION_PROXY_CANARY_REQUEST)
+
+// This event is created when a response to the canary request has been
+// received with the following parameters:
+// {
+// "headers": <The list of header:value pairs>,
+// }
+EVENT_TYPE(DATA_REDUCTION_PROXY_CANARY_RESPONSE_RECEIVED)
+
+// This event is created when a bypass event takes place with the following
+// parameters:
+// {
+// "action": <For DRP proxy sourced bypasses in the chrome-proxy header,
+// the bypass type>,
+// "bypass_type": <For non-DRP proxy sourced bypasses, the bypass type>,
+// "url": <The origin URL of the remote endpoint which resulted in the
+// bypass>,
+// "bypass_duration_seconds": <The length of time to be in a bypass state>,
+// }
+EVENT_TYPE(DATA_REDUCTION_PROXY_BYPASS_REQUESTED)
+
+// This event is created when the data reduction proxy configuration changes
+// (i.e. a switch between primary and fallback) with the following parameters:
+// {
+// "proxy_server": <The URL of the proxy server no longer being used>,
+// "net_error": <The net_error encountered when using the proxy server; this
+// can be 0 if the proxy server is explicitly skipped>,
+// }
+EVENT_TYPE(DATA_REDUCTION_PROXY_FALLBACK)
diff --git a/net/base/net_log_source_type_list.h b/net/base/net_log_source_type_list.h
index dc553a4..dbad470 100644
--- a/net/base/net_log_source_type_list.h
+++ b/net/base/net_log_source_type_list.h
@@ -27,3 +27,4 @@
SOURCE_TYPE(PROXY_CLIENT_SOCKET)
SOURCE_TYPE(IPV6_REACHABILITY_CHECK)
SOURCE_TYPE(ASYNC_REVALIDATION)
+SOURCE_TYPE(DATA_REDUCTION_PROXY)
diff --git a/net/base/network_change_notifier.cc b/net/base/network_change_notifier.cc
index afd6b23..b797864 100644
--- a/net/base/network_change_notifier.cc
+++ b/net/base/network_change_notifier.cc
@@ -305,7 +305,8 @@
if (bytes_read > 10000 &&
request_duration > base::TimeDelta::FromMilliseconds(1) &&
request.creation_time() > last_connection_change_) {
- int32 kbps = bytes_read * 8 / request_duration.InMilliseconds();
+ int32 kbps = static_cast<int32>(
+ bytes_read * 8 / request_duration.InMilliseconds());
if (kbps > peak_kbps_since_last_connection_change_)
peak_kbps_since_last_connection_change_ = kbps;
}
@@ -784,6 +785,81 @@
}
// static
+double NetworkChangeNotifier::GetMaxBandwidthForConnectionSubtype(
+ ConnectionSubtype subtype) {
+ switch (subtype) {
+ case SUBTYPE_GSM:
+ return 0.01;
+ case SUBTYPE_IDEN:
+ return 0.064;
+ case SUBTYPE_CDMA:
+ return 0.115;
+ case SUBTYPE_1XRTT:
+ return 0.153;
+ case SUBTYPE_GPRS:
+ return 0.237;
+ case SUBTYPE_EDGE:
+ return 0.384;
+ case SUBTYPE_UMTS:
+ return 2.0;
+ case SUBTYPE_EVDO_REV_0:
+ return 2.46;
+ case SUBTYPE_EVDO_REV_A:
+ return 3.1;
+ case SUBTYPE_HSPA:
+ return 3.6;
+ case SUBTYPE_EVDO_REV_B:
+ return 14.7;
+ case SUBTYPE_HSDPA:
+ return 14.3;
+ case SUBTYPE_HSUPA:
+ return 14.4;
+ case SUBTYPE_EHRPD:
+ return 21.0;
+ case SUBTYPE_HSPAP:
+ return 42.0;
+ case SUBTYPE_LTE:
+ return 100.0;
+ case SUBTYPE_LTE_ADVANCED:
+ return 100.0;
+ case SUBTYPE_BLUETOOTH_1_2:
+ return 1.0;
+ case SUBTYPE_BLUETOOTH_2_1:
+ return 3.0;
+ case SUBTYPE_BLUETOOTH_3_0:
+ return 24.0;
+ case SUBTYPE_BLUETOOTH_4_0:
+ return 1.0;
+ case SUBTYPE_ETHERNET:
+ return 10.0;
+ case SUBTYPE_FAST_ETHERNET:
+ return 100.0;
+ case SUBTYPE_GIGABIT_ETHERNET:
+ return 1000.0;
+ case SUBTYPE_10_GIGABIT_ETHERNET:
+ return 10000.0;
+ case SUBTYPE_WIFI_B:
+ return 11.0;
+ case SUBTYPE_WIFI_G:
+ return 54.0;
+ case SUBTYPE_WIFI_N:
+ return 600.0;
+ case SUBTYPE_WIFI_AC:
+ return 1300.0;
+ case SUBTYPE_WIFI_AD:
+ return 7000.0;
+ case SUBTYPE_UNKNOWN:
+ return std::numeric_limits<double>::infinity();
+ case SUBTYPE_NONE:
+ return 0.0;
+ case SUBTYPE_OTHER:
+ return std::numeric_limits<double>::infinity();
+ }
+ NOTREACHED();
+ return std::numeric_limits<double>::infinity();
+}
+
+// static
void NetworkChangeNotifier::NotifyObserversOfIPAddressChange() {
if (g_network_change_notifier &&
!g_network_change_notifier->test_notifications_only_) {
diff --git a/net/base/network_change_notifier.h b/net/base/network_change_notifier.h
index bdd2d18..285c52b 100644
--- a/net/base/network_change_notifier.h
+++ b/net/base/network_change_notifier.h
@@ -34,6 +34,9 @@
public:
// This is a superset of the connection types in the NetInfo v3 specification:
// http://w3c.github.io/netinfo/.
+ //
+ // A Java counterpart will be generated for this enum.
+ // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.net
enum ConnectionType {
CONNECTION_UNKNOWN = 0, // A connection exists, but its type is unknown.
// Also used as a default value.
@@ -47,6 +50,49 @@
CONNECTION_LAST = CONNECTION_BLUETOOTH
};
+ // This is the NetInfo v3 set of connection technologies as seen in
+ // http://w3c.github.io/netinfo/. This enum is copied in
+ // NetworkChangeNotifier.java so be sure to change both at once.
+ //
+ // A Java counterpart will be generated for this enum.
+ // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.net
+ enum ConnectionSubtype {
+ SUBTYPE_GSM = 0,
+ SUBTYPE_IDEN,
+ SUBTYPE_CDMA,
+ SUBTYPE_1XRTT,
+ SUBTYPE_GPRS,
+ SUBTYPE_EDGE,
+ SUBTYPE_UMTS,
+ SUBTYPE_EVDO_REV_0,
+ SUBTYPE_EVDO_REV_A,
+ SUBTYPE_HSPA,
+ SUBTYPE_EVDO_REV_B,
+ SUBTYPE_HSDPA,
+ SUBTYPE_HSUPA,
+ SUBTYPE_EHRPD,
+ SUBTYPE_HSPAP,
+ SUBTYPE_LTE,
+ SUBTYPE_LTE_ADVANCED,
+ SUBTYPE_BLUETOOTH_1_2,
+ SUBTYPE_BLUETOOTH_2_1,
+ SUBTYPE_BLUETOOTH_3_0,
+ SUBTYPE_BLUETOOTH_4_0,
+ SUBTYPE_ETHERNET,
+ SUBTYPE_FAST_ETHERNET,
+ SUBTYPE_GIGABIT_ETHERNET,
+ SUBTYPE_10_GIGABIT_ETHERNET,
+ SUBTYPE_WIFI_B,
+ SUBTYPE_WIFI_G,
+ SUBTYPE_WIFI_N,
+ SUBTYPE_WIFI_AC,
+ SUBTYPE_WIFI_AD,
+ SUBTYPE_UNKNOWN,
+ SUBTYPE_NONE,
+ SUBTYPE_OTHER,
+ SUBTYPE_LAST = SUBTYPE_OTHER
+ };
+
class NET_EXPORT IPAddressObserver {
public:
// Will be called when the IP address of the primary interface changes.
@@ -162,7 +208,9 @@
// Returns a theoretical upper limit on download bandwidth, potentially based
// on underlying connection type, signal strength, or some other signal. The
// default mapping of connection type to maximum bandwidth is provided in the
- // NetInfo spec: http://w3c.github.io/netinfo/.
+ // NetInfo spec: http://w3c.github.io/netinfo/. Host-specific application
+ // permissions may be required, please see host-specific declaration for more
+ // information.
static double GetMaxBandwidth();
// Retrieve the last read DnsConfig. This could be expensive if the system has
@@ -306,6 +354,11 @@
// cheap as it is called often.
virtual double GetCurrentMaxBandwidth() const;
+ // Returns a theoretical upper limit on download bandwidth given a connection
+ // subtype. The mapping of connection type to maximum bandwidth is provided in
+ // the NetInfo spec: http://w3c.github.io/netinfo/.
+ static double GetMaxBandwidthForConnectionSubtype(ConnectionSubtype subtype);
+
// Broadcasts a notification to all registered observers. Note that this
// happens asynchronously, even for observers on the current thread, even in
// tests.
diff --git a/net/base/upload_bytes_element_reader.cc b/net/base/upload_bytes_element_reader.cc
index 6927d8e..44f61f4 100644
--- a/net/base/upload_bytes_element_reader.cc
+++ b/net/base/upload_bytes_element_reader.cc
@@ -48,8 +48,8 @@
const CompletionCallback& callback) {
DCHECK_LT(0, buf_length);
- const size_t num_bytes_to_read =
- std::min(BytesRemaining(), static_cast<uint64>(buf_length));
+ const int num_bytes_to_read = static_cast<int>(
+ std::min(BytesRemaining(), static_cast<uint64>(buf_length)));
// Check if we have anything to copy first, because we are getting
// the address of an element in |bytes_| and that will throw an
diff --git a/net/base/upload_file_element_reader.cc b/net/base/upload_file_element_reader.cc
index 4682466..9be9117 100644
--- a/net/base/upload_file_element_reader.cc
+++ b/net/base/upload_file_element_reader.cc
@@ -78,8 +78,8 @@
const CompletionCallback& callback) {
DCHECK(!callback.is_null());
- uint64 num_bytes_to_read =
- std::min(BytesRemaining(), static_cast<uint64>(buf_length));
+ int num_bytes_to_read = static_cast<int>(
+ std::min(BytesRemaining(), static_cast<uint64>(buf_length)));
if (num_bytes_to_read == 0)
return 0;
@@ -140,7 +140,7 @@
if (result < 0) {
DLOG(WARNING) << "Failed to seek \"" << path_.value()
<< "\" to offset: " << range_offset_ << " (" << result << ")";
- callback.Run(result);
+ callback.Run(static_cast<int>(result));
return;
}
diff --git a/net/cert/cert_policy_enforcer.cc b/net/cert/cert_policy_enforcer.cc
new file mode 100644
index 0000000..c9ce7cc
--- /dev/null
+++ b/net/cert/cert_policy_enforcer.cc
@@ -0,0 +1,165 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "net/cert/cert_policy_enforcer.h"
+
+#include <algorithm>
+
+#include "base/build_time.h"
+#include "base/metrics/field_trial.h"
+#include "base/metrics/histogram.h"
+#include "base/numerics/safe_conversions.h"
+#include "base/strings/string_number_conversions.h"
+#include "net/cert/ct_ev_whitelist.h"
+#include "net/cert/ct_verify_result.h"
+#include "net/cert/signed_certificate_timestamp.h"
+#include "net/cert/x509_certificate.h"
+
+namespace net {
+
+namespace {
+
+bool IsEmbeddedSCT(const scoped_refptr<ct::SignedCertificateTimestamp>& sct) {
+ return sct->origin == ct::SignedCertificateTimestamp::SCT_EMBEDDED;
+}
+
+// Returns true if the current build is recent enough to ensure that
+// built-in security information (e.g. CT Logs) is fresh enough.
+// TODO(eranm): Move to base or net/base
+bool IsBuildTimely() {
+#if defined(DONT_EMBED_BUILD_METADATA) && !defined(OFFICIAL_BUILD)
+ return true;
+#else
+ const base::Time build_time = base::GetBuildTime();
+ // We consider built-in information to be timely for 10 weeks.
+ return (base::Time::Now() - build_time).InDays() < 70 /* 10 weeks */;
+#endif
+}
+
+uint32_t ApproximateMonthDifference(const base::Time& start,
+ const base::Time& end) {
+ base::Time::Exploded exploded_start;
+ base::Time::Exploded exploded_expiry;
+ start.UTCExplode(&exploded_start);
+ end.UTCExplode(&exploded_expiry);
+ uint32_t month_diff = (exploded_expiry.year - exploded_start.year) * 12 +
+ (exploded_expiry.month - exploded_start.month);
+
+ // Add any remainder as a full month.
+ if (exploded_expiry.day_of_month > exploded_start.day_of_month)
+ ++month_diff;
+
+ return month_diff;
+}
+
+enum CTComplianceStatus {
+ CT_NOT_COMPLIANT = 0,
+ CT_IN_WHITELIST = 1,
+ CT_ENOUGH_SCTS = 2,
+ CT_COMPLIANCE_MAX,
+};
+
+void LogCTComplianceStatusToUMA(CTComplianceStatus status) {
+ UMA_HISTOGRAM_ENUMERATION("Net.SSL_EVCertificateCTCompliance", status,
+ CT_COMPLIANCE_MAX);
+}
+
+} // namespace
+
+CertPolicyEnforcer::CertPolicyEnforcer(size_t num_ct_logs,
+ bool require_ct_for_ev)
+ : num_ct_logs_(num_ct_logs), require_ct_for_ev_(require_ct_for_ev) {
+}
+
+CertPolicyEnforcer::~CertPolicyEnforcer() {
+}
+
+bool CertPolicyEnforcer::DoesConformToCTEVPolicy(
+ X509Certificate* cert,
+ const ct::EVCertsWhitelist* ev_whitelist,
+ const ct::CTVerifyResult& ct_result) {
+ if (!require_ct_for_ev_)
+ return true;
+
+ if (!IsBuildTimely())
+ return false;
+
+ if (IsCertificateInWhitelist(cert, ev_whitelist)) {
+ LogCTComplianceStatusToUMA(CT_IN_WHITELIST);
+ return true;
+ }
+
+ if (HasRequiredNumberOfSCTs(cert, ct_result)) {
+ LogCTComplianceStatusToUMA(CT_ENOUGH_SCTS);
+ return true;
+ }
+
+ LogCTComplianceStatusToUMA(CT_NOT_COMPLIANT);
+ return false;
+}
+
+bool CertPolicyEnforcer::IsCertificateInWhitelist(
+ X509Certificate* cert,
+ const ct::EVCertsWhitelist* ev_whitelist) {
+ bool cert_in_ev_whitelist = false;
+ if (ev_whitelist && ev_whitelist->IsValid()) {
+ const SHA256HashValue fingerprint(
+ X509Certificate::CalculateFingerprint256(cert->os_cert_handle()));
+
+ std::string truncated_fp =
+ std::string(reinterpret_cast<const char*>(fingerprint.data), 8);
+ cert_in_ev_whitelist = ev_whitelist->ContainsCertificateHash(truncated_fp);
+
+ UMA_HISTOGRAM_BOOLEAN("Net.SSL_EVCertificateInWhitelist",
+ cert_in_ev_whitelist);
+ }
+ return cert_in_ev_whitelist;
+}
+
+bool CertPolicyEnforcer::HasRequiredNumberOfSCTs(
+ X509Certificate* cert,
+ const ct::CTVerifyResult& ct_result) {
+ // TODO(eranm): Count the number of *independent* SCTs once the information
+ // about log operators is available, crbug.com/425174
+ size_t num_valid_scts = ct_result.verified_scts.size();
+ size_t num_embedded_scts =
+ std::count_if(ct_result.verified_scts.begin(),
+ ct_result.verified_scts.end(), IsEmbeddedSCT);
+
+ size_t num_non_embedded_scts = num_valid_scts - num_embedded_scts;
+ // If at least two valid SCTs were delivered by means other than embedding
+ // (i.e. in a TLS extension or OCSP), then the certificate conforms to bullet
+ // number 3 of the "Qualifying Certificate" section of the CT/EV policy.
+ if (num_non_embedded_scts >= 2)
+ return true;
+
+ if (cert->valid_start().is_null() || cert->valid_expiry().is_null() ||
+ cert->valid_start().is_max() || cert->valid_expiry().is_max()) {
+ // Will not be able to calculate the certificate's validity period.
+ return false;
+ }
+
+ uint32_t expiry_in_months_approx =
+ ApproximateMonthDifference(cert->valid_start(), cert->valid_expiry());
+
+ // For embedded SCTs, if the certificate has the number of SCTs specified in
+ // table 1 of the "Qualifying Certificate" section of the CT/EV policy, then
+ // it qualifies.
+ size_t num_required_embedded_scts;
+ if (expiry_in_months_approx > 39) {
+ num_required_embedded_scts = 5;
+ } else if (expiry_in_months_approx > 27) {
+ num_required_embedded_scts = 4;
+ } else if (expiry_in_months_approx >= 15) {
+ num_required_embedded_scts = 3;
+ } else {
+ num_required_embedded_scts = 2;
+ }
+
+ size_t min_acceptable_logs = std::max(num_ct_logs_, static_cast<size_t>(2u));
+ return num_embedded_scts >=
+ std::min(num_required_embedded_scts, min_acceptable_logs);
+}
+
+} // namespace net
diff --git a/net/cert/cert_policy_enforcer.h b/net/cert/cert_policy_enforcer.h
new file mode 100644
index 0000000..68039b3
--- /dev/null
+++ b/net/cert/cert_policy_enforcer.h
@@ -0,0 +1,56 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+#ifndef NET_CERT_CERT_POLICY_ENFORCER_H
+#define NET_CERT_CERT_POLICY_ENFORCER_H
+
+#include <stddef.h>
+
+#include "net/base/net_export.h"
+
+namespace net {
+
+namespace ct {
+
+struct CTVerifyResult;
+class EVCertsWhitelist;
+
+} // namespace ct
+
+class X509Certificate;
+
+// Class for checking that a given certificate conforms to security-related
+// policies.
+class NET_EXPORT CertPolicyEnforcer {
+ public:
+ // Set the parameters for this policy enforcer:
+ // |num_ct_logs| is the number of Certificate Transparency log currently
+ // known to Chrome.
+ // |require_ct_for_ev| indicates whether Certificate Transparency presence
+ // is required for EV certificates.
+ CertPolicyEnforcer(size_t num_ct_logs, bool require_ct_for_ev);
+ virtual ~CertPolicyEnforcer();
+
+ // Returns true if the collection of SCTs for the given certificate
+ // conforms with the CT/EV policy.
+ // |cert| is the certificate for which the SCTs apply.
+ // |ct_result| must contain the result of verifying any SCTs associated with
+ // |cert| prior to invoking this method.
+ bool DoesConformToCTEVPolicy(X509Certificate* cert,
+ const ct::EVCertsWhitelist* ev_whitelist,
+ const ct::CTVerifyResult& ct_result);
+
+ private:
+ bool IsCertificateInWhitelist(X509Certificate* cert,
+ const ct::EVCertsWhitelist* ev_whitelist);
+
+ bool HasRequiredNumberOfSCTs(X509Certificate* cert,
+ const ct::CTVerifyResult& ct_result);
+
+ size_t num_ct_logs_;
+ bool require_ct_for_ev_;
+};
+
+} // namespace net
+
+#endif // NET_CERT_CERT_POLICY_ENFORCER_H
diff --git a/net/cert/cert_policy_enforcer_unittest.cc b/net/cert/cert_policy_enforcer_unittest.cc
new file mode 100644
index 0000000..45a2e6a
--- /dev/null
+++ b/net/cert/cert_policy_enforcer_unittest.cc
@@ -0,0 +1,212 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "net/cert/cert_policy_enforcer.h"
+
+#include <string>
+
+#include "base/memory/scoped_ptr.h"
+#include "net/base/test_data_directory.h"
+#include "net/cert/ct_ev_whitelist.h"
+#include "net/cert/ct_verify_result.h"
+#include "net/cert/x509_certificate.h"
+#include "net/test/cert_test_util.h"
+#include "net/test/ct_test_util.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace net {
+
+namespace {
+
+class DummyEVCertsWhitelist : public ct::EVCertsWhitelist {
+ public:
+ DummyEVCertsWhitelist(bool is_valid_response, bool contains_hash_response)
+ : canned_is_valid_(is_valid_response),
+ canned_contains_response_(contains_hash_response) {}
+
+ bool IsValid() const override { return canned_is_valid_; }
+
+ bool ContainsCertificateHash(
+ const std::string& certificate_hash) const override {
+ return canned_contains_response_;
+ }
+
+ protected:
+ ~DummyEVCertsWhitelist() override {}
+
+ private:
+ bool canned_is_valid_;
+ bool canned_contains_response_;
+};
+
+class CertPolicyEnforcerTest : public ::testing::Test {
+ public:
+ virtual void SetUp() override {
+ policy_enforcer_.reset(new CertPolicyEnforcer(5, true));
+
+ std::string der_test_cert(ct::GetDerEncodedX509Cert());
+ chain_ = X509Certificate::CreateFromBytes(der_test_cert.data(),
+ der_test_cert.size());
+ ASSERT_TRUE(chain_.get());
+ }
+
+ void FillResultWithSCTsOfOrigin(
+ ct::SignedCertificateTimestamp::Origin desired_origin,
+ int num_scts,
+ ct::CTVerifyResult* result) {
+ for (int i = 0; i < num_scts; ++i) {
+ scoped_refptr<ct::SignedCertificateTimestamp> sct(
+ new ct::SignedCertificateTimestamp());
+ sct->origin = desired_origin;
+ result->verified_scts.push_back(sct);
+ }
+ }
+
+ protected:
+ scoped_ptr<CertPolicyEnforcer> policy_enforcer_;
+ scoped_refptr<X509Certificate> chain_;
+};
+
+TEST_F(CertPolicyEnforcerTest, ConformsToCTEVPolicyWithNonEmbeddedSCTs) {
+ ct::CTVerifyResult result;
+ FillResultWithSCTsOfOrigin(
+ ct::SignedCertificateTimestamp::SCT_FROM_TLS_EXTENSION, 2, &result);
+
+ EXPECT_TRUE(
+ policy_enforcer_->DoesConformToCTEVPolicy(chain_.get(), nullptr, result));
+}
+
+TEST_F(CertPolicyEnforcerTest, ConformsToCTEVPolicyWithEmbeddedSCTs) {
+ // This chain_ is valid for 10 years - over 121 months - so requires 5 SCTs.
+ ct::CTVerifyResult result;
+ FillResultWithSCTsOfOrigin(ct::SignedCertificateTimestamp::SCT_EMBEDDED, 5,
+ &result);
+
+ EXPECT_TRUE(
+ policy_enforcer_->DoesConformToCTEVPolicy(chain_.get(), nullptr, result));
+}
+
+TEST_F(CertPolicyEnforcerTest, DoesNotConformToCTEVPolicyNotEnoughSCTs) {
+ scoped_refptr<ct::EVCertsWhitelist> non_including_whitelist(
+ new DummyEVCertsWhitelist(true, false));
+ // This chain_ is valid for 10 years - over 121 months - so requires 5 SCTs.
+ // However, as there are only two logs, two SCTs will be required - supply one
+ // to guarantee the test fails.
+ ct::CTVerifyResult result;
+ FillResultWithSCTsOfOrigin(ct::SignedCertificateTimestamp::SCT_EMBEDDED, 1,
+ &result);
+
+ EXPECT_FALSE(policy_enforcer_->DoesConformToCTEVPolicy(
+ chain_.get(), non_including_whitelist.get(), result));
+
+ // ... but should be OK if whitelisted.
+ scoped_refptr<ct::EVCertsWhitelist> whitelist(
+ new DummyEVCertsWhitelist(true, true));
+ EXPECT_TRUE(policy_enforcer_->DoesConformToCTEVPolicy(
+ chain_.get(), whitelist.get(), result));
+}
+
+TEST_F(CertPolicyEnforcerTest, DoesNotEnforceCTPolicyIfNotRequired) {
+ scoped_ptr<CertPolicyEnforcer> enforcer(new CertPolicyEnforcer(3, false));
+
+ ct::CTVerifyResult result;
+ FillResultWithSCTsOfOrigin(ct::SignedCertificateTimestamp::SCT_EMBEDDED, 1,
+ &result);
+ // Expect true despite the chain not having enough SCTs as the policy
+ // is not enforced.
+ EXPECT_TRUE(enforcer->DoesConformToCTEVPolicy(chain_.get(), nullptr, result));
+}
+
+TEST_F(CertPolicyEnforcerTest, DoesNotConformToPolicyInvalidDates) {
+ scoped_refptr<X509Certificate> no_valid_dates_cert(new X509Certificate(
+ "subject", "issuer", base::Time(), base::Time::Now()));
+ ct::CTVerifyResult result;
+ FillResultWithSCTsOfOrigin(ct::SignedCertificateTimestamp::SCT_EMBEDDED, 5,
+ &result);
+ EXPECT_FALSE(policy_enforcer_->DoesConformToCTEVPolicy(
+ no_valid_dates_cert.get(), nullptr, result));
+ // ... but should be OK if whitelisted.
+ scoped_refptr<ct::EVCertsWhitelist> whitelist(
+ new DummyEVCertsWhitelist(true, true));
+ EXPECT_TRUE(policy_enforcer_->DoesConformToCTEVPolicy(
+ chain_.get(), whitelist.get(), result));
+}
+
+TEST_F(CertPolicyEnforcerTest,
+ ConformsToPolicyExactNumberOfSCTsForValidityPeriod) {
+ // Test multiple validity periods: Over 27 months, Over 15 months (but less
+ // than 27 months),
+ // Less than 15 months.
+ const size_t validity_period[] = {12, 19, 30, 50};
+ const size_t needed_scts[] = {2, 3, 4, 5};
+
+ for (int i = 0; i < 3; ++i) {
+ size_t curr_validity = validity_period[i];
+ scoped_refptr<X509Certificate> cert(new X509Certificate(
+ "subject", "issuer", base::Time::Now(),
+ base::Time::Now() + base::TimeDelta::FromDays(31 * curr_validity)));
+ size_t curr_required_scts = needed_scts[i];
+ ct::CTVerifyResult result;
+ for (size_t j = 0; j < curr_required_scts - 1; ++j) {
+ FillResultWithSCTsOfOrigin(ct::SignedCertificateTimestamp::SCT_EMBEDDED,
+ 1, &result);
+ EXPECT_FALSE(policy_enforcer_->DoesConformToCTEVPolicy(cert.get(),
+ nullptr, result))
+ << " for: " << curr_validity << " and " << curr_required_scts
+ << " scts=" << result.verified_scts.size() << " j=" << j;
+ }
+ FillResultWithSCTsOfOrigin(ct::SignedCertificateTimestamp::SCT_EMBEDDED, 1,
+ &result);
+ EXPECT_TRUE(
+ policy_enforcer_->DoesConformToCTEVPolicy(cert.get(), nullptr, result));
+ }
+}
+
+TEST_F(CertPolicyEnforcerTest,
+ ConformsToPolicyButDoesNotRequireMoreThanNumLogs) {
+ scoped_ptr<CertPolicyEnforcer> enforcer(new CertPolicyEnforcer(2, true));
+
+ ct::CTVerifyResult result;
+ FillResultWithSCTsOfOrigin(ct::SignedCertificateTimestamp::SCT_EMBEDDED, 2,
+ &result);
+ // Expect true despite the chain not having enough SCTs according to the
+ // policy
+ // since we only have 2 logs.
+ EXPECT_TRUE(enforcer->DoesConformToCTEVPolicy(chain_.get(), nullptr, result));
+}
+
+TEST_F(CertPolicyEnforcerTest, ConformsToPolicyByEVWhitelistPresence) {
+ scoped_refptr<ct::EVCertsWhitelist> whitelist(
+ new DummyEVCertsWhitelist(true, true));
+
+ ct::CTVerifyResult result;
+ FillResultWithSCTsOfOrigin(ct::SignedCertificateTimestamp::SCT_EMBEDDED, 1,
+ &result);
+ EXPECT_TRUE(policy_enforcer_->DoesConformToCTEVPolicy(
+ chain_.get(), whitelist.get(), result));
+}
+
+TEST_F(CertPolicyEnforcerTest, IgnoresInvalidEVWhitelist) {
+ scoped_refptr<ct::EVCertsWhitelist> whitelist(
+ new DummyEVCertsWhitelist(false, true));
+
+ ct::CTVerifyResult result;
+ FillResultWithSCTsOfOrigin(ct::SignedCertificateTimestamp::SCT_EMBEDDED, 1,
+ &result);
+ EXPECT_FALSE(policy_enforcer_->DoesConformToCTEVPolicy(
+ chain_.get(), whitelist.get(), result));
+}
+
+TEST_F(CertPolicyEnforcerTest, IgnoresNullEVWhitelist) {
+ ct::CTVerifyResult result;
+ FillResultWithSCTsOfOrigin(ct::SignedCertificateTimestamp::SCT_EMBEDDED, 1,
+ &result);
+ EXPECT_FALSE(
+ policy_enforcer_->DoesConformToCTEVPolicy(chain_.get(), nullptr, result));
+}
+
+} // namespace
+
+} // namespace net
diff --git a/net/cert/crl_set_storage.cc b/net/cert/crl_set_storage.cc
index 1b11d78..2da4f92 100644
--- a/net/cert/crl_set_storage.cc
+++ b/net/cert/crl_set_storage.cc
@@ -8,6 +8,7 @@
#include "base/debug/trace_event.h"
#include "base/format_macros.h"
#include "base/json/json_reader.h"
+#include "base/numerics/safe_conversions.h"
#include "base/strings/stringprintf.h"
#include "base/values.h"
#include "crypto/sha2.h"
@@ -517,10 +518,12 @@
}
std::string ret;
- char* out = WriteInto(&ret, len + 1 /* to include final NUL */);
+ uint8_t* out = reinterpret_cast<uint8_t*>(
+ WriteInto(&ret, len + 1 /* to include final NUL */));
size_t off = 0;
- out[off++] = header.size();
- out[off++] = header.size() >> 8;
+ CHECK(base::IsValueInRangeForNumericType<uint16>(header.size()));
+ out[off++] = static_cast<uint8_t>(header.size());
+ out[off++] = static_cast<uint8_t>(header.size() >> 8);
memcpy(out + off, header.data(), header.size());
off += header.size();
@@ -534,7 +537,8 @@
for (std::vector<std::string>::const_iterator j = i->second.begin();
j != i->second.end(); ++j) {
- out[off++] = j->size();
+ CHECK(base::IsValueInRangeForNumericType<uint8_t>(j->size()));
+ out[off++] = static_cast<uint8_t>(j->size());
memcpy(out + off, j->data(), j->size());
off += j->size();
}
diff --git a/net/cert/ct_log_response_parser.cc b/net/cert/ct_log_response_parser.cc
index bd59a9e..f7cc25f 100644
--- a/net/cert/ct_log_response_parser.cc
+++ b/net/cert/ct_log_response_parser.cc
@@ -127,7 +127,8 @@
signed_tree_head->tree_size = parsed_sth.tree_size;
signed_tree_head->timestamp =
base::Time::UnixEpoch() +
- base::TimeDelta::FromMilliseconds(parsed_sth.timestamp);
+ base::TimeDelta::FromMilliseconds(
+ static_cast<int64>(parsed_sth.timestamp));
signed_tree_head->signature = parsed_sth.signature;
memcpy(signed_tree_head->sha256_root_hash,
parsed_sth.sha256_root_hash.c_str(),
diff --git a/net/cert/x509_certificate.cc b/net/cert/x509_certificate.cc
index 880d487..02e0234 100644
--- a/net/cert/x509_certificate.cc
+++ b/net/cert/x509_certificate.cc
@@ -629,27 +629,16 @@
if (presented_domain != reference_domain)
continue;
- base::StringPiece pattern_begin, pattern_end;
- SplitOnChar(presented_host, '*', &pattern_begin, &pattern_end);
-
- if (pattern_end.empty()) { // No '*' in the presented_host
+ if (presented_host != "*") {
if (presented_host == reference_host)
return true;
continue;
}
- pattern_end.remove_prefix(1); // move past the *
if (!allow_wildcards)
continue;
- // * must not match a substring of an IDN A label; just a whole fragment.
- if (reference_host.starts_with("xn--") &&
- !(pattern_begin.empty() && pattern_end.empty()))
- continue;
-
- if (reference_host.starts_with(pattern_begin) &&
- reference_host.ends_with(pattern_end))
- return true;
+ return true;
}
return false;
}
diff --git a/net/cert/x509_certificate_unittest.cc b/net/cert/x509_certificate_unittest.cc
index c64da2c..f5e49f8 100644
--- a/net/cert/x509_certificate_unittest.cc
+++ b/net/cert/x509_certificate_unittest.cc
@@ -971,10 +971,10 @@
{ false, "w.bar.foo.com", "w*.bar.foo.com" },
{ false, "www.bar.foo.com", "ww*ww.bar.foo.com" },
{ false, "wwww.bar.foo.com", "ww*ww.bar.foo.com" },
- { true, "wwww.bar.foo.com", "w*w.bar.foo.com" },
+ { false, "wwww.bar.foo.com", "w*w.bar.foo.com" },
{ false, "wwww.bar.foo.com", "w*w.bar.foo.c0m" },
- { true, "WALLY.bar.foo.com", "wa*.bar.foo.com" },
- { true, "wally.bar.foo.com", "*Ly.bar.foo.com" },
+ { false, "WALLY.bar.foo.com", "wa*.bar.foo.com" },
+ { false, "wally.bar.foo.com", "*Ly.bar.foo.com" },
{ true, "ww%57.foo.com", "", "www.foo.com" },
{ true, "www&.foo.com", "www%26.foo.com" },
// Common name must not be used if subject alternative name was provided.
@@ -998,12 +998,14 @@
{ true, "foo.example.com", "*.example.com" },
{ false, "bar.foo.example.com", "*.example.com" },
{ false, "example.com", "*.example.com" },
- // (e.g., baz*.example.net and *baz.example.net and b*z.example.net would
- // be taken to match baz1.example.net and foobaz.example.net and
- // buzz.example.net, respectively
- { true, "baz1.example.net", "baz*.example.net" },
- { true, "foobaz.example.net", "*baz.example.net" },
- { true, "buzz.example.net", "b*z.example.net" },
+ // Partial wildcards are disallowed, though RFC 2818 rules allow them.
+ // That is, forms such as baz*.example.net, *baz.example.net, and
+ // b*z.example.net should NOT match domains. Instead, the wildcard must
+ // always be the left-most label, and only a single label.
+ { false, "baz1.example.net", "baz*.example.net" },
+ { false, "foobaz.example.net", "*baz.example.net" },
+ { false, "buzz.example.net", "b*z.example.net" },
+ { false, "www.test.example.net", "www.*.example.net" },
// Wildcards should not be valid for public registry controlled domains,
// and unknown/unrecognized domains, at least three domain components must
// be present.
diff --git a/net/cert/x509_certificate_win.cc b/net/cert/x509_certificate_win.cc
index 0bed756..c965f69 100644
--- a/net/cert/x509_certificate_win.cc
+++ b/net/cert/x509_certificate_win.cc
@@ -37,14 +37,14 @@
void ExplodedTimeToSystemTime(const base::Time::Exploded& exploded,
SYSTEMTIME* system_time) {
- system_time->wYear = exploded.year;
- system_time->wMonth = exploded.month;
- system_time->wDayOfWeek = exploded.day_of_week;
- system_time->wDay = exploded.day_of_month;
- system_time->wHour = exploded.hour;
- system_time->wMinute = exploded.minute;
- system_time->wSecond = exploded.second;
- system_time->wMilliseconds = exploded.millisecond;
+ system_time->wYear = static_cast<WORD>(exploded.year);
+ system_time->wMonth = static_cast<WORD>(exploded.month);
+ system_time->wDayOfWeek = static_cast<WORD>(exploded.day_of_week);
+ system_time->wDay = static_cast<WORD>(exploded.day_of_month);
+ system_time->wHour = static_cast<WORD>(exploded.hour);
+ system_time->wMinute = static_cast<WORD>(exploded.minute);
+ system_time->wSecond = static_cast<WORD>(exploded.second);
+ system_time->wMilliseconds = static_cast<WORD>(exploded.millisecond);
}
//-----------------------------------------------------------------------------
diff --git a/net/cookies/cookie_monster.cc b/net/cookies/cookie_monster.cc
index cd9c9b8..e879a8f 100644
--- a/net/cookies/cookie_monster.cc
+++ b/net/cookies/cookie_monster.cc
@@ -1162,6 +1162,7 @@
std::sort(cookie_ptrs.begin(), cookie_ptrs.end(), CookieSorter);
CookieList cookies;
+ cookies.reserve(cookie_ptrs.size());
for (std::vector<CanonicalCookie*>::const_iterator it = cookie_ptrs.begin();
it != cookie_ptrs.end(); it++)
cookies.push_back(**it);
diff --git a/net/disk_cache/blockfile/addr.h b/net/disk_cache/blockfile/addr.h
index 99d2c93..a5e4367 100644
--- a/net/disk_cache/blockfile/addr.h
+++ b/net/disk_cache/blockfile/addr.h
@@ -25,10 +25,10 @@
};
const int kMaxBlockSize = 4096 * 4;
-const int kMaxBlockFile = 255;
+const int16 kMaxBlockFile = 255;
const int kMaxNumBlocks = 4;
-const int kFirstAdditionalBlockFile = 4;
-const int kFirstAdditionalBlockFileV3 = 7;
+const int16 kFirstAdditionalBlockFile = 4;
+const size_t kFirstAdditionalBlockFileV3 = 7;
// Defines a storage address for a cache record
//
diff --git a/net/disk_cache/blockfile/backend_impl.cc b/net/disk_cache/blockfile/backend_impl.cc
index 20995b7..1998d33 100644
--- a/net/disk_cache/blockfile/backend_impl.cc
+++ b/net/disk_cache/blockfile/backend_impl.cc
@@ -484,8 +484,10 @@
if (!cache_entry) {
CACHE_UMA(AGE_MS, "OpenTime.Miss", 0, start);
CACHE_UMA(COUNTS_10000, "AllOpenBySize.Miss", 0, current_size);
- CACHE_UMA(HOURS, "AllOpenByTotalHours.Miss", 0, total_hours);
- CACHE_UMA(HOURS, "AllOpenByUseHours.Miss", 0, use_hours);
+ CACHE_UMA(HOURS, "AllOpenByTotalHours.Miss", 0,
+ static_cast<base::HistogramBase::Sample>(total_hours));
+ CACHE_UMA(HOURS, "AllOpenByUseHours.Miss", 0,
+ static_cast<base::HistogramBase::Sample>(use_hours));
stats_.OnEvent(Stats::OPEN_MISS);
return NULL;
}
@@ -497,8 +499,10 @@
cache_entry->entry()->address().value());
CACHE_UMA(AGE_MS, "OpenTime", 0, start);
CACHE_UMA(COUNTS_10000, "AllOpenBySize.Hit", 0, current_size);
- CACHE_UMA(HOURS, "AllOpenByTotalHours.Hit", 0, total_hours);
- CACHE_UMA(HOURS, "AllOpenByUseHours.Hit", 0, use_hours);
+ CACHE_UMA(HOURS, "AllOpenByTotalHours.Hit", 0,
+ static_cast<base::HistogramBase::Sample>(total_hours));
+ CACHE_UMA(HOURS, "AllOpenByUseHours.Hit", 0,
+ static_cast<base::HistogramBase::Sample>(use_hours));
stats_.OnEvent(Stats::OPEN_HIT);
web_fonts_histogram::RecordCacheHit(cache_entry);
SIMPLE_STATS_COUNTER("disk_cache.hit");
@@ -1886,7 +1890,7 @@
// time is the ratio of that bin's total count to the count in the same bin in
// the TotalTime histogram.
if (base::RandInt(0, 99) < hit_ratio_as_percentage)
- CACHE_UMA(HOURS, "HitRatioByTotalTime", 0, implicit_cast<int>(total_hours));
+ CACHE_UMA(HOURS, "HitRatioByTotalTime", 0, static_cast<int>(total_hours));
int64 use_hours = stats_.GetCounter(Stats::LAST_REPORT_TIMER) / 120;
stats_.SetCounter(Stats::LAST_REPORT_TIMER, stats_.GetCounter(Stats::TIMER));
@@ -1904,7 +1908,7 @@
// is the ratio of that bin's total count to the count in the same bin in the
// UseTime histogram.
if (base::RandInt(0, 99) < hit_ratio_as_percentage)
- CACHE_UMA(HOURS, "HitRatioByUseTime", 0, implicit_cast<int>(use_hours));
+ CACHE_UMA(HOURS, "HitRatioByUseTime", 0, static_cast<int>(use_hours));
CACHE_UMA(PERCENTAGE, "HitRatio", 0, hit_ratio_as_percentage);
int64 trim_rate = stats_.GetCounter(Stats::TRIM_ENTRY) / use_hours;
diff --git a/net/disk_cache/blockfile/block_bitmaps_v3.cc b/net/disk_cache/blockfile/block_bitmaps_v3.cc
index 011793c..ab86fc2 100644
--- a/net/disk_cache/blockfile/block_bitmaps_v3.cc
+++ b/net/disk_cache/blockfile/block_bitmaps_v3.cc
@@ -71,7 +71,7 @@
void BlockBitmaps::ReportStats() {
int used_blocks[kFirstAdditionalBlockFile];
int load[kFirstAdditionalBlockFile];
- for (int i = 0; i < kFirstAdditionalBlockFile; i++) {
+ for (int16 i = 0; i < kFirstAdditionalBlockFile; i++) {
GetFileStats(i, &used_blocks[i], &load[i]);
}
UMA_HISTOGRAM_COUNTS("DiskCache.Blocks_0", used_blocks[0]);
@@ -104,7 +104,7 @@
}
int BlockBitmaps::GetHeaderNumber(Addr address) {
- DCHECK_GE(bitmaps_.size(), static_cast<size_t>(kFirstAdditionalBlockFileV3));
+ DCHECK_GE(bitmaps_.size(), kFirstAdditionalBlockFileV3);
DCHECK(address.is_block_file() || !address.is_initialized());
if (!address.is_initialized())
return -1;
diff --git a/net/disk_cache/blockfile/block_files.cc b/net/disk_cache/blockfile/block_files.cc
index 4ae217b..58d25da 100644
--- a/net/disk_cache/blockfile/block_files.cc
+++ b/net/disk_cache/blockfile/block_files.cc
@@ -28,7 +28,7 @@
// Returns the type of block (number of consecutive blocks that can be stored)
// for a given nibble of the bitmap.
-inline int GetMapBlockType(uint8 value) {
+inline int GetMapBlockType(uint32 value) {
value &= 0xf;
return s_types[value];
}
@@ -279,7 +279,7 @@
thread_checker_.reset(new base::ThreadChecker);
block_files_.resize(kFirstAdditionalBlockFile);
- for (int i = 0; i < kFirstAdditionalBlockFile; i++) {
+ for (int16 i = 0; i < kFirstAdditionalBlockFile; i++) {
if (create_files)
if (!CreateBlockFile(i, static_cast<FileType>(i + 1), true))
return false;
@@ -574,7 +574,7 @@
MappedFile* BlockFiles::NextFile(MappedFile* file) {
ScopedFlush flush(file);
BlockFileHeader* header = reinterpret_cast<BlockFileHeader*>(file->buffer());
- int new_file = header->next_file;
+ int16 new_file = header->next_file;
if (!new_file) {
// RANKINGS is not reported as a type for small entries, but we may be
// extending the rankings block file.
@@ -595,8 +595,8 @@
return GetFile(address);
}
-int BlockFiles::CreateNextBlockFile(FileType block_type) {
- for (int i = kFirstAdditionalBlockFile; i <= kMaxBlockFile; i++) {
+int16 BlockFiles::CreateNextBlockFile(FileType block_type) {
+ for (int16 i = kFirstAdditionalBlockFile; i <= kMaxBlockFile; i++) {
if (CreateBlockFile(i, block_type, false))
return i;
}
diff --git a/net/disk_cache/blockfile/block_files.h b/net/disk_cache/blockfile/block_files.h
index f84c314..7c2794a 100644
--- a/net/disk_cache/blockfile/block_files.h
+++ b/net/disk_cache/blockfile/block_files.h
@@ -136,7 +136,7 @@
MappedFile* NextFile(MappedFile* file);
// Creates an empty block file and returns its index.
- int CreateNextBlockFile(FileType block_type);
+ int16 CreateNextBlockFile(FileType block_type);
// Removes a chained block file that is now empty.
bool RemoveEmptyFile(FileType block_type);
diff --git a/net/disk_cache/simple/simple_backend_impl.cc b/net/disk_cache/simple/simple_backend_impl.cc
index 6385a37..8cf592a 100644
--- a/net/disk_cache/simple/simple_backend_impl.cc
+++ b/net/disk_cache/simple/simple_backend_impl.cc
@@ -271,12 +271,15 @@
}
bool SimpleBackendImpl::SetMaxSize(int max_bytes) {
+ if (max_bytes < 0)
+ return false;
orig_max_size_ = max_bytes;
- return index_->SetMaxSize(max_bytes);
+ index_->SetMaxSize(max_bytes);
+ return true;
}
int SimpleBackendImpl::GetMaxFileSize() const {
- return index_->max_size() / kMaxFileRatio;
+ return static_cast<int>(index_->max_size() / kMaxFileRatio);
}
void SimpleBackendImpl::OnDoomStart(uint64 entry_hash) {
diff --git a/net/disk_cache/simple/simple_entry_impl.cc b/net/disk_cache/simple/simple_entry_impl.cc
index a6de878..a894aff 100644
--- a/net/disk_cache/simple/simple_entry_impl.cc
+++ b/net/disk_cache/simple/simple_entry_impl.cc
@@ -1022,9 +1022,9 @@
DCHECK_EQ(STATE_READY, state_);
state_ = STATE_IO_PENDING;
- int64 max_sparse_data_size = kint64max;
+ uint64 max_sparse_data_size = kint64max;
if (backend_.get()) {
- int64 max_cache_size = backend_->index()->max_size();
+ uint64 max_cache_size = backend_->index()->max_size();
max_sparse_data_size = max_cache_size / kMaxSparseDataSizeDivisor;
}
diff --git a/net/disk_cache/simple/simple_index.cc b/net/disk_cache/simple/simple_index.cc
index 66d9f42..6eb60bd 100644
--- a/net/disk_cache/simple/simple_index.cc
+++ b/net/disk_cache/simple/simple_index.cc
@@ -82,9 +82,9 @@
entry_size_(0) {
}
-EntryMetadata::EntryMetadata(base::Time last_used_time, int entry_size)
+EntryMetadata::EntryMetadata(base::Time last_used_time, uint64 entry_size)
: last_used_time_seconds_since_epoch_(0),
- entry_size_(entry_size) {
+ entry_size_(base::checked_cast<int32>(entry_size)) {
SetLastUsedTime(last_used_time);
}
@@ -111,6 +111,14 @@
last_used_time_seconds_since_epoch_ = 1;
}
+uint64 EntryMetadata::GetEntrySize() const {
+ return entry_size_;
+}
+
+void EntryMetadata::SetEntrySize(uint64 entry_size) {
+ entry_size_ = base::checked_cast<int32>(entry_size);
+}
+
void EntryMetadata::Serialize(Pickle* pickle) const {
DCHECK(pickle);
int64 internal_last_used_time = GetLastUsedTime().ToInternalValue();
@@ -122,10 +130,11 @@
DCHECK(it);
int64 tmp_last_used_time;
uint64 tmp_entry_size;
- if (!it->ReadInt64(&tmp_last_used_time) || !it->ReadUInt64(&tmp_entry_size))
+ if (!it->ReadInt64(&tmp_last_used_time) || !it->ReadUInt64(&tmp_entry_size) ||
+ tmp_entry_size > static_cast<uint64>(std::numeric_limits<int32>::max()))
return false;
SetLastUsedTime(base::Time::FromInternalValue(tmp_last_used_time));
- entry_size_ = tmp_entry_size;
+ entry_size_ = static_cast<int32>(tmp_entry_size);
return true;
}
@@ -179,18 +188,13 @@
index_file_->LoadIndexEntries(cache_mtime, reply, load_result);
}
-bool SimpleIndex::SetMaxSize(int max_bytes) {
- if (max_bytes < 0)
- return false;
-
+void SimpleIndex::SetMaxSize(uint64 max_bytes) {
// Zero size means use the default.
- if (!max_bytes)
- return true;
-
- max_size_ = max_bytes;
- high_watermark_ = max_size_ - max_size_ / kEvictionMarginDivisor;
- low_watermark_ = max_size_ - 2 * (max_size_ / kEvictionMarginDivisor);
- return true;
+ if (max_bytes) {
+ max_size_ = max_bytes;
+ high_watermark_ = max_size_ - max_size_ / kEvictionMarginDivisor;
+ low_watermark_ = max_size_ - 2 * (max_size_ / kEvictionMarginDivisor);
+ }
}
int SimpleIndex::ExecuteWhenReady(const net::CompletionCallback& task) {
@@ -286,12 +290,12 @@
// Take all live key hashes from the index and sort them by time.
eviction_in_progress_ = true;
eviction_start_time_ = base::TimeTicks::Now();
- SIMPLE_CACHE_UMA(MEMORY_KB,
- "Eviction.CacheSizeOnStart2", cache_type_,
- cache_size_ / kBytesInKb);
- SIMPLE_CACHE_UMA(MEMORY_KB,
- "Eviction.MaxCacheSizeOnStart2", cache_type_,
- max_size_ / kBytesInKb);
+ SIMPLE_CACHE_UMA(
+ MEMORY_KB, "Eviction.CacheSizeOnStart2", cache_type_,
+ static_cast<base::HistogramBase::Sample>(cache_size_ / kBytesInKb));
+ SIMPLE_CACHE_UMA(
+ MEMORY_KB, "Eviction.MaxCacheSizeOnStart2", cache_type_,
+ static_cast<base::HistogramBase::Sample>(max_size_ / kBytesInKb));
std::vector<uint64> entry_hashes;
entry_hashes.reserve(entries_set_.size());
for (EntrySet::const_iterator it = entries_set_.begin(),
@@ -308,8 +312,7 @@
DCHECK(it != entry_hashes.end());
EntrySet::iterator found_meta = entries_set_.find(*it);
DCHECK(found_meta != entries_set_.end());
- uint64 to_evict_size = found_meta->second.GetEntrySize();
- evicted_so_far_size += to_evict_size;
+ evicted_so_far_size += found_meta->second.GetEntrySize();
++it;
}
@@ -320,15 +323,16 @@
SIMPLE_CACHE_UMA(TIMES,
"Eviction.TimeToSelectEntries", cache_type_,
base::TimeTicks::Now() - eviction_start_time_);
- SIMPLE_CACHE_UMA(MEMORY_KB,
- "Eviction.SizeOfEvicted2", cache_type_,
- evicted_so_far_size / kBytesInKb);
+ SIMPLE_CACHE_UMA(
+ MEMORY_KB, "Eviction.SizeOfEvicted2", cache_type_,
+ static_cast<base::HistogramBase::Sample>(
+ evicted_so_far_size / kBytesInKb));
delegate_->DoomEntries(&entry_hashes, base::Bind(&SimpleIndex::EvictionDone,
AsWeakPtr()));
}
-bool SimpleIndex::UpdateEntrySize(uint64 entry_hash, int entry_size) {
+bool SimpleIndex::UpdateEntrySize(uint64 entry_hash, int64 entry_size) {
DCHECK(io_thread_checker_.CalledOnValidThread());
EntrySet::iterator it = entries_set_.find(entry_hash);
if (it == entries_set_.end())
@@ -349,9 +353,9 @@
SIMPLE_CACHE_UMA(TIMES,
"Eviction.TimeToDone", cache_type_,
base::TimeTicks::Now() - eviction_start_time_);
- SIMPLE_CACHE_UMA(MEMORY_KB,
- "Eviction.SizeWhenDone2", cache_type_,
- cache_size_ / kBytesInKb);
+ SIMPLE_CACHE_UMA(
+ MEMORY_KB, "Eviction.SizeWhenDone2", cache_type_,
+ static_cast<base::HistogramBase::Sample>(cache_size_ / kBytesInKb));
}
// static
@@ -374,10 +378,10 @@
}
void SimpleIndex::UpdateEntryIteratorSize(EntrySet::iterator* it,
- int entry_size) {
+ int64 entry_size) {
// Update the total cache size with the new entry size.
DCHECK(io_thread_checker_.CalledOnValidThread());
- DCHECK_GE(cache_size_, implicit_cast<uint64>((*it)->second.GetEntrySize()));
+ DCHECK_GE(cache_size_, (*it)->second.GetEntrySize());
cache_size_ -= (*it)->second.GetEntrySize();
cache_size_ += entry_size;
(*it)->second.SetEntrySize(entry_size);
diff --git a/net/disk_cache/simple/simple_index.h b/net/disk_cache/simple/simple_index.h
index 2b7e1cd..3829a35 100644
--- a/net/disk_cache/simple/simple_index.h
+++ b/net/disk_cache/simple/simple_index.h
@@ -40,13 +40,13 @@
class NET_EXPORT_PRIVATE EntryMetadata {
public:
EntryMetadata();
- EntryMetadata(base::Time last_used_time, int entry_size);
+ EntryMetadata(base::Time last_used_time, uint64 entry_size);
base::Time GetLastUsedTime() const;
void SetLastUsedTime(const base::Time& last_used_time);
- int GetEntrySize() const { return entry_size_; }
- void SetEntrySize(int entry_size) { entry_size_ = entry_size; }
+ uint64 GetEntrySize() const;
+ void SetEntrySize(uint64 entry_size);
// Serialize the data into the provided pickle.
void Serialize(Pickle* pickle) const;
@@ -86,8 +86,8 @@
void Initialize(base::Time cache_mtime);
- bool SetMaxSize(int max_bytes);
- int max_size() const { return max_size_; }
+ void SetMaxSize(uint64 max_bytes);
+ uint64 max_size() const { return max_size_; }
void Insert(uint64 entry_hash);
void Remove(uint64 entry_hash);
@@ -104,7 +104,7 @@
// Update the size (in bytes) of an entry, in the metadata stored in the
// index. This should be the total disk-file size including all streams of the
// entry.
- bool UpdateEntrySize(uint64 entry_hash, int entry_size);
+ bool UpdateEntrySize(uint64 entry_hash, int64 entry_size);
typedef base::hash_map<uint64, EntryMetadata> EntrySet;
@@ -143,7 +143,7 @@
void PostponeWritingToDisk();
- void UpdateEntryIteratorSize(EntrySet::iterator* it, int entry_size);
+ void UpdateEntryIteratorSize(EntrySet::iterator* it, int64 entry_size);
// Must run on IO Thread.
void MergeInitializingSet(scoped_ptr<SimpleIndexLoadResult> load_result);
diff --git a/net/disk_cache/simple/simple_index_unittest.cc b/net/disk_cache/simple/simple_index_unittest.cc
index 1096488..a74cb10 100644
--- a/net/disk_cache/simple/simple_index_unittest.cc
+++ b/net/disk_cache/simple/simple_index_unittest.cc
@@ -28,7 +28,7 @@
const base::Time kTestLastUsedTime =
base::Time::UnixEpoch() + base::TimeDelta::FromDays(20);
-const int kTestEntrySize = 789;
+const uint64 kTestEntrySize = 789;
} // namespace
@@ -171,7 +171,7 @@
TEST_F(EntryMetadataTest, Basics) {
EntryMetadata entry_metadata;
EXPECT_EQ(base::Time(), entry_metadata.GetLastUsedTime());
- EXPECT_EQ(0, entry_metadata.GetEntrySize());
+ EXPECT_EQ(0U, entry_metadata.GetEntrySize());
entry_metadata = NewEntryMetadataWithValues();
CheckEntryMetadataValues(entry_metadata);
@@ -231,7 +231,7 @@
// Confirm blank state.
EntryMetadata metadata;
EXPECT_EQ(base::Time(), metadata.GetLastUsedTime());
- EXPECT_EQ(0, metadata.GetEntrySize());
+ EXPECT_EQ(0U, metadata.GetEntrySize());
// Confirm state after insert.
index()->Insert(hashes_.at<1>());
@@ -239,14 +239,14 @@
base::Time now(base::Time::Now());
EXPECT_LT(now - base::TimeDelta::FromMinutes(1), metadata.GetLastUsedTime());
EXPECT_GT(now + base::TimeDelta::FromMinutes(1), metadata.GetLastUsedTime());
- EXPECT_EQ(0, metadata.GetEntrySize());
+ EXPECT_EQ(0U, metadata.GetEntrySize());
// Confirm state after remove.
metadata = EntryMetadata();
index()->Remove(hashes_.at<1>());
EXPECT_FALSE(GetEntryForTesting(hashes_.at<1>(), &metadata));
EXPECT_EQ(base::Time(), metadata.GetLastUsedTime());
- EXPECT_EQ(0, metadata.GetEntrySize());
+ EXPECT_EQ(0U, metadata.GetEntrySize());
}
TEST_F(SimpleIndexTest, Has) {
@@ -330,11 +330,11 @@
EXPECT_GT(
now - base::TimeDelta::FromDays(2) + base::TimeDelta::FromSeconds(1),
metadata.GetLastUsedTime());
- EXPECT_EQ(475, metadata.GetEntrySize());
+ EXPECT_EQ(475U, metadata.GetEntrySize());
index()->UpdateEntrySize(kHash1, 600u);
EXPECT_TRUE(GetEntryForTesting(kHash1, &metadata));
- EXPECT_EQ(600, metadata.GetEntrySize());
+ EXPECT_EQ(600U, metadata.GetEntrySize());
EXPECT_EQ(1, index()->GetEntryCount());
}
@@ -383,7 +383,7 @@
EXPECT_GT(
now - base::TimeDelta::FromDays(2) + base::TimeDelta::FromSeconds(1),
metadata.GetLastUsedTime());
- EXPECT_EQ(10, metadata.GetEntrySize());
+ EXPECT_EQ(10U, metadata.GetEntrySize());
EXPECT_TRUE(GetEntryForTesting(hashes_.at<2>(), &metadata));
EXPECT_LT(
now - base::TimeDelta::FromDays(3) - base::TimeDelta::FromSeconds(1),
@@ -391,7 +391,7 @@
EXPECT_GT(
now - base::TimeDelta::FromDays(3) + base::TimeDelta::FromSeconds(1),
metadata.GetLastUsedTime());
- EXPECT_EQ(100, metadata.GetEntrySize());
+ EXPECT_EQ(100U, metadata.GetEntrySize());
}
// Remove something that's going to come in from the loaded index.
@@ -423,7 +423,7 @@
base::Time now(base::Time::Now());
EXPECT_LT(now - base::TimeDelta::FromMinutes(1), metadata.GetLastUsedTime());
EXPECT_GT(now + base::TimeDelta::FromMinutes(1), metadata.GetLastUsedTime());
- EXPECT_EQ(0, metadata.GetEntrySize());
+ EXPECT_EQ(0U, metadata.GetEntrySize());
}
// Insert and Remove something that's going to come in from the loaded index.
@@ -456,7 +456,7 @@
base::Time now(base::Time::Now());
EXPECT_LT(now - base::TimeDelta::FromMinutes(1), metadata.GetLastUsedTime());
EXPECT_GT(now + base::TimeDelta::FromMinutes(1), metadata.GetLastUsedTime());
- EXPECT_EQ(0, metadata.GetEntrySize());
+ EXPECT_EQ(0U, metadata.GetEntrySize());
}
// Do all above tests at once + a non-conflict to test for cross-key
@@ -494,14 +494,14 @@
EXPECT_TRUE(GetEntryForTesting(hashes_.at<2>(), &metadata));
EXPECT_LT(now - base::TimeDelta::FromMinutes(1), metadata.GetLastUsedTime());
EXPECT_GT(now + base::TimeDelta::FromMinutes(1), metadata.GetLastUsedTime());
- EXPECT_EQ(0, metadata.GetEntrySize());
+ EXPECT_EQ(0U, metadata.GetEntrySize());
EXPECT_FALSE(index()->Has(hashes_.at<3>()));
EXPECT_TRUE(GetEntryForTesting(hashes_.at<4>(), &metadata));
EXPECT_LT(now - base::TimeDelta::FromMinutes(1), metadata.GetLastUsedTime());
EXPECT_GT(now + base::TimeDelta::FromMinutes(1), metadata.GetLastUsedTime());
- EXPECT_EQ(0, metadata.GetEntrySize());
+ EXPECT_EQ(0U, metadata.GetEntrySize());
EXPECT_TRUE(GetEntryForTesting(hashes_.at<5>(), &metadata));
@@ -512,7 +512,7 @@
now - base::TimeDelta::FromDays(6) - base::TimeDelta::FromSeconds(1),
metadata.GetLastUsedTime());
- EXPECT_EQ(100000, metadata.GetEntrySize());
+ EXPECT_EQ(100000U, metadata.GetEntrySize());
}
TEST_F(SimpleIndexTest, BasicEviction) {
@@ -601,7 +601,7 @@
const EntryMetadata& entry1(entry_set.begin()->second);
EXPECT_LT(now - base::TimeDelta::FromMinutes(1), entry1.GetLastUsedTime());
EXPECT_GT(now + base::TimeDelta::FromMinutes(1), entry1.GetLastUsedTime());
- EXPECT_EQ(20, entry1.GetEntrySize());
+ EXPECT_EQ(20U, entry1.GetEntrySize());
}
TEST_F(SimpleIndexTest, DiskWritePostponed) {
diff --git a/net/disk_cache/simple/simple_synchronous_entry.cc b/net/disk_cache/simple/simple_synchronous_entry.cc
index 52f8f08..f859105 100644
--- a/net/disk_cache/simple/simple_synchronous_entry.cc
+++ b/net/disk_cache/simple/simple_synchronous_entry.cc
@@ -134,8 +134,8 @@
int SimpleEntryStat::GetOffsetInFile(const std::string& key,
int offset,
int stream_index) const {
- const int64 headers_size = sizeof(SimpleFileHeader) + key.size();
- const int64 additional_offset =
+ const size_t headers_size = sizeof(SimpleFileHeader) + key.size();
+ const size_t additional_offset =
stream_index == 0 ? data_size_[1] + sizeof(SimpleFileEOF) : 0;
return headers_size + offset + additional_offset;
}
@@ -154,8 +154,9 @@
return GetOffsetInFile(key, eof_data_offset, stream_index);
}
-int SimpleEntryStat::GetFileSize(const std::string& key, int file_index) const {
- const int total_data_size =
+int64 SimpleEntryStat::GetFileSize(const std::string& key,
+ int file_index) const {
+ const int32 total_data_size =
file_index == 0 ? data_size_[0] + data_size_[1] + sizeof(SimpleFileEOF)
: data_size_[2];
return GetFileSizeFromKeyAndDataSize(key, total_data_size);
@@ -451,7 +452,7 @@
void SimpleSynchronousEntry::WriteSparseData(
const EntryOperationData& in_entry_op,
net::IOBuffer* in_buf,
- int64 max_sparse_data_size,
+ uint64 max_sparse_data_size,
SimpleEntryStat* out_entry_stat,
int* out_result) {
DCHECK(initialized_);
@@ -467,7 +468,7 @@
return;
}
- int64 sparse_data_size = out_entry_stat->sparse_data_size();
+ uint64 sparse_data_size = out_entry_stat->sparse_data_size();
// This is a pessimistic estimate; it assumes the entire buffer is going to
// be appended as a new range, not written over existing ranges.
if (sparse_data_size + buf_len > max_sparse_data_size) {
diff --git a/net/disk_cache/simple/simple_synchronous_entry.h b/net/disk_cache/simple/simple_synchronous_entry.h
index 739a488..7f98b21 100644
--- a/net/disk_cache/simple/simple_synchronous_entry.h
+++ b/net/disk_cache/simple/simple_synchronous_entry.h
@@ -44,7 +44,7 @@
int stream_index) const;
int GetEOFOffsetInFile(const std::string& key, int stream_index) const;
int GetLastEOFOffsetInFile(const std::string& key, int file_index) const;
- int GetFileSize(const std::string& key, int file_index) const;
+ int64 GetFileSize(const std::string& key, int file_index) const;
base::Time last_used() const { return last_used_; }
base::Time last_modified() const { return last_modified_; }
@@ -158,7 +158,7 @@
int* out_result);
void WriteSparseData(const EntryOperationData& in_entry_op,
net::IOBuffer* in_buf,
- int64 max_sparse_data_size,
+ uint64 max_sparse_data_size,
SimpleEntryStat* out_entry_stat,
int* out_result);
void GetAvailableRange(const EntryOperationData& in_entry_op,
diff --git a/net/dns/dns_hosts.cc b/net/dns/dns_hosts.cc
index 3867b44..b4d213b 100644
--- a/net/dns/dns_hosts.cc
+++ b/net/dns/dns_hosts.cc
@@ -195,7 +195,8 @@
if (!base::GetFileSize(path, &size))
return false;
- UMA_HISTOGRAM_COUNTS("AsyncDNS.HostsSize", size);
+ UMA_HISTOGRAM_COUNTS("AsyncDNS.HostsSize",
+ static_cast<base::HistogramBase::Sample>(size));
// Reject HOSTS files larger than |kMaxHostsSize| bytes.
const int64 kMaxHostsSize = 1 << 25; // 32MB
diff --git a/net/dns/dns_session.cc b/net/dns/dns_session.cc
index d6992f1..0b6292e 100644
--- a/net/dns/dns_session.cc
+++ b/net/dns/dns_session.cc
@@ -39,7 +39,9 @@
: last_failure_count(0), rtt_estimate(rtt_estimate_param) {
rtt_histogram.reset(new base::SampleVector(buckets));
// Seed histogram with 2 samples at |rtt_estimate| timeout.
- rtt_histogram->Accumulate(rtt_estimate.InMilliseconds(), 2);
+ rtt_histogram->Accumulate(
+ static_cast<base::HistogramBase::Sample>(rtt_estimate.InMilliseconds()),
+ 2);
}
// Count of consecutive failures after last success.
@@ -100,7 +102,9 @@
RecordServerStats();
}
-int DnsSession::NextQueryId() const { return rand_callback_.Run(); }
+uint16 DnsSession::NextQueryId() const {
+ return static_cast<uint16>(rand_callback_.Run());
+}
unsigned DnsSession::NextFirstServerIndex() {
unsigned index = NextGoodServerIndex(server_index_);
@@ -182,8 +186,8 @@
deviation += (abs_error - deviation) / 4; // * delta
// Histogram-based method.
- server_stats_[server_index]->rtt_histogram
- ->Accumulate(rtt.InMilliseconds(), 1);
+ server_stats_[server_index]->rtt_histogram->Accumulate(
+ static_cast<base::HistogramBase::Sample>(rtt.InMilliseconds()), 1);
}
void DnsSession::RecordLostPacket(unsigned server_index, int attempt) {
diff --git a/net/dns/dns_session.h b/net/dns/dns_session.h
index 01ba5e5..e878a57 100644
--- a/net/dns/dns_session.h
+++ b/net/dns/dns_session.h
@@ -66,7 +66,7 @@
NetLog* net_log() const { return net_log_; }
// Return the next random query ID.
- int NextQueryId() const;
+ uint16 NextQueryId() const;
// Return the index of the first configured server to use on first attempt.
unsigned NextFirstServerIndex();
diff --git a/net/dns/dns_transaction.cc b/net/dns/dns_transaction.cc
index 03eb7f2..beb2197 100644
--- a/net/dns/dns_transaction.cc
+++ b/net/dns/dns_transaction.cc
@@ -392,8 +392,10 @@
if (rv < 0)
return rv;
- base::WriteBigEndian<uint16>(length_buffer_->data(),
- query_->io_buffer()->size());
+ uint16 query_size = static_cast<uint16>(query_->io_buffer()->size());
+ if (static_cast<int>(query_size) != query_->io_buffer()->size())
+ return ERR_FAILED;
+ base::WriteBigEndian<uint16>(length_buffer_->data(), query_size);
buffer_ =
new DrainableIOBuffer(length_buffer_.get(), length_buffer_->size());
next_state_ = STATE_SEND_LENGTH;
diff --git a/net/dns/host_resolver_impl.cc b/net/dns/host_resolver_impl.cc
index 9426da5..b06a006 100644
--- a/net/dns/host_resolver_impl.cc
+++ b/net/dns/host_resolver_impl.cc
@@ -24,6 +24,7 @@
#include "base/message_loop/message_loop_proxy.h"
#include "base/metrics/field_trial.h"
#include "base/metrics/histogram.h"
+#include "base/profiler/scoped_tracker.h"
#include "base/stl_util.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
@@ -480,6 +481,11 @@
// Prepare final AddressList and call completion callback.
void OnComplete(int error, const AddressList& addr_list) {
+ // TODO(vadimt): Remove ScopedTracker below once crbug.com/436634 is fixed.
+ tracked_objects::ScopedTracker tracking_profile(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "436634 HostResolverImpl::Request::OnComplete"));
+
DCHECK(!was_canceled());
if (error == OK)
*addresses_ = EnsurePortOnAddressList(addr_list, info_.port());
@@ -679,6 +685,11 @@
const uint32 attempt_number,
int error,
const int os_error) {
+ // TODO(vadimt): Remove ScopedTracker below once crbug.com/436634 is fixed.
+ tracked_objects::ScopedTracker tracking_profile1(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "436634 HostResolverImpl::ProcTask::OnLookupComplete1"));
+
DCHECK(origin_loop_->BelongsToCurrentThread());
// If results are empty, we should return an error.
bool empty_list_on_ok = (error == OK && results.empty());
@@ -740,6 +751,11 @@
net_log_.EndEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_PROC_TASK,
net_log_callback);
+ // TODO(vadimt): Remove ScopedTracker below once crbug.com/436634 is fixed.
+ tracked_objects::ScopedTracker tracking_profile2(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "436634 HostResolverImpl::ProcTask::OnLookupComplete2"));
+
callback_.Run(error, results_);
}
@@ -1470,6 +1486,11 @@
void OnProcTaskComplete(base::TimeTicks start_time,
int net_error,
const AddressList& addr_list) {
+ // TODO(vadimt): Remove ScopedTracker below once crbug.com/436634 is fixed.
+ tracked_objects::ScopedTracker tracking_profile(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "436634 HostResolverImpl::Job::OnProcTaskComplete"));
+
DCHECK(is_proc_running());
if (!resolver_->resolved_known_ipv6_hostname_ &&
@@ -1619,6 +1640,11 @@
// Performs Job's last rites. Completes all Requests. Deletes this.
void CompleteRequests(const HostCache::Entry& entry,
base::TimeDelta ttl) {
+ // TODO(vadimt): Remove ScopedTracker below once crbug.com/436634 is fixed.
+ tracked_objects::ScopedTracker tracking_profile1(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "436634 HostResolverImpl::Job::CompleteRequests1"));
+
CHECK(resolver_.get());
// This job must be removed from resolver's |jobs_| now to make room for a
@@ -1668,6 +1694,11 @@
if (did_complete)
resolver_->CacheResult(key_, entry, ttl);
+ // TODO(vadimt): Remove ScopedTracker below once crbug.com/436634 is fixed.
+ tracked_objects::ScopedTracker tracking_profile2(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "436634 HostResolverImpl::Job::CompleteRequests2"));
+
// Complete all of the requests that were attached to the job.
for (RequestsList::const_iterator it = requests_.begin();
it != requests_.end(); ++it) {
diff --git a/net/dns/single_request_host_resolver.cc b/net/dns/single_request_host_resolver.cc
index 7974aba..2c4b3aa 100644
--- a/net/dns/single_request_host_resolver.cc
+++ b/net/dns/single_request_host_resolver.cc
@@ -8,6 +8,7 @@
#include "base/bind_helpers.h"
#include "base/compiler_specific.h"
#include "base/logging.h"
+#include "base/profiler/scoped_tracker.h"
#include "net/base/net_errors.h"
namespace net {
@@ -63,6 +64,11 @@
}
void SingleRequestHostResolver::OnResolveCompletion(int result) {
+ // TODO(vadimt): Remove ScopedTracker below once crbug.com/436634 is fixed.
+ tracked_objects::ScopedTracker tracking_profile(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "436634 SingleRequestHostResolver::OnResolveCompletion"));
+
DCHECK(cur_request_);
DCHECK_EQ(false, cur_request_callback_.is_null());
diff --git a/net/filter/gzip_header.cc b/net/filter/gzip_header.cc
index 4d1cad9..f4aca6b 100644
--- a/net/filter/gzip_header.cc
+++ b/net/filter/gzip_header.cc
@@ -105,7 +105,7 @@
case IN_FEXTRA: {
// Grab the rest of the bytes in the extra field, or as many
// of them as are actually present so far.
- const int num_extra_bytes = static_cast<const int>(std::min(
+ const uint16 num_extra_bytes = static_cast<uint16>(std::min(
static_cast<ptrdiff_t>(extra_length_),
(end - pos)));
pos += num_extra_bytes;
diff --git a/net/http/disk_based_cert_cache.cc b/net/http/disk_based_cert_cache.cc
index 9b39d85..b91fb10 100644
--- a/net/http/disk_based_cert_cache.cc
+++ b/net/http/disk_based_cert_cache.cc
@@ -10,6 +10,7 @@
#include "base/callback_helpers.h"
#include "base/memory/ref_counted.h"
#include "base/metrics/histogram.h"
+#include "base/profiler/scoped_tracker.h"
#include "base/stl_util.h"
#include "base/strings/string_number_conversions.h"
#include "net/base/io_buffer.h"
@@ -397,6 +398,11 @@
}
void DiskBasedCertCache::ReadWorker::OnIOComplete(int rv) {
+ // TODO(vadimt): Remove ScopedTracker below once crbug.com/422516 is fixed.
+ tracked_objects::ScopedTracker tracking_profile(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "422516 DiskBasedCertCache::ReadWorker::OnIOComplete"));
+
if (canceled_) {
Finish(ERR_FAILED);
return;
diff --git a/net/http/disk_cache_based_quic_server_info.cc b/net/http/disk_cache_based_quic_server_info.cc
index 148df3f..ab34bbe 100644
--- a/net/http/disk_cache_based_quic_server_info.cc
+++ b/net/http/disk_cache_based_quic_server_info.cc
@@ -9,6 +9,7 @@
#include "base/callback_helpers.h"
#include "base/logging.h"
#include "base/metrics/histogram.h"
+#include "base/profiler/scoped_tracker.h"
#include "net/base/completion_callback.h"
#include "net/base/io_buffer.h"
#include "net/base/net_errors.h"
@@ -78,9 +79,11 @@
const CompletionCallback& callback) {
DCHECK(CalledOnValidThread());
DCHECK_NE(GET_BACKEND, state_);
+ wait_for_data_start_time_ = base::TimeTicks::Now();
RecordQuicServerInfoStatus(QUIC_SERVER_INFO_WAIT_FOR_DATA_READY);
if (ready_) {
+ wait_for_data_end_time_ = base::TimeTicks::Now();
RecordLastFailure();
return OK;
}
@@ -183,11 +186,17 @@
void DiskCacheBasedQuicServerInfo::OnIOComplete(CacheOperationDataShim* unused,
int rv) {
+ // TODO(vadimt): Remove ScopedTracker below once crbug.com/422516 is fixed.
+ tracked_objects::ScopedTracker tracking_profile(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "422516 DiskCacheBasedQuicServerInfo::OnIOComplete"));
+
DCHECK_NE(NONE, state_);
rv = DoLoop(rv);
if (rv == ERR_IO_PENDING)
return;
if (!wait_for_ready_callback_.is_null()) {
+ wait_for_data_end_time_ = base::TimeTicks::Now();
RecordLastFailure();
base::ResetAndReturn(&wait_for_ready_callback_).Run(rv);
}
diff --git a/net/http/http_cache_transaction.cc b/net/http/http_cache_transaction.cc
index 896db76..23fb2d1 100644
--- a/net/http/http_cache_transaction.cc
+++ b/net/http/http_cache_transaction.cc
@@ -2883,15 +2883,16 @@
}
TimeDelta before_send_time = send_request_since_ - first_cache_access_since_;
- int before_send_percent =
- total_time.ToInternalValue() == 0 ? 0
- : before_send_time * 100 / total_time;
- DCHECK_LE(0, before_send_percent);
- DCHECK_GE(100, before_send_percent);
+ int64 before_send_percent = (total_time.ToInternalValue() == 0) ?
+ 0 : before_send_time * 100 / total_time;
+ DCHECK_GE(before_send_percent, 0);
+ DCHECK_LE(before_send_percent, 100);
+ base::HistogramBase::Sample before_send_sample =
+ static_cast<base::HistogramBase::Sample>(before_send_percent);
UMA_HISTOGRAM_TIMES("HttpCache.AccessToDone.SentRequest", total_time);
UMA_HISTOGRAM_TIMES("HttpCache.BeforeSend", before_send_time);
- UMA_HISTOGRAM_PERCENTAGE("HttpCache.PercentBeforeSend", before_send_percent);
+ UMA_HISTOGRAM_PERCENTAGE("HttpCache.PercentBeforeSend", before_send_sample);
// TODO(gavinp): Remove or minimize these histograms, particularly the ones
// below this comment after we have received initial data.
@@ -2900,25 +2901,25 @@
UMA_HISTOGRAM_TIMES("HttpCache.BeforeSend.CantConditionalize",
before_send_time);
UMA_HISTOGRAM_PERCENTAGE("HttpCache.PercentBeforeSend.CantConditionalize",
- before_send_percent);
+ before_send_sample);
break;
}
case PATTERN_ENTRY_NOT_CACHED: {
UMA_HISTOGRAM_TIMES("HttpCache.BeforeSend.NotCached", before_send_time);
UMA_HISTOGRAM_PERCENTAGE("HttpCache.PercentBeforeSend.NotCached",
- before_send_percent);
+ before_send_sample);
break;
}
case PATTERN_ENTRY_VALIDATED: {
UMA_HISTOGRAM_TIMES("HttpCache.BeforeSend.Validated", before_send_time);
UMA_HISTOGRAM_PERCENTAGE("HttpCache.PercentBeforeSend.Validated",
- before_send_percent);
+ before_send_sample);
break;
}
case PATTERN_ENTRY_UPDATED: {
UMA_HISTOGRAM_TIMES("HttpCache.BeforeSend.Updated", before_send_time);
UMA_HISTOGRAM_PERCENTAGE("HttpCache.PercentBeforeSend.Updated",
- before_send_percent);
+ before_send_sample);
break;
}
default:
diff --git a/net/http/http_network_session.cc b/net/http/http_network_session.cc
index 28b3b22..656db54 100644
--- a/net/http/http_network_session.cc
+++ b/net/http/http_network_session.cc
@@ -37,21 +37,14 @@
// TODO(yutak): Differentiate WebSocket pool manager and allow more
// simultaneous connections for WebSockets.
return new net::ClientSocketPoolManagerImpl(
- params.net_log,
- params.client_socket_factory
- ? params.client_socket_factory
- : net::ClientSocketFactory::GetDefaultFactory(),
- params.host_resolver,
- params.cert_verifier,
- params.channel_id_service,
- params.transport_security_state,
- params.cert_transparency_verifier,
- params.ssl_session_cache_shard,
- params.proxy_service,
- params.ssl_config_service,
- params.enable_ssl_connect_job_waiting,
- params.proxy_delegate,
- pool_type);
+ params.net_log, params.client_socket_factory
+ ? params.client_socket_factory
+ : net::ClientSocketFactory::GetDefaultFactory(),
+ params.host_resolver, params.cert_verifier, params.channel_id_service,
+ params.transport_security_state, params.cert_transparency_verifier,
+ params.cert_policy_enforcer, params.ssl_session_cache_shard,
+ params.proxy_service, params.ssl_config_service,
+ params.enable_ssl_connect_job_waiting, params.proxy_delegate, pool_type);
}
} // unnamed namespace
@@ -62,6 +55,7 @@
: client_socket_factory(NULL),
host_resolver(NULL),
cert_verifier(NULL),
+ cert_policy_enforcer(NULL),
channel_id_service(NULL),
transport_security_state(NULL),
cert_transparency_verifier(NULL),
diff --git a/net/http/http_network_session.h b/net/http/http_network_session.h
index 557b84e..bf93c83 100644
--- a/net/http/http_network_session.h
+++ b/net/http/http_network_session.h
@@ -29,6 +29,7 @@
namespace net {
+class CertPolicyEnforcer;
class CertVerifier;
class ChannelIDService;
class ClientSocketFactory;
@@ -66,6 +67,7 @@
ClientSocketFactory* client_socket_factory;
HostResolver* host_resolver;
CertVerifier* cert_verifier;
+ CertPolicyEnforcer* cert_policy_enforcer;
ChannelIDService* channel_id_service;
TransportSecurityState* transport_security_state;
CTVerifier* cert_transparency_verifier;
diff --git a/net/http/http_network_transaction.cc b/net/http/http_network_transaction.cc
index 8cddaf5..b4ef356 100644
--- a/net/http/http_network_transaction.cc
+++ b/net/http/http_network_transaction.cc
@@ -961,11 +961,6 @@
return result;
}
- if (result == ERR_QUIC_HANDSHAKE_FAILED) {
- ResetConnectionAndRequestForResend();
- return OK;
- }
-
// ERR_CONNECTION_CLOSED is treated differently at this point; if partial
// response headers were received, we do the best we can to make sense of it
// and send it back up the stack.
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc
index 878406e..eacd06c 100644
--- a/net/http/http_network_transaction_unittest.cc
+++ b/net/http/http_network_transaction_unittest.cc
@@ -583,6 +583,7 @@
NULL,
NULL,
NULL,
+ NULL,
std::string(),
NULL,
NULL,
diff --git a/net/http/http_proxy_client_socket_pool_unittest.cc b/net/http/http_proxy_client_socket_pool_unittest.cc
index bdaf57f..f818432 100644
--- a/net/http/http_proxy_client_socket_pool_unittest.cc
+++ b/net/http/http_proxy_client_socket_pool_unittest.cc
@@ -171,6 +171,7 @@
NULL /* channel_id_store */,
NULL /* transport_security_state */,
NULL /* cert_transparency_verifier */,
+ NULL /* cert_policy_enforcer */,
std::string() /* ssl_session_cache_shard */,
session_deps_.deterministic_socket_factory.get(),
&transport_socket_pool_,
diff --git a/net/http/http_response_info.cc b/net/http/http_response_info.cc
index 6967d79..c3a4827 100644
--- a/net/http/http_response_info.cc
+++ b/net/http/http_response_info.cc
@@ -343,7 +343,7 @@
ssl_info.signed_certificate_timestamps.begin(); it !=
ssl_info.signed_certificate_timestamps.end(); ++it) {
it->sct->Persist(pickle);
- pickle->WriteUInt16(it->status);
+ pickle->WriteUInt16(static_cast<uint16>(it->status));
}
}
}
diff --git a/net/http/http_server_properties.h b/net/http/http_server_properties.h
index a63dc6a..b860cc7 100644
--- a/net/http/http_server_properties.h
+++ b/net/http/http_server_properties.h
@@ -13,6 +13,7 @@
#include "base/time/time.h"
#include "net/base/host_port_pair.h"
#include "net/base/net_export.h"
+#include "net/quic/quic_bandwidth.h"
#include "net/socket/next_proto.h"
#include "net/spdy/spdy_framer.h" // TODO(willchan): Reconsider this.
#include "net/spdy/spdy_protocol.h"
@@ -143,8 +144,10 @@
class NET_EXPORT HttpServerProperties {
public:
struct NetworkStats {
+ NetworkStats() : bandwidth_estimate(QuicBandwidth::Zero()) {}
+
base::TimeDelta srtt;
- uint64 bandwidth_estimate;
+ QuicBandwidth bandwidth_estimate;
};
HttpServerProperties() {}
diff --git a/net/http/http_server_properties_impl.cc b/net/http/http_server_properties_impl.cc
index 1bf541b..8a8e49a 100644
--- a/net/http/http_server_properties_impl.cc
+++ b/net/http/http_server_properties_impl.cc
@@ -127,16 +127,6 @@
}
}
-// static
-std::string HttpServerPropertiesImpl::GetFlattenedSpdyServer(
- const net::HostPortPair& host_port_pair) {
- std::string spdy_server;
- spdy_server.append(host_port_pair.host());
- spdy_server.append(":");
- base::StringAppendF(&spdy_server, "%d", host_port_pair.port());
- return spdy_server;
-}
-
static const AlternateProtocolInfo* g_forced_alternate_protocol = NULL;
// static
@@ -172,10 +162,9 @@
DCHECK(CalledOnValidThread());
if (host_port_pair.host().empty())
return false;
- std::string spdy_server = GetFlattenedSpdyServer(host_port_pair);
SpdyServerHostPortMap::iterator spdy_host_port =
- spdy_servers_map_.Get(spdy_server);
+ spdy_servers_map_.Get(host_port_pair.ToString());
if (spdy_host_port != spdy_servers_map_.end())
return spdy_host_port->second;
return false;
@@ -187,16 +176,15 @@
DCHECK(CalledOnValidThread());
if (host_port_pair.host().empty())
return;
- std::string spdy_server = GetFlattenedSpdyServer(host_port_pair);
SpdyServerHostPortMap::iterator spdy_host_port =
- spdy_servers_map_.Get(spdy_server);
+ spdy_servers_map_.Get(host_port_pair.ToString());
if ((spdy_host_port != spdy_servers_map_.end()) &&
(spdy_host_port->second == support_spdy)) {
return;
}
// Cache the data.
- spdy_servers_map_.Put(spdy_server, support_spdy);
+ spdy_servers_map_.Put(host_port_pair.ToString(), support_spdy);
}
bool HttpServerPropertiesImpl::HasAlternateProtocol(
@@ -204,12 +192,16 @@
if (g_forced_alternate_protocol)
return true;
AlternateProtocolMap::const_iterator it = alternate_protocol_map_.Get(server);
- if (it != alternate_protocol_map_.end() &&
- it->second.probability >= alternate_protocol_probability_threshold_) {
- return true;
+ if (it != alternate_protocol_map_.end())
+ return it->second.probability >= alternate_protocol_probability_threshold_;
+
+ auto canonical = GetCanonicalHost(server);
+ if (canonical == canonical_host_to_origin_map_.end() ||
+ canonical->second.Equals(server)) {
+ return false;
}
- return GetCanonicalHost(server) != canonical_host_to_origin_map_.end();
+ return HasAlternateProtocol(canonical->second);
}
std::string HttpServerPropertiesImpl::GetCanonicalSuffix(
diff --git a/net/http/http_server_properties_impl_unittest.cc b/net/http/http_server_properties_impl_unittest.cc
index 3d1bacb..4dda0db 100644
--- a/net/http/http_server_properties_impl_unittest.cc
+++ b/net/http/http_server_properties_impl_unittest.cc
@@ -34,12 +34,10 @@
TEST_F(SpdyServerPropertiesTest, Initialize) {
HostPortPair spdy_server_google("www.google.com", 443);
- std::string spdy_server_g =
- HttpServerPropertiesImpl::GetFlattenedSpdyServer(spdy_server_google);
+ std::string spdy_server_g = spdy_server_google.ToString();
HostPortPair spdy_server_docs("docs.google.com", 443);
- std::string spdy_server_d =
- HttpServerPropertiesImpl::GetFlattenedSpdyServer(spdy_server_docs);
+ std::string spdy_server_d = spdy_server_docs.ToString();
// Check by initializing NULL spdy servers.
impl_.InitializeSpdyServers(NULL, true);
@@ -155,11 +153,9 @@
std::string string_value_g;
std::string string_value_m;
HostPortPair spdy_server_google("www.google.com", 443);
- std::string spdy_server_g =
- HttpServerPropertiesImpl::GetFlattenedSpdyServer(spdy_server_google);
+ std::string spdy_server_g = spdy_server_google.ToString();
HostPortPair spdy_server_mail("mail.google.com", 443);
- std::string spdy_server_m =
- HttpServerPropertiesImpl::GetFlattenedSpdyServer(spdy_server_mail);
+ std::string spdy_server_m = spdy_server_mail.ToString();
// Add www.google.com:443 as not supporting SPDY.
impl_.SetSupportsSpdy(spdy_server_google, false);
@@ -204,11 +200,9 @@
std::string string_value_g;
std::string string_value_m;
HostPortPair spdy_server_google("www.google.com", 443);
- std::string spdy_server_g =
- HttpServerPropertiesImpl::GetFlattenedSpdyServer(spdy_server_google);
+ std::string spdy_server_g = spdy_server_google.ToString();
HostPortPair spdy_server_mail("mail.google.com", 443);
- std::string spdy_server_m =
- HttpServerPropertiesImpl::GetFlattenedSpdyServer(spdy_server_mail);
+ std::string spdy_server_m = spdy_server_mail.ToString();
// Add www.google.com:443 as supporting SPDY.
impl_.SetSupportsSpdy(spdy_server_google, true);
@@ -445,6 +439,36 @@
EXPECT_EQ(".c.youtube.com", impl_.GetCanonicalSuffix(canonical_port_pair));
}
+TEST_F(AlternateProtocolServerPropertiesTest, CanonicalBelowThreshold) {
+ impl_.SetAlternateProtocolProbabilityThreshold(0.02);
+
+ HostPortPair test_host_port_pair("foo.c.youtube.com", 80);
+ HostPortPair canonical_port_pair("bar.c.youtube.com", 80);
+ AlternateProtocolInfo canonical_protocol(1234, QUIC, 0.01);
+
+ impl_.SetAlternateProtocol(canonical_port_pair,
+ canonical_protocol.port,
+ canonical_protocol.protocol,
+ canonical_protocol.probability);
+ EXPECT_FALSE(impl_.HasAlternateProtocol(canonical_port_pair));
+ EXPECT_FALSE(impl_.HasAlternateProtocol(test_host_port_pair));
+}
+
+TEST_F(AlternateProtocolServerPropertiesTest, CanonicalAboveThreshold) {
+ impl_.SetAlternateProtocolProbabilityThreshold(0.02);
+
+ HostPortPair test_host_port_pair("foo.c.youtube.com", 80);
+ HostPortPair canonical_port_pair("bar.c.youtube.com", 80);
+ AlternateProtocolInfo canonical_protocol(1234, QUIC, 0.03);
+
+ impl_.SetAlternateProtocol(canonical_port_pair,
+ canonical_protocol.port,
+ canonical_protocol.protocol,
+ canonical_protocol.probability);
+ EXPECT_TRUE(impl_.HasAlternateProtocol(canonical_port_pair));
+ EXPECT_TRUE(impl_.HasAlternateProtocol(test_host_port_pair));
+}
+
TEST_F(AlternateProtocolServerPropertiesTest, ClearCanonical) {
HostPortPair test_host_port_pair("foo.c.youtube.com", 80);
HostPortPair canonical_port_pair("bar.c.youtube.com", 80);
diff --git a/net/http/http_server_properties_manager.cc b/net/http/http_server_properties_manager.cc
index 5773129..62db0b4 100644
--- a/net/http/http_server_properties_manager.cc
+++ b/net/http/http_server_properties_manager.cc
@@ -27,13 +27,7 @@
// Time to wait before starting an update the preferences from the
// http_server_properties_impl_ cache. Scheduling another update during this
// period will reset the timer.
-// TODO(rtenneti): Remove OS_ANDROID ifdef after testing if flushing of
-// AlternateProtocolHosts to disk in 500ms helps with QUIC's 0RTT or not.
-#if defined(OS_ANDROID)
-const int64 kUpdatePrefsDelayMs = 500;
-#else
const int64 kUpdatePrefsDelayMs = 5000;
-#endif
// "version" 0 indicates, http_server_properties doesn't have "version"
// property.
diff --git a/net/http/http_stream_factory_impl_unittest.cc b/net/http/http_stream_factory_impl_unittest.cc
index 4ac5467..beac733 100644
--- a/net/http/http_stream_factory_impl_unittest.cc
+++ b/net/http/http_stream_factory_impl_unittest.cc
@@ -403,16 +403,17 @@
nullptr, // ssl_histograms
host_resolver,
cert_verifier,
- nullptr, // channel_id_store
- nullptr, // transport_security_state
- nullptr, // cert_transparency_verifier
+ nullptr, // channel_id_store
+ nullptr, // transport_security_state
+ nullptr, // cert_transparency_verifier
+ nullptr, // cert_policy_enforcer
std::string(), // ssl_session_cache_shard
- nullptr, // deterministic_socket_factory
- nullptr, // transport_socket_pool
+ nullptr, // deterministic_socket_factory
+ nullptr, // transport_socket_pool
nullptr,
nullptr,
nullptr, // ssl_config_service
- false, // enable_ssl_connect_job_waiting
+ false, // enable_ssl_connect_job_waiting
nullptr), // net_log
last_num_streams_(-1) {
}
diff --git a/net/http/http_stream_parser.cc b/net/http/http_stream_parser.cc
index b998986..41b85df 100644
--- a/net/http/http_stream_parser.cc
+++ b/net/http/http_stream_parser.cc
@@ -25,7 +25,7 @@
namespace {
-const size_t kMaxMergedHeaderAndBodySize = 1400;
+const uint64 kMaxMergedHeaderAndBodySize = 1400;
const size_t kRequestBodyBufferSize = 1 << 14; // 16KB
std::string GetResponseHeaderLines(const HttpResponseHeaders& headers) {
@@ -59,12 +59,12 @@
return false;
}
-base::Value* NetLogSendRequestBodyCallback(int length,
+base::Value* NetLogSendRequestBodyCallback(uint64 length,
bool is_chunked,
bool did_merge,
NetLog::LogLevel /* log_level */) {
base::DictionaryValue* dict = new base::DictionaryValue();
- dict->SetInteger("length", length);
+ dict->SetInteger("length", static_cast<int>(length));
dict->SetBoolean("is_chunked", is_chunked);
dict->SetBoolean("did_merge", did_merge);
return dict;
@@ -253,8 +253,8 @@
// single write.
bool did_merge = false;
if (ShouldMergeRequestHeadersAndBody(request, request_->upload_data_stream)) {
- size_t merged_size =
- request_headers_length_ + request_->upload_data_stream->size();
+ int merged_size = static_cast<int>(
+ request_headers_length_ + request_->upload_data_stream->size());
scoped_refptr<IOBuffer> merged_request_headers_and_body(
new IOBuffer(merged_size));
// We'll repurpose |request_headers_| to store the merged headers and
@@ -265,10 +265,10 @@
memcpy(request_headers_->data(), request.data(), request_headers_length_);
request_headers_->DidConsume(request_headers_length_);
- size_t todo = request_->upload_data_stream->size();
+ uint64 todo = request_->upload_data_stream->size();
while (todo) {
- int consumed = request_->upload_data_stream
- ->Read(request_headers_.get(), todo, CompletionCallback());
+ int consumed = request_->upload_data_stream->Read(
+ request_headers_.get(), static_cast<int>(todo), CompletionCallback());
DCHECK_GT(consumed, 0); // Read() won't fail if not chunked.
request_headers_->DidConsume(consumed);
todo -= consumed;
@@ -1059,7 +1059,7 @@
// IsInMemory() ensures that the request body is not chunked.
request_body->IsInMemory() &&
request_body->size() > 0) {
- size_t merged_size = request_headers.size() + request_body->size();
+ uint64 merged_size = request_headers.size() + request_body->size();
if (merged_size <= kMaxMergedHeaderAndBodySize)
return true;
}
diff --git a/net/http/transport_security_state.cc b/net/http/transport_security_state.cc
index 6217d57..a2d377e 100644
--- a/net/http/transport_security_state.cc
+++ b/net/http/transport_security_state.cc
@@ -264,7 +264,7 @@
break;
for (size_t j = 0; j < label_length; ++j) {
- new_host[i + 1 + j] = tolower(new_host[i + 1 + j]);
+ new_host[i + 1 + j] = static_cast<char>(tolower(new_host[i + 1 + j]));
}
}
diff --git a/net/http/transport_security_state_static.h b/net/http/transport_security_state_static.h
index 1774a24..79fa777 100644
--- a/net/http/transport_security_state_static.h
+++ b/net/http/transport_security_state_static.h
@@ -710,1552 +710,1592 @@
// it's a pointer to the n'th element of the array.
static const uint8 kHSTSHuffmanTree[] = {
0xf0, 0xf7, 0x00, 0xec, 0x01, 0x80, 0xe7, 0xe1,
- 0xb3, 0xb1, 0x04, 0xf1, 0xb4, 0x05, 0x06, 0xfa,
- 0xf6, 0x07, 0xeb, 0x08, 0xed, 0x09, 0xae, 0xe3,
- 0x0a, 0x0b, 0x03, 0x0c, 0x02, 0x0d, 0xe2, 0xe8,
- 0x0f, 0xf3, 0xee, 0xf4, 0x10, 0x11, 0xff, 0x12,
- 0xad, 0xe6, 0x14, 0xf5, 0xb8, 0xb9, 0xb6, 0x16,
- 0xb7, 0x17, 0xb5, 0x18, 0xb0, 0x19, 0xb2, 0x1a,
- 0x1b, 0xea, 0xf8, 0x1c, 0x1d, 0xf9, 0xe4, 0x1e,
- 0x15, 0x1f, 0xe5, 0x20, 0xe9, 0xf2, 0xef, 0x22,
- 0x21, 0x23, 0x13, 0x24, 0x0e, 0x25,
+ 0xb9, 0xb6, 0x04, 0xb8, 0xb7, 0x05, 0xb5, 0x06,
+ 0x07, 0xf1, 0xb1, 0xb0, 0xb2, 0x09, 0x08, 0x0a,
+ 0x0b, 0xfa, 0xf6, 0x0c, 0xeb, 0x0d, 0xed, 0x0e,
+ 0xae, 0xe3, 0x0f, 0x10, 0x03, 0x11, 0x02, 0x12,
+ 0xe2, 0xe8, 0x14, 0xf3, 0x15, 0xe5, 0xff, 0x16,
+ 0xee, 0xf4, 0x18, 0xef, 0xb3, 0xb4, 0x1a, 0xea,
+ 0xf8, 0x1b, 0xad, 0x1c, 0x1d, 0xe4, 0xe6, 0xf9,
+ 0x1f, 0xf5, 0x1e, 0x20, 0xe9, 0xf2, 0x21, 0x22,
+ 0x19, 0x23, 0x17, 0x24, 0x13, 0x25,
};
static const uint8 kPreloadedHSTSData[] = {
- 0xfe, 0x76, 0x0a, 0x77, 0x21, 0xa2, 0x25, 0x9f,
- 0x0a, 0x77, 0x21, 0xa2, 0x2d, 0x9b, 0x29, 0x2a,
- 0x4a, 0x54, 0x80, 0x26, 0x94, 0x02, 0xd3, 0xfa,
- 0xf8, 0x20, 0x67, 0xaa, 0x53, 0x8d, 0x34, 0xfc,
- 0xfb, 0x79, 0xb6, 0x34, 0x74, 0x29, 0xf9, 0x72,
- 0x14, 0x9d, 0x89, 0x86, 0xee, 0x43, 0xb6, 0x7f,
- 0x3b, 0x05, 0x3b, 0x90, 0xd1, 0x51, 0x4f, 0xff,
- 0x5b, 0xd6, 0x76, 0x9c, 0xca, 0x36, 0x5c, 0xd8,
- 0xe9, 0xf0, 0xa7, 0x72, 0x1a, 0x2b, 0xd9, 0xf7,
- 0x9b, 0xd3, 0x5a, 0x0e, 0x93, 0xb0, 0xf7, 0x04,
- 0xc2, 0x7f, 0xe7, 0x73, 0xdd, 0x82, 0x9d, 0xc8,
- 0x68, 0x91, 0xa7, 0xff, 0x39, 0x9c, 0xf7, 0x60,
- 0xa7, 0x72, 0x1a, 0x27, 0x89, 0xff, 0xce, 0x67,
- 0x3d, 0xd8, 0x29, 0xdc, 0x86, 0x89, 0xfe, 0x7f,
- 0xf3, 0x99, 0xcf, 0x76, 0x0a, 0x77, 0x21, 0xa2,
- 0x86, 0x9f, 0xfc, 0xe6, 0x73, 0xdd, 0x82, 0x9d,
- 0xc8, 0x68, 0xa2, 0x27, 0xfd, 0xcf, 0x76, 0x0a,
- 0x77, 0x21, 0xa2, 0x91, 0x9f, 0xff, 0xb3, 0x6b,
- 0x2e, 0xf7, 0x5f, 0xfc, 0x0a, 0xd5, 0x40, 0x54,
- 0x9c, 0xc4, 0x51, 0xee, 0x23, 0x4f, 0xfc, 0xee,
- 0x7b, 0xb0, 0x53, 0xb9, 0x0d, 0x12, 0x84, 0x50,
- 0xba, 0x70, 0xf8, 0xd2, 0x10, 0xc7, 0x76, 0x76,
- 0x30, 0xaf, 0x61, 0x35, 0x93, 0x00, 0xa4, 0xdd,
- 0xa9, 0x55, 0x4b, 0x58, 0x7a, 0xb7, 0x96, 0x4f,
- 0xfe, 0x73, 0x39, 0xee, 0xc1, 0x4e, 0xe4, 0x34,
- 0x4e, 0x73, 0xff, 0x9c, 0xce, 0x7b, 0xb0, 0x53,
- 0xb9, 0x0d, 0x14, 0x4c, 0xff, 0xc2, 0xf7, 0x5b,
+ 0xfe, 0x75, 0x8a, 0x6e, 0xa1, 0xa2, 0x25, 0x9f,
+ 0x0a, 0x6e, 0xa1, 0xa2, 0x2d, 0x9a, 0xe9, 0x2a,
+ 0x4a, 0x54, 0x80, 0x26, 0x94, 0x02, 0xd3, 0xfb,
+ 0x36, 0x20, 0x67, 0xaa, 0x53, 0x8d, 0x34, 0xfc,
+ 0xfc, 0x79, 0xb5, 0xb4, 0x74, 0x29, 0xf9, 0x6a,
+ 0x14, 0x9d, 0x69, 0x86, 0xf1, 0x43, 0xb6, 0x7f,
+ 0x3a, 0xc5, 0x37, 0x50, 0xd1, 0x51, 0x4f, 0xff,
+ 0x63, 0xd8, 0x77, 0x4b, 0xba, 0x39, 0x5b, 0xe4,
+ 0xe9, 0xf0, 0xa6, 0xea, 0x1a, 0x2b, 0xd9, 0xf7,
+ 0x9b, 0xd3, 0xba, 0x0e, 0x93, 0xac, 0xf7, 0x04,
+ 0xc2, 0x7f, 0xe7, 0x6b, 0xdd, 0x62, 0x9b, 0xa8,
+ 0x68, 0x91, 0xa7, 0xff, 0x39, 0x9a, 0xf7, 0x58,
+ 0xa6, 0xea, 0x1a, 0x27, 0x89, 0xff, 0xce, 0x66,
+ 0xbd, 0xd6, 0x29, 0xba, 0x86, 0x89, 0xfe, 0x7f,
+ 0xf3, 0x99, 0xaf, 0x75, 0x8a, 0x6e, 0xa1, 0xa2,
+ 0x86, 0x9f, 0xfc, 0xe6, 0x6b, 0xdd, 0x62, 0x9b,
+ 0xa8, 0x68, 0xa2, 0x27, 0xfd, 0xaf, 0x75, 0x8a,
+ 0x6e, 0xa1, 0xa2, 0x91, 0x9f, 0xff, 0xaf, 0x9c,
+ 0x2f, 0x57, 0x67, 0xfa, 0x0a, 0xd5, 0x40, 0x54,
+ 0x9c, 0xc4, 0x51, 0xf1, 0x23, 0x4f, 0xfc, 0xed,
+ 0x7b, 0xac, 0x53, 0x75, 0x0d, 0x12, 0x84, 0x50,
+ 0xba, 0x70, 0xf8, 0xd2, 0x10, 0xc7, 0x8e, 0x76,
+ 0x30, 0xaf, 0x61, 0x36, 0x13, 0x00, 0xa4, 0xdc,
+ 0xa9, 0x55, 0x4b, 0xb8, 0x7a, 0xb7, 0x96, 0x4f,
+ 0xfe, 0x73, 0x35, 0xee, 0xb1, 0x4d, 0xd4, 0x34,
+ 0x4e, 0x73, 0xff, 0x9c, 0xcd, 0x7b, 0xac, 0x53,
+ 0x75, 0x0d, 0x14, 0x4c, 0xff, 0xc2, 0xf7, 0x63,
0xd5, 0x69, 0xfe, 0x01, 0xd0, 0x28, 0xea, 0xaa,
- 0x96, 0xaa, 0x53, 0xf9, 0xd8, 0x29, 0xdc, 0x86,
- 0x88, 0x72, 0x7c, 0x29, 0xdc, 0x86, 0x88, 0xbe,
- 0x7d, 0xd7, 0x7a, 0xe9, 0x2a, 0x4e, 0xc3, 0xd8,
- 0xf9, 0x84, 0xff, 0xe7, 0x33, 0x9e, 0xec, 0x14,
- 0xee, 0x43, 0x44, 0xc9, 0x3f, 0x9d, 0x82, 0x9d,
- 0xc8, 0x68, 0xb7, 0xa7, 0xff, 0x39, 0x9c, 0xf7,
- 0x60, 0xa7, 0x72, 0x1a, 0x29, 0x38, 0x54, 0xe6,
- 0x5f, 0x09, 0x3c, 0x27, 0xaa, 0x93, 0x63, 0xb9,
- 0xfc, 0xec, 0x14, 0xee, 0x43, 0x44, 0x3b, 0x3f,
- 0xf9, 0xcc, 0xe7, 0xbb, 0x05, 0x3b, 0x90, 0xd1,
- 0x2c, 0x4f, 0xe7, 0x60, 0xa7, 0x72, 0x1a, 0x23,
- 0x09, 0xf0, 0xa7, 0x72, 0x1a, 0x23, 0xd9, 0xea,
- 0xf5, 0x2d, 0x8e, 0x9e, 0x77, 0x3d, 0xd8, 0x7a,
- 0x97, 0x30, 0x9f, 0xce, 0xc1, 0x4e, 0xe4, 0x34,
- 0x58, 0x73, 0xf9, 0xd8, 0x29, 0xdc, 0x86, 0x8b,
+ 0x97, 0x6a, 0x53, 0xf9, 0xd6, 0x29, 0xba, 0x86,
+ 0x88, 0x72, 0x7c, 0x29, 0xba, 0x86, 0x88, 0xbe,
+ 0x7d, 0xb9, 0x7a, 0xf4, 0x2a, 0x4e, 0xb3, 0xd8,
+ 0xf9, 0x84, 0xff, 0xe7, 0x33, 0x5e, 0xeb, 0x14,
+ 0xdd, 0x43, 0x44, 0xc9, 0x3f, 0x9d, 0x62, 0x9b,
+ 0xa8, 0x68, 0xb7, 0xa7, 0xff, 0x39, 0x9a, 0xf7,
+ 0x58, 0xa6, 0xea, 0x1a, 0x29, 0x38, 0x54, 0xe6,
+ 0x5f, 0x09, 0x3b, 0x27, 0xaa, 0x93, 0x63, 0xb9,
+ 0xfc, 0xeb, 0x14, 0xdd, 0x43, 0x44, 0x3b, 0x3f,
+ 0xf9, 0xcc, 0xd7, 0xba, 0xc5, 0x37, 0x50, 0xd1,
+ 0x2c, 0x4f, 0xe7, 0x58, 0xa6, 0xea, 0x1a, 0x23,
+ 0x09, 0xf0, 0xa6, 0xea, 0x1a, 0x23, 0xd9, 0xea,
+ 0xed, 0x2d, 0x8e, 0x9e, 0x76, 0xbd, 0xd6, 0x7a,
+ 0x99, 0x30, 0x9f, 0xce, 0xb1, 0x4d, 0xd4, 0x34,
+ 0x58, 0x73, 0xf9, 0xd6, 0x29, 0xba, 0x86, 0x8b,
0x9e, 0x15, 0x3c, 0xaa, 0x0e, 0xde, 0xa5, 0xe8,
- 0x47, 0xb0, 0xe2, 0xe7, 0x73, 0xf9, 0xd8, 0x29,
- 0xdc, 0x86, 0x88, 0x7a, 0x7c, 0x29, 0xdc, 0x86,
- 0x88, 0x9a, 0x6b, 0xb0, 0xe9, 0xff, 0xd9, 0x6d,
- 0xf4, 0x55, 0x7d, 0x4d, 0xd5, 0x87, 0x45, 0x27,
- 0xc7, 0x61, 0x69, 0xeb, 0xeb, 0xdb, 0xcd, 0x10,
- 0xbc, 0x9d, 0x88, 0xe7, 0xac, 0x24, 0xf5, 0x23,
- 0x9e, 0xbd, 0xbd, 0x73, 0xa7, 0xff, 0x79, 0xa7,
- 0xe5, 0x2f, 0xd0, 0xce, 0xef, 0x9d, 0x37, 0x37,
- 0x9d, 0x2d, 0xd3, 0x11, 0x0f, 0x62, 0x2e, 0x4d,
- 0x9f, 0x5b, 0xaf, 0xcf, 0x3a, 0x7b, 0xd5, 0xf0,
- 0x0e, 0x9c, 0x10, 0x84, 0xa9, 0xf7, 0x7e, 0xf6,
- 0xc2, 0x9c, 0x5e, 0x4f, 0xba, 0xed, 0x65, 0xce,
- 0x8d, 0x91, 0x34, 0x03, 0xef, 0x9a, 0xcf, 0xfc,
- 0x0f, 0x35, 0xa2, 0xcb, 0xe1, 0xd7, 0x76, 0x74,
- 0xff, 0xbd, 0xa5, 0x7e, 0xb5, 0x5f, 0x30, 0xe9,
- 0xfb, 0x1b, 0x6a, 0xfc, 0xa9, 0xd3, 0xd9, 0xb6,
- 0x50, 0x74, 0x62, 0x79, 0xbe, 0x86, 0x03, 0x46,
- 0x36, 0x4c, 0xf9, 0xfd, 0xcb, 0xe7, 0xec, 0x0a,
- 0xe6, 0xde, 0x3a, 0x7f, 0xff, 0xf7, 0xff, 0x4a,
- 0xe9, 0xfe, 0x6d, 0x6f, 0x35, 0xa2, 0xb9, 0x4b,
- 0xc7, 0x02, 0x74, 0xfb, 0xd7, 0xd5, 0x68, 0x3a,
- 0x7f, 0x52, 0xfa, 0xe9, 0xd5, 0x69, 0x3a, 0x7f,
- 0x70, 0x75, 0x69, 0x6f, 0xc7, 0x47, 0x8f, 0xaf,
- 0xe7, 0x10, 0xa9, 0x9a, 0xe3, 0xf8, 0xc2, 0x52,
- 0x6d, 0x5e, 0x74, 0xee, 0xbd, 0x4e, 0x9b, 0x5a,
- 0x0e, 0x9e, 0x5f, 0xdd, 0xa7, 0x9b, 0x31, 0x1b,
- 0x9f, 0xff, 0x6a, 0xb7, 0xd1, 0xfd, 0x5b, 0xf4,
- 0x65, 0xf7, 0x32, 0xe7, 0x4f, 0xfd, 0x65, 0xd3,
- 0xa2, 0xff, 0xeb, 0xad, 0xce, 0x9f, 0xda, 0x29,
- 0x7f, 0xad, 0xab, 0x0e, 0x80, 0x1f, 0xff, 0xd1,
- 0xe7, 0xfc, 0x2d, 0x68, 0xaa, 0xfa, 0x8e, 0xb9,
- 0xd0, 0xa7, 0xc7, 0xa9, 0x14, 0xff, 0xff, 0xf6,
- 0xbf, 0xa8, 0xfd, 0x5a, 0xd1, 0xbe, 0xfe, 0x7e,
- 0x53, 0x7c, 0x6d, 0xfc, 0xa9, 0xd2, 0x53, 0xa7,
- 0xf3, 0xf8, 0x7d, 0x55, 0xa4, 0xe9, 0xff, 0xff,
- 0xfd, 0xe0, 0x57, 0xf9, 0xd4, 0xe8, 0xda, 0xda,
- 0xe8, 0xfe, 0x52, 0xfc, 0xd6, 0x8f, 0xe7, 0x52,
- 0x74, 0xee, 0xe4, 0x34, 0x53, 0x11, 0x88, 0xbf,
- 0x48, 0x4c, 0xcf, 0xfb, 0x3f, 0x4b, 0xeb, 0x75,
- 0x16, 0x8e, 0x9f, 0x53, 0xfc, 0x6d, 0x87, 0x47,
- 0x8f, 0xa3, 0x8f, 0xe7, 0xfb, 0x99, 0xb5, 0x96,
- 0x8c, 0x09, 0xd3, 0xff, 0xfb, 0xf8, 0x97, 0xba,
- 0xde, 0xad, 0x7f, 0x03, 0xa1, 0x5b, 0xa9, 0xd3,
- 0xfe, 0x45, 0x65, 0xb2, 0xb9, 0xef, 0x9d, 0x0a,
- 0x8a, 0x4b, 0x34, 0x4f, 0x85, 0x5b, 0x28, 0x9d,
- 0x3f, 0x77, 0xf4, 0x6c, 0xbf, 0x3a, 0x30, 0xfd,
- 0xfc, 0x45, 0xa9, 0x34, 0x50, 0xbb, 0x3f, 0xb2,
- 0x56, 0x93, 0x84, 0x8d, 0x0e, 0x92, 0x2f, 0x42,
- 0x19, 0xa0, 0xf1, 0x87, 0x8b, 0x21, 0x1d, 0xf2,
- 0x1b, 0xc6, 0xa9, 0x3f, 0xed, 0x23, 0xc1, 0xd1,
- 0xdb, 0x75, 0x07, 0x4f, 0x67, 0xf4, 0xee, 0xce,
- 0x9f, 0xff, 0xff, 0x5b, 0xd7, 0xb6, 0x0a, 0xb6,
- 0xd0, 0xcd, 0x5b, 0xf4, 0x65, 0x2f, 0xcd, 0x7e,
- 0x0a, 0x9d, 0x2b, 0xf9, 0x16, 0xd5, 0x27, 0x9f,
- 0xff, 0x66, 0x5b, 0xc9, 0x6c, 0xd1, 0x5d, 0x6c,
- 0xbb, 0xb3, 0xa7, 0xff, 0xaf, 0x6c, 0x06, 0x86,
- 0x2e, 0x5f, 0x6c, 0xf9, 0xd3, 0xfd, 0x4e, 0x86,
- 0x2e, 0x7e, 0xfb, 0x87, 0x4a, 0xb8, 0x88, 0xfe,
- 0x51, 0x97, 0xbe, 0x98, 0x85, 0xe1, 0xd3, 0x3e,
- 0x7a, 0xd2, 0xfa, 0x9d, 0x3f, 0xff, 0xff, 0xec,
- 0xfe, 0x9d, 0x1e, 0xb6, 0xae, 0x6b, 0xd7, 0x56,
- 0x7f, 0xb4, 0xdb, 0xce, 0xcb, 0x52, 0x05, 0xd8,
- 0xa9, 0xff, 0xff, 0x93, 0xc1, 0xdb, 0x51, 0xd1,
- 0xaa, 0xd1, 0x54, 0xb6, 0xb6, 0xa7, 0x82, 0x74,
- 0xda, 0xd1, 0x4a, 0x68, 0xde, 0x28, 0xac, 0x29,
- 0x61, 0x55, 0x79, 0xda, 0x33, 0x9f, 0xc6, 0xeb,
- 0x3f, 0xf9, 0x89, 0xa2, 0xdc, 0xfc, 0x67, 0x7c,
- 0x07, 0x4f, 0xff, 0xbd, 0xfb, 0xdb, 0x1b, 0xee,
- 0xd6, 0x6e, 0xfb, 0xe0, 0x3a, 0x7f, 0xe5, 0xfd,
- 0x1f, 0xc6, 0xd5, 0xd5, 0x69, 0x3a, 0x2a, 0x8a,
- 0x5d, 0x57, 0x67, 0xb2, 0xf8, 0xdd, 0x9d, 0x3b,
- 0x73, 0x2c, 0x74, 0xd9, 0xb1, 0xd1, 0x42, 0x6d,
- 0x8f, 0x87, 0x7d, 0x49, 0x2e, 0x4a, 0xd8, 0x7a,
- 0x7e, 0xd9, 0x7f, 0x6e, 0x79, 0xd3, 0x97, 0x65,
- 0x3a, 0x7f, 0x34, 0xfc, 0xbd, 0x79, 0xad, 0x07,
- 0x90, 0xc2, 0xd9, 0xf9, 0xbe, 0xdd, 0xbb, 0x50,
- 0x1d, 0x3f, 0x85, 0xaf, 0xe5, 0xba, 0xe7, 0x46,
- 0x1f, 0x2f, 0x8c, 0xe7, 0xe5, 0x06, 0x5f, 0x7d,
- 0x07, 0x43, 0xcf, 0x43, 0xe4, 0x33, 0xff, 0xfe,
- 0xbf, 0xf8, 0x15, 0xa3, 0x3d, 0xfb, 0xff, 0x1b,
- 0x68, 0xa8, 0x7e, 0x74, 0xff, 0xbd, 0x8d, 0x68,
- 0xaa, 0xdb, 0xb7, 0x67, 0x4f, 0xee, 0xa6, 0xb6,
- 0xce, 0x13, 0xa3, 0x63, 0xf5, 0xba, 0x24, 0x98,
- 0x74, 0xef, 0xe6, 0xc7, 0x42, 0x9a, 0xca, 0x44,
- 0x27, 0xea, 0x6b, 0x99, 0xfd, 0x27, 0x4f, 0x33,
- 0x7a, 0x80, 0xe8, 0xc3, 0xd2, 0xf1, 0x7c, 0x2a,
- 0x79, 0x59, 0x0e, 0x7f, 0x27, 0x8b, 0x9c, 0xfe,
- 0xbf, 0xa8, 0xcb, 0x6b, 0x73, 0xa7, 0xb2, 0x95,
- 0x68, 0xe9, 0xfa, 0xdc, 0xf6, 0x0f, 0x8e, 0x9f,
- 0x78, 0x03, 0x94, 0x9d, 0x1a, 0x51, 0x55, 0xe3,
- 0x50, 0x11, 0x6a, 0x59, 0x3f, 0xff, 0x0b, 0xed,
- 0x8d, 0x59, 0x7f, 0xa7, 0xf9, 0x7b, 0x6a, 0x74,
- 0xff, 0xfe, 0xf6, 0x52, 0xfa, 0xde, 0xca, 0xc5,
- 0xf6, 0xda, 0x15, 0xba, 0x9d, 0x3f, 0xff, 0xfe,
- 0xd7, 0xfa, 0x03, 0xd4, 0xbc, 0x78, 0x1a, 0x2b,
- 0xaa, 0xd3, 0x6c, 0xf7, 0xf3, 0x49, 0xd3, 0xff,
- 0xed, 0x44, 0x72, 0xf5, 0xb7, 0xb3, 0x45, 0x80,
- 0xa7, 0x46, 0x23, 0x8a, 0xd0, 0x8c, 0x9f, 0xfe,
- 0x7b, 0x7d, 0xb1, 0x7e, 0xd7, 0xf2, 0xf5, 0xe3,
- 0xa7, 0xff, 0xdb, 0x63, 0x34, 0x37, 0xdd, 0x6a,
- 0xd3, 0xf8, 0x68, 0x3a, 0x7f, 0xb3, 0xf4, 0x68,
- 0x07, 0x73, 0x47, 0x4f, 0xfa, 0xba, 0xff, 0x45,
- 0x75, 0xdc, 0xd4, 0x4e, 0x9f, 0xfd, 0x46, 0x8a,
- 0xdb, 0x5d, 0x17, 0xad, 0x54, 0x4e, 0x9f, 0xff,
- 0xf6, 0x53, 0x5f, 0x60, 0x74, 0x5b, 0x2f, 0x5c,
- 0xa3, 0x46, 0x7b, 0x63, 0xa3, 0x11, 0x85, 0xe5,
- 0x08, 0xa1, 0x5c, 0x3a, 0x46, 0x99, 0x49, 0x3f,
- 0x94, 0x98, 0xb9, 0x53, 0xbb, 0xc6, 0x13, 0x3f,
- 0xee, 0x1b, 0x65, 0xd7, 0xfe, 0x01, 0xd3, 0xfd,
- 0x81, 0xa5, 0xf5, 0xd1, 0x7f, 0x1d, 0x3f, 0xff,
- 0xe5, 0x45, 0x66, 0x86, 0xad, 0xef, 0xed, 0xa3,
- 0x7a, 0x7f, 0x2d, 0x87, 0x42, 0x23, 0xab, 0xe7,
- 0x8d, 0xe7, 0x93, 0xde, 0xbf, 0x94, 0xe9, 0xff,
- 0xff, 0xfa, 0xea, 0xcf, 0xfb, 0x4d, 0xb9, 0xad,
- 0x1f, 0xd5, 0xbf, 0x46, 0x52, 0xfc, 0xd7, 0xe0,
- 0xa9, 0xd0, 0xf4, 0x5c, 0x78, 0x86, 0x15, 0x79,
- 0x3f, 0x25, 0xf2, 0xfa, 0x35, 0xde, 0x87, 0x54,
- 0xf5, 0xeb, 0xc0, 0x3a, 0x7f, 0xeb, 0x7b, 0x47,
- 0x87, 0x5a, 0x38, 0x50, 0xe9, 0xef, 0x5b, 0xa8,
- 0x3a, 0x7e, 0xbf, 0x0f, 0xe9, 0xf1, 0xd1, 0x88,
- 0xb6, 0xd2, 0x42, 0x88, 0xd7, 0x22, 0x9e, 0xdf,
- 0xaf, 0x54, 0xe9, 0xff, 0xfb, 0xc3, 0xa3, 0x3d,
- 0x9f, 0xd3, 0x6f, 0x63, 0x31, 0x0e, 0x9f, 0xff,
- 0xef, 0x50, 0x2a, 0xca, 0xea, 0xba, 0x14, 0x57,
- 0x6b, 0x2b, 0x0e, 0x8c, 0x46, 0x20, 0xae, 0x4f,
- 0xff, 0xfe, 0x11, 0xf5, 0x1a, 0x2d, 0x97, 0xfa,
- 0xb5, 0x6c, 0xa1, 0x69, 0xbe, 0xa8, 0x74, 0xff,
- 0xff, 0xcb, 0xa6, 0xcb, 0xa3, 0xf9, 0xae, 0x9d,
- 0x14, 0xbe, 0xbe, 0xfe, 0xf5, 0xa0, 0xe9, 0xf5,
- 0x35, 0xf6, 0x7c, 0xe8, 0xc4, 0x53, 0xea, 0xff,
- 0x1e, 0x4d, 0x1a, 0xd1, 0x91, 0xcf, 0xfc, 0xfa,
- 0xfb, 0x4d, 0x97, 0xd4, 0x2e, 0x93, 0xa7, 0xfb,
- 0xfa, 0xb5, 0xfc, 0xb7, 0x5c, 0xe9, 0xfe, 0xda,
- 0xca, 0x1d, 0xad, 0xcc, 0x3a, 0x7f, 0xff, 0xb8,
- 0x6d, 0x97, 0xf6, 0x7e, 0x8a, 0xae, 0x7f, 0x6b,
- 0x29, 0xd3, 0xd7, 0xd1, 0x40, 0x9d, 0x14, 0xa2,
- 0x27, 0x99, 0x67, 0xe6, 0xa9, 0x7e, 0xab, 0x73,
- 0xa7, 0xfa, 0xdc, 0xcf, 0xe5, 0xba, 0xe7, 0x42,
- 0x9f, 0x3d, 0x4c, 0x27, 0xec, 0xb8, 0x8e, 0x3c,
- 0xe9, 0xfb, 0xf9, 0x6f, 0xe2, 0x1d, 0x3d, 0xfc,
- 0xae, 0x86, 0x8f, 0x56, 0xe5, 0x51, 0xb2, 0xe0,
- 0x9a, 0x46, 0xcf, 0x49, 0x57, 0x92, 0x44, 0xea,
- 0xd0, 0xc3, 0xbc, 0x22, 0x9b, 0x3b, 0x4f, 0xfd,
- 0xff, 0xe6, 0x81, 0xcb, 0x7f, 0x1a, 0x3a, 0x15,
- 0x77, 0x1b, 0x27, 0x3e, 0xfa, 0x10, 0xd3, 0xef,
- 0xab, 0x3b, 0x63, 0xa7, 0xf6, 0x35, 0x6c, 0xba,
- 0xec, 0x74, 0xff, 0xff, 0xf5, 0xb2, 0xf5, 0xe6,
- 0xb4, 0x7f, 0x29, 0x7e, 0x6b, 0x47, 0xf3, 0x6b,
- 0x79, 0xa3, 0xa6, 0xd7, 0x49, 0xd0, 0x28, 0x9e,
- 0xbc, 0x21, 0x67, 0xec, 0xa3, 0xf9, 0x4d, 0x4e,
- 0x9f, 0xfc, 0x34, 0xbe, 0xb8, 0xca, 0x56, 0xd6,
- 0x53, 0xa5, 0x53, 0xa3, 0x53, 0xda, 0xde, 0x95,
- 0x3f, 0x95, 0x9f, 0xcb, 0x75, 0xce, 0x9f, 0xff,
- 0xf5, 0xfe, 0xa0, 0xa5, 0xf5, 0xd5, 0x6f, 0xfc,
- 0xdb, 0xd8, 0x2d, 0x1d, 0x1e, 0x54, 0xd8, 0xd1,
- 0x3f, 0x43, 0x47, 0xe4, 0xf5, 0x84, 0x46, 0xa4,
- 0xbb, 0xcc, 0x67, 0xcf, 0xf0, 0xe5, 0x27, 0x4f,
- 0xb2, 0xb4, 0x60, 0x4e, 0x8a, 0x4f, 0x3a, 0xc4,
- 0xf3, 0xff, 0xef, 0x51, 0x89, 0xb5, 0xbd, 0x9a,
- 0x74, 0x69, 0xd5, 0x4e, 0x9e, 0x6f, 0xbe, 0x58,
- 0xe9, 0xff, 0xff, 0x9b, 0xe9, 0x7f, 0x53, 0xa3,
- 0xfa, 0xb7, 0xe8, 0xca, 0x5f, 0x9a, 0xfc, 0x15,
- 0x3a, 0x28, 0x45, 0x36, 0x12, 0x4f, 0xff, 0xff,
- 0x96, 0x9a, 0xea, 0xb4, 0xe8, 0xb6, 0x6d, 0xa3,
- 0xf9, 0xae, 0x9d, 0x15, 0x00, 0x3d, 0x73, 0xa7,
- 0xcb, 0xfa, 0x7a, 0x83, 0xa7, 0xff, 0xff, 0xff,
- 0x63, 0x31, 0x16, 0xca, 0xcb, 0xe5, 0x6a, 0xa2,
- 0x2b, 0xfc, 0xa3, 0x35, 0xae, 0xad, 0x7d, 0x58,
- 0x74, 0xff, 0x03, 0x36, 0xfe, 0x5b, 0xae, 0x74,
- 0xfe, 0xa3, 0x55, 0xbb, 0x3d, 0x73, 0xa7, 0xfc,
- 0xba, 0x5b, 0xf5, 0xcf, 0xb5, 0xbd, 0x87, 0x46,
- 0x1f, 0xe5, 0x26, 0xb3, 0xff, 0xd9, 0x7d, 0xb3,
- 0x01, 0x5d, 0x03, 0x5d, 0xaa, 0x74, 0xf5, 0x1e,
- 0xfd, 0xce, 0x85, 0x57, 0xe1, 0x84, 0x7e, 0x8c,
- 0x0c, 0x48, 0xd9, 0x09, 0x1b, 0x14, 0x74, 0x28,
- 0xff, 0x0b, 0x4a, 0x91, 0x6a, 0xa5, 0x3b, 0x6d,
- 0x0d, 0x1d, 0x3f, 0xfd, 0x4b, 0xfe, 0xba, 0x19,
- 0xf5, 0xd3, 0x7f, 0x50, 0x74, 0x61, 0xfb, 0x78,
- 0x82, 0x7e, 0xa1, 0xa7, 0xb7, 0x06, 0x83, 0xa7,
- 0xcc, 0xf6, 0xd9, 0xb1, 0xd2, 0x68, 0xe9, 0x95,
- 0x87, 0x4a, 0xe7, 0x40, 0x9a, 0x5e, 0x15, 0x8d,
- 0x8f, 0x56, 0xc6, 0xd3, 0xd7, 0xaf, 0x52, 0x74,
- 0xcd, 0x71, 0xd3, 0xfa, 0xde, 0x1a, 0x5f, 0xf5,
- 0x3a, 0x37, 0x52, 0x68, 0x0a, 0x69, 0x8f, 0xde,
- 0x23, 0x61, 0x16, 0xa2, 0xd3, 0xfa, 0xbe, 0xa4,
- 0x3d, 0xf0, 0x1d, 0x3f, 0xfe, 0x51, 0x54, 0xc6,
- 0x2a, 0x3f, 0xd5, 0xd5, 0x87, 0x43, 0x48, 0x86,
- 0xdc, 0x34, 0x9d, 0xfe, 0x61, 0xd3, 0x01, 0x4e,
- 0x8f, 0x1b, 0x0f, 0x8d, 0xc9, 0xcd, 0xc7, 0x5a,
- 0x34, 0xb2, 0x81, 0xa8, 0x5d, 0xda, 0x36, 0x1c,
- 0x9d, 0xd2, 0xd3, 0x0b, 0xa4, 0x97, 0xd7, 0x4c,
- 0x75, 0x3e, 0x84, 0xdb, 0x51, 0x81, 0x8c, 0x7d,
- 0x8c, 0x87, 0x55, 0xa7, 0xa3, 0xfa, 0x30, 0x5f,
- 0xcf, 0x01, 0xd6, 0x55, 0x4d, 0xe7, 0x2c, 0x5b,
- 0x46, 0x2b, 0xb9, 0x1b, 0x0e, 0xf8, 0x71, 0xb7,
- 0xab, 0xcf, 0xe7, 0x60, 0xa7, 0x72, 0x1a, 0x29,
- 0xd9, 0xf0, 0xa7, 0x72, 0x1a, 0x2a, 0x39, 0xff,
- 0x73, 0xdd, 0x82, 0x9d, 0xc8, 0x68, 0x9a, 0x24,
- 0xec, 0x3f, 0x66, 0x18, 0x4f, 0xe7, 0x60, 0xa7,
- 0x72, 0x1a, 0x2a, 0xf9, 0xf0, 0xa7, 0x72, 0x1a,
- 0x2b, 0x69, 0xfe, 0x7b, 0xb0, 0x53, 0xb9, 0x0d,
- 0x12, 0x0c, 0x9d, 0x87, 0xe3, 0xc6, 0x13, 0xff,
- 0x3b, 0x9e, 0xec, 0x14, 0xee, 0x43, 0x44, 0x87,
- 0x3e, 0x14, 0xee, 0x43, 0x45, 0x89, 0x3e, 0xc1,
- 0x5f, 0xe9, 0x3a, 0x7f, 0x59, 0x77, 0xee, 0x60,
- 0xa9, 0xd3, 0xff, 0x2e, 0x57, 0x3f, 0xb7, 0x80,
- 0xbf, 0x3a, 0x77, 0xd6, 0x83, 0xa4, 0xff, 0x9e,
- 0xfe, 0xa8, 0x73, 0xb7, 0x3c, 0x03, 0xa7, 0x0a,
- 0xbc, 0xe9, 0xfd, 0x82, 0xf0, 0x66, 0x34, 0x74,
- 0xfb, 0x9f, 0xbe, 0xca, 0x74, 0xfd, 0x5a, 0x8f,
- 0x83, 0xbb, 0x3a, 0x15, 0x11, 0x5e, 0x31, 0xe2,
- 0x89, 0xff, 0xe7, 0xab, 0x15, 0xfb, 0x7d, 0x6d,
- 0xd8, 0x27, 0x4f, 0xe4, 0xfe, 0x36, 0xfe, 0x54,
- 0xe8, 0xa5, 0x10, 0x16, 0x4d, 0x9f, 0xc0, 0x5c,
- 0xbf, 0xbe, 0x12, 0xa3, 0x15, 0x6d, 0xe9, 0x30,
- 0x42, 0x7a, 0x61, 0x29, 0xe2, 0x91, 0x1f, 0xb4,
- 0x29, 0x3a, 0x15, 0xc0, 0x24, 0x9f, 0xfa, 0xde,
- 0x5b, 0xdb, 0xb4, 0xe7, 0xc0, 0x74, 0xff, 0xf6,
- 0x52, 0xfb, 0xeb, 0x43, 0xad, 0xcc, 0xf5, 0x4e,
- 0x9a, 0xce, 0xc4, 0x4c, 0x7d, 0x16, 0x1c, 0x9a,
- 0xa2, 0xc6, 0x4d, 0x3f, 0x9d, 0x82, 0x9d, 0xc8,
- 0x68, 0xb3, 0x67, 0xff, 0x39, 0x9c, 0xf7, 0x60,
- 0xa7, 0x72, 0x1a, 0x28, 0x09, 0xfd, 0xfc, 0xb8,
- 0x37, 0xfd, 0xa3, 0xa6, 0xd1, 0x53, 0xa7, 0x93,
- 0xb9, 0x0d, 0x16, 0xfc, 0xfd, 0xbe, 0xfc, 0x9c,
- 0x27, 0x40, 0x9e, 0xb8, 0x0a, 0xe7, 0xd7, 0x7d,
- 0x77, 0xd4, 0xe9, 0xfc, 0xad, 0xb7, 0xdf, 0xea,
- 0x03, 0xa7, 0xbb, 0xdf, 0xb9, 0xd3, 0xfb, 0x5a,
- 0x6a, 0xa9, 0x8c, 0x3a, 0x7a, 0xda, 0x76, 0x61,
- 0xd3, 0x63, 0xce, 0x8c, 0x37, 0x5f, 0x25, 0x93,
- 0x95, 0x3d, 0x47, 0x9b, 0x63, 0x78, 0x90, 0xd8,
- 0xa8, 0x06, 0xdf, 0x21, 0xbb, 0x6c, 0xff, 0xb9,
- 0xee, 0xc1, 0x4e, 0xe4, 0x34, 0x52, 0x93, 0xfc,
- 0xf7, 0x60, 0xa7, 0x72, 0x1a, 0x24, 0xe9, 0x39,
- 0x88, 0x87, 0xe4, 0x68, 0x57, 0x74, 0xf3, 0x44,
- 0x64, 0x5b, 0x5a, 0xdd, 0xcc, 0x8e, 0xa1, 0x21,
- 0x63, 0xe2, 0x7d, 0xdc, 0x2b, 0x1a, 0x26, 0x64,
- 0xe3, 0xdd, 0x8a, 0x40, 0x77, 0x59, 0x44, 0xcd,
- 0xa1, 0xf9, 0x3e, 0x14, 0xee, 0x43, 0x44, 0x3f,
- 0x3f, 0xee, 0x7b, 0xb0, 0x53, 0xb9, 0x0d, 0x12,
- 0x9c, 0x9d, 0x87, 0xec, 0xc3, 0x09, 0xfc, 0xec,
- 0x14, 0xee, 0x43, 0x44, 0x4f, 0x3f, 0x9d, 0x82,
- 0x9d, 0xc8, 0x68, 0x8c, 0x67, 0xff, 0x39, 0x9c,
- 0xf7, 0x60, 0xa7, 0x72, 0x1a, 0x27, 0x98, 0x54,
- 0x77, 0xd0, 0x4e, 0xf3, 0xbb, 0x1d, 0xcf, 0x85,
- 0x3b, 0x90, 0xd1, 0x10, 0x4f, 0xfb, 0x9e, 0xec,
- 0x14, 0xee, 0x43, 0x44, 0xa9, 0x27, 0x61, 0xfb,
- 0x30, 0xc2, 0x7f, 0x3b, 0x05, 0x3b, 0x90, 0xd1,
- 0x14, 0x4f, 0xe7, 0x60, 0xa7, 0x72, 0x1a, 0x23,
- 0x29, 0xff, 0xce, 0x67, 0x3d, 0xd8, 0x29, 0xdc,
- 0x86, 0x89, 0x96, 0x7f, 0x3b, 0x05, 0x3b, 0x90,
- 0xd1, 0x52, 0x4f, 0xe7, 0x60, 0xa7, 0x72, 0x1a,
- 0x2b, 0xa9, 0xfc, 0xec, 0x14, 0xee, 0x43, 0x45,
- 0x8b, 0x3f, 0xf3, 0x39, 0xee, 0xc1, 0x4e, 0xe4,
- 0x34, 0x4f, 0x53, 0xfc, 0x17, 0x72, 0xfb, 0x73,
- 0xcd, 0xe7, 0x43, 0x91, 0x14, 0xa9, 0x93, 0xf6,
- 0xeb, 0xb2, 0xfe, 0xd6, 0xa7, 0x4f, 0x0b, 0x2f,
- 0x49, 0xd3, 0x93, 0x2c, 0x54, 0xff, 0xfd, 0x6f,
- 0xf6, 0x9f, 0x0a, 0xbd, 0xf9, 0x50, 0x01, 0x4e,
- 0x9f, 0xff, 0x87, 0xcd, 0xfc, 0xc7, 0x28, 0x8f,
- 0x9b, 0xd3, 0x5a, 0x0e, 0x9f, 0x27, 0xad, 0xbd,
- 0x87, 0x4f, 0xfe, 0xea, 0xff, 0x00, 0xeb, 0x79,
- 0x38, 0x4e, 0x9f, 0x5e, 0xca, 0xc4, 0x3a, 0x7f,
- 0xf7, 0xf4, 0x2a, 0xfd, 0x59, 0xa3, 0x45, 0xb7,
- 0x0e, 0x9b, 0xa9, 0x3a, 0x7f, 0x75, 0x7a, 0xda,
- 0xfe, 0x83, 0xa3, 0xe7, 0x95, 0xa8, 0xb4, 0x79,
- 0x50, 0x80, 0xad, 0xb1, 0x82, 0xc5, 0x3f, 0x47,
- 0xb9, 0x33, 0x7c, 0x27, 0x27, 0x7f, 0xae, 0x6a,
- 0x85, 0xa7, 0x7f, 0xd5, 0x3a, 0x41, 0xdd, 0x0f,
- 0x11, 0x4a, 0x27, 0x85, 0xb7, 0x30, 0xe8, 0xc3,
- 0xce, 0xf1, 0x64, 0xff, 0xbd, 0x6e, 0xba, 0xb5,
- 0x5f, 0x30, 0xe9, 0xf7, 0xf4, 0xfb, 0x2a, 0x74,
- 0xff, 0xd8, 0x1e, 0x06, 0x25, 0xb8, 0x15, 0x3a,
- 0x3c, 0x7d, 0x5f, 0x29, 0x9e, 0xfe, 0xda, 0x34,
- 0x9d, 0x3f, 0x65, 0x43, 0xdf, 0xa0, 0xe8, 0xe3,
- 0xd4, 0xf9, 0x3c, 0xfb, 0x5d, 0x35, 0xd9, 0x4e,
- 0x8c, 0x46, 0x17, 0x9d, 0xac, 0x43, 0x3f, 0xff,
- 0xfa, 0xcb, 0xe1, 0x15, 0xdf, 0x7f, 0x7f, 0x57,
- 0xe5, 0x76, 0xd7, 0x85, 0xe7, 0x4f, 0xa8, 0xd8,
- 0x7c, 0x13, 0xa7, 0xed, 0xb8, 0x41, 0xb9, 0x87,
- 0x4f, 0xfb, 0xfe, 0x7d, 0xed, 0x83, 0xea, 0x9d,
- 0x3f, 0xee, 0xc0, 0x2f, 0xfb, 0x6c, 0xd2, 0x74,
- 0x3c, 0xff, 0x00, 0x7d, 0x3f, 0xf9, 0x72, 0x9b,
- 0xd9, 0x6f, 0xf5, 0x05, 0x4e, 0x9d, 0x5b, 0x30,
- 0xe8, 0xb9, 0xf2, 0xea, 0x93, 0x3f, 0x6b, 0x5b,
- 0xd7, 0x2e, 0x74, 0xe0, 0x84, 0x25, 0x4f, 0xfe,
- 0xbf, 0xaf, 0x5b, 0x7b, 0x73, 0x78, 0xab, 0xca,
- 0x71, 0x79, 0x1e, 0x45, 0x46, 0xa9, 0x50, 0xf5,
- 0x58, 0x98, 0xf5, 0xe2, 0x91, 0x85, 0x5f, 0xe1,
- 0x0f, 0x78, 0x65, 0xcd, 0xa7, 0x0e, 0x9f, 0x06,
- 0xeb, 0x48, 0x4e, 0x9f, 0xcb, 0xc3, 0x60, 0xf6,
- 0xc5, 0x4c, 0x10, 0x95, 0x1b, 0x1e, 0x38, 0x4c,
- 0x67, 0xab, 0x7f, 0x6e, 0xca, 0x71, 0xa3, 0x98,
- 0x35, 0x3a, 0x58, 0x74, 0xa9, 0xc3, 0x4b, 0x71,
- 0x69, 0xff, 0xab, 0x5d, 0xbe, 0xbb, 0x59, 0x6f,
- 0x53, 0xa1, 0x4f, 0xb7, 0x52, 0x79, 0xff, 0x5f,
- 0xc3, 0xc0, 0x6f, 0xbe, 0x58, 0xe8, 0x79, 0xf1,
- 0x78, 0x8a, 0x7d, 0x94, 0x67, 0x84, 0xe9, 0xfa,
- 0xea, 0x3b, 0x67, 0xce, 0x9f, 0xdb, 0x59, 0x7e,
- 0x1e, 0xa4, 0xe9, 0xff, 0xbd, 0xb5, 0x95, 0x14,
- 0x1d, 0xf0, 0x1d, 0x3f, 0xff, 0xef, 0x33, 0xbf,
- 0x4b, 0xdc, 0x1c, 0xf3, 0x6c, 0xfe, 0x6d, 0xcf,
- 0x3c, 0x5e, 0xb0, 0xa9, 0x8f, 0xf1, 0x65, 0x4d,
- 0x35, 0x43, 0x9f, 0xfe, 0xcb, 0xd7, 0x1a, 0xb2,
- 0xb6, 0xcb, 0x59, 0x4e, 0x9f, 0xff, 0xff, 0x7b,
- 0x29, 0xaf, 0xb0, 0x3a, 0x32, 0x97, 0xd7, 0xd7,
- 0xaf, 0xa9, 0xdb, 0x6d, 0x68, 0x3a, 0x3e, 0x8d,
- 0xeb, 0xa8, 0x4d, 0xe0, 0x9d, 0x36, 0xf0, 0x1d,
- 0x0d, 0x1a, 0xe0, 0x0b, 0x4e, 0x7f, 0x6c, 0x74,
- 0xc1, 0x09, 0xd1, 0xe3, 0xd4, 0xa9, 0x10, 0x47,
- 0x27, 0x5f, 0x78, 0x0a, 0x71, 0xaf, 0x9f, 0xff,
- 0xfd, 0x75, 0xda, 0xda, 0xf6, 0x96, 0x76, 0xd9,
- 0x9f, 0xd3, 0x5a, 0xe7, 0xc0, 0x74, 0x52, 0x8a,
- 0xbf, 0x17, 0x4f, 0xf6, 0x5e, 0xca, 0x37, 0xc4,
- 0x3a, 0x72, 0x8b, 0x47, 0x46, 0x27, 0xe7, 0xd1,
- 0xbf, 0xfc, 0x93, 0x70, 0xd6, 0x7d, 0xfc, 0xbf,
- 0x37, 0x9d, 0x3f, 0xf6, 0x08, 0xe3, 0x56, 0xca,
- 0xf7, 0xce, 0x9f, 0xdf, 0x51, 0xd5, 0x2c, 0xa7,
- 0x4f, 0xbd, 0xa6, 0xdc, 0xf3, 0xa7, 0xef, 0x2b,
- 0x28, 0xc0, 0x9d, 0x30, 0x42, 0x74, 0x21, 0xf6,
- 0x09, 0x48, 0x4b, 0x67, 0xfb, 0x1a, 0xe6, 0xba,
- 0x97, 0xd4, 0xa7, 0x1a, 0xd9, 0xff, 0xd9, 0xf0,
- 0x65, 0xbd, 0x4d, 0x6d, 0xad, 0x4e, 0x9f, 0xbf,
- 0xc0, 0xdb, 0x3e, 0x74, 0xfc, 0xcf, 0x6e, 0x60,
- 0xe9, 0x3a, 0x70, 0x42, 0x12, 0xa7, 0xfe, 0x51,
- 0xfe, 0xbd, 0xbf, 0x1a, 0x56, 0x1c, 0xe2, 0xf2,
- 0x37, 0x6a, 0x8b, 0x9a, 0x86, 0x55, 0x52, 0xae,
- 0x99, 0xa9, 0x68, 0x53, 0x67, 0x70, 0xd0, 0x79,
- 0x04, 0xa7, 0x9f, 0x94, 0xbc, 0xf2, 0x09, 0x4e,
- 0xaf, 0xb6, 0x3c, 0x82, 0x53, 0x04, 0x27, 0x90,
- 0x4a, 0x11, 0x14, 0x8d, 0x14, 0x5c, 0xbc, 0x25,
- 0x53, 0x75, 0xcb, 0x20, 0x91, 0xc6, 0xf6, 0x7e,
- 0xcb, 0x66, 0x7f, 0x49, 0xd3, 0xbb, 0xe0, 0xf9,
- 0xf0, 0x5c, 0xce, 0x7b, 0x73, 0x3a, 0xc7, 0x4b,
- 0x37, 0x67, 0xac, 0x03, 0x39, 0xfc, 0xd3, 0xf5,
- 0xa2, 0xfe, 0xa0, 0xa9, 0xfd, 0xe7, 0xeb, 0xd5,
- 0xb7, 0x8e, 0x93, 0xca, 0x9d, 0xc3, 0x41, 0x50,
- 0x54, 0x29, 0xb5, 0x41, 0x06, 0x0d, 0xcf, 0x7d,
- 0x40, 0x85, 0x38, 0xd6, 0x42, 0xa3, 0x17, 0x21,
- 0x2b, 0x3d, 0xaf, 0x0b, 0xce, 0x93, 0x0e, 0x9b,
- 0x1f, 0xb1, 0xb1, 0x68, 0x86, 0x7c, 0x1c, 0x6b,
- 0xcc, 0x3a, 0x7e, 0x45, 0x69, 0xea, 0x02, 0xa5,
- 0xe3, 0xa7, 0xfa, 0x8d, 0x5f, 0xb5, 0xb5, 0xef,
- 0x9d, 0x3f, 0x79, 0x59, 0x46, 0x04, 0xe9, 0xf6,
- 0x50, 0xcc, 0x61, 0xd3, 0xab, 0xe1, 0x3a, 0x3e,
- 0x78, 0x57, 0x27, 0x9f, 0xbf, 0xc0, 0x06, 0xb5,
- 0x3a, 0x7e, 0xf6, 0x9d, 0xea, 0xc7, 0x6c, 0x98,
- 0x66, 0x08, 0x09, 0xed, 0x5b, 0xee, 0x45, 0x18,
- 0x9e, 0x8f, 0x8a, 0x3f, 0x19, 0xc4, 0xf7, 0xf2,
- 0x8d, 0x4e, 0x87, 0xab, 0xd7, 0xc2, 0xbb, 0x43,
- 0xf7, 0xea, 0xf5, 0x8f, 0xfe, 0xe6, 0xd3, 0xff,
- 0xea, 0x04, 0x73, 0x6e, 0x65, 0xba, 0xff, 0x56,
- 0x8e, 0x9c, 0x10, 0x84, 0xa9, 0x9e, 0xa5, 0x38,
- 0xbc, 0x85, 0x44, 0xa8, 0xb8, 0xcf, 0xd4, 0x34,
- 0xf6, 0xe0, 0xd0, 0x74, 0xf5, 0xba, 0x90, 0x9d,
- 0x3e, 0xa0, 0x7c, 0xac, 0x3a, 0x7f, 0xf9, 0x77,
- 0xdf, 0xea, 0x0e, 0xb8, 0x37, 0xfd, 0xe7, 0x46,
- 0xea, 0x46, 0x87, 0x8d, 0x38, 0x8a, 0xe4, 0xf3,
- 0x9f, 0xef, 0x9d, 0x3f, 0x5d, 0x5a, 0xfe, 0xb5,
- 0x3a, 0x1e, 0x79, 0x77, 0x1c, 0x9d, 0xae, 0xad,
- 0xd9, 0xd3, 0x73, 0x9b, 0xa3, 0x74, 0x31, 0xba,
- 0xc6, 0xdb, 0xaf, 0xc8, 0x96, 0x51, 0x55, 0x10,
- 0xff, 0x79, 0x0e, 0xd1, 0xb5, 0xe4, 0xaf, 0x3d,
- 0x2c, 0xc8, 0x2f, 0xe8, 0x49, 0x35, 0x19, 0x50,
- 0x91, 0x32, 0x34, 0x5b, 0x4b, 0x0e, 0xe4, 0x5f,
- 0x94, 0xd6, 0x53, 0x7d, 0xe7, 0x74, 0xb5, 0x87,
- 0xc6, 0xe4, 0x3c, 0x77, 0xc2, 0x35, 0xbc, 0x8a,
- 0x7f, 0xf3, 0x99, 0xcf, 0x76, 0x0a, 0x77, 0x21,
- 0xa2, 0x8a, 0x9f, 0xce, 0xc1, 0x4e, 0xe4, 0x34,
- 0x5d, 0x13, 0xff, 0x3b, 0x9e, 0xec, 0x14, 0xee,
- 0x43, 0x44, 0x97, 0x3f, 0x9d, 0x82, 0x9d, 0xc8,
- 0x68, 0xbc, 0xa1, 0x5b, 0xf2, 0xba, 0x09, 0xde,
- 0x77, 0x87, 0x68, 0xa4, 0xd1, 0xdb, 0x0e, 0xed,
- 0x0c, 0x5f, 0xd7, 0x47, 0x55, 0x8e, 0xce, 0xea,
- 0x5a, 0x9d, 0xb6, 0x4c, 0x9f, 0xfc, 0xe6, 0x73,
- 0xdd, 0x82, 0x9d, 0xc8, 0x68, 0x96, 0x67, 0x93,
- 0xb9, 0x0d, 0x11, 0x9c, 0xfd, 0xe5, 0x65, 0x18,
- 0x13, 0xa6, 0xfb, 0xce, 0x93, 0x0e, 0x9f, 0x78,
- 0x6d, 0xce, 0x13, 0xd3, 0x61, 0x6e, 0xf1, 0x69,
- 0xfb, 0x9f, 0xe1, 0xe1, 0x3a, 0x75, 0x56, 0x93,
- 0xa0, 0x53, 0x10, 0x63, 0xf7, 0xd3, 0x2e, 0x55,
- 0x3f, 0xf5, 0xfc, 0x3c, 0x0d, 0x14, 0xbd, 0x58,
- 0x74, 0xfb, 0xea, 0xfa, 0xf1, 0xd1, 0xe3, 0xec,
- 0x6c, 0x8d, 0x3f, 0xff, 0x7b, 0x6d, 0x6f, 0x5a,
- 0x5e, 0xbf, 0x05, 0x74, 0x6b, 0xf3, 0xa7, 0xfe,
- 0xc6, 0x5f, 0xc1, 0xaa, 0xdb, 0xb7, 0x67, 0x4f,
- 0xfa, 0xcb, 0xeb, 0x79, 0x7e, 0xd6, 0xa7, 0x49,
- 0xd8, 0x9d, 0xbb, 0x50, 0xa9, 0xe2, 0x4f, 0xb1,
- 0xd5, 0x1e, 0x7f, 0xf3, 0x99, 0xcf, 0x76, 0x0a,
- 0x77, 0x21, 0xa2, 0x69, 0x9f, 0xfc, 0xe6, 0x73,
- 0xdd, 0x82, 0x9d, 0xc8, 0x68, 0x9c, 0x67, 0xff,
- 0x39, 0x9c, 0xf7, 0x60, 0xa7, 0x72, 0x1a, 0x28,
- 0x19, 0xf0, 0xa7, 0x72, 0x1a, 0x2e, 0x09, 0x97,
- 0xc7, 0x4f, 0xef, 0xbd, 0x7d, 0xb6, 0x30, 0xe9,
- 0x3b, 0x0f, 0xe2, 0xc6, 0x1a, 0x8a, 0xcf, 0xef,
- 0x3b, 0x7a, 0x83, 0x02, 0x74, 0xff, 0x3d, 0xd8,
- 0x29, 0xdc, 0x86, 0x89, 0x26, 0x4e, 0xb1, 0xfa,
- 0xf1, 0xa4, 0x50, 0xbb, 0x5a, 0xf9, 0x63, 0x28,
- 0xaa, 0xd2, 0x90, 0x14, 0xab, 0x0c, 0xab, 0xc2,
- 0xaa, 0x7f, 0xda, 0x79, 0xd8, 0x29, 0xdc, 0x86,
- 0x8b, 0x52, 0x7f, 0xdc, 0xf7, 0x60, 0xa7, 0x72,
- 0x1a, 0x25, 0x58, 0x3a, 0x4e, 0xd2, 0x89, 0x86,
- 0x24, 0x37, 0xa3, 0x4f, 0xe7, 0x60, 0xa7, 0x72,
- 0x1a, 0x22, 0x99, 0xfc, 0xec, 0x14, 0xee, 0x43,
- 0x44, 0x69, 0x3f, 0x9d, 0x82, 0x9d, 0xc8, 0x68,
- 0xa7, 0xe7, 0xff, 0x39, 0x9c, 0xf7, 0x60, 0xa7,
- 0x72, 0x1a, 0x26, 0xa9, 0xfc, 0xec, 0x14, 0xee,
- 0x43, 0x45, 0x77, 0x3c, 0x9d, 0xc8, 0x68, 0xaf,
- 0xa7, 0x04, 0x21, 0x2a, 0x5f, 0x29, 0xc5, 0xe4,
- 0x09, 0xf3, 0x31, 0x1e, 0x73, 0xd6, 0x93, 0xa7,
- 0xfd, 0x96, 0x0f, 0x5e, 0xab, 0x94, 0x1d, 0x2b,
- 0x9d, 0x3f, 0xde, 0x1c, 0xa3, 0xcf, 0xcd, 0x8e,
- 0x81, 0x3c, 0x9e, 0x10, 0x93, 0xb1, 0x1c, 0x6d,
- 0x10, 0xfc, 0x72, 0xb0, 0x86, 0x9f, 0xfc, 0xe6,
- 0x73, 0xdd, 0x82, 0x9d, 0xc8, 0x68, 0x9e, 0xe7,
- 0xf3, 0xb0, 0x53, 0xb9, 0x0d, 0x17, 0x0c, 0xff,
- 0xce, 0xe7, 0xbb, 0x05, 0x3b, 0x90, 0xd1, 0x27,
- 0xc2, 0xab, 0xe3, 0xa0, 0xed, 0xe7, 0x7a, 0x4e,
- 0xd0, 0xed, 0xa5, 0x21, 0x8e, 0x12, 0xc9, 0x15,
- 0x52, 0x6c, 0x77, 0x3f, 0x9d, 0x82, 0x9d, 0xc8,
- 0x68, 0x8a, 0xa7, 0xf3, 0xb0, 0x53, 0xb9, 0x0d,
- 0x14, 0xcc, 0xff, 0xe7, 0x33, 0x9e, 0xec, 0x14,
- 0xee, 0x43, 0x44, 0xcf, 0x3f, 0xf9, 0xcc, 0xe7,
- 0xbb, 0x05, 0x3b, 0x90, 0xd1, 0x46, 0xc5, 0x09,
- 0x8d, 0x6c, 0x77, 0xa4, 0xee, 0xea, 0x53, 0xff,
- 0x3b, 0x9e, 0xec, 0x14, 0xee, 0x43, 0x44, 0x75,
- 0x3f, 0x7b, 0x3f, 0xb6, 0x50, 0x74, 0xf8, 0x53,
- 0xb9, 0x0d, 0x14, 0xd4, 0xff, 0xcf, 0xb7, 0xbf,
- 0x45, 0x75, 0x51, 0x68, 0xe9, 0xfb, 0xca, 0xca,
- 0x30, 0x27, 0x4f, 0xff, 0x65, 0xed, 0x8f, 0x1e,
- 0xfd, 0xed, 0xcf, 0x3a, 0x65, 0x01, 0xd3, 0xfd,
- 0x5e, 0xa5, 0x53, 0xc8, 0xe1, 0x44, 0x7f, 0xcb,
- 0x77, 0xa6, 0xc9, 0xdb, 0x27, 0x25, 0x85, 0xd4,
- 0x98, 0x5e, 0x1a, 0xd3, 0xe1, 0x4e, 0xe4, 0x34,
- 0x55, 0x53, 0xfe, 0xe7, 0xbb, 0x05, 0x3b, 0x90,
- 0xd1, 0x36, 0xc9, 0xd8, 0x7e, 0xcc, 0x30, 0x9f,
- 0xce, 0xc1, 0x4e, 0xe4, 0x34, 0x57, 0xf3, 0xf9,
- 0xd8, 0x29, 0xdc, 0x86, 0x8b, 0x1a, 0x7c, 0x29,
- 0xdc, 0x86, 0x8b, 0x56, 0x7f, 0xdc, 0xf7, 0x60,
- 0xa7, 0x72, 0x1a, 0x28, 0x29, 0x3b, 0x0f, 0xd9,
- 0x86, 0x13, 0xe1, 0x4e, 0xe4, 0x34, 0x5c, 0x53,
- 0xcd, 0xed, 0xfe, 0x43, 0xa7, 0xf2, 0xb3, 0x9b,
- 0x28, 0xb7, 0x9d, 0x27, 0x62, 0x23, 0x38, 0xc2,
- 0xe4, 0xf3, 0xf9, 0xd8, 0x29, 0xdc, 0x86, 0x8b,
- 0xa6, 0x7f, 0xff, 0x2d, 0xbf, 0xaf, 0x6e, 0xf1,
- 0xf6, 0xcd, 0x39, 0xb3, 0x5a, 0x9d, 0x3f, 0xe7,
- 0xe0, 0x8f, 0x3e, 0x8c, 0x09, 0xd3, 0xbf, 0xce,
- 0x14, 0x52, 0xdd, 0xa6, 0x7f, 0xc2, 0xb4, 0xdb,
- 0xab, 0x75, 0x09, 0xd3, 0xf6, 0xe9, 0xfc, 0xb7,
- 0x5c, 0xe9, 0xf8, 0x1c, 0xd3, 0xfd, 0x73, 0xa7,
- 0xff, 0xfd, 0xa5, 0x76, 0xb6, 0x53, 0x7f, 0xf5,
- 0x81, 0xd5, 0xaf, 0x0a, 0x1d, 0x3c, 0x9d, 0xc8,
- 0x68, 0x93, 0x27, 0xf8, 0x72, 0x9b, 0xdf, 0x9f,
- 0x53, 0xa0, 0x4f, 0x8d, 0x85, 0x73, 0xf6, 0xc0,
- 0xdd, 0x2a, 0x0d, 0xc3, 0xa7, 0xff, 0x5b, 0xd7,
- 0xa5, 0x3c, 0x35, 0x69, 0x78, 0xe9, 0xf6, 0x5f,
- 0xcc, 0xe3, 0xa7, 0xff, 0xdc, 0x82, 0xb6, 0xfe,
- 0x5f, 0x1c, 0x10, 0x84, 0xa8, 0x79, 0xfc, 0x5c,
- 0x9a, 0x7f, 0xf6, 0xbf, 0xeb, 0xa8, 0xd6, 0xcb,
- 0xfb, 0x9d, 0x38, 0x21, 0x09, 0x53, 0xf0, 0xf5,
- 0x0c, 0xf5, 0x4a, 0x71, 0x79, 0x3e, 0xc6, 0x0e,
- 0x6e, 0xce, 0x9f, 0x7a, 0xf4, 0x60, 0x4e, 0x9f,
- 0xe5, 0x4b, 0x7f, 0x5b, 0xad, 0x4e, 0x81, 0x3e,
- 0x06, 0x14, 0x4f, 0xf6, 0x70, 0x34, 0x66, 0xdc,
- 0xf3, 0xa7, 0xff, 0x75, 0x16, 0xf2, 0xff, 0x1a,
- 0xf0, 0xf8, 0xe8, 0xc4, 0x52, 0x5c, 0x84, 0x27,
- 0x33, 0xef, 0xe5, 0xba, 0xe7, 0x4f, 0xf9, 0xeb,
- 0xfa, 0x37, 0x8f, 0xf5, 0x79, 0xd1, 0xbb, 0x3e,
- 0x86, 0x89, 0xa7, 0xaf, 0x46, 0x6c, 0x74, 0xff,
- 0x7b, 0x4e, 0xf1, 0x03, 0x3d, 0x53, 0xa1, 0xa3,
- 0xe0, 0xdc, 0x23, 0x9c, 0x10, 0x84, 0xe9, 0xff,
- 0xf6, 0x32, 0xff, 0x50, 0x66, 0xd5, 0xc6, 0x2a,
- 0x14, 0xe2, 0xf2, 0x31, 0x32, 0xbf, 0x42, 0x1e,
- 0xc8, 0x53, 0xf5, 0x97, 0x42, 0x7a, 0x83, 0xa7,
- 0xe1, 0xe1, 0xfa, 0xbc, 0xe8, 0xd8, 0xf6, 0x44,
- 0xbe, 0x67, 0xb9, 0xb8, 0xbd, 0x56, 0xa6, 0x2f,
- 0x2e, 0xc8, 0x68, 0x69, 0x21, 0x43, 0x7a, 0x61,
- 0x84, 0xd1, 0x17, 0x32, 0xfc, 0xf2, 0xb1, 0x96,
- 0xde, 0x3c, 0x2d, 0xf0, 0x8e, 0x9f, 0x63, 0x07,
- 0x37, 0x67, 0x4f, 0xfd, 0x96, 0xfa, 0xd1, 0xbe,
- 0xd6, 0xed, 0xd9, 0xd3, 0xf7, 0x23, 0x82, 0x10,
- 0x9d, 0x27, 0x23, 0x22, 0x70, 0x4c, 0xfa, 0x7b,
- 0xa3, 0xf0, 0xe2, 0xa9, 0x4b, 0x64, 0xa8, 0x7b,
- 0x3a, 0x07, 0x68, 0xf7, 0xa9, 0x86, 0x00, 0x93,
- 0xb0, 0xec, 0x10, 0xb1, 0xac, 0x2c, 0xee, 0x69,
- 0xad, 0x25, 0xf2, 0x7f, 0x3b, 0x05, 0x3b, 0x90,
- 0xd1, 0x1a, 0xcf, 0x85, 0x3b, 0x90, 0xd1, 0x52,
- 0xcd, 0xc8, 0x68, 0x86, 0xa4, 0xec, 0x3d, 0x1e,
- 0x30, 0x9f, 0xf9, 0xdc, 0xf7, 0x60, 0xa7, 0x72,
- 0x1a, 0x23, 0xe9, 0xfc, 0xec, 0x14, 0xee, 0x43,
- 0x45, 0x8f, 0x3f, 0x6e, 0x9f, 0xcb, 0x75, 0xce,
- 0x9f, 0xef, 0xf0, 0x2b, 0xd7, 0xbf, 0x1d, 0x3c,
- 0x06, 0x78, 0x4e, 0x9f, 0xff, 0xe5, 0x1f, 0xe6,
- 0xd9, 0x6b, 0x79, 0x2d, 0xeb, 0xd7, 0xa9, 0x3a,
- 0x3c, 0x88, 0x7b, 0x10, 0xce, 0xee, 0x43, 0x45,
- 0xa1, 0x3f, 0xee, 0x0b, 0x7a, 0x70, 0xd1, 0x81,
- 0x3a, 0x42, 0x87, 0xca, 0x24, 0xd3, 0xf3, 0x6d,
- 0xf7, 0xfa, 0x80, 0xe9, 0xf2, 0xdf, 0x2c, 0xa7,
- 0x4f, 0xff, 0x65, 0xeb, 0x8d, 0x59, 0x5b, 0x65,
- 0xac, 0xa7, 0x45, 0x07, 0xeb, 0xf2, 0x58, 0x54,
- 0x64, 0xe4, 0x29, 0xa7, 0xfe, 0xca, 0xfb, 0x5f,
- 0xbc, 0x57, 0x36, 0x3a, 0x7d, 0x7b, 0x77, 0xf4,
- 0x9d, 0x3f, 0xdf, 0xd6, 0x8d, 0xad, 0x9f, 0x53,
- 0xa6, 0xfe, 0x61, 0xf2, 0x21, 0x4c, 0xfe, 0xcb,
- 0x35, 0xeb, 0x79, 0x87, 0x4f, 0xe7, 0xe0, 0xd7,
- 0xeb, 0x41, 0xd3, 0xdb, 0x65, 0xb8, 0xe9, 0xfe,
- 0xcc, 0x0e, 0x22, 0x60, 0x4e, 0x8c, 0x45, 0xdd,
- 0x26, 0x9c, 0x65, 0x52, 0x19, 0xec, 0xb7, 0x5c,
- 0xe9, 0xfd, 0xa7, 0xdf, 0xd5, 0xf9, 0x53, 0xa4,
- 0xe6, 0xe2, 0xe5, 0x5a, 0x98, 0xed, 0x0b, 0xec,
- 0x84, 0x45, 0xa1, 0xdd, 0xf2, 0x6a, 0xc2, 0xa2,
- 0xf0, 0xe6, 0xdc, 0x3c, 0xde, 0x41, 0x3f, 0x37,
- 0xfb, 0x6f, 0xab, 0x47, 0x4f, 0x65, 0xba, 0xe7,
- 0x4b, 0x74, 0xc3, 0xd2, 0xf9, 0x94, 0xf8, 0x53,
- 0xb9, 0x0d, 0x16, 0xb4, 0xff, 0xb9, 0xee, 0xc1,
- 0x4e, 0xe4, 0x34, 0x50, 0x72, 0x73, 0x71, 0x14,
- 0x58, 0x58, 0xc3, 0x09, 0xff, 0xce, 0x67, 0x3d,
- 0xd8, 0x29, 0xdc, 0x86, 0x8a, 0x2e, 0x7f, 0x3b,
- 0x05, 0x3b, 0x90, 0xd1, 0x75, 0x43, 0xd9, 0x0a,
- 0x69, 0x08, 0xcf, 0x13, 0x31, 0x32, 0xd3, 0x9c,
- 0xc0, 0x8e, 0xa6, 0xa7, 0x37, 0x52, 0x9f, 0x0a,
- 0x77, 0x21, 0xa2, 0x21, 0x9d, 0x6c, 0xd8, 0xe9,
- 0x3b, 0x0f, 0x32, 0x93, 0x09, 0xfc, 0xec, 0x14,
- 0xee, 0x43, 0x44, 0x6d, 0x3f, 0x9d, 0x82, 0x9d,
- 0xc8, 0x68, 0xa6, 0xe7, 0xf3, 0xb0, 0x53, 0xb9,
- 0x0d, 0x15, 0x04, 0xfe, 0x76, 0x0a, 0x77, 0x21,
- 0xa2, 0xa6, 0x9f, 0x0a, 0x77, 0x21, 0xa2, 0xb0,
- 0x9f, 0x78, 0x3b, 0x6a, 0x27, 0x4f, 0xf3, 0xdd,
- 0x82, 0x9d, 0xc8, 0x68, 0x8f, 0xe7, 0x62, 0xd0,
- 0x74, 0x9d, 0x88, 0xb5, 0x43, 0x0e, 0x29, 0xfa,
- 0x0c, 0xff, 0xe7, 0x33, 0x9e, 0xec, 0x14, 0xee,
- 0x43, 0x44, 0xdf, 0x3f, 0xf3, 0x39, 0xee, 0xc1,
- 0x4e, 0xe4, 0x34, 0x4f, 0xd3, 0xf3, 0x75, 0xdd,
- 0x5b, 0xa6, 0xe6, 0x52, 0x74, 0xff, 0xf2, 0xaa,
- 0xaa, 0xaa, 0xaa, 0xad, 0x35, 0x3a, 0x7c, 0x3e,
- 0xa3, 0x98, 0x54, 0xc1, 0x09, 0x51, 0x86, 0xf4,
- 0x24, 0xf2, 0xd4, 0xa7, 0x1a, 0x08, 0x54, 0x63,
- 0xd6, 0x14, 0xd3, 0xf0, 0xf2, 0x5b, 0xc2, 0x74,
- 0xf5, 0x0c, 0xf3, 0xce, 0x9f, 0x57, 0xfa, 0xf3,
- 0xce, 0x9f, 0xd6, 0x56, 0x38, 0x00, 0x53, 0xa4,
- 0x2a, 0x7f, 0xb8, 0x47, 0xe2, 0x89, 0xff, 0x2d,
- 0x3b, 0x6f, 0x5d, 0xdd, 0xb5, 0xa9, 0xd3, 0x81,
- 0x5c, 0x3a, 0x7f, 0xed, 0x96, 0xfd, 0x5c, 0xb5,
- 0xbc, 0xc3, 0xa7, 0x5f, 0xcd, 0x1d, 0x0a, 0x7c,
- 0x35, 0x44, 0x85, 0x4f, 0x93, 0xc4, 0xe3, 0x0a,
- 0x76, 0x19, 0x7d, 0x1e, 0xef, 0x93, 0xdc, 0xd6,
- 0xf6, 0x1d, 0x37, 0x7c, 0xe8, 0x13, 0x72, 0xc2,
- 0x49, 0xc1, 0x08, 0x4e, 0x9e, 0xa3, 0xfe, 0x52,
- 0x9c, 0x5e, 0x4f, 0x53, 0x7f, 0x21, 0xd0, 0xa8,
- 0x8f, 0xb1, 0xe6, 0xa6, 0x33, 0xff, 0x51, 0xa8,
- 0x33, 0xfa, 0xb4, 0xb7, 0xe3, 0xa7, 0x96, 0xf5,
- 0x43, 0x44, 0x1d, 0x3f, 0x75, 0x97, 0x77, 0xab,
- 0xce, 0x81, 0x45, 0x2d, 0xd1, 0xdb, 0x16, 0xcc,
- 0x3b, 0x1d, 0x30, 0x42, 0x74, 0x3c, 0xd6, 0x04,
- 0x5a, 0x7a, 0xab, 0xe6, 0xc5, 0x38, 0xd0, 0xcf,
- 0xab, 0xbf, 0x60, 0x54, 0xe8, 0xf1, 0xef, 0x6f,
- 0x33, 0x9c, 0x10, 0x84, 0xa8, 0x29, 0xc5, 0xe4,
- 0xf7, 0x83, 0xe6, 0x8a, 0x84, 0x37, 0x9e, 0x19,
- 0x8f, 0x26, 0xf1, 0x68, 0x6e, 0x7d, 0xf2, 0x77,
- 0xfd, 0x53, 0xa7, 0xb6, 0xef, 0x80, 0xe9, 0xff,
- 0x97, 0xe0, 0xfa, 0xd2, 0xd2, 0xfc, 0x07, 0x47,
- 0x91, 0x06, 0x01, 0xca, 0x91, 0x4f, 0x97, 0x06,
- 0xde, 0x3a, 0x7b, 0x6c, 0x66, 0xec, 0xe8, 0x68,
- 0xf2, 0xdb, 0x12, 0xcf, 0xd7, 0xc6, 0xbe, 0xac,
- 0x3c, 0x40, 0x53, 0xee, 0xfe, 0xd6, 0x53, 0x44,
- 0x04, 0xe3, 0x75, 0x3f, 0xca, 0x34, 0x68, 0xc6,
- 0xbc, 0xc3, 0xa7, 0xca, 0x0f, 0x53, 0x53, 0xa7,
- 0xf0, 0xb5, 0x5f, 0x7e, 0xfe, 0x3a, 0x7a, 0x90,
- 0x0a, 0x95, 0x30, 0x42, 0x54, 0x29, 0xb7, 0x09,
- 0x0c, 0xfd, 0xc2, 0xf7, 0xff, 0xc5, 0x38, 0xd0,
- 0x42, 0xaa, 0x48, 0xc7, 0xbf, 0x2f, 0xd9, 0x13,
- 0xe7, 0x77, 0x28, 0xd6, 0x11, 0x73, 0xed, 0x6f,
- 0xaf, 0x6f, 0x34, 0x40, 0xf3, 0xfe, 0xb6, 0xb4,
- 0x2e, 0x85, 0xba, 0xec, 0x74, 0xee, 0x1a, 0x0e,
- 0x98, 0x21, 0x3a, 0x7f, 0x0f, 0xb1, 0xb6, 0xf7,
- 0xb9, 0x0d, 0x88, 0x46, 0xe3, 0x64, 0x5f, 0x8b,
- 0x9c, 0xff, 0xdf, 0xcd, 0x36, 0xe7, 0xef, 0xea,
- 0x54, 0xe8, 0x53, 0xea, 0xc2, 0x39, 0xff, 0xd8,
- 0xc6, 0x73, 0xf0, 0x53, 0xb9, 0x0d, 0x10, 0xc4,
- 0x58, 0xfc, 0x7e, 0x41, 0x3f, 0x60, 0xa7, 0x72,
- 0x1a, 0x20, 0xa9, 0xeb, 0xd5, 0x40, 0x54, 0xee,
- 0x1a, 0x0a, 0x9e, 0xd7, 0xfd, 0xa4, 0xa9, 0xfd,
- 0xea, 0x32, 0xf5, 0x50, 0x15, 0x05, 0x4f, 0xd8,
- 0x8b, 0x65, 0x61, 0x53, 0x04, 0x25, 0x4f, 0xdf,
- 0x5f, 0xd1, 0xe1, 0x2a, 0x31, 0x30, 0xa4, 0x21,
- 0x60, 0xdd, 0x89, 0x00, 0x67, 0xf0, 0xa0, 0x95,
- 0x6f, 0x16, 0x9b, 0xc2, 0x53, 0x8f, 0xca, 0x5c,
- 0xf4, 0xf5, 0xed, 0x1d, 0x8c, 0xff, 0x95, 0xfd,
- 0xfc, 0xa8, 0xad, 0x4e, 0x9f, 0xeb, 0xd9, 0x5b,
- 0x6c, 0xa0, 0x53, 0xa7, 0xf9, 0x69, 0x7e, 0xe2,
- 0xa6, 0x30, 0xe8, 0x53, 0xf4, 0xb1, 0xd4, 0xff,
- 0xfc, 0xd7, 0x73, 0xfa, 0xda, 0x32, 0x8d, 0x6f,
- 0xaf, 0x6f, 0x34, 0x5f, 0x73, 0xef, 0x5f, 0xf8,
- 0xf3, 0xa7, 0xfd, 0xff, 0x3e, 0xf6, 0xc1, 0xf5,
- 0x4e, 0x9f, 0xd7, 0x06, 0xff, 0xbe, 0xd8, 0x78,
- 0x80, 0x67, 0x70, 0xbc, 0xf1, 0x00, 0xc6, 0x1f,
- 0x4e, 0xa8, 0x53, 0x73, 0xcf, 0x10, 0x0c, 0xf7,
- 0x7e, 0x97, 0x9e, 0x20, 0x19, 0xfd, 0xe4, 0xb6,
- 0x00, 0x0a, 0x78, 0x80, 0x67, 0x7b, 0xfb, 0x1e,
- 0x20, 0x18, 0xd9, 0x17, 0x2c, 0x22, 0xb1, 0x7b,
- 0x63, 0xe9, 0xc2, 0xb7, 0x3c, 0x40, 0x30, 0x78,
- 0x80, 0x66, 0x56, 0x1e, 0x20, 0x18, 0xd8, 0xdc,
- 0xf8, 0x5e, 0x7b, 0xcc, 0xd9, 0x4f, 0x10, 0x0c,
- 0xeb, 0xf2, 0x1e, 0x20, 0x19, 0xff, 0x7f, 0x9e,
- 0xeb, 0x79, 0x38, 0x4f, 0x10, 0x0c, 0xdd, 0xb1,
- 0xe2, 0x01, 0x9f, 0xdf, 0xe0, 0xd6, 0xaa, 0x03,
- 0xc4, 0x03, 0x3e, 0xf6, 0x9e, 0xf8, 0x0f, 0x10,
- 0x0c, 0xde, 0xa9, 0xe2, 0x01, 0x81, 0x3d, 0x9b,
- 0x9b, 0x4f, 0xaf, 0xf5, 0xa5, 0xe6, 0x88, 0x06,
- 0x60, 0x29, 0xe2, 0x01, 0x71, 0xb5, 0x9f, 0x79,
- 0x59, 0xdb, 0x1e, 0x20, 0x19, 0xed, 0x7b, 0xe8,
- 0x78, 0x80, 0x67, 0x28, 0xa1, 0xe2, 0x01, 0x9f,
- 0xf6, 0x53, 0x5d, 0x97, 0x3e, 0x0a, 0x9e, 0x20,
- 0x19, 0xf6, 0xbc, 0xf7, 0xa9, 0xe2, 0x01, 0x8c,
- 0x44, 0x05, 0x93, 0x26, 0x10, 0x1e, 0x20, 0x18,
- 0x7a, 0xa8, 0xfd, 0x88, 0xf2, 0x13, 0x1e, 0x56,
- 0xb1, 0x90, 0x0d, 0x2a, 0x5d, 0x78, 0x53, 0x6a,
- 0x45, 0x3e, 0xcb, 0xd7, 0xa9, 0x3c, 0x40, 0x33,
- 0xfb, 0x65, 0x46, 0x85, 0x6e, 0x78, 0x80, 0x76,
- 0x36, 0x93, 0x85, 0x42, 0x78, 0x80, 0x61, 0x0f,
- 0xdc, 0x54, 0x27, 0xbd, 0xf7, 0xd4, 0xf1, 0x00,
- 0xcf, 0xdc, 0xd3, 0xf2, 0x97, 0x9e, 0x20, 0x18,
- 0xc4, 0x45, 0x00, 0x83, 0x52, 0xf9, 0xfe, 0xb2,
- 0xd5, 0xd5, 0xd4, 0x40, 0x78, 0x80, 0x65, 0xe3,
- 0xc4, 0x03, 0x37, 0x51, 0xb1, 0xf1, 0xd9, 0x1a,
- 0x61, 0x01, 0xe2, 0x01, 0x9f, 0x75, 0xeb, 0xea,
- 0x4f, 0x10, 0x0c, 0xfd, 0xef, 0xea, 0xfc, 0xa9,
- 0xe2, 0x01, 0x85, 0x44, 0x97, 0xc8, 0xae, 0x6b,
- 0x1b, 0x32, 0x03, 0xb2, 0x1b, 0x6d, 0x20, 0x0b,
- 0x05, 0x88, 0xb8, 0xbc, 0x04, 0xf5, 0x95, 0xb1,
- 0x78, 0xf0, 0x37, 0x21, 0x27, 0xbe, 0x18, 0x33,
- 0xbb, 0x90, 0xd1, 0x00, 0xb9, 0x17, 0x93, 0xda,
- 0x77, 0x5b, 0x66, 0x1d, 0x30, 0x14, 0xa9, 0x69,
- 0x2a, 0x75, 0x96, 0x83, 0xa6, 0x08, 0x4a, 0x8f,
- 0x1e, 0xce, 0xec, 0x55, 0xa1, 0x20, 0x8e, 0x4e,
- 0x67, 0xaa, 0x53, 0x8f, 0x06, 0x7a, 0xf5, 0x6f,
- 0xd4, 0xe8, 0xa1, 0x95, 0xd2, 0xf2, 0x74, 0xa4,
- 0xb8, 0xf8, 0xe0, 0x10, 0xc6, 0xde, 0x5b, 0x3f,
- 0x0b, 0x4f, 0x51, 0xa0, 0xe9, 0xff, 0x3e, 0xba,
- 0x3f, 0x8c, 0x51, 0xd2, 0x74, 0xff, 0xc3, 0x6e,
- 0xc7, 0xa8, 0x83, 0x7b, 0x0e, 0x9f, 0xb7, 0x84,
- 0x7d, 0x96, 0x2a, 0x79, 0xab, 0x73, 0x47, 0x4f,
- 0xb1, 0xa7, 0xad, 0x27, 0x4f, 0x67, 0xd5, 0xe5,
- 0x40, 0x9f, 0x5f, 0xc8, 0xdb, 0xca, 0x21, 0x53,
- 0x7b, 0xc2, 0xdf, 0x20, 0xd9, 0x0f, 0xa1, 0x33,
- 0x3d, 0xef, 0xde, 0xa7, 0x4e, 0xd5, 0xbb, 0xa9,
- 0xd3, 0xff, 0x01, 0x98, 0x96, 0xf6, 0xd6, 0xd7,
- 0x49, 0xd3, 0xff, 0x5e, 0xb9, 0xb2, 0xd3, 0x5c,
- 0xa6, 0xe7, 0x4f, 0xe7, 0xe5, 0x77, 0xd6, 0xf8,
- 0x74, 0x2a, 0x39, 0x3c, 0x45, 0xc9, 0x1a, 0xa3,
- 0x4f, 0xb9, 0xb6, 0xdb, 0x29, 0xd3, 0x56, 0xa7,
- 0x4e, 0x08, 0x42, 0x74, 0xc0, 0xe2, 0x9c, 0x5e,
- 0x40, 0x9e, 0xb5, 0x4c, 0xa7, 0x70, 0x30, 0xa8,
- 0x7a, 0x2e, 0xd9, 0x08, 0x0d, 0xc2, 0x19, 0xfd,
- 0x7f, 0xe5, 0x20, 0xde, 0xf3, 0xa7, 0xfb, 0xf8,
- 0xdb, 0x1c, 0x10, 0x84, 0xa9, 0xcc, 0xeb, 0x9d,
- 0x16, 0x3d, 0x56, 0xc7, 0x50, 0xa8, 0xe7, 0xf1,
- 0xc7, 0x42, 0x2e, 0x7f, 0xf6, 0x6d, 0xcc, 0xca,
- 0x5f, 0x80, 0xcd, 0x8e, 0x9a, 0xdc, 0x74, 0xcd,
- 0x54, 0xe9, 0xf6, 0x36, 0xf7, 0xf6, 0xc3, 0x59,
- 0xbc, 0x56, 0x34, 0x22, 0xe1, 0xce, 0xd3, 0xdb,
- 0x65, 0xb8, 0xe9, 0xff, 0x97, 0x3e, 0xfb, 0x67,
- 0xfe, 0xa1, 0x3a, 0x5e, 0x14, 0x44, 0x7c, 0x96,
- 0xe4, 0x31, 0x43, 0x6d, 0xc0, 0xf8, 0xf4, 0xb6,
- 0x8f, 0xe7, 0x49, 0x7a, 0x42, 0xbf, 0xc4, 0x23,
- 0x4b, 0x57, 0xb4, 0x7c, 0xc0, 0x4d, 0xfc, 0x60,
- 0xd7, 0x8f, 0x79, 0xb4, 0x6e, 0x73, 0xfd, 0x83,
- 0xf5, 0xbb, 0xf2, 0xc7, 0x4f, 0xdf, 0x06, 0x6d,
- 0xcf, 0x3a, 0x7d, 0xbd, 0xa7, 0xae, 0xec, 0xa8,
- 0x54, 0x48, 0xe1, 0xb6, 0xf2, 0xd9, 0xff, 0xc3,
- 0xa7, 0xfa, 0xf6, 0xfc, 0xaf, 0x97, 0xe7, 0x4b,
- 0x79, 0xa2, 0x05, 0x95, 0xcd, 0x40, 0xa4, 0xbd,
- 0x73, 0x78, 0x11, 0xf9, 0xff, 0x7b, 0x72, 0xde,
- 0xde, 0xe0, 0x01, 0x4a, 0x9f, 0xfd, 0x7a, 0xf5,
- 0x3a, 0x18, 0xb9, 0xfb, 0xee, 0x1d, 0x0a, 0x89,
- 0x3f, 0x22, 0x4e, 0xa3, 0xef, 0x3a, 0x15, 0x38,
- 0x26, 0x42, 0x26, 0xd0, 0xba, 0xd4, 0x8a, 0x7f,
- 0x3d, 0xac, 0xff, 0x5b, 0x0e, 0x9f, 0xfc, 0x29,
- 0xfc, 0x6d, 0xfc, 0x51, 0x5a, 0x9d, 0x3f, 0xb9,
- 0xab, 0x63, 0x32, 0xa7, 0x46, 0x1f, 0xcb, 0x64,
- 0x79, 0xfb, 0xda, 0x6f, 0x98, 0xc3, 0xa7, 0xd9,
- 0xb7, 0x86, 0xa7, 0x4f, 0xff, 0x56, 0xf4, 0xa7,
- 0xad, 0xa1, 0xbf, 0x2d, 0xe6, 0x1d, 0x25, 0xa0,
- 0xff, 0x42, 0x4f, 0x1e, 0x47, 0xb5, 0x88, 0xef,
- 0x0a, 0xb9, 0xdb, 0x70, 0x9d, 0x3e, 0x07, 0x7f,
- 0x1b, 0xce, 0x85, 0x3c, 0x4d, 0x46, 0xe7, 0x95,
- 0x94, 0xb4, 0x74, 0x2a, 0xa5, 0xf7, 0xc7, 0x43,
- 0x57, 0x9b, 0x91, 0x4f, 0x03, 0xa9, 0xa9, 0xd3,
- 0x04, 0x27, 0x45, 0x4d, 0xc0, 0x48, 0xa7, 0xea,
- 0xfa, 0xdd, 0x96, 0x29, 0xc6, 0x86, 0x70, 0x42,
- 0x12, 0xa7, 0x9f, 0x7c, 0x42, 0x9c, 0x5e, 0x4f,
- 0xb3, 0x6f, 0x02, 0xa7, 0xd3, 0xfa, 0x5c, 0x27,
- 0xc9, 0xf2, 0xf9, 0xfb, 0xf4, 0xd5, 0xac, 0xb9,
- 0xd3, 0xff, 0xdf, 0xbb, 0x58, 0x39, 0xcc, 0x5b,
- 0x7b, 0x63, 0xa7, 0xd4, 0x6e, 0xfd, 0x94, 0x9d,
- 0x3e, 0xf5, 0x56, 0x86, 0x1f, 0x2f, 0xd9, 0xf2,
- 0xf0, 0x83, 0x53, 0xe5, 0xfb, 0x37, 0x3c, 0xf9,
- 0x7e, 0xcf, 0x6a, 0xfc, 0xa9, 0xf2, 0xfd, 0x8d,
- 0x8f, 0x47, 0xe4, 0x53, 0xe5, 0xca, 0xe7, 0xcf,
- 0x97, 0xec, 0x1f, 0x2f, 0xd9, 0xba, 0xe7, 0xcb,
- 0xf5, 0x85, 0xbc, 0x9f, 0xf3, 0xfa, 0xd5, 0x26,
- 0x7b, 0x37, 0x3c, 0x03, 0xe5, 0xfb, 0x07, 0xcb,
- 0xf6, 0x60, 0x29, 0xf2, 0xfd, 0x9f, 0xec, 0x07,
- 0x0e, 0x36, 0xcd, 0x8f, 0x97, 0xec, 0xfd, 0x96,
- 0xf5, 0x75, 0xa0, 0xf9, 0x7e, 0xc0, 0x11, 0x47,
- 0xf2, 0x2a, 0xa2, 0xcf, 0x0d, 0x0b, 0x73, 0xe5,
- 0xfb, 0x07, 0xcb, 0xf7, 0x0d, 0x74, 0xc1, 0x09,
- 0xf2, 0xfd, 0x87, 0xab, 0x11, 0xd8, 0xd7, 0x21,
- 0x09, 0x4c, 0x27, 0x44, 0xa5, 0x86, 0x35, 0x85,
- 0xd5, 0xd7, 0x82, 0x4d, 0x3d, 0x8f, 0x5d, 0x25,
- 0xcb, 0xf4, 0xe4, 0x47, 0xcf, 0xfb, 0x13, 0x6c,
- 0x10, 0xf5, 0x9a, 0x3a, 0x67, 0xd0, 0x54, 0x50,
- 0x89, 0x6a, 0x50, 0xbe, 0x7b, 0x02, 0xb9, 0x2b,
- 0xd3, 0x8c, 0x73, 0xff, 0xf5, 0x2f, 0x15, 0x6d,
- 0xcd, 0x2e, 0xd6, 0x56, 0x73, 0x47, 0x42, 0xae,
- 0xe1, 0xe1, 0x37, 0x8b, 0xfa, 0x73, 0x93, 0x52,
- 0xc9, 0xff, 0x69, 0x5a, 0x7e, 0xb6, 0xb6, 0xa8,
- 0x74, 0xfd, 0xfe, 0xd3, 0x6e, 0x79, 0xd3, 0x82,
- 0x10, 0x95, 0x3b, 0x7a, 0x80, 0xa7, 0x17, 0x93,
- 0xfe, 0xff, 0x3f, 0x78, 0xe3, 0x6e, 0x13, 0xa7,
- 0xfb, 0xfc, 0x0d, 0x0f, 0x50, 0x52, 0x74, 0x6c,
- 0x99, 0x8b, 0x10, 0x40, 0x95, 0xf2, 0xcb, 0x9f,
- 0xcf, 0xfb, 0xff, 0xf6, 0xad, 0xdd, 0x77, 0x16,
- 0xe7, 0x4e, 0x08, 0x42, 0x58, 0x84, 0x13, 0xe1,
- 0x4e, 0xe4, 0x2c, 0x42, 0x07, 0x1a, 0xa9, 0xc1,
- 0x08, 0x4b, 0x10, 0x7a, 0x0b, 0x10, 0x79, 0xc6,
- 0xaa, 0x65, 0x66, 0x22, 0x4d, 0x1a, 0xe7, 0xd7,
- 0x5b, 0xab, 0x0e, 0x9e, 0xff, 0x97, 0x49, 0xd3,
- 0xb7, 0xa8, 0x0e, 0x8a, 0x0f, 0x01, 0x84, 0x73,
- 0xe4, 0x5b, 0x2b, 0x0a, 0x9f, 0x7f, 0xbf, 0xfc,
- 0x2a, 0x6c, 0x42, 0xa6, 0x08, 0x4a, 0x8c, 0x3f,
- 0x5a, 0x92, 0xdc, 0x98, 0x22, 0x93, 0xfb, 0xfb,
- 0xd4, 0x16, 0xc6, 0xf2, 0x9c, 0x6e, 0xe1, 0x53,
- 0x80, 0xf3, 0x37, 0x43, 0x4e, 0x7f, 0xf5, 0x94,
- 0x15, 0xcc, 0xdb, 0xbf, 0xda, 0x4e, 0x9f, 0xd5,
- 0xde, 0xca, 0x87, 0xa9, 0x3a, 0x15, 0x5d, 0x8e,
- 0x26, 0x7a, 0x30, 0x51, 0x8e, 0xb3, 0x8d, 0x2a,
- 0x95, 0x38, 0x21, 0x09, 0x53, 0xe7, 0x83, 0xbf,
- 0xb1, 0x4e, 0x2f, 0x27, 0xff, 0xbf, 0x4e, 0x8a,
- 0x40, 0xbf, 0x4e, 0xa3, 0xfc, 0x74, 0xff, 0xf6,
- 0x2b, 0xb6, 0xfa, 0xea, 0x99, 0xa7, 0xc2, 0x74,
- 0xf3, 0x7d, 0x80, 0xd8, 0xe8, 0x79, 0xfb, 0xf2,
- 0x84, 0xff, 0xe7, 0xe0, 0x81, 0x9e, 0xae, 0xfa,
- 0xae, 0x1d, 0x3d, 0xed, 0xb1, 0x87, 0x42, 0xa7,
- 0x1c, 0xf3, 0x7e, 0x86, 0x57, 0xc8, 0x75, 0x4a,
- 0x9f, 0xb7, 0x75, 0xf7, 0xe9, 0x79, 0xd3, 0xfe,
- 0xe1, 0xdc, 0xf5, 0xb3, 0xa9, 0x01, 0xd3, 0xfe,
- 0xad, 0x54, 0x6e, 0xae, 0xdb, 0xc7, 0x4f, 0xfb,
- 0xfc, 0xd5, 0xb8, 0x47, 0xdb, 0x1d, 0x18, 0x8e,
- 0xf4, 0x33, 0xf2, 0x03, 0x0f, 0xa7, 0x9f, 0xbf,
- 0x1a, 0x3a, 0x7c, 0x3b, 0x66, 0x7c, 0xe9, 0xff,
- 0xb7, 0x7e, 0xcb, 0x2b, 0x6a, 0xd9, 0x69, 0x3a,
- 0x38, 0xfc, 0x2a, 0x4d, 0x3f, 0xfd, 0x97, 0xae,
- 0x35, 0x65, 0x6d, 0x96, 0xb2, 0x9d, 0x3f, 0xae,
- 0xdd, 0x5a, 0xfb, 0x74, 0xa3, 0x53, 0xa3, 0x64,
- 0x5a, 0x7c, 0x86, 0xea, 0x13, 0xff, 0xde, 0xae,
- 0x6d, 0x7a, 0xfb, 0x4d, 0xbb, 0xfe, 0x3a, 0x7f,
- 0xff, 0x7e, 0xf9, 0x6f, 0x2d, 0xfc, 0x05, 0x7b,
- 0x82, 0x10, 0x95, 0x3d, 0xb6, 0x66, 0x92, 0xa7,
- 0x3f, 0xfa, 0x9a, 0x21, 0x99, 0xc1, 0x08, 0x4a,
- 0x9d, 0x9f, 0x42, 0x9c, 0x5e, 0x4f, 0xfb, 0x28,
- 0xcd, 0xb9, 0xff, 0x5a, 0x0e, 0x80, 0x1f, 0x47,
- 0xca, 0x67, 0xf3, 0xff, 0x97, 0xbe, 0xb4, 0x1d,
- 0x0a, 0x9c, 0x4d, 0x0c, 0x34, 0x91, 0x8c, 0x2b,
- 0xb8, 0x8a, 0x7b, 0xd7, 0xf2, 0x9d, 0x3f, 0xb5,
- 0xc1, 0x00, 0x3d, 0xf3, 0xa7, 0xff, 0xca, 0xff,
- 0x6d, 0x6d, 0xf5, 0xc1, 0x4e, 0xe4, 0x34, 0x41,
- 0x91, 0x64, 0x4a, 0x5c, 0xce, 0x7d, 0x51, 0xf0,
- 0x77, 0x67, 0x4f, 0xed, 0xcc, 0xae, 0xe6, 0x0a,
- 0x9d, 0x0f, 0x4c, 0xe7, 0xd0, 0xb5, 0xa9, 0x1d,
- 0xca, 0xe7, 0xff, 0x97, 0xf4, 0x68, 0x6b, 0xdf,
- 0xcd, 0xb3, 0xfa, 0x4e, 0x9c, 0xa2, 0xd1, 0xd0,
- 0xab, 0xb9, 0x9b, 0x1d, 0xe4, 0x69, 0x08, 0x63,
- 0xe8, 0xf7, 0x3a, 0x38, 0x8d, 0x50, 0xf7, 0x15,
- 0xa7, 0xff, 0x91, 0x6b, 0x55, 0x66, 0x5f, 0xd5,
- 0xb7, 0x1d, 0x3f, 0xbf, 0xf5, 0x7b, 0x17, 0xc7,
- 0x4f, 0xeb, 0xf9, 0xb7, 0xae, 0xf5, 0x2a, 0x4c,
- 0x3a, 0x7e, 0xcf, 0xe9, 0x15, 0x77, 0x8f, 0x17,
- 0x79, 0xac, 0x62, 0x61, 0x7e, 0x4d, 0xab, 0xbc,
- 0xf0, 0xeb, 0x4b, 0xce, 0x9f, 0xdf, 0x7f, 0xf1,
- 0x8a, 0x87, 0x4e, 0x66, 0xd8, 0x74, 0x29, 0xf8,
- 0x61, 0x1f, 0x18, 0xce, 0xbf, 0xa8, 0x3a, 0x7f,
- 0xda, 0xde, 0xbb, 0xc4, 0x0c, 0xf5, 0x4e, 0x9f,
- 0xf9, 0x7f, 0xd6, 0x50, 0x38, 0x6b, 0x52, 0xa3,
- 0x64, 0x42, 0x31, 0x0a, 0x7d, 0x6f, 0x7a, 0x9a,
- 0x9d, 0x05, 0x4f, 0xd5, 0xde, 0xa2, 0xac, 0x2a,
- 0x0a, 0x82, 0xa0, 0xa8, 0x2a, 0x1e, 0x7b, 0xfe,
- 0x0a, 0x01, 0x6e, 0xa1, 0x5b, 0x81, 0x4d, 0xe1,
- 0x53, 0x5b, 0x0a, 0x9f, 0xbb, 0xae, 0xd2, 0xb0,
- 0xad, 0x05, 0xac, 0x9b, 0xb2, 0xa0, 0xa8, 0x2a,
- 0x1e, 0x5a, 0x78, 0x2a, 0x0a, 0x82, 0xa0, 0xa8,
- 0x2a, 0x0a, 0x82, 0xa2, 0x83, 0x79, 0xb0, 0x57,
- 0x82, 0x80, 0x15, 0x50, 0xa6, 0xc1, 0x50, 0x54,
- 0x15, 0x0f, 0x2d, 0x2a, 0x15, 0x05, 0x41, 0x50,
- 0x54, 0x15, 0x0f, 0x35, 0x00, 0x0a, 0xb8, 0x53,
- 0x78, 0x54, 0x15, 0x05, 0x41, 0x50, 0x54, 0x50,
- 0x6a, 0x34, 0x85, 0x08, 0x55, 0x82, 0xa5, 0xa4,
- 0xa8, 0x2a, 0x0a, 0x82, 0xa0, 0xa8, 0xd8, 0xd4,
- 0x52, 0x14, 0x00, 0xad, 0x42, 0xa0, 0xa8, 0x2a,
- 0x0a, 0x9f, 0x59, 0x41, 0x5c, 0x2a, 0x0a, 0x87,
- 0x9e, 0x72, 0x05, 0x58, 0x2b, 0x82, 0x80, 0x4d,
- 0x24, 0x2a, 0x0a, 0x82, 0xa0, 0xa8, 0x2a, 0x1e,
- 0x6a, 0x29, 0x0a, 0xf0, 0x53, 0x60, 0xa8, 0x2a,
- 0x0a, 0x82, 0xa0, 0xa8, 0x79, 0xa8, 0xd8, 0x2a,
- 0xc1, 0x5f, 0x0a, 0x95, 0x8a, 0x82, 0xa0, 0xa9,
- 0x3c, 0xa8, 0x2a, 0x92, 0xc2, 0x0a, 0x82, 0xa0,
- 0xa8, 0x2a, 0x28, 0x3e, 0x67, 0x85, 0x69, 0x1a,
- 0x41, 0xa6, 0x82, 0x80, 0x15, 0x70, 0xa9, 0x61,
- 0x50, 0x54, 0x15, 0x27, 0x95, 0x05, 0x52, 0x58,
- 0x41, 0x50, 0x54, 0x29, 0xe9, 0x3c, 0x2b, 0xc3,
- 0x42, 0x34, 0xc0, 0xa8, 0x2a, 0x0a, 0x82, 0xa0,
- 0xa8, 0x2a, 0x14, 0xd9, 0x52, 0x14, 0x21, 0x4c,
- 0x0a, 0xf8, 0x54, 0x15, 0x05, 0x41, 0x50, 0x25,
- 0xf5, 0x42, 0xae, 0x15, 0x05, 0x41, 0x50, 0x54,
- 0x30, 0xbe, 0xf8, 0x55, 0xc2, 0xa4, 0xc2, 0xa0,
- 0xa8, 0x2a, 0x00, 0x5a, 0x6a, 0x15, 0x05, 0x41,
- 0x50, 0x54, 0x15, 0x0a, 0x6a, 0x1a, 0x0a, 0xb0,
- 0x56, 0xa1, 0x50, 0xab, 0xf5, 0xb4, 0x39, 0x3c,
- 0xf7, 0x62, 0x9c, 0x5c, 0x46, 0xda, 0x52, 0x3c,
- 0xcd, 0xbb, 0x3d, 0x68, 0xe8, 0x61, 0x18, 0xc4,
- 0x7b, 0x1b, 0xf3, 0x30, 0x0f, 0x3e, 0xed, 0x56,
- 0x6b, 0xb0, 0xea, 0xf2, 0xd9, 0x94, 0x29, 0x5b,
- 0x85, 0xbb, 0xc9, 0x1b, 0xd2, 0x67, 0xcf, 0xfa,
- 0xe5, 0x4a, 0x72, 0x6a, 0xf3, 0xbc, 0xac, 0x2a,
- 0x7b, 0xc9, 0xc2, 0x74, 0xef, 0x6d, 0x87, 0x4e,
- 0x5d, 0xee, 0xa5, 0x11, 0xe2, 0x73, 0x61, 0xbb,
- 0x8f, 0xcf, 0xeb, 0x78, 0x3b, 0x0a, 0xd0, 0x74,
- 0x52, 0x88, 0x46, 0x94, 0x26, 0x02, 0x9d, 0x3f,
- 0x0f, 0x7f, 0x7a, 0x80, 0xe9, 0xb8, 0x4e, 0x97,
- 0x8e, 0x42, 0xd2, 0x48, 0x74, 0x98, 0x74, 0xec,
- 0xdc, 0x77, 0x91, 0x26, 0x22, 0xb6, 0x41, 0xe1,
- 0xed, 0xe1, 0xf3, 0xff, 0xed, 0x57, 0x47, 0x08,
- 0xf0, 0x15, 0xc1, 0x08, 0x4e, 0x87, 0xb3, 0x66,
- 0xf6, 0x85, 0x02, 0x16, 0x7a, 0x14, 0x2d, 0x12,
- 0x75, 0x2a, 0x7f, 0xf0, 0xb8, 0xba, 0xf4, 0xfe,
- 0x5f, 0xdf, 0xbf, 0xae, 0x1d, 0x3f, 0x3f, 0xfe,
- 0x7d, 0xb0, 0xe9, 0xf5, 0x1e, 0x15, 0x79, 0xd0,
- 0x27, 0xa9, 0xf2, 0xd9, 0xff, 0x59, 0x44, 0x1f,
- 0xc0, 0xf0, 0x0e, 0x9d, 0x98, 0xd1, 0xd2, 0xcb,
- 0x1e, 0xb8, 0x0f, 0x27, 0x98, 0xb9, 0x41, 0xd3,
- 0xec, 0x6d, 0xf5, 0xa4, 0xe8, 0xf1, 0xe5, 0x54,
- 0x86, 0x79, 0x7f, 0x74, 0x3a, 0x4b, 0x89, 0x95,
- 0xfd, 0xe2, 0xee, 0x3b, 0x84, 0x53, 0xda, 0xf0,
- 0xbc, 0xe9, 0xe5, 0xd5, 0xbb, 0xa9, 0x53, 0xe7,
- 0xb8, 0x21, 0x09, 0xd1, 0xf3, 0xcf, 0xd4, 0x9e,
- 0x36, 0x44, 0x9e, 0x38, 0x43, 0x15, 0x56, 0x02,
- 0x3b, 0x1d, 0x61, 0xb1, 0x3f, 0x0e, 0xa0, 0xcf,
- 0xa1, 0xd3, 0xfd, 0x47, 0xf1, 0xf6, 0xc0, 0x54,
- 0xe9, 0xed, 0xb6, 0x56, 0xc7, 0x4f, 0xff, 0x96,
- 0xca, 0xc4, 0x5b, 0xe0, 0xa7, 0x72, 0x1a, 0x2f,
- 0x89, 0xfc, 0x1e, 0xbd, 0x57, 0x28, 0x3a, 0x7f,
- 0xfe, 0xcb, 0xef, 0x7a, 0xb6, 0xf7, 0xc0, 0x3e,
- 0x56, 0x61, 0x53, 0x5f, 0x0e, 0x9f, 0x0f, 0xa8,
- 0xe6, 0x1a, 0x61, 0x39, 0xeb, 0xea, 0xbc, 0x69,
- 0x84, 0xe6, 0x02, 0x9a, 0x81, 0x39, 0xfd, 0xfe,
- 0xd3, 0x75, 0x10, 0x1a, 0x81, 0x39, 0xfd, 0x5c,
- 0xb7, 0xab, 0xad, 0x06, 0x98, 0x4e, 0x6c, 0xd8,
- 0xd3, 0x09, 0xcc, 0x10, 0x9e, 0x61, 0x38, 0xc4,
- 0xd3, 0x29, 0x34, 0xf1, 0x73, 0x08, 0xaa, 0x80,
- 0xd9, 0x08, 0x24, 0x72, 0xb9, 0x66, 0x13, 0x38,
- 0xf9, 0xe5, 0xea, 0x53, 0xf7, 0x0c, 0x79, 0x11,
- 0x55, 0x50, 0xb7, 0x94, 0xa9, 0x0a, 0xae, 0x73,
- 0x63, 0x94, 0x25, 0xb2, 0xdd, 0xe5, 0x5b, 0xcf,
- 0xb6, 0xc1, 0xf6, 0x93, 0xa7, 0xdf, 0xcd, 0xf8,
- 0xd1, 0xd3, 0xfd, 0x6e, 0x65, 0xbc, 0xb4, 0xbc,
- 0xe9, 0xfb, 0x7f, 0xdf, 0xb9, 0xd4, 0x1d, 0x1e,
- 0x3e, 0xc0, 0x1c, 0xc7, 0xd1, 0x6f, 0x78, 0x4a,
- 0xc2, 0xae, 0x91, 0x64, 0xbc, 0x8f, 0x29, 0x74,
- 0x38, 0x27, 0xff, 0x32, 0xf5, 0xf7, 0xe9, 0x7d,
- 0xfd, 0x5f, 0x1d, 0x3f, 0xff, 0xbf, 0x94, 0xe5,
- 0x7b, 0xf6, 0xf2, 0xde, 0xda, 0xf3, 0x0e, 0x9f,
- 0xbf, 0xab, 0x3d, 0x65, 0x3a, 0x7f, 0xfd, 0xdf,
- 0xbf, 0x75, 0xbe, 0xb7, 0xa8, 0x72, 0xc7, 0x4e,
- 0x1a, 0xd4, 0xf1, 0x01, 0xcf, 0xff, 0x6f, 0x15,
- 0xb2, 0xe8, 0xc1, 0x4e, 0xe4, 0x34, 0x40, 0x6e,
- 0x35, 0x10, 0x04, 0x72, 0xdd, 0xee, 0x31, 0x33,
- 0x6f, 0x46, 0x27, 0x3f, 0xff, 0xb9, 0xf9, 0x5f,
- 0x08, 0xf9, 0x9b, 0xef, 0x6c, 0x0d, 0xce, 0x9f,
- 0xff, 0xee, 0x7e, 0x7d, 0xa7, 0xe5, 0x2f, 0xde,
- 0xa0, 0x70, 0x42, 0x12, 0xa2, 0xc8, 0xcb, 0xfb,
- 0x0c, 0xfe, 0x5c, 0x14, 0xee, 0x43, 0x44, 0x13,
- 0x3f, 0xcb, 0x7c, 0x14, 0xee, 0x43, 0x45, 0xf3,
- 0x3e, 0xf3, 0x6f, 0xe5, 0x76, 0x3f, 0xa4, 0x3a,
- 0x9f, 0xf5, 0x1d, 0x4e, 0xe6, 0x5f, 0xfc, 0xd8,
- 0xe9, 0xc1, 0x08, 0x4a, 0x9f, 0xaf, 0x6c, 0x4e,
- 0x12, 0x9c, 0x5e, 0x45, 0x08, 0x99, 0xfb, 0x04,
- 0xff, 0xd4, 0x31, 0x69, 0xaf, 0xf2, 0x8d, 0xef,
- 0x3a, 0x7f, 0xfb, 0x7d, 0x3f, 0xd0, 0x96, 0xf0,
- 0x00, 0xa2, 0xf3, 0xa7, 0x04, 0x21, 0x2a, 0x7f,
- 0x6f, 0x02, 0xff, 0x29, 0xb9, 0x4e, 0x2f, 0x27,
- 0xff, 0xe6, 0xef, 0x42, 0x5b, 0xdb, 0x6d, 0x81,
- 0xd1, 0x7a, 0xe5, 0x07, 0x4b, 0xac, 0x8a, 0xbd,
- 0x51, 0x21, 0xea, 0xa2, 0xfd, 0x0d, 0xa1, 0x24,
- 0x62, 0x4d, 0xe3, 0x1b, 0x9f, 0x5b, 0x2e, 0xd3,
- 0xce, 0x9f, 0xf6, 0x5d, 0x46, 0xb6, 0x5f, 0xdc,
- 0xf1, 0x04, 0x4f, 0xe5, 0xc1, 0x4e, 0xe4, 0x34,
- 0x41, 0x0e, 0x3c, 0x99, 0xfb, 0xac, 0x23, 0xe0,
- 0x9d, 0x3f, 0x6e, 0xf6, 0x0f, 0x7d, 0xe7, 0x47,
- 0xcf, 0x77, 0x52, 0xb8, 0xb2, 0x67, 0x80, 0x71,
- 0xfc, 0x2a, 0x27, 0xf9, 0x7f, 0x7d, 0xf9, 0x6e,
- 0xa4, 0xe9, 0xff, 0xee, 0x0d, 0xf2, 0xcb, 0xeb,
- 0xff, 0x2d, 0xe3, 0xa1, 0xe8, 0x88, 0xf9, 0xd4,
- 0xfe, 0xbe, 0xf6, 0x54, 0x3d, 0x49, 0xd3, 0xde,
- 0x6b, 0xc1, 0x3a, 0x7f, 0xfd, 0xad, 0x1f, 0x5c,
- 0xb3, 0x96, 0xf9, 0x6d, 0x44, 0xe9, 0xf6, 0x5e,
- 0xbb, 0xeb, 0xb1, 0xfc, 0xef, 0x23, 0x9f, 0x92,
- 0xde, 0xdc, 0xf6, 0x93, 0xa7, 0xe6, 0x2e, 0xee,
- 0xd9, 0x41, 0xd3, 0xff, 0xff, 0xde, 0xbf, 0x33,
- 0xbe, 0x07, 0xfa, 0xba, 0xb2, 0xde, 0x5b, 0xdb,
- 0x5e, 0x61, 0xd1, 0xb2, 0x38, 0xfc, 0x65, 0xc6,
- 0x33, 0x87, 0x7d, 0x4e, 0x9f, 0xf7, 0x7d, 0x30,
- 0x53, 0xb9, 0x0d, 0x10, 0x8c, 0x29, 0xf1, 0x6a,
- 0x3b, 0x3f, 0xf9, 0x72, 0x9d, 0xf7, 0xf7, 0xf5,
- 0x7e, 0x54, 0xe9, 0xff, 0xee, 0xea, 0x37, 0xe5,
- 0xb9, 0x8e, 0x08, 0x42, 0x74, 0xb3, 0x64, 0x4f,
- 0x34, 0x9b, 0x38, 0x21, 0x09, 0x53, 0xfd, 0x80,
- 0xe1, 0xc6, 0xd9, 0xb1, 0x4e, 0x2f, 0x26, 0x08,
- 0x4a, 0x9c, 0x10, 0x84, 0xa9, 0xfb, 0xa8, 0xda,
- 0xcb, 0x52, 0x9c, 0x5e, 0x47, 0xd1, 0x6c, 0x14,
- 0x7d, 0xc3, 0x29, 0xf2, 0x7b, 0x6d, 0xec, 0x29,
- 0xc6, 0xce, 0x70, 0x42, 0x12, 0xa7, 0x55, 0x44,
- 0xa7, 0x17, 0x92, 0x07, 0x8f, 0xfe, 0xea, 0xd3,
- 0xf6, 0xdf, 0x57, 0xf2, 0x1d, 0x3f, 0xb7, 0x8e,
- 0xde, 0x6c, 0xbb, 0x1d, 0x3f, 0xaf, 0x6c, 0x6d,
- 0x97, 0xa9, 0xd0, 0x28, 0x98, 0xb1, 0x67, 0xce,
- 0x21, 0x51, 0xdf, 0x90, 0xc0, 0x9d, 0x4e, 0xeb,
- 0x9b, 0xa9, 0xd3, 0xff, 0xb3, 0x77, 0xdf, 0x06,
- 0x22, 0xd9, 0x58, 0x74, 0xfc, 0x9e, 0xad, 0xbc,
- 0xd1, 0x53, 0xfb, 0xf9, 0x4b, 0xeb, 0xed, 0x27,
- 0x4f, 0x77, 0x0e, 0x93, 0xa3, 0x41, 0xeb, 0xd0,
- 0x6d, 0x3c, 0xbc, 0xc6, 0xc5, 0x4e, 0x08, 0x42,
- 0x54, 0xff, 0xf6, 0xf5, 0x06, 0x67, 0xef, 0x6f,
- 0x2f, 0xe8, 0x29, 0xc5, 0xe4, 0xb1, 0x11, 0x3c,
- 0xc3, 0xe8, 0x54, 0xf9, 0x1e, 0x57, 0x4a, 0x57,
- 0xa1, 0x0b, 0x68, 0x61, 0xcf, 0xff, 0x99, 0x88,
- 0xbf, 0xeb, 0xd7, 0x6d, 0x78, 0x5e, 0x74, 0xf9,
- 0x6f, 0x56, 0xd8, 0x74, 0x29, 0xfe, 0x5d, 0x52,
- 0x7f, 0xfb, 0xcd, 0xb3, 0xfb, 0x7f, 0x83, 0x9f,
- 0xed, 0x27, 0x4f, 0xff, 0xf6, 0xd6, 0xf0, 0x71,
- 0xbf, 0xcc, 0xeb, 0xd7, 0x57, 0xe5, 0x37, 0x3a,
- 0x31, 0x18, 0x1c, 0xa7, 0x0a, 0xd9, 0x0a, 0xd0,
- 0x9a, 0xf8, 0xe5, 0xf6, 0x87, 0xa6, 0x4b, 0x28,
- 0xf4, 0x72, 0x4d, 0x42, 0xf8, 0x48, 0xd9, 0x0a,
- 0xfb, 0x46, 0x4e, 0x08, 0x49, 0x7e, 0x18, 0x15,
- 0x95, 0x3b, 0x79, 0x41, 0x5a, 0xc3, 0x44, 0x30,
- 0xe1, 0x9c, 0xd9, 0x7e, 0x74, 0xff, 0xf6, 0x7d,
- 0xd7, 0xd3, 0xea, 0x6b, 0x6c, 0x07, 0x1d, 0x2a,
- 0x5e, 0x7d, 0xfb, 0x0e, 0xcf, 0xd6, 0x6b, 0xd6,
- 0xf3, 0x0e, 0x9f, 0xf7, 0xd6, 0xf6, 0xe0, 0x75,
- 0x35, 0x3a, 0x73, 0x5a, 0x89, 0xd3, 0xfe, 0xef,
- 0x0e, 0x52, 0xe0, 0x84, 0x27, 0x47, 0x1e, 0xdd,
- 0x47, 0x67, 0xff, 0xbe, 0xaf, 0xd1, 0xbe, 0xfe,
- 0xfe, 0xaf, 0xca, 0x9d, 0x18, 0x99, 0xf2, 0x17,
- 0xda, 0x13, 0x20, 0x21, 0x9f, 0xcb, 0xf7, 0xff,
- 0x30, 0x07, 0x4f, 0xe7, 0xe0, 0xd7, 0xeb, 0x41,
- 0xd3, 0xff, 0xca, 0xd9, 0x45, 0xdb, 0xef, 0xfc,
- 0xa3, 0xc2, 0x7b, 0xbd, 0xe7, 0xff, 0xb2, 0xeb,
- 0xf4, 0xcb, 0xdb, 0xc2, 0x04, 0x3a, 0x7d, 0xd5,
- 0xcf, 0xdc, 0xe9, 0xd7, 0xed, 0xd9, 0xd3, 0xfa,
- 0xf6, 0xf3, 0x81, 0xde, 0x3a, 0x28, 0x4c, 0x8f,
- 0x65, 0xff, 0xa6, 0x5c, 0x9b, 0x51, 0xf9, 0xfd,
- 0xa8, 0x16, 0xde, 0xe7, 0x9d, 0x3f, 0xff, 0x7f,
- 0x2b, 0xae, 0x8c, 0xb7, 0x7f, 0x1a, 0x7a, 0xd2,
- 0x74, 0xff, 0xb2, 0xba, 0xe0, 0xa7, 0x72, 0x1a,
- 0x20, 0x69, 0xf6, 0x5e, 0xdc, 0xfd, 0x08, 0xa5,
- 0xfa, 0xf4, 0xff, 0xff, 0xfd, 0x97, 0xb7, 0x7f,
- 0x4e, 0x8a, 0x8f, 0x75, 0xdb, 0x66, 0xda, 0x31,
- 0x9d, 0xfa, 0x5e, 0x78, 0x82, 0xe7, 0xfd, 0xdd,
- 0xa5, 0x3b, 0x6d, 0x1a, 0x42, 0x78, 0x82, 0xe7,
- 0xfe, 0xb7, 0xad, 0xe5, 0xfd, 0xf4, 0x69, 0x09,
- 0xe2, 0x0b, 0x9f, 0xcb, 0xef, 0xdf, 0x46, 0x90,
- 0x9e, 0x20, 0xb9, 0xf9, 0x99, 0xb6, 0x8d, 0x21,
- 0x3c, 0x41, 0x73, 0xff, 0xfd, 0xdf, 0xff, 0x99,
- 0xa2, 0xa9, 0x6f, 0x0f, 0xb4, 0xd1, 0x81, 0x3c,
- 0x41, 0x73, 0x53, 0xa3, 0x64, 0xe8, 0x51, 0x40,
- 0x55, 0xb9, 0x13, 0xe7, 0xf1, 0x65, 0x52, 0xdf,
- 0x94, 0x7d, 0x3d, 0xc2, 0x0e, 0x3a, 0x7f, 0xeb,
- 0x7a, 0xde, 0x5f, 0xdf, 0x46, 0x90, 0x9e, 0x20,
- 0xb9, 0xfe, 0x6a, 0xa9, 0xea, 0x34, 0x69, 0x09,
- 0xe2, 0x0b, 0x9f, 0x5e, 0xaa, 0xcd, 0x08, 0x8a,
- 0x2d, 0xea, 0xd3, 0xff, 0xb4, 0x25, 0xbc, 0x8b,
- 0x7a, 0xe8, 0xd2, 0x13, 0xc4, 0x17, 0x3f, 0xff,
- 0xf7, 0xff, 0xe6, 0x68, 0xd7, 0x34, 0x55, 0x2d,
- 0xe1, 0xf6, 0x9a, 0x30, 0x27, 0x88, 0x2e, 0x31,
- 0x32, 0x6a, 0x50, 0xf9, 0x72, 0x7f, 0xad, 0xe1,
- 0xf6, 0x9a, 0x30, 0x27, 0x88, 0x2e, 0x7f, 0xfb,
- 0xba, 0x97, 0xd6, 0xde, 0xdb, 0x65, 0x15, 0x2a,
- 0x7f, 0xd8, 0xf7, 0xeb, 0x51, 0xfd, 0x1b, 0x87,
- 0x88, 0x2e, 0x11, 0x1d, 0x02, 0x91, 0x55, 0x09,
- 0xff, 0x27, 0x86, 0xfc, 0x0a, 0xe8, 0x09, 0xe2,
- 0x0b, 0x9f, 0xad, 0xeb, 0x5b, 0xc0, 0x34, 0x01,
- 0x73, 0xec, 0x06, 0x8d, 0x21, 0x3c, 0x41, 0x73,
- 0x65, 0xd0, 0xfc, 0xec, 0x77, 0x14, 0xa3, 0xae,
- 0xb0, 0xbf, 0x9f, 0x99, 0x9b, 0x68, 0xd2, 0x13,
- 0xc4, 0x17, 0x3f, 0xe4, 0xb7, 0x87, 0xda, 0x68,
- 0xc0, 0x9e, 0x20, 0xb9, 0xb3, 0x47, 0x22, 0x32,
- 0xa7, 0xf3, 0xfb, 0x5f, 0x33, 0xbf, 0x4b, 0xcf,
- 0x10, 0x5c, 0xff, 0xb3, 0xcd, 0xb3, 0xf9, 0xb7,
- 0x3c, 0xf1, 0x05, 0xb0, 0xf0, 0xa3, 0x65, 0xdc,
- 0x70, 0x16, 0x7e, 0x3e, 0x7a, 0xc6, 0x31, 0x78,
- 0xc6, 0x75, 0x85, 0xa8, 0x5c, 0x67, 0xc0, 0xa8,
- 0x00, 0xa6, 0x88, 0x2d, 0xc8, 0x80, 0x9f, 0xf6,
- 0x3e, 0xdc, 0xf6, 0xf6, 0xfd, 0x68, 0x3a, 0x7f,
- 0x0f, 0xf3, 0x6b, 0x6a, 0x13, 0xa7, 0xd4, 0xdf,
- 0x84, 0x07, 0x4f, 0xd9, 0x47, 0x59, 0x77, 0x67,
- 0x47, 0x91, 0x17, 0xc6, 0x9f, 0x27, 0x9d, 0xc3,
- 0x41, 0xd3, 0x01, 0x4e, 0x9e, 0xf2, 0xb3, 0x0e,
- 0x83, 0xa7, 0xee, 0xd3, 0x75, 0x10, 0x1d, 0x1b,
- 0x1b, 0x7f, 0x85, 0x4f, 0xff, 0xe5, 0xf6, 0xdf,
- 0x5d, 0x52, 0xf8, 0x9b, 0x2a, 0x6f, 0x61, 0xd3,
- 0x01, 0x4e, 0x99, 0x74, 0x9d, 0x3f, 0xd9, 0x7a,
- 0xab, 0x37, 0xe3, 0x47, 0x4f, 0xea, 0xe5, 0xbd,
- 0x5d, 0x68, 0x3a, 0x60, 0x84, 0xa9, 0xfe, 0xfe,
- 0x36, 0xe7, 0xd7, 0xdb, 0x1d, 0x08, 0x9f, 0xbf,
- 0x86, 0xc4, 0x55, 0x8a, 0xf6, 0x22, 0x03, 0x13,
- 0x76, 0x2b, 0xf1, 0x7a, 0x9d, 0x04, 0xd7, 0x78,
- 0xb4, 0xe0, 0x84, 0x25, 0x49, 0x85, 0x38, 0xbc,
- 0x9f, 0x73, 0x5d, 0xc2, 0x53, 0x91, 0xb3, 0xbe,
- 0x17, 0x53, 0xfa, 0x9b, 0xae, 0x5b, 0x28, 0x3a,
- 0x15, 0xb2, 0x07, 0xc8, 0xda, 0x34, 0xa0, 0xd2,
- 0x63, 0xe8, 0xd5, 0x45, 0x3a, 0xd0, 0xd8, 0xea,
- 0x48, 0xf7, 0xd1, 0xab, 0x0d, 0x1d, 0x65, 0x7f,
- 0xb6, 0x4b, 0x9e, 0xc4, 0x5b, 0x9d, 0x3d, 0x8c,
- 0xcb, 0x9d, 0x3d, 0xd4, 0x6f, 0x79, 0xd0, 0xa7,
- 0xc7, 0x48, 0xfb, 0x79, 0x04, 0xfd, 0xfd, 0x76,
- 0x67, 0x3c, 0xe9, 0xff, 0xea, 0x5f, 0xf5, 0xd0,
- 0xcf, 0xae, 0x9b, 0xfa, 0x83, 0xa7, 0xf5, 0x6e,
- 0xdb, 0x3f, 0x9b, 0x1d, 0x0a, 0x8b, 0xaf, 0x17,
- 0xf2, 0xb4, 0xee, 0xd1, 0xbc, 0xe9, 0xff, 0xef,
- 0xbf, 0x46, 0x6d, 0xea, 0xd3, 0x7d, 0x7a, 0xa7,
- 0x46, 0x83, 0xf4, 0xc1, 0xf9, 0xfa, 0x86, 0x9e,
- 0xdc, 0x1a, 0x0e, 0x99, 0xf4, 0x1d, 0x3e, 0xb6,
- 0x79, 0xf5, 0x3a, 0x7f, 0xfa, 0xcb, 0xbd, 0xd7,
- 0xff, 0x02, 0xb5, 0x50, 0x15, 0x3f, 0x81, 0x82,
- 0x9d, 0xc8, 0x78, 0x81, 0x21, 0xe8, 0xb3, 0xd8,
- 0x9c, 0x54, 0x66, 0x6f, 0x79, 0xd3, 0xd7, 0xa3,
- 0xbe, 0x74, 0xf5, 0x35, 0xeb, 0x9d, 0x14, 0x1e,
- 0xee, 0x0c, 0xd8, 0x8a, 0x7f, 0x7f, 0x83, 0x5a,
- 0xa8, 0x0e, 0x9c, 0x10, 0x84, 0xf8, 0x7d, 0x4e,
- 0xef, 0xec, 0x5c, 0x3e, 0x8e, 0x35, 0x31, 0xb2,
- 0x25, 0x40, 0xb7, 0x3f, 0xfe, 0xcf, 0xfb, 0x4b,
- 0xab, 0x7b, 0x6b, 0xcf, 0x7a, 0x9d, 0x14, 0x1f,
- 0xe6, 0x92, 0x48, 0xdd, 0x4a, 0xbc, 0x1e, 0x69,
- 0x90, 0xca, 0xf4, 0x23, 0x7a, 0x34, 0x09, 0xf7,
- 0xae, 0xb7, 0xa9, 0x53, 0xc8, 0xb7, 0xa9, 0x53,
- 0x04, 0x25, 0x43, 0xcf, 0x77, 0x09, 0xc2, 0x41,
- 0x36, 0x04, 0xa7, 0x1a, 0xe9, 0xff, 0xf6, 0x5d,
- 0x53, 0x33, 0xf7, 0xb7, 0x97, 0xf4, 0x1d, 0x00,
- 0x3f, 0x80, 0x92, 0xcf, 0xff, 0xe5, 0x6d, 0xef,
- 0x83, 0x45, 0xeb, 0x89, 0x6e, 0xfd, 0xea, 0x74,
- 0xfe, 0x6a, 0x97, 0xdb, 0x55, 0x13, 0xa7, 0x3f,
- 0x84, 0xe9, 0xf3, 0xf2, 0xf9, 0xb1, 0x52, 0xf3,
- 0x47, 0x83, 0x71, 0xa9, 0x80, 0xa7, 0x4c, 0x05,
- 0x3a, 0x7e, 0xfe, 0xaf, 0xcf, 0xbb, 0xc6, 0xa8,
- 0x02, 0xb3, 0xff, 0x5e, 0xd8, 0xcd, 0xea, 0x0c,
- 0xa6, 0xe7, 0x4f, 0xea, 0x53, 0xc3, 0xbd, 0x76,
- 0x3a, 0x78, 0x0c, 0xe7, 0xd4, 0xfe, 0xee, 0x8d,
- 0x3b, 0x73, 0x29, 0x3a, 0x14, 0xf6, 0x38, 0xe6,
- 0x7a, 0xba, 0xd3, 0x73, 0xa7, 0x04, 0x21, 0x2a,
- 0x7d, 0x9a, 0x7f, 0xad, 0x4a, 0x71, 0x79, 0x3e,
- 0xc7, 0x04, 0x21, 0x3a, 0x14, 0xf8, 0x2e, 0x73,
- 0x3c, 0x1e, 0xfb, 0xce, 0x99, 0x2c, 0x74, 0xe0,
- 0x84, 0x25, 0x4f, 0xde, 0xed, 0x36, 0xf5, 0xca,
- 0x71, 0x79, 0x3e, 0xc0, 0x66, 0x34, 0x74, 0xab,
- 0xa1, 0x12, 0xa2, 0x63, 0xf3, 0xe9, 0xef, 0x7f,
- 0x57, 0xec, 0x8e, 0xdc, 0x85, 0xb4, 0x2a, 0xe3,
- 0xb3, 0xc8, 0xb1, 0x93, 0x4b, 0xb0, 0xa9, 0xda,
- 0x31, 0x8e, 0x20, 0xac, 0x28, 0x2f, 0x18, 0x74,
- 0xfc, 0xac, 0x11, 0xeb, 0x9d, 0x3f, 0xfd, 0xe6,
- 0x52, 0xfa, 0xe8, 0xcf, 0xff, 0x3c, 0x03, 0xa2,
- 0xc7, 0xfb, 0x72, 0xa9, 0x39, 0xba, 0x42, 0x19,
- 0xe5, 0x65, 0x76, 0xd1, 0x19, 0x1b, 0xe5, 0x26,
- 0xed, 0x2c, 0x07, 0x2b, 0x74, 0xad, 0x31, 0xb8,
- 0xa4, 0x76, 0x54, 0xca, 0xa7, 0xf4, 0x27, 0x5a,
- 0x9e, 0x7f, 0x19, 0xd3, 0x56, 0x4a, 0x0b, 0xb4,
- 0xf8, 0x57, 0x53, 0xcb, 0x41, 0x2c, 0xe7, 0xf3,
- 0xac, 0x15, 0xac, 0x97, 0xaf, 0x59, 0xcf, 0xeb,
- 0x19, 0xab, 0x68, 0x76, 0x06, 0x14, 0x5b, 0x92,
- 0xc4, 0xf7, 0xce, 0xec, 0xb7, 0xc6, 0x1b, 0x0e,
- 0x84, 0x47, 0x03, 0xf1, 0x0d, 0x8b, 0x3f, 0x9d,
- 0x82, 0x9d, 0xc8, 0x68, 0xb8, 0xe7, 0xf3, 0xb0,
- 0x53, 0xb9, 0x0d, 0x17, 0x5c, 0xff, 0xce, 0xe7,
- 0xbb, 0x05, 0x3b, 0x90, 0xd1, 0x28, 0xc2, 0xc2,
- 0x30, 0xd5, 0xe5, 0x1b, 0x1d, 0xe9, 0x3b, 0x43,
- 0xbf, 0x43, 0xc3, 0x76, 0x81, 0xd8, 0x89, 0x32,
- 0xa9, 0xc5, 0xce, 0xdb, 0xce, 0xe7, 0xff, 0x39,
- 0x9c, 0xf7, 0x60, 0xa7, 0x72, 0x1a, 0x25, 0xa9,
- 0xf0, 0xa7, 0x72, 0x1a, 0x23, 0x79, 0xff, 0x73,
- 0xdd, 0x82, 0x9d, 0xc8, 0x68, 0x97, 0xe4, 0xec,
- 0x3f, 0x66, 0x18, 0x4f, 0xe7, 0x60, 0xa7, 0x72,
- 0x1a, 0x2a, 0xb9, 0xfe, 0xd3, 0x9f, 0xca, 0x6f,
- 0xcc, 0x3a, 0x6d, 0xbc, 0x74, 0xfd, 0x82, 0x9d,
- 0xc8, 0x68, 0x90, 0x23, 0x41, 0xe6, 0x38, 0x5e,
- 0x7d, 0x5e, 0xff, 0x52, 0x74, 0x3c, 0xf2, 0xe9,
- 0x24, 0x8d, 0x28, 0xf4, 0xe8, 0x68, 0xcf, 0xfd,
- 0xfc, 0xa1, 0xdb, 0x8b, 0xff, 0xe5, 0xce, 0x87,
- 0x1f, 0x80, 0x94, 0xcf, 0xe7, 0x60, 0xa7, 0x72,
- 0x1a, 0x2c, 0x89, 0xfc, 0xec, 0x14, 0xee, 0x43,
- 0x45, 0xaf, 0x3f, 0x9d, 0x82, 0x9d, 0xc8, 0x68,
- 0xb9, 0x27, 0xc2, 0x9d, 0xc8, 0x68, 0xbb, 0x27,
- 0xfd, 0xcf, 0x76, 0x0a, 0x77, 0x21, 0xa2, 0x8e,
- 0x93, 0xb0, 0xfd, 0x98, 0x61, 0x3e, 0x14, 0xee,
- 0x43, 0x45, 0x2b, 0x3f, 0xff, 0xfd, 0x65, 0xa1,
- 0x6d, 0xe6, 0xdd, 0xb5, 0xbc, 0xe4, 0xb7, 0x9a,
- 0xb2, 0xd1, 0x87, 0x4f, 0x9c, 0xce, 0x7b, 0xb1,
- 0x16, 0x4d, 0x18, 0x45, 0x0b, 0x9d, 0xef, 0x86,
- 0x45, 0x24, 0xfe, 0x8e, 0x7d, 0x84, 0x20, 0x3b,
- 0xa9, 0xdd, 0xe1, 0x62, 0xda, 0x1b, 0x33, 0xfc,
- 0xf7, 0x60, 0xa7, 0x72, 0x1a, 0x23, 0x89, 0xfe,
- 0xf3, 0xb0, 0x53, 0xb9, 0x0d, 0x15, 0xac, 0x9d,
- 0xc8, 0x82, 0xba, 0x0c, 0xff, 0xe7, 0x33, 0x9e,
- 0xec, 0x14, 0xee, 0x43, 0x44, 0xb7, 0x36, 0x52,
- 0x74, 0xfe, 0xdb, 0x18, 0xc5, 0xf5, 0x4e, 0x8a,
- 0x4f, 0x27, 0xc2, 0xd3, 0xad, 0xb3, 0xce, 0x9c,
- 0xf6, 0x21, 0xd3, 0xff, 0xf5, 0xba, 0x90, 0x6d,
- 0x6e, 0x7e, 0x57, 0xfa, 0xf6, 0xf3, 0xa0, 0xd1,
- 0x0d, 0xcf, 0xfb, 0x9e, 0xec, 0x14, 0xee, 0x43,
- 0x44, 0xc1, 0x38, 0x75, 0x01, 0x53, 0xfb, 0xf9,
- 0x7b, 0xa8, 0xd4, 0xe9, 0x39, 0x53, 0x64, 0xa0,
- 0x8f, 0x61, 0xdc, 0x1b, 0x45, 0xf6, 0x0b, 0xdd,
- 0x1b, 0x78, 0xe4, 0xe6, 0x6a, 0x25, 0x4f, 0xfb,
- 0x9e, 0xec, 0x14, 0xee, 0x43, 0x44, 0xc7, 0x27,
- 0x78, 0xf8, 0x98, 0x39, 0x3f, 0x2d, 0x74, 0x5f,
- 0x2c, 0x74, 0xff, 0xff, 0xf3, 0xeb, 0x6c, 0xd4,
- 0x35, 0xb6, 0x26, 0x57, 0x46, 0x52, 0xfa, 0xfb,
- 0xfe, 0x3a, 0x79, 0x3b, 0x90, 0xd1, 0x58, 0xcf,
- 0xfb, 0x73, 0x2f, 0xfc, 0xd5, 0x7f, 0x73, 0xa3,
- 0x4a, 0x63, 0x74, 0x97, 0x0c, 0x20, 0x6e, 0x57,
- 0x3f, 0xf9, 0x7f, 0x7d, 0x3a, 0xaf, 0xf1, 0x14,
- 0x4e, 0x9f, 0xf6, 0x6d, 0x6c, 0xad, 0x2f, 0x5b,
- 0x1d, 0x3f, 0xec, 0xd8, 0x7d, 0xad, 0x00, 0xab,
- 0xce, 0x9f, 0xff, 0xfb, 0xfa, 0xd1, 0x89, 0xa3,
- 0xfa, 0xb7, 0xe8, 0xca, 0x5f, 0x9a, 0xfc, 0x15,
- 0x3a, 0x7f, 0x6e, 0xaa, 0x1a, 0x7b, 0x70, 0x68,
- 0x3a, 0x75, 0xbc, 0xec, 0x4f, 0x31, 0x11, 0x6c,
- 0x93, 0xf3, 0xfb, 0xa0, 0xee, 0x3f, 0x4d, 0xab,
- 0x47, 0x4f, 0xbb, 0xf4, 0x6b, 0x53, 0xa3, 0xe7,
- 0x83, 0x51, 0x89, 0xe5, 0x1e, 0xf9, 0xd3, 0xd5,
- 0xaa, 0x80, 0xe8, 0xb1, 0xe0, 0x04, 0x7e, 0x7c,
- 0xaf, 0x06, 0xaf, 0x3a, 0x72, 0xfd, 0xe7, 0x43,
- 0x47, 0x87, 0x72, 0x89, 0xf9, 0x59, 0x9f, 0xf6,
- 0x93, 0xa5, 0x53, 0xa3, 0xc6, 0xfb, 0x8b, 0xa6,
- 0x02, 0x95, 0x30, 0x42, 0x54, 0x78, 0xd5, 0x84,
- 0x56, 0x7f, 0x73, 0xff, 0x97, 0xb7, 0x8a, 0x71,
- 0xa1, 0x9e, 0xdb, 0xa9, 0xa9, 0xd3, 0x97, 0xed,
- 0x1d, 0x37, 0xd4, 0xe8, 0x68, 0xd8, 0x88, 0xe4,
- 0xf0, 0x83, 0x1b, 0xce, 0x9d, 0xbc, 0x74, 0x9d,
- 0x0a, 0x8b, 0x7c, 0x54, 0xf1, 0x0d, 0x88, 0xe6,
- 0xb5, 0xce, 0x9c, 0x10, 0x84, 0xa9, 0xff, 0xb1,
- 0x36, 0x5a, 0x37, 0xe5, 0xba, 0x92, 0x9c, 0x5e,
- 0x4f, 0x78, 0x5b, 0xf6, 0x3a, 0x42, 0x74, 0xf9,
- 0x9e, 0xb8, 0x38, 0xe8, 0xa0, 0xf6, 0xf7, 0x64,
- 0xba, 0x87, 0xcf, 0xe4, 0xf5, 0x7f, 0x8d, 0xb8,
- 0xe9, 0xb2, 0xe7, 0x45, 0x27, 0x91, 0x63, 0x39,
- 0xeb, 0xff, 0x1e, 0x74, 0xff, 0xef, 0x56, 0xd9,
- 0xb7, 0xf1, 0xb7, 0xf2, 0xa7, 0x40, 0x9f, 0x6d,
- 0xc8, 0x64, 0xe5, 0x5c, 0xd8, 0xd9, 0x8b, 0x19,
- 0x45, 0x85, 0x8d, 0x96, 0x87, 0xcf, 0x1d, 0xfc,
- 0xca, 0xb0, 0xb0, 0xbb, 0xee, 0xf8, 0x48, 0x4f,
- 0x85, 0x3b, 0x90, 0xd1, 0x5b, 0xcf, 0xfb, 0x9e,
- 0xec, 0x14, 0xee, 0x43, 0x44, 0xe1, 0x27, 0x61,
- 0xfb, 0x30, 0xc2, 0x7c, 0x29, 0xdc, 0x86, 0x8b,
- 0x46, 0x7b, 0x1a, 0xf6, 0x93, 0xa4, 0xec, 0x3d,
- 0x4b, 0x18, 0x4f, 0x27, 0x72, 0x1a, 0x2d, 0xa9,
- 0xfa, 0xca, 0xc5, 0xf6, 0xc7, 0x4c, 0xec, 0x13,
- 0xd8, 0xb9, 0x5c, 0xfe, 0x76, 0x0a, 0x77, 0x21,
- 0xa2, 0xe5, 0x9f, 0xce, 0xc1, 0x4e, 0xe4, 0x34,
- 0x5d, 0xb0, 0xac, 0xe5, 0x6a, 0x0a, 0x1f, 0x1f,
- 0xfe, 0xd0, 0xdb, 0xd3, 0x2c, 0x3f, 0xd3, 0xb0,
- 0x9b, 0xb8, 0xc9, 0x6c, 0xf7, 0xf7, 0xfa, 0x96,
- 0x5c, 0xee, 0x7f, 0x3b, 0x05, 0x3b, 0x90, 0xd1,
- 0x53, 0xcf, 0x27, 0x72, 0x1a, 0x2b, 0x99, 0xfc,
- 0xec, 0x14, 0xee, 0x43, 0x45, 0x9d, 0x02, 0x7c,
- 0xd6, 0x2b, 0x9f, 0x0a, 0x77, 0x21, 0xa2, 0x42,
- 0x9f, 0xef, 0x53, 0x5b, 0xfd, 0x59, 0x53, 0xa6,
- 0x7b, 0xb0, 0xfa, 0x80, 0x61, 0x3c, 0xdd, 0x2c,
- 0xac, 0x3a, 0x7f, 0x65, 0xab, 0x5c, 0x1a, 0x0e,
- 0x93, 0xb1, 0x31, 0x1e, 0x84, 0x5d, 0x4b, 0x6e,
- 0x4f, 0x3f, 0xf9, 0xcc, 0xe7, 0xbb, 0x05, 0x3b,
- 0x90, 0xd1, 0x3e, 0x42, 0x2a, 0x4b, 0xdd, 0xc7,
- 0x65, 0x64, 0x79, 0xf0, 0xa7, 0x72, 0x1a, 0x2b,
- 0x29, 0xff, 0x73, 0xdd, 0x82, 0x9d, 0xc8, 0x68,
- 0x9b, 0xa6, 0xf3, 0xb0, 0xfd, 0x98, 0x61, 0x3e,
- 0x14, 0xee, 0x43, 0x44, 0xad, 0x3f, 0xda, 0x6d,
- 0xed, 0x1a, 0xa6, 0x54, 0xe9, 0xf3, 0x99, 0xcf,
- 0x76, 0x1f, 0x6f, 0x18, 0x4f, 0x85, 0x3b, 0x90,
- 0xd1, 0x2e, 0x4f, 0xf7, 0xb9, 0xf7, 0xfa, 0xb2,
- 0xa7, 0x4f, 0x36, 0xf7, 0xd4, 0xe9, 0xf3, 0x99,
- 0xcf, 0x76, 0x22, 0x2e, 0xc6, 0x1c, 0x71, 0x3f,
- 0xf3, 0xb9, 0xee, 0xc1, 0x4e, 0xe4, 0x34, 0x47,
- 0x73, 0xfd, 0x7b, 0x63, 0xdd, 0xdf, 0xa9, 0xd3,
- 0xf3, 0x73, 0xea, 0x99, 0xf3, 0xa7, 0xed, 0xd3,
- 0xf9, 0x6e, 0xb9, 0xd3, 0xe1, 0x4e, 0xe4, 0x34,
- 0x54, 0x33, 0xec, 0xb5, 0xf2, 0x83, 0xa7, 0xff,
- 0xfb, 0x5e, 0xdd, 0xfa, 0x8b, 0x77, 0xae, 0xb6,
- 0xf5, 0xeb, 0x9b, 0x1d, 0x27, 0x6e, 0x89, 0x92,
- 0x37, 0x0b, 0xf0, 0xc6, 0xe6, 0x1b, 0x84, 0xf3,
- 0xe1, 0x4e, 0xe4, 0x34, 0x55, 0x13, 0xfe, 0xe7,
- 0xbb, 0x05, 0x3b, 0x90, 0xd1, 0x35, 0xc9, 0xd8,
- 0x7e, 0xcc, 0x30, 0x9f, 0xce, 0xc1, 0x4e, 0xe4,
- 0x34, 0x55, 0x93, 0xff, 0x3b, 0x9e, 0xec, 0x14,
- 0xee, 0x43, 0x44, 0x89, 0x3e, 0x14, 0xee, 0x43,
- 0x45, 0xa5, 0x3f, 0xee, 0x7b, 0xb0, 0x53, 0xb9,
- 0x0d, 0x13, 0xec, 0x9d, 0x87, 0xec, 0xc3, 0x09,
- 0xff, 0xce, 0x67, 0x3d, 0xd8, 0x29, 0xdc, 0x86,
- 0x8a, 0x12, 0x7d, 0x6f, 0x50, 0xa2, 0x74, 0xf8,
- 0x53, 0xb9, 0x0d, 0x14, 0x7c, 0xff, 0xfd, 0x9b,
- 0x59, 0x77, 0xba, 0xff, 0xe0, 0x56, 0xaa, 0x02,
- 0xa7, 0xce, 0x67, 0x3d, 0xca, 0x8b, 0x4c, 0x27,
- 0xdc, 0x30, 0x85, 0x5e, 0x2c, 0xa2, 0x19, 0x0f,
- 0x4b, 0xc4, 0xcd, 0x31, 0xae, 0x24, 0x34, 0xa9,
- 0x27, 0x68, 0xee, 0xd0, 0xc2, 0x01, 0x3d, 0xe3,
- 0x06, 0x9f, 0xce, 0xc1, 0x4e, 0xe4, 0x34, 0x44,
- 0x53, 0xf6, 0x0a, 0x77, 0x21, 0xa2, 0x2b, 0x9f,
- 0xed, 0xdb, 0xb0, 0x53, 0xb9, 0x0d, 0x15, 0xc4,
- 0x38, 0xfe, 0xb8, 0xd6, 0x7b, 0x2d, 0xd7, 0x3a,
- 0x7f, 0x67, 0x84, 0x00, 0xd6, 0xa7, 0x4b, 0x74,
- 0xf9, 0xe9, 0xd4, 0x82, 0x7f, 0xee, 0xf3, 0xfd,
- 0xfb, 0xeb, 0x61, 0xc3, 0xa7, 0xd9, 0xed, 0x87,
- 0x0e, 0x9d, 0x7a, 0xfa, 0xc7, 0xd5, 0x74, 0x49,
- 0xf0, 0xa7, 0x72, 0x1a, 0x29, 0xe8, 0x6e, 0x23,
- 0xed, 0x61, 0x2f, 0x86, 0x93, 0xff, 0xb9, 0xee,
- 0xdb, 0xfc, 0x1a, 0xd5, 0x40, 0x74, 0x39, 0x10,
- 0x3b, 0x1b, 0xce, 0x76, 0xd8, 0x74, 0xf9, 0x5e,
- 0x0d, 0x5e, 0x74, 0xf2, 0x77, 0x21, 0xa2, 0xb3,
- 0x86, 0x8f, 0x4c, 0x4a, 0x27, 0xea, 0x18, 0xbf,
- 0x7d, 0x4e, 0x9c, 0xb4, 0x78, 0xe9, 0xf5, 0xc1,
- 0xbf, 0xef, 0x3a, 0x76, 0xbd, 0x53, 0xa7, 0xd8,
- 0xd5, 0x1a, 0x80, 0xe9, 0x3b, 0x11, 0xb8, 0x24,
- 0x56, 0x2e, 0xe1, 0xcf, 0x95, 0x6f, 0x1c, 0x9f,
- 0xf9, 0xdc, 0xf7, 0x60, 0xa7, 0x72, 0x1a, 0x24,
- 0x59, 0xfc, 0xec, 0x14, 0xee, 0x43, 0x45, 0x93,
- 0x3f, 0x9d, 0x82, 0x9d, 0xc8, 0x68, 0xb6, 0x27,
- 0x65, 0x70, 0xe9, 0xf0, 0xa7, 0x72, 0x1a, 0x2d,
- 0xb9, 0x39, 0xe7, 0x95, 0x83, 0x53, 0xfe, 0x6e,
- 0x37, 0x37, 0x5a, 0xf6, 0xcf, 0xa8, 0x0e, 0x9f,
- 0x97, 0xef, 0xdb, 0x56, 0x1d, 0x3e, 0x14, 0xee,
- 0x43, 0x45, 0xe1, 0x3d, 0x7d, 0xcc, 0xb1, 0xd3,
- 0xff, 0x2e, 0xf6, 0x52, 0xfb, 0xe7, 0xef, 0x53,
- 0xa7, 0xd9, 0xf0, 0x37, 0xa9, 0xd3, 0xe5, 0xdf,
- 0xaf, 0x54, 0xe9, 0xd7, 0x50, 0x1d, 0x27, 0x6e,
- 0xbc, 0x9c, 0x25, 0x09, 0xb8, 0x5f, 0x49, 0x85,
- 0x89, 0x00, 0x8f, 0xf2, 0x9b, 0x94, 0xce, 0xf6,
- 0x52, 0x74, 0xf8, 0x53, 0xb9, 0x0d, 0x17, 0xa4,
- 0xff, 0xbf, 0xd7, 0x7a, 0xe9, 0xbf, 0xa8, 0x3a,
- 0x7d, 0x8c, 0xb7, 0x6c, 0x74, 0x9d, 0xb2, 0x2d,
- 0x30, 0x73, 0x79, 0x83, 0x7a, 0x0c, 0x2b, 0x22,
- 0x96, 0x88, 0x5a, 0xe4, 0x7e, 0x08, 0x49, 0xe8,
- 0xd2, 0xc5, 0x71, 0x89, 0x80, 0x3b, 0xfc, 0x21,
- 0x75, 0x8e, 0xac, 0x31, 0x9b, 0x4f, 0x65, 0xba,
- 0xe7, 0x4f, 0xec, 0xf0, 0x80, 0x1a, 0xd4, 0xe9,
- 0x6e, 0x9f, 0x3d, 0x3a, 0x90, 0x4f, 0x85, 0x3b,
- 0x90, 0xd1, 0x11, 0xcf, 0xff, 0x5b, 0x5a, 0xd7,
- 0x19, 0xfc, 0x6d, 0xa1, 0x5b, 0xa9, 0xd3, 0xfe,
- 0x7a, 0xd0, 0x39, 0x7b, 0xfa, 0xe7, 0x4f, 0xff,
- 0xf2, 0xdb, 0xbd, 0x75, 0xb7, 0xf2, 0xf6, 0xf5,
- 0xb3, 0xc1, 0x3a, 0x6a, 0x18, 0x54, 0xc1, 0x09,
- 0x53, 0xff, 0x3d, 0xc9, 0x6f, 0x35, 0x65, 0xa1,
- 0xc0, 0x35, 0xa1, 0x17, 0x9f, 0xd9, 0xbb, 0xfe,
- 0x5b, 0xae, 0x74, 0xff, 0xfc, 0x8e, 0x1e, 0xff,
- 0xae, 0xe1, 0x5b, 0xff, 0x80, 0x74, 0x37, 0x15,
- 0x38, 0xe1, 0x6a, 0x18, 0x52, 0xb4, 0x27, 0xdd,
- 0x09, 0x2b, 0xae, 0xb6, 0x35, 0x9f, 0x0a, 0x77,
- 0x21, 0xa2, 0x2e, 0x9f, 0x5c, 0x1b, 0xfe, 0xf2,
- 0xd9, 0xec, 0x93, 0xb0, 0xfa, 0x38, 0xc2, 0x1c,
- 0x98, 0x4b, 0xe1, 0xc7, 0x3f, 0xf3, 0x39, 0xee,
- 0xc1, 0x4e, 0xe4, 0x34, 0x4c, 0xd3, 0xa9, 0x5a,
- 0x9d, 0x39, 0x3c, 0xc3, 0xa7, 0x6e, 0xad, 0xcd,
- 0xd4, 0x74, 0xf9, 0x3a, 0xde, 0x68, 0xe9, 0xff,
- 0x9b, 0xfd, 0x7f, 0x27, 0xb6, 0xbe, 0x21, 0xd3,
- 0xff, 0xfd, 0xaf, 0x7d, 0x3f, 0x9b, 0x5b, 0x5d,
- 0x16, 0x57, 0x8a, 0xd0, 0x74, 0x62, 0x2c, 0x6c,
- 0x8f, 0x3f, 0xfe, 0xdb, 0xdf, 0xa3, 0x2b, 0xee,
- 0xb3, 0x82, 0x10, 0x95, 0x3c, 0x9d, 0xc8, 0x68,
- 0xb3, 0xe7, 0xfd, 0xeb, 0x2b, 0xfd, 0x75, 0xbd,
- 0x4e, 0x9f, 0xfe, 0xf0, 0xdb, 0xb4, 0x63, 0x6f,
- 0xe5, 0x73, 0xe7, 0x4e, 0x08, 0x42, 0x54, 0xff,
- 0xb9, 0xf5, 0xfe, 0x26, 0xd8, 0x25, 0x38, 0xbc,
- 0x9f, 0xe5, 0xb7, 0xb6, 0xff, 0x73, 0x47, 0x4f,
- 0xf7, 0xbf, 0xb6, 0xfd, 0xb5, 0xbd, 0x4e, 0x84,
- 0x4f, 0xc4, 0x56, 0x18, 0x57, 0x63, 0xe0, 0x36,
- 0xdd, 0x2d, 0xb1, 0xcc, 0xff, 0xff, 0xfd, 0x98,
- 0x0a, 0xe6, 0x7f, 0x4e, 0xf1, 0xfa, 0xe5, 0x9d,
- 0x5f, 0xe5, 0x0c, 0xc6, 0x1d, 0x3a, 0xab, 0x41,
- 0xd3, 0xb7, 0x32, 0xc7, 0x43, 0xd1, 0x89, 0x58,
- 0x45, 0x5c, 0x72, 0x7a, 0x90, 0x6a, 0x87, 0x4f,
- 0xad, 0xf5, 0xc1, 0x32, 0x7f, 0xde, 0x17, 0xe0,
- 0xd1, 0xaf, 0x6c, 0x68, 0x83, 0x5c, 0x69, 0x67,
- 0xdc, 0x9e, 0x62, 0x9d, 0x3f, 0x3e, 0xdf, 0xea,
- 0x6e, 0x74, 0xb1, 0x0f, 0x4f, 0xe4, 0xb3, 0xff,
- 0xfe, 0xe0, 0xdf, 0x2d, 0x75, 0xcf, 0xd3, 0x7c,
- 0x1f, 0x51, 0xcc, 0x3a, 0x1e, 0x9a, 0x06, 0x42,
- 0xbf, 0xe4, 0xd3, 0xf0, 0xe6, 0xd5, 0xb2, 0x9d,
- 0x3f, 0xff, 0xb5, 0xff, 0x69, 0xd1, 0xbf, 0xfd,
- 0x7a, 0xfa, 0x9b, 0x78, 0x27, 0x4f, 0xff, 0xf5,
- 0x6a, 0xa3, 0x75, 0x73, 0x32, 0xf5, 0xdf, 0x5e,
- 0x7e, 0x1d, 0x3d, 0x6c, 0xf3, 0x63, 0xa3, 0xc8,
- 0x89, 0xb3, 0x34, 0xcc, 0xdd, 0x0d, 0x17, 0xe4,
- 0xff, 0xcf, 0xbe, 0xaf, 0x7b, 0x2f, 0x75, 0x61,
- 0xd3, 0xff, 0x7b, 0x3f, 0x99, 0x5d, 0x0f, 0xab,
- 0x0e, 0x8a, 0x51, 0x17, 0x54, 0x69, 0xef, 0xfd,
- 0x50, 0xe8, 0x54, 0xc6, 0xb6, 0x23, 0xc8, 0x59,
- 0xf1, 0x24, 0xff, 0xff, 0xcd, 0xeb, 0x6f, 0x31,
- 0xcd, 0x3f, 0x87, 0x7d, 0xbd, 0x4d, 0x53, 0xd4,
- 0x1d, 0x3f, 0xee, 0x7b, 0x39, 0xf7, 0xaa, 0xe9,
- 0x3a, 0x7b, 0x2b, 0xef, 0x9d, 0x1f, 0x3e, 0x0d,
- 0x4f, 0xe7, 0xb7, 0xeb, 0xd5, 0x3a, 0x7f, 0xd7,
- 0xa8, 0x3d, 0x4d, 0x2f, 0xcb, 0x9d, 0x0a, 0x7c,
- 0xb8, 0x49, 0x33, 0x5a, 0x9d, 0x26, 0x1d, 0x14,
- 0x9a, 0x86, 0xec, 0x62, 0x7f, 0xff, 0xd6, 0xf5,
- 0x37, 0xca, 0x6e, 0x22, 0xb7, 0x06, 0xff, 0xbe,
- 0xd8, 0x74, 0xe0, 0x84, 0x25, 0x4f, 0x6d, 0xb7,
- 0x7c, 0xa7, 0x17, 0x93, 0xfe, 0xeb, 0x27, 0xbb,
- 0x45, 0x7a, 0xc7, 0x42, 0xa6, 0x44, 0x84, 0xfe,
- 0x84, 0x5d, 0x8c, 0xa7, 0xfe, 0xcf, 0xd3, 0x7c,
- 0x1f, 0x51, 0xcc, 0x3a, 0x7d, 0x97, 0x7b, 0x2c,
- 0x74, 0x29, 0xf5, 0xd5, 0x12, 0x60, 0x58, 0xe9,
- 0xfa, 0x86, 0x9e, 0xdc, 0x1a, 0x0e, 0x9f, 0xda,
- 0x6d, 0x97, 0xb7, 0xae, 0x74, 0xde, 0x13, 0xa3,
- 0x75, 0x1f, 0xf7, 0x8d, 0x2c, 0x6b, 0x3f, 0xf6,
- 0xcb, 0xb0, 0xad, 0xfc, 0x9e, 0xd8, 0xe9, 0xfa,
- 0xda, 0xd0, 0xd5, 0xbc, 0x74, 0x6c, 0x7e, 0xd6,
- 0x45, 0x93, 0x9b, 0xa3, 0x37, 0x77, 0x75, 0x87,
- 0x14, 0x6e, 0x82, 0xbd, 0xa1, 0xb1, 0x92, 0x84,
- 0xe9, 0x8c, 0xa7, 0xc6, 0xad, 0x47, 0x10, 0x26,
- 0xac, 0x2c, 0xb4, 0xa0, 0xde, 0x41, 0x04, 0x36,
- 0xbf, 0x08, 0x8a, 0xc6, 0xd5, 0x78, 0x56, 0x04,
- 0x87, 0x72, 0x12, 0x9b, 0xe1, 0x57, 0x0e, 0x67,
- 0xc8, 0x5a, 0x9c, 0x53, 0x3f, 0xf9, 0xcc, 0xe7,
- 0xbb, 0x05, 0x3b, 0x90, 0xd1, 0x36, 0x4f, 0xe7,
- 0x60, 0xa7, 0x72, 0x1a, 0x2a, 0xd9, 0xfc, 0xf7,
- 0xeb, 0x7f, 0xab, 0xce, 0x9e, 0xcb, 0x75, 0xce,
- 0x96, 0xe9, 0x87, 0xa9, 0xf3, 0x49, 0xf0, 0xa7,
- 0x72, 0x1a, 0x2b, 0x49, 0xff, 0xe4, 0x51, 0xc0,
- 0x73, 0x39, 0xeb, 0xe4, 0x3a, 0x7f, 0xf9, 0xf5,
- 0xcf, 0xab, 0x3b, 0x2f, 0x75, 0x61, 0xd3, 0x5e,
- 0xea, 0x89, 0x7e, 0x4a, 0x9f, 0xca, 0xdb, 0x7d,
- 0xfe, 0xa0, 0x3a, 0x7e, 0xa3, 0x2d, 0xec, 0x61,
- 0xd3, 0xfd, 0x8d, 0xff, 0x50, 0xd2, 0xfa, 0x9d,
- 0x3f, 0x9f, 0x97, 0xef, 0x83, 0x53, 0xa4, 0xe6,
- 0xe2, 0x7e, 0x58, 0x59, 0xe8, 0x63, 0xd8, 0xb7,
- 0x8d, 0xbe, 0x5b, 0x73, 0xc9, 0xfc, 0xec, 0x14,
- 0xee, 0x43, 0x45, 0x81, 0x3e, 0x14, 0xee, 0x43,
- 0x44, 0xeb, 0x3f, 0xff, 0xac, 0xb4, 0x6d, 0x8c,
- 0x75, 0x6b, 0x96, 0xf5, 0x75, 0xa0, 0xe9, 0xf3,
- 0x99, 0xcf, 0x76, 0x22, 0x55, 0xa3, 0x09, 0xf0,
- 0xa7, 0x72, 0x1a, 0x2d, 0x99, 0xff, 0x01, 0x6a,
- 0xeb, 0x79, 0x38, 0x4e, 0x93, 0xb0, 0xfb, 0x38,
- 0xc2, 0x79, 0x3b, 0x90, 0xd1, 0x73, 0x49, 0x87,
- 0x4c, 0xec, 0x13, 0x76, 0x12, 0xb9, 0xfc, 0xec,
- 0x14, 0xee, 0x43, 0x45, 0xdf, 0x3c, 0xed, 0x3b,
- 0x00, 0xe8, 0x56, 0xd6, 0x5b, 0x29, 0xf7, 0x28,
- 0x61, 0x4a, 0x97, 0xa5, 0x40, 0x8b, 0x93, 0x21,
- 0xa0, 0x08, 0x56, 0x55, 0x86, 0xe5, 0x7b, 0xce,
- 0xe7, 0xfd, 0xfe, 0x72, 0xd6, 0xac, 0xe7, 0x9d,
- 0x3f, 0xbf, 0x46, 0x37, 0xdd, 0x74, 0x9d, 0x3e,
- 0x14, 0xee, 0x43, 0x44, 0xaf, 0x3f, 0xef, 0xf0,
- 0x76, 0xb2, 0xd1, 0x81, 0x3a, 0x7b, 0x5e, 0x17,
- 0x9d, 0x3f, 0xff, 0xbd, 0x7e, 0x67, 0x7c, 0x16,
- 0x0f, 0x7e, 0x84, 0xf5, 0x07, 0x46, 0xc8, 0x83,
- 0xe2, 0x18, 0xd9, 0x1c, 0xb6, 0x86, 0x14, 0xee,
- 0x7b, 0x95, 0x37, 0x6c, 0x38, 0xac, 0x62, 0xb3,
- 0xae, 0xbb, 0x15, 0x3f, 0xfa, 0xdd, 0xeb, 0xab,
- 0xfc, 0x34, 0x6a, 0x02, 0xa7, 0xf7, 0x23, 0xb6,
- 0x16, 0xed, 0xca, 0x7c, 0xf5, 0x1c, 0x93, 0x91,
- 0x55, 0x73, 0x23, 0xb3, 0x6d, 0x0a, 0xd9, 0xff,
- 0xce, 0x67, 0x3d, 0xd8, 0x29, 0xdc, 0x86, 0x89,
- 0x86, 0x7f, 0xfe, 0xc7, 0x6f, 0x1e, 0x03, 0xb4,
- 0xdd, 0xe1, 0x5a, 0xbc, 0xe9, 0xff, 0xb7, 0x4c,
- 0xa5, 0xfa, 0xf5, 0xfe, 0xaf, 0x3a, 0x7f, 0x2f,
- 0x51, 0x7d, 0x3c, 0x27, 0x4f, 0xb8, 0x5f, 0xcc,
- 0x3a, 0x3e, 0x7b, 0x1a, 0x99, 0xcf, 0xcc, 0x5c,
- 0xfd, 0xf7, 0x0e, 0x9f, 0x2e, 0x7e, 0xfb, 0x87,
- 0x4f, 0xd6, 0xf5, 0xeb, 0xd4, 0xe8, 0x3d, 0x86,
- 0x17, 0xcf, 0xff, 0xfb, 0xf8, 0x16, 0xfb, 0xe5,
- 0xb4, 0x7f, 0x28, 0xf6, 0x7e, 0x97, 0xd4, 0xe9,
- 0xf9, 0xb6, 0xfb, 0xfd, 0x40, 0x74, 0xff, 0xe5,
- 0xb8, 0x15, 0xf9, 0x4d, 0xe8, 0xd4, 0x27, 0x42,
- 0x9f, 0xef, 0x8c, 0x67, 0xea, 0xfb, 0x4b, 0x3a,
- 0xe7, 0x4f, 0xff, 0xf8, 0x71, 0xb2, 0xfe, 0xfa,
- 0x37, 0xfd, 0x6d, 0xde, 0xba, 0xde, 0xa7, 0x4b,
- 0x29, 0x44, 0xf8, 0x97, 0xcf, 0x7d, 0x41, 0xbc,
- 0xe9, 0xee, 0xdf, 0xb6, 0x1d, 0x27, 0x37, 0x15,
- 0xc1, 0xed, 0x0a, 0x24, 0x7b, 0x69, 0x22, 0xd0,
- 0xf0, 0xfc, 0x30, 0x2e, 0x51, 0xa9, 0x1c, 0xf8,
- 0x53, 0xb9, 0x0d, 0x15, 0x74, 0xff, 0x3d, 0xd8,
- 0x29, 0xdc, 0x86, 0x88, 0xf2, 0x4e, 0xc3, 0xf1,
- 0xe3, 0x09, 0xfc, 0xec, 0x14, 0xee, 0x43, 0x45,
- 0x83, 0x3f, 0x9d, 0x82, 0x9d, 0xc8, 0x68, 0xb2,
- 0xa7, 0xf3, 0xb0, 0x53, 0xb9, 0x0d, 0x16, 0x9c,
- 0xf2, 0x77, 0x21, 0xa2, 0xdc, 0x9f, 0xf9, 0x70,
- 0x73, 0xfa, 0x2d, 0x94, 0x84, 0xe8, 0x13, 0xef,
- 0xa9, 0x5c, 0xff, 0x2f, 0xf5, 0x62, 0xd6, 0xfe,
- 0x3a, 0x7f, 0xdc, 0xf7, 0x60, 0xa7, 0x72, 0x1a,
- 0x28, 0x79, 0xfa, 0xbd, 0x4d, 0x6f, 0xe3, 0xa7,
- 0xef, 0xb7, 0x30, 0x56, 0xa7, 0x4f, 0xff, 0xd9,
- 0xb5, 0x97, 0x7b, 0xaf, 0xfe, 0x05, 0x6a, 0xa0,
- 0x2a, 0x4e, 0xc4, 0xd6, 0xbc, 0x42, 0xc3, 0x9b,
- 0xa3, 0x6a, 0x5d, 0xb8, 0x5f, 0x3f, 0x9d, 0x82,
- 0x9d, 0xc8, 0x68, 0xbc, 0xe1, 0x59, 0x16, 0x4f,
- 0x44, 0xd9, 0x4b, 0x25, 0xf0, 0xd3, 0x0f, 0xf1,
- 0x26, 0x61, 0xdd, 0x8e, 0xff, 0x28, 0x11, 0xb3,
- 0x0c, 0xfe, 0x76, 0x0a, 0x77, 0x21, 0xa2, 0x96,
- 0x9f, 0xce, 0xc1, 0x4e, 0xe4, 0x34, 0x58, 0x53,
- 0xf9, 0xd8, 0x29, 0xdc, 0x86, 0x8b, 0x2e, 0x79,
- 0xda, 0x77, 0x5f, 0x37, 0x53, 0xa7, 0x3b, 0x7b,
- 0x0e, 0x9e, 0x47, 0x2d, 0x50, 0xf4, 0xb5, 0x34,
- 0x9f, 0xfc, 0xe6, 0x73, 0xdd, 0x82, 0x9d, 0xc8,
- 0x68, 0xa3, 0x27, 0xf3, 0x95, 0xb2, 0x8a, 0x80,
- 0xe8, 0x7a, 0x77, 0xe2, 0x76, 0xc3, 0xbe, 0x84,
- 0x6d, 0x4e, 0x2e, 0xa5, 0x3f, 0xf3, 0xb9, 0xee,
- 0xc1, 0x4e, 0xe4, 0x34, 0x47, 0x33, 0xff, 0x9c,
- 0xce, 0x7b, 0xb0, 0x53, 0xb9, 0x0d, 0x13, 0x94,
- 0xfe, 0x76, 0x0a, 0x77, 0x21, 0xa2, 0xcc, 0x9f,
- 0xf9, 0xca, 0x01, 0x5b, 0xdb, 0xa9, 0x79, 0xd3,
- 0xf9, 0xd8, 0x29, 0xdc, 0x86, 0x8b, 0x76, 0x7f,
- 0xf3, 0x99, 0xcf, 0x76, 0x0a, 0x77, 0x21, 0xa2,
- 0x90, 0x9f, 0xf9, 0xdc, 0xf7, 0x60, 0xa7, 0x72,
- 0x1a, 0x25, 0x28, 0xa1, 0x3f, 0x56, 0x93, 0x18,
- 0xa4, 0x03, 0xbf, 0xa1, 0xdc, 0xed, 0xbd, 0x4a,
- 0x7f, 0xdc, 0xf7, 0x60, 0xa7, 0x72, 0x1a, 0x27,
- 0x69, 0xff, 0xf7, 0xb6, 0xd5, 0x8a, 0xdf, 0xdb,
- 0x7d, 0x7f, 0x88, 0x74, 0x9c, 0xc4, 0x4f, 0xf2,
- 0x34, 0xff, 0xdc, 0xcb, 0x62, 0x75, 0x97, 0x7b,
- 0xce, 0x9f, 0xfb, 0xf9, 0x6e, 0xa3, 0x2b, 0xfe,
- 0xa4, 0xe9, 0xb7, 0x1d, 0xb2, 0x21, 0xea, 0x87,
- 0x0c, 0x47, 0x16, 0xe4, 0x2b, 0xe7, 0xc2, 0x9d,
- 0xc8, 0x68, 0x8b, 0x27, 0xfd, 0xcf, 0x76, 0x0a,
- 0x77, 0x21, 0xa2, 0x5d, 0x9f, 0xff, 0xb3, 0x6b,
- 0x2e, 0xf7, 0x5f, 0xfc, 0x0a, 0xd5, 0x40, 0x54,
- 0x9d, 0x88, 0xd3, 0x61, 0x86, 0xe2, 0x34, 0xff,
- 0xe7, 0x33, 0x9e, 0xec, 0x14, 0xee, 0x43, 0x44,
- 0xc5, 0x3f, 0x60, 0xa7, 0x72, 0x1a, 0x2a, 0x99,
- 0xff, 0xff, 0xc3, 0xd6, 0xa5, 0xf9, 0x77, 0x5b,
- 0xaa, 0x3e, 0x0d, 0xed, 0xe1, 0x79, 0xd0, 0xe4,
- 0x56, 0x71, 0xac, 0xff, 0xe7, 0x33, 0x9e, 0xec,
- 0x14, 0xee, 0x43, 0x44, 0xe9, 0x3f, 0xbd, 0xc2,
- 0xaf, 0xe6, 0xc7, 0x4f, 0x9a, 0x56, 0x96, 0xa7,
- 0x4f, 0xc1, 0xcf, 0x36, 0xcf, 0x9d, 0x3d, 0xeb,
- 0x2b, 0xbc, 0x7a, 0xd5, 0x28, 0x9f, 0xfb, 0x5a,
- 0xdd, 0x69, 0x76, 0xad, 0x79, 0x87, 0x43, 0x11,
- 0x05, 0x63, 0x99, 0xff, 0x73, 0xdd, 0x82, 0x9d,
- 0xc8, 0x68, 0x9d, 0xe7, 0xd7, 0xd7, 0x99, 0xe2,
- 0xa4, 0xed, 0x93, 0x9b, 0xc8, 0xc2, 0x98, 0x47,
- 0xc8, 0xd3, 0xff, 0x9c, 0xce, 0x7b, 0xb0, 0x53,
- 0xb9, 0x0d, 0x14, 0x2c, 0xff, 0xe7, 0x33, 0x9e,
- 0xec, 0x14, 0xee, 0x43, 0x45, 0x25, 0x3f, 0xff,
- 0xb2, 0xae, 0xdf, 0x8d, 0x5b, 0x99, 0x7b, 0x2d,
- 0xf5, 0x61, 0xd1, 0x42, 0xe4, 0xb3, 0xce, 0x12,
- 0x1f, 0xc2, 0x44, 0xc8, 0xfb, 0x40, 0x93, 0xaa,
- 0x96, 0xe2, 0x94, 0xfe, 0x76, 0x0a, 0x77, 0x21,
- 0xa2, 0x24, 0x9f, 0xfc, 0xe6, 0x73, 0xdd, 0x82,
- 0x9d, 0xc8, 0x68, 0x97, 0xa7, 0xc2, 0x9d, 0xc8,
- 0x68, 0xa5, 0xe7, 0xff, 0x63, 0xd4, 0x15, 0x15,
- 0xa5, 0xfe, 0x61, 0xd3, 0xe6, 0xff, 0x31, 0x6a,
- 0x74, 0xfb, 0x9b, 0x60, 0xd4, 0xe9, 0x2e, 0xc7,
- 0xa2, 0xc2, 0xa9, 0x3b, 0x11, 0xe4, 0xd1, 0x85,
- 0xe1, 0x35, 0x3f, 0x9d, 0x82, 0x9d, 0xc8, 0x68,
- 0xa7, 0x27, 0xfd, 0xe1, 0xea, 0xdb, 0x33, 0xe8,
- 0x74, 0xff, 0xb2, 0xca, 0x38, 0xe0, 0x84, 0x25,
- 0x4d, 0xe0, 0x9d, 0x35, 0x0e, 0xd9, 0x11, 0xbb,
- 0x87, 0x6d, 0xe7, 0x93, 0xe1, 0x4e, 0xe4, 0x34,
- 0x57, 0x93, 0xff, 0xf6, 0x6d, 0x65, 0xde, 0xeb,
- 0xff, 0x81, 0x5a, 0xa8, 0x0a, 0x93, 0xb1, 0x11,
- 0xbb, 0x86, 0x13, 0xff, 0x3b, 0x9e, 0xec, 0x14,
- 0xee, 0x43, 0x44, 0x8f, 0x3b, 0xc0, 0x53, 0xa7,
- 0x26, 0x30, 0xa7, 0x17, 0x73, 0xe1, 0x4e, 0xe4,
- 0x34, 0x49, 0x13, 0xce, 0xe7, 0xb9, 0x4f, 0x67,
- 0x0a, 0x67, 0xfe, 0x77, 0x3d, 0xd8, 0x29, 0xdc,
- 0x86, 0x89, 0x2a, 0x7c, 0x29, 0xdc, 0x86, 0x8b,
- 0xc6, 0x7e, 0xd7, 0xf4, 0xf5, 0x35, 0x3a, 0x7d,
- 0x5a, 0xdf, 0x10, 0xe9, 0xfe, 0x7b, 0xb0, 0x53,
- 0xb9, 0x0d, 0x12, 0x6c, 0x9d, 0x88, 0xc7, 0xa4,
- 0xc0, 0x4c, 0x38, 0x9a, 0x15, 0x77, 0x26, 0x83,
- 0xb7, 0xc6, 0x89, 0xb1, 0xdf, 0xa1, 0x90, 0xd4,
- 0x34, 0x58, 0x57, 0x68, 0x60, 0x5c, 0xdf, 0x58,
- 0xc4, 0xe1, 0x63, 0x76, 0xd5, 0xa2, 0x3a, 0xe7,
- 0xc7, 0x93, 0xb4, 0xa1, 0xac, 0xb7, 0x5a, 0xda,
- 0x65, 0x2c, 0x25, 0x7f, 0xbd, 0x4c, 0xf3, 0xdf,
- 0xa7, 0x3d, 0x37, 0x71, 0xd8, 0x35, 0x4e, 0xc3,
- 0x1a, 0x47, 0xab, 0x31, 0x1a, 0x11, 0x69, 0xda,
- 0x8e, 0xa7, 0xb9, 0x02, 0x58, 0x73, 0x77, 0x0b,
- 0x1f, 0xcf, 0x63, 0x56, 0x92, 0xbb, 0x7a, 0xe8,
- 0x7f, 0x5a, 0x60, 0xb3, 0x69, 0x4c, 0x41, 0x94,
- 0xa1, 0xb9, 0x1f, 0x5e, 0xf9, 0xd9, 0x46, 0xf9,
- 0xe4, 0xb8,
+ 0x47, 0xb0, 0xe3, 0x27, 0x73, 0xf9, 0xd6, 0x29,
+ 0xba, 0x86, 0x88, 0x7a, 0x7c, 0x29, 0xba, 0x86,
+ 0x88, 0x9a, 0x6c, 0xb0, 0xe9, 0xff, 0xd7, 0x8e,
+ 0xb4, 0x55, 0x7d, 0x4e, 0x55, 0x87, 0x45, 0x27,
+ 0xc7, 0x81, 0x69, 0xec, 0xf7, 0xbd, 0x4d, 0x10,
+ 0xbc, 0x9d, 0x68, 0xe7, 0xac, 0x24, 0xfb, 0x23,
+ 0x9b, 0xbc, 0x1d, 0x3d, 0x9c, 0x7b, 0x27, 0x4f,
+ 0xfe, 0xf3, 0x4f, 0xba, 0x5f, 0xc1, 0x9b, 0xbf,
+ 0x3a, 0x6d, 0x6f, 0x3a, 0x4d, 0xd5, 0xa2, 0x1f,
+ 0x04, 0x5a, 0x9b, 0x3e, 0xc6, 0xe7, 0x5e, 0x74,
+ 0xf7, 0xab, 0xe0, 0x1d, 0x38, 0x21, 0x09, 0x53,
+ 0xed, 0xfe, 0x71, 0x65, 0x38, 0xbc, 0x9f, 0x6e,
+ 0x5a, 0xbc, 0x9d, 0x1c, 0xa2, 0x68, 0x07, 0xdf,
+ 0x35, 0x9f, 0xf8, 0x1e, 0x6b, 0x86, 0x17, 0xc3,
+ 0xdf, 0x1c, 0xe9, 0xff, 0x7b, 0xa2, 0xfd, 0x6a,
+ 0xbe, 0x61, 0xd3, 0xf5, 0xb6, 0xed, 0xf7, 0x53,
+ 0xa7, 0xaf, 0x9b, 0xa0, 0xe8, 0xb4, 0xf3, 0x7d,
+ 0x0c, 0x06, 0x8c, 0x70, 0x99, 0xf3, 0xfc, 0x97,
+ 0xcf, 0xd6, 0x15, 0xbe, 0x7c, 0x74, 0xff, 0xff,
+ 0xef, 0xfe, 0x95, 0xe9, 0xfb, 0xe7, 0x1e, 0x6b,
+ 0x85, 0x6e, 0x97, 0x8d, 0x84, 0xe9, 0xf7, 0xb3,
+ 0xda, 0xd0, 0x74, 0xfe, 0xa5, 0xf5, 0xe9, 0xda,
+ 0xd2, 0x74, 0xfe, 0xd0, 0xf6, 0xd2, 0xe7, 0x4e,
+ 0x8f, 0x1f, 0x5f, 0xce, 0x21, 0x53, 0x35, 0xb7,
+ 0xf1, 0x84, 0xa4, 0xdd, 0xbc, 0xe9, 0xdb, 0x9a,
+ 0x9d, 0x37, 0x74, 0x1d, 0x3c, 0xbf, 0xcb, 0x4f,
+ 0x36, 0x62, 0x37, 0x3f, 0xfe, 0xed, 0x73, 0xc3,
+ 0xfd, 0xb7, 0xf0, 0xbc, 0xf1, 0x5e, 0x4e, 0x9f,
+ 0xfb, 0x0b, 0xd3, 0x86, 0x7f, 0xb9, 0x5c, 0x9d,
+ 0x3f, 0xb8, 0x52, 0xff, 0x63, 0xb6, 0x1d, 0x00,
+ 0x3f, 0xff, 0xa3, 0xcf, 0xf8, 0x5a, 0xe1, 0x55,
+ 0xf5, 0x1b, 0x93, 0xa1, 0x4f, 0x8f, 0xb2, 0x29,
+ 0xff, 0xff, 0xee, 0xff, 0x51, 0xfa, 0xb5, 0xc3,
+ 0xae, 0x7c, 0xfb, 0xa7, 0x36, 0xdb, 0xf7, 0x53,
+ 0xa4, 0xa7, 0x4f, 0xe7, 0xe8, 0xfa, 0xab, 0x49,
+ 0xd3, 0xff, 0xff, 0xfb, 0xc0, 0xaf, 0xef, 0x69,
+ 0xe1, 0xce, 0x3b, 0xe1, 0xfb, 0xa5, 0xf7, 0xdd,
+ 0x1f, 0xbd, 0xa4, 0xe9, 0xdb, 0xa8, 0x68, 0xa6,
+ 0x22, 0xd1, 0x7e, 0x90, 0x99, 0x9f, 0xf5, 0xfe,
+ 0x97, 0xd7, 0x2a, 0x2d, 0x1d, 0x3e, 0xa7, 0xf6,
+ 0xda, 0xce, 0x8f, 0x1f, 0x46, 0x9f, 0xcf, 0xf6,
+ 0xb3, 0x9c, 0x2d, 0x16, 0x13, 0xa7, 0xff, 0xf7,
+ 0xed, 0x33, 0x95, 0xcd, 0x5a, 0xfd, 0x87, 0x82,
+ 0xb7, 0x63, 0xa7, 0xfc, 0x8a, 0xcc, 0x5d, 0x6f,
+ 0xdf, 0x3a, 0x15, 0x14, 0x98, 0x68, 0x9f, 0x0a,
+ 0xb6, 0x51, 0x3a, 0x7e, 0xdf, 0xf0, 0xe5, 0x7e,
+ 0x74, 0x59, 0xfb, 0xf8, 0x8b, 0xb2, 0x68, 0xa1,
+ 0x76, 0x7f, 0x94, 0xae, 0x87, 0x09, 0x1a, 0x1d,
+ 0x24, 0x5e, 0x84, 0x33, 0x41, 0xe3, 0x0f, 0x16,
+ 0x42, 0x3b, 0xe4, 0x39, 0x8d, 0x52, 0x7f, 0xdd,
+ 0x07, 0x43, 0xc3, 0x79, 0xda, 0x0e, 0x9e, 0xbf,
+ 0xf4, 0xe3, 0x9d, 0x3f, 0xff, 0xfe, 0xc7, 0xb3,
+ 0x8b, 0x15, 0x6d, 0xc1, 0x9d, 0xb7, 0xf0, 0xba,
+ 0x5f, 0x7d, 0xfc, 0x15, 0x3a, 0x59, 0xf2, 0x2d,
+ 0xaa, 0x4f, 0x3f, 0xfe, 0xbb, 0xc7, 0x93, 0x17,
+ 0xc2, 0xbd, 0xe1, 0x78, 0xe7, 0x4f, 0xff, 0x67,
+ 0x16, 0x0e, 0x0c, 0x5b, 0xcf, 0x37, 0xf3, 0xa7,
+ 0xfa, 0x9e, 0x0c, 0x5b, 0xfe, 0x78, 0x8e, 0x95,
+ 0x6d, 0x11, 0xfa, 0xa3, 0x2f, 0x7d, 0x31, 0x0c,
+ 0xc3, 0xa6, 0x7c, 0xf5, 0xa5, 0xf5, 0x3a, 0x7f,
+ 0xff, 0xff, 0xd7, 0xfe, 0x9c, 0x3d, 0x8e, 0xdc,
+ 0xd7, 0xb2, 0xac, 0xfe, 0xf4, 0xc7, 0x9d, 0x78,
+ 0xa4, 0x0b, 0xc9, 0x53, 0xff, 0xff, 0x27, 0x83,
+ 0xcf, 0x63, 0xc3, 0xb5, 0xa2, 0xa9, 0x8e, 0xf1,
+ 0x4e, 0x84, 0xe9, 0xbb, 0xa2, 0x94, 0xd1, 0xbc,
+ 0x51, 0x58, 0x52, 0xc2, 0xaa, 0xf3, 0xc4, 0x67,
+ 0x3f, 0x8d, 0xd6, 0x7f, 0xf3, 0x13, 0x86, 0x35,
+ 0xf6, 0xcd, 0xf8, 0x0e, 0x9f, 0xff, 0x7b, 0xf9,
+ 0xc5, 0xb7, 0xe5, 0xab, 0xe3, 0xef, 0xc0, 0x74,
+ 0xff, 0xcb, 0xfa, 0x3f, 0x6d, 0xab, 0xda, 0xd2,
+ 0x74, 0x55, 0x14, 0xbd, 0xae, 0xcf, 0x5e, 0x6d,
+ 0xb9, 0x3a, 0x77, 0x15, 0xe0, 0xe9, 0xaf, 0x93,
+ 0xa2, 0x84, 0xdb, 0x1f, 0x0e, 0xfa, 0x92, 0x64,
+ 0x95, 0xb0, 0xf4, 0xfd, 0xca, 0xff, 0x1a, 0xf3,
+ 0xa7, 0x2f, 0x2a, 0x74, 0xfe, 0x69, 0xf7, 0x9a,
+ 0xeb, 0x5c, 0x0f, 0x21, 0x85, 0xb3, 0xf3, 0x7e,
+ 0x37, 0x8e, 0xa0, 0x3a, 0x7f, 0x0b, 0x5f, 0xbc,
+ 0x6e, 0x4e, 0x8b, 0x3e, 0x5f, 0x19, 0xcf, 0xca,
+ 0x0b, 0xcf, 0x5a, 0x0e, 0x87, 0x9e, 0x87, 0xc8,
+ 0x67, 0xff, 0xfd, 0x9f, 0xe8, 0x2b, 0x45, 0xfb,
+ 0xf9, 0xfd, 0xb6, 0xe1, 0x50, 0xfc, 0xe9, 0xff,
+ 0x7a, 0xda, 0xe1, 0x55, 0xc6, 0xf1, 0xce, 0x9f,
+ 0xdb, 0x4d, 0x71, 0x7a, 0x27, 0x47, 0x27, 0xeb,
+ 0x94, 0x49, 0x30, 0xe9, 0xdf, 0xbe, 0x4e, 0x85,
+ 0x35, 0x94, 0x88, 0x4f, 0xd4, 0xd6, 0xef, 0xfd,
+ 0x0e, 0x9e, 0x67, 0x55, 0x01, 0xd1, 0x67, 0xa5,
+ 0xe2, 0xf8, 0x54, 0xf2, 0xae, 0x1c, 0xfe, 0x4f,
+ 0x17, 0x39, 0xfd, 0x9f, 0x51, 0x78, 0xef, 0x27,
+ 0x4f, 0x5d, 0x2a, 0xd1, 0xd3, 0xf6, 0x35, 0xec,
+ 0x1f, 0x1d, 0x3e, 0xf0, 0x06, 0xe9, 0x3a, 0x3a,
+ 0x22, 0xab, 0xc6, 0xa0, 0x22, 0xec, 0xb2, 0x7f,
+ 0xfe, 0x17, 0xe2, 0xda, 0xc2, 0xff, 0xa7, 0xef,
+ 0x38, 0xec, 0xe9, 0xff, 0xfd, 0xeb, 0xa5, 0xf5,
+ 0xce, 0x15, 0x8b, 0xee, 0x78, 0x2b, 0x76, 0x3a,
+ 0x7f, 0xff, 0xfd, 0xdf, 0xf8, 0x07, 0x69, 0x78,
+ 0xe8, 0x38, 0x57, 0xb5, 0xa7, 0x17, 0xef, 0xdf,
+ 0x43, 0xa7, 0xff, 0xdd, 0x88, 0xde, 0x6b, 0x8f,
+ 0x5f, 0x0c, 0x01, 0x4e, 0x8b, 0x47, 0x16, 0x21,
+ 0x19, 0x3f, 0xfc, 0xf6, 0xfc, 0x5a, 0xfd, 0xaf,
+ 0xde, 0x6b, 0xa7, 0x4f, 0xff, 0xb9, 0xb6, 0x70,
+ 0x6f, 0xca, 0xd5, 0xa7, 0xe8, 0xd0, 0x74, 0xff,
+ 0x5f, 0xe8, 0xe0, 0x0d, 0xd6, 0x8e, 0x9f, 0xf5,
+ 0x7b, 0xff, 0x0a, 0xf7, 0xc5, 0xd8, 0x9d, 0x3f,
+ 0xfa, 0x8e, 0x15, 0xc7, 0x7c, 0x33, 0x5a, 0xa8,
+ 0x9d, 0x3f, 0xff, 0xeb, 0xa6, 0xbe, 0xb0, 0xf0,
+ 0xc5, 0xe6, 0xb7, 0x47, 0x0b, 0xf7, 0x27, 0x45,
+ 0xa3, 0x0b, 0xca, 0x11, 0x42, 0xb8, 0x74, 0x8d,
+ 0x32, 0x92, 0x7f, 0x29, 0x31, 0x72, 0xa7, 0x79,
+ 0x8c, 0x26, 0x7f, 0xda, 0x38, 0xbc, 0xaf, 0xfc,
+ 0x03, 0xa7, 0xfa, 0xc3, 0x4b, 0xeb, 0xc3, 0x3e,
+ 0x3a, 0x7f, 0xff, 0xca, 0x8a, 0xce, 0x0d, 0x63,
+ 0xdf, 0xe7, 0x87, 0x54, 0xfd, 0xe2, 0xce, 0x84,
+ 0x47, 0x57, 0xcf, 0x1b, 0xcf, 0x27, 0xbd, 0x9f,
+ 0x29, 0xd3, 0xff, 0xff, 0xf6, 0x55, 0x9f, 0xf7,
+ 0x4c, 0x6b, 0x5c, 0x3f, 0xdb, 0x7f, 0x0b, 0xa5,
+ 0xf7, 0xdf, 0xc1, 0x53, 0xa1, 0xe8, 0xb8, 0xf1,
+ 0x0c, 0x2a, 0xf2, 0x7d, 0xcb, 0xe5, 0xf4, 0x6b,
+ 0xbb, 0x0e, 0xa9, 0xec, 0xd7, 0x40, 0x74, 0xff,
+ 0xd8, 0xf7, 0x0f, 0x0f, 0x74, 0x68, 0xa1, 0xd3,
+ 0xde, 0xc6, 0xd0, 0x74, 0xfd, 0x9d, 0x1f, 0xd3,
+ 0xe3, 0xa2, 0xd1, 0x6d, 0xd0, 0x85, 0x11, 0xb2,
+ 0x45, 0x3d, 0xd7, 0xbd, 0xa9, 0xd3, 0xff, 0xf7,
+ 0x87, 0x85, 0xfa, 0xff, 0xd3, 0x1e, 0xb6, 0x5a,
+ 0x1d, 0x3f, 0xff, 0xde, 0xa0, 0x55, 0x95, 0xed,
+ 0x78, 0x28, 0xaf, 0x38, 0x56, 0x1d, 0x16, 0x8c,
+ 0x41, 0x5c, 0x9f, 0xff, 0xfc, 0x23, 0xea, 0x38,
+ 0x62, 0xf3, 0xf5, 0x6b, 0x17, 0x42, 0xd3, 0x9e,
+ 0xd0, 0xe9, 0xff, 0xff, 0x97, 0xa6, 0x17, 0x87,
+ 0xef, 0xbe, 0x9c, 0x29, 0x7d, 0x7d, 0xfe, 0xab,
+ 0x41, 0xd3, 0xea, 0x6b, 0xeb, 0xf9, 0xd1, 0x68,
+ 0xa7, 0xed, 0xfe, 0x3c, 0x9a, 0x36, 0x23, 0x23,
+ 0x9f, 0xf9, 0xf5, 0xf7, 0x4c, 0x2f, 0xa8, 0x5e,
+ 0x87, 0x4f, 0xf7, 0xfb, 0x6b, 0xf7, 0x8d, 0xc9,
+ 0xd3, 0xfd, 0xce, 0x14, 0x3c, 0xe3, 0x58, 0x74,
+ 0xff, 0xff, 0x68, 0xe2, 0xf3, 0xeb, 0xfd, 0x15,
+ 0x5b, 0xff, 0x38, 0x53, 0xa7, 0xb3, 0xc2, 0x81,
+ 0x3a, 0x29, 0x44, 0x4e, 0xb2, 0xcf, 0xcd, 0x52,
+ 0xfe, 0xd7, 0x27, 0x4f, 0xf6, 0x35, 0x9f, 0xbc,
+ 0x6e, 0x4e, 0x9e, 0xb1, 0x00, 0x4e, 0x85, 0x44,
+ 0x3d, 0x4c, 0x32, 0x6f, 0x3f, 0x5e, 0x44, 0x6d,
+ 0xe7, 0x4f, 0xdf, 0xbc, 0x7e, 0xd0, 0xe9, 0xef,
+ 0xdd, 0x78, 0x34, 0x7a, 0xb9, 0x2a, 0x8e, 0x57,
+ 0x10, 0x52, 0x36, 0x7a, 0x4a, 0xbc, 0x92, 0x27,
+ 0x58, 0x86, 0x1e, 0x61, 0x54, 0xda, 0x10, 0x93,
+ 0xff, 0x7f, 0xf7, 0xc0, 0x6f, 0x1f, 0xb6, 0x8e,
+ 0x85, 0x5d, 0xf9, 0xb9, 0xd2, 0x9d, 0x84, 0x5c,
+ 0xfb, 0xea, 0xcd, 0xe4, 0xe9, 0xfd, 0x6d, 0x62,
+ 0xf2, 0xbc, 0x9d, 0x3f, 0xff, 0xfd, 0x8b, 0xcd,
+ 0x75, 0xae, 0x1f, 0xba, 0x5f, 0x7d, 0xd1, 0xfb,
+ 0xe7, 0x1e, 0x68, 0xe9, 0xbb, 0xe8, 0x74, 0x0a,
+ 0x27, 0xb3, 0x08, 0x59, 0xfa, 0xe8, 0xfd, 0xd3,
+ 0x53, 0xa7, 0xff, 0x0d, 0x2f, 0xad, 0xb2, 0x95,
+ 0xc6, 0x14, 0xe9, 0x54, 0xe8, 0xec, 0xf6, 0xba,
+ 0xa5, 0x4f, 0xe5, 0x67, 0xef, 0x1b, 0x93, 0xa7,
+ 0xff, 0xfd, 0x9f, 0xa8, 0x29, 0x7d, 0x7b, 0x5c,
+ 0xfe, 0xf9, 0xf5, 0x8b, 0x47, 0x47, 0x95, 0x36,
+ 0x34, 0x4f, 0xb0, 0xd1, 0xf9, 0x3d, 0x61, 0x11,
+ 0xd9, 0x2f, 0x53, 0x19, 0xf3, 0xfc, 0x37, 0x49,
+ 0xd3, 0xeb, 0xad, 0x16, 0x13, 0xa2, 0x93, 0xce,
+ 0xc1, 0x3c, 0xff, 0xfb, 0xd4, 0x5a, 0x73, 0x8f,
+ 0x5f, 0x4e, 0x1d, 0x3b, 0x53, 0xa7, 0x9b, 0xf3,
+ 0x78, 0x3a, 0x7f, 0xff, 0xe6, 0xfa, 0x5f, 0xb4,
+ 0xf0, 0xff, 0x6d, 0xfc, 0x2e, 0x97, 0xdf, 0x7f,
+ 0x05, 0x4e, 0x8a, 0x11, 0x4d, 0x64, 0x93, 0xff,
+ 0xff, 0xe5, 0xa6, 0xbd, 0xad, 0x3c, 0x31, 0x7c,
+ 0xf0, 0xfd, 0xf7, 0xd3, 0x85, 0x40, 0x0f, 0x64,
+ 0xe9, 0xf2, 0xfe, 0x9d, 0xa0, 0xe9, 0xff, 0xff,
+ 0xff, 0xd6, 0xcb, 0x45, 0xc2, 0xb3, 0x37, 0x5a,
+ 0xa8, 0x8a, 0xfe, 0xe8, 0xbe, 0xeb, 0xdb, 0x5f,
+ 0x56, 0x1d, 0x3f, 0xc0, 0xbe, 0x7f, 0x78, 0xdc,
+ 0x9d, 0x3f, 0xa8, 0xed, 0x72, 0xcf, 0x64, 0xe9,
+ 0xff, 0x2f, 0x46, 0xfe, 0xef, 0xed, 0x75, 0x61,
+ 0xd1, 0x67, 0xf9, 0x49, 0xac, 0xff, 0xf5, 0xe7,
+ 0x9b, 0xb0, 0x57, 0x80, 0xd7, 0x9a, 0x9d, 0x3d,
+ 0x47, 0xbf, 0x93, 0xa1, 0x55, 0xf8, 0x59, 0x1f,
+ 0xa3, 0x03, 0x12, 0x36, 0x42, 0x47, 0x05, 0x1b,
+ 0x0a, 0x3f, 0xc2, 0xd2, 0xa4, 0x5d, 0xa9, 0x4e,
+ 0xe7, 0x83, 0x47, 0x4f, 0xff, 0x52, 0xff, 0xaf,
+ 0x06, 0x7d, 0x7a, 0x67, 0xd4, 0x1d, 0x16, 0x7e,
+ 0xde, 0x20, 0x9f, 0xa8, 0x69, 0xfc, 0x68, 0xd0,
+ 0x74, 0xf9, 0x9e, 0xe6, 0xf9, 0x3a, 0x4d, 0x1d,
+ 0x32, 0xb0, 0xe9, 0x64, 0xe8, 0x13, 0x4b, 0xa2,
+ 0xb1, 0xc9, 0xea, 0xe0, 0xda, 0x7b, 0x35, 0xda,
+ 0x4e, 0x99, 0xad, 0x3a, 0x7f, 0x63, 0xc3, 0x4b,
+ 0xfe, 0xa7, 0x43, 0x77, 0x4d, 0x05, 0x4d, 0x6d,
+ 0xfb, 0xc4, 0x6c, 0x22, 0xec, 0x5a, 0x7f, 0x57,
+ 0xd4, 0x87, 0x7e, 0x03, 0xa7, 0xff, 0xca, 0x2a,
+ 0x96, 0xc5, 0x47, 0xfa, 0xbd, 0xb0, 0xe8, 0x69,
+ 0x10, 0xdc, 0x46, 0x93, 0xbf, 0xac, 0x3a, 0x60,
+ 0x29, 0xd1, 0xe3, 0x61, 0xf1, 0xb9, 0x3b, 0x8c,
+ 0x75, 0xbd, 0x9c, 0x6c, 0x27, 0x96, 0x50, 0x35,
+ 0x0b, 0xbc, 0xc6, 0xc3, 0x73, 0xba, 0x5d, 0x21,
+ 0x74, 0x92, 0xfa, 0xe9, 0x8e, 0xa7, 0xd0, 0x9b,
+ 0x6a, 0x30, 0x31, 0x8f, 0xb1, 0x90, 0xea, 0xc4,
+ 0xf4, 0x7e, 0xc6, 0x0b, 0xf9, 0xe3, 0x6a, 0xca,
+ 0xa9, 0xcc, 0xe5, 0x8b, 0x68, 0xc5, 0x78, 0xa3,
+ 0x62, 0xeb, 0x0e, 0x36, 0xf5, 0x79, 0xfc, 0xeb,
+ 0x14, 0xdd, 0x43, 0x45, 0x3b, 0x3e, 0x14, 0xdd,
+ 0x43, 0x45, 0x47, 0x3f, 0xed, 0x7b, 0xac, 0x53,
+ 0x75, 0x0d, 0x13, 0x44, 0x9d, 0x67, 0xec, 0xc3,
+ 0x09, 0xfc, 0xeb, 0x14, 0xdd, 0x43, 0x45, 0x5f,
+ 0x3e, 0x14, 0xdd, 0x43, 0x45, 0x6d, 0x3f, 0xcf,
+ 0x75, 0x8a, 0x6e, 0xa1, 0xa2, 0x41, 0x93, 0xac,
+ 0xfc, 0x74, 0xc2, 0x7f, 0xe7, 0x6b, 0xdd, 0x62,
+ 0x9b, 0xa8, 0x68, 0x90, 0xe7, 0xc2, 0x9b, 0xa8,
+ 0x68, 0xb1, 0x27, 0xd6, 0x2b, 0xfe, 0x87, 0x4f,
+ 0xec, 0x2f, 0x5e, 0x2b, 0x15, 0x3a, 0x7f, 0xe5,
+ 0xba, 0xdf, 0xf9, 0xf0, 0x17, 0xe7, 0x4e, 0xfa,
+ 0xd0, 0x74, 0x9f, 0xf3, 0xdf, 0xed, 0x0e, 0x77,
+ 0x17, 0x80, 0x74, 0xfb, 0xcd, 0xbb, 0xda, 0x9d,
+ 0x38, 0x55, 0xe7, 0x4f, 0xeb, 0x17, 0x82, 0xed,
+ 0xa3, 0xa7, 0xda, 0xfe, 0xb8, 0x53, 0xa7, 0xea,
+ 0xd4, 0x7c, 0x1e, 0x39, 0xd0, 0xa8, 0x8a, 0xf1,
+ 0x8e, 0x94, 0x4f, 0xff, 0x3d, 0x58, 0xaf, 0xe7,
+ 0xeb, 0x8d, 0xb1, 0x3a, 0x7f, 0x27, 0xed, 0xb7,
+ 0xee, 0xa7, 0x45, 0x28, 0x80, 0xc2, 0x6c, 0xfe,
+ 0x02, 0xde, 0x7d, 0xf0, 0x95, 0x16, 0xac, 0x17,
+ 0xa1, 0x82, 0x13, 0xd3, 0x09, 0x4f, 0x14, 0xb4,
+ 0x3e, 0x25, 0x58, 0x85, 0x26, 0xc2, 0xb8, 0x04,
+ 0x93, 0xff, 0x63, 0xcb, 0x9c, 0x6f, 0x4b, 0xf8,
+ 0x0e, 0x9f, 0xfe, 0xba, 0x5f, 0x9e, 0xe8, 0x76,
+ 0x35, 0x9e, 0xa9, 0xd3, 0x61, 0xd6, 0x89, 0x8f,
+ 0xa2, 0xc3, 0x93, 0x62, 0x58, 0xcd, 0x27, 0xf3,
+ 0xac, 0x53, 0x75, 0x0d, 0x16, 0x6c, 0xff, 0xe7,
+ 0x33, 0x5e, 0xeb, 0x14, 0xdd, 0x43, 0x45, 0x01,
+ 0x37, 0x78, 0x3a, 0x7f, 0x7e, 0xf2, 0x0e, 0xbf,
+ 0x68, 0xe9, 0xb8, 0x54, 0xe9, 0xe4, 0xdd, 0x43,
+ 0x45, 0xbf, 0x3f, 0x75, 0xce, 0xa6, 0x89, 0xd0,
+ 0x27, 0xae, 0x02, 0xb9, 0xf6, 0x5f, 0x5e, 0xb5,
+ 0x3a, 0x7f, 0x2b, 0x6e, 0xb9, 0xfa, 0x80, 0xe9,
+ 0xed, 0xf7, 0xf2, 0x74, 0xfe, 0xee, 0x9a, 0xaa,
+ 0x5b, 0x0e, 0x9e, 0xc7, 0x4e, 0x58, 0x74, 0xd6,
+ 0xf3, 0xa2, 0xcd, 0xd7, 0xc9, 0x64, 0xee, 0x31,
+ 0x3e, 0xb5, 0x17, 0x79, 0xb5, 0xb7, 0x89, 0x0e,
+ 0x0a, 0x80, 0x6d, 0xf2, 0x1c, 0xb6, 0xcf, 0xfb,
+ 0x5e, 0xeb, 0x14, 0xdd, 0x43, 0x45, 0x29, 0x3f,
+ 0xcf, 0x75, 0x8a, 0x6e, 0xa1, 0xa2, 0x4e, 0x93,
+ 0x98, 0x88, 0x7d, 0x46, 0x85, 0x77, 0x67, 0xb4,
+ 0x46, 0x45, 0xcd, 0xae, 0x27, 0xb8, 0xf0, 0x12,
+ 0x16, 0x3e, 0x27, 0xe3, 0xc2, 0xb1, 0xa2, 0x66,
+ 0x4e, 0x59, 0xe0, 0xa4, 0x07, 0x75, 0x94, 0x7a,
+ 0xda, 0x30, 0xe9, 0xf0, 0xa6, 0xea, 0x1a, 0x21,
+ 0xf9, 0xff, 0x6b, 0xdd, 0x62, 0x9b, 0xa8, 0x68,
+ 0x94, 0xe4, 0xeb, 0x3f, 0x66, 0x18, 0x4f, 0xe7,
+ 0x58, 0xa6, 0xea, 0x1a, 0x22, 0x79, 0xfc, 0xeb,
+ 0x14, 0xdd, 0x43, 0x44, 0x63, 0x3f, 0xf9, 0xcc,
+ 0xd7, 0xba, 0xc5, 0x37, 0x50, 0xd1, 0x3c, 0xc2,
+ 0xa3, 0xbe, 0x82, 0x77, 0x9d, 0xe0, 0xee, 0x7c,
+ 0x29, 0xba, 0x86, 0x88, 0x82, 0x7f, 0xda, 0xf7,
+ 0x58, 0xa6, 0xea, 0x1a, 0x25, 0x49, 0x3a, 0xcf,
+ 0xd9, 0x86, 0x13, 0xf9, 0xd6, 0x29, 0xba, 0x86,
+ 0x88, 0xa2, 0x7f, 0x3a, 0xc5, 0x37, 0x50, 0xd1,
+ 0x19, 0x4f, 0xfe, 0x73, 0x35, 0xee, 0xb1, 0x4d,
+ 0xd4, 0x34, 0x4c, 0xb3, 0xf9, 0xd6, 0x29, 0xba,
+ 0x86, 0x8a, 0x92, 0x7f, 0x3a, 0xc5, 0x37, 0x50,
+ 0xd1, 0x5d, 0x4f, 0xe7, 0x58, 0xa6, 0xea, 0x1a,
+ 0x2c, 0x59, 0xff, 0x99, 0xaf, 0x75, 0x8a, 0x6e,
+ 0xa1, 0xa2, 0x7a, 0x9f, 0xe0, 0xbb, 0x57, 0xdc,
+ 0x5e, 0x6f, 0x3a, 0x1c, 0x88, 0xa5, 0x4c, 0x9f,
+ 0x9b, 0x8a, 0xf3, 0xee, 0xea, 0x74, 0xf0, 0xb3,
+ 0x34, 0x9d, 0x39, 0x2f, 0x05, 0x4f, 0xff, 0xd8,
+ 0xfe, 0xf4, 0xf0, 0xab, 0xdf, 0x75, 0x00, 0x14,
+ 0xe9, 0xff, 0xf8, 0x7c, 0xdf, 0xac, 0x72, 0x88,
+ 0xf9, 0xbd, 0x3b, 0xa0, 0xe9, 0xf2, 0x7b, 0x1d,
+ 0x58, 0x74, 0xff, 0xed, 0xaf, 0xec, 0x0e, 0xc7,
+ 0x93, 0x44, 0xe9, 0xf6, 0x70, 0xac, 0x43, 0xa7,
+ 0xff, 0x7f, 0x82, 0xaf, 0xd5, 0x9c, 0x38, 0x63,
+ 0x88, 0xe9, 0xb6, 0x93, 0xa7, 0xf6, 0xd7, 0x71,
+ 0xdf, 0xe8, 0x3a, 0x3e, 0x79, 0x5d, 0x8b, 0x47,
+ 0x95, 0x08, 0x0a, 0xdb, 0x18, 0x30, 0x53, 0xf4,
+ 0x7c, 0x93, 0x37, 0xc2, 0x72, 0x77, 0xf7, 0x26,
+ 0xa8, 0x5a, 0x77, 0xfd, 0x53, 0xa4, 0x16, 0xe8,
+ 0xf1, 0x14, 0xa2, 0x78, 0x5b, 0x6b, 0x0e, 0x8b,
+ 0x3c, 0xef, 0x16, 0x4f, 0xfb, 0xd8, 0xdc, 0xab,
+ 0x55, 0xf3, 0x0e, 0x9f, 0x7f, 0xa7, 0xae, 0xa7,
+ 0x4f, 0xfd, 0x61, 0xd0, 0x5a, 0x63, 0x41, 0x53,
+ 0xa3, 0xc7, 0xd5, 0xf2, 0x99, 0xef, 0xf3, 0xc3,
+ 0xa1, 0xd3, 0xf5, 0xd4, 0x3b, 0xfa, 0x0e, 0x8d,
+ 0x3d, 0x4f, 0x93, 0xcf, 0xbb, 0xe9, 0x5e, 0x54,
+ 0xe8, 0xb4, 0x61, 0x79, 0xdb, 0x04, 0x33, 0xff,
+ 0xff, 0xb0, 0xbe, 0x11, 0x5e, 0xb9, 0xf7, 0xfb,
+ 0x7d, 0xd7, 0x9e, 0xf4, 0x5e, 0x74, 0xfa, 0x8e,
+ 0x47, 0xc1, 0x3a, 0x7e, 0xe7, 0x44, 0x1c, 0x56,
+ 0x74, 0xff, 0xbf, 0xe7, 0xe7, 0x16, 0x3e, 0xa9,
+ 0xd3, 0xfe, 0xdb, 0x02, 0xff, 0x79, 0xbe, 0x87,
+ 0x43, 0xcf, 0xf0, 0x07, 0xd3, 0xff, 0x96, 0xe9,
+ 0xce, 0x17, 0x3f, 0x50, 0x54, 0xe9, 0xd5, 0xc3,
+ 0x0e, 0x8c, 0x9f, 0x2f, 0x69, 0x33, 0xf7, 0x75,
+ 0xcd, 0x6f, 0x27, 0x4e, 0x08, 0x42, 0x54, 0xff,
+ 0xec, 0xfb, 0x35, 0xc7, 0xb8, 0xba, 0x8a, 0xbc,
+ 0xa7, 0x17, 0x91, 0xe4, 0x54, 0x76, 0x95, 0x0f,
+ 0x55, 0x89, 0x6f, 0x5e, 0x29, 0x18, 0x55, 0xfe,
+ 0x10, 0xf9, 0x86, 0x5c, 0xdd, 0x2c, 0xe9, 0xf0,
+ 0x72, 0xb4, 0x84, 0xe9, 0xfc, 0xba, 0x38, 0x0e,
+ 0xf2, 0x54, 0xc1, 0x09, 0x51, 0xc9, 0xe3, 0x84,
+ 0xc6, 0x7a, 0xb9, 0xf7, 0x1c, 0xa7, 0x1a, 0x39,
+ 0x83, 0x53, 0xa5, 0x67, 0x4a, 0x9b, 0x34, 0xb9,
+ 0x16, 0x9f, 0xfa, 0xb5, 0xe7, 0xeb, 0xce, 0x17,
+ 0x35, 0x3a, 0x14, 0xfb, 0x7b, 0x27, 0x9f, 0xf6,
+ 0x7c, 0x3a, 0x06, 0xfc, 0xde, 0x0e, 0x87, 0x9f,
+ 0x17, 0x88, 0xa7, 0xa8, 0xbf, 0x09, 0xd3, 0xfe,
+ 0x5a, 0x70, 0xac, 0x4c, 0x79, 0xa3, 0xa2, 0xcf,
+ 0x80, 0x48, 0x67, 0xec, 0xa8, 0xf3, 0x7f, 0x3a,
+ 0x7f, 0x73, 0x85, 0xf8, 0x76, 0x93, 0xa7, 0xfe,
+ 0xf7, 0x38, 0x54, 0x50, 0x6f, 0xc0, 0x74, 0xff,
+ 0xff, 0xbc, 0xcd, 0xfd, 0x2f, 0x70, 0x6f, 0xcd,
+ 0xaf, 0xf7, 0xce, 0xbc, 0xf1, 0x7a, 0xc2, 0xa6,
+ 0x3f, 0xa5, 0x95, 0x34, 0xed, 0x0e, 0x7f, 0xfa,
+ 0xf3, 0x5b, 0x6b, 0x0a, 0xda, 0xf1, 0x85, 0x3a,
+ 0x7f, 0xff, 0xfd, 0xeb, 0xa6, 0xbe, 0xb0, 0xf0,
+ 0xba, 0x5f, 0x5f, 0x66, 0xbe, 0xa7, 0x9e, 0x7b,
+ 0xa0, 0xe8, 0xfa, 0x37, 0xb2, 0xa1, 0x37, 0x82,
+ 0x74, 0xdd, 0x40, 0x74, 0x34, 0x6b, 0x80, 0x2d,
+ 0x39, 0xfb, 0xc9, 0xd3, 0x04, 0x27, 0x47, 0x8f,
+ 0x52, 0xa4, 0x41, 0x1c, 0x9d, 0x9e, 0xa0, 0x29,
+ 0xc6, 0xbe, 0x7f, 0xff, 0xf6, 0x57, 0x9c, 0x77,
+ 0xbd, 0x19, 0xbc, 0xdd, 0xff, 0xa5, 0x6b, 0x7f,
+ 0x01, 0xd1, 0x4a, 0x2a, 0xfc, 0x5d, 0x3f, 0xd7,
+ 0x9c, 0x28, 0xe6, 0xd0, 0xe9, 0xca, 0x2d, 0x1d,
+ 0x16, 0x9f, 0x9e, 0xc6, 0xff, 0xf2, 0x4e, 0x23,
+ 0x59, 0xf7, 0xef, 0x3a, 0xde, 0x74, 0xff, 0xd6,
+ 0x23, 0x6d, 0x62, 0xeb, 0xbf, 0x3a, 0x7f, 0x7d,
+ 0x47, 0xb4, 0xc2, 0x9d, 0x3e, 0xf7, 0x4c, 0x6b,
+ 0xce, 0x9f, 0xbc, 0xac, 0xa2, 0xc2, 0x74, 0xc1,
+ 0x09, 0xd0, 0x87, 0xd8, 0x25, 0x21, 0x2d, 0x9f,
+ 0xeb, 0x6b, 0x5a, 0xda, 0x5f, 0x52, 0x9c, 0x6b,
+ 0x67, 0xff, 0x5f, 0xc1, 0x78, 0xf5, 0x35, 0xc7,
+ 0x75, 0x3a, 0x7e, 0xfe, 0x83, 0x9b, 0xf9, 0xd3,
+ 0xf3, 0x3d, 0xc5, 0x63, 0xd0, 0xe9, 0xc1, 0x08,
+ 0x4a, 0x9f, 0xf9, 0x47, 0xfd, 0xef, 0x5b, 0x69,
+ 0x58, 0x73, 0x8b, 0xc8, 0xe3, 0xaa, 0x2e, 0x6a,
+ 0x19, 0x55, 0x4a, 0xca, 0x67, 0x65, 0xa1, 0x4d,
+ 0x9d, 0xa3, 0x41, 0xe4, 0x12, 0x9e, 0x7d, 0xd2,
+ 0xf3, 0xc8, 0x25, 0x3a, 0xbe, 0xe4, 0xf2, 0x09,
+ 0x4c, 0x10, 0x9e, 0x41, 0x28, 0x44, 0x52, 0x34,
+ 0x51, 0x92, 0xf0, 0x95, 0x4d, 0xb9, 0x2c, 0x82,
+ 0x47, 0x1b, 0xd9, 0xfa, 0xf1, 0x77, 0xfe, 0x87,
+ 0x4e, 0xdf, 0x83, 0xe7, 0xc1, 0x93, 0x39, 0xee,
+ 0x2b, 0xdc, 0x1d, 0x2b, 0xe3, 0x9e, 0xb0, 0x0c,
+ 0xe7, 0xf3, 0x4f, 0xee, 0x8c, 0xfa, 0x82, 0xa7,
+ 0xf7, 0x9f, 0xde, 0xd7, 0x1e, 0x3a, 0x4f, 0x2a,
+ 0x76, 0x8d, 0x05, 0x41, 0x50, 0xa6, 0xd5, 0x04,
+ 0x18, 0x37, 0x3d, 0xf5, 0x02, 0x14, 0xe3, 0x59,
+ 0x0a, 0x8c, 0x5b, 0x84, 0xac, 0xf7, 0x7a, 0x2f,
+ 0x3a, 0x4c, 0x3a, 0x6b, 0x7f, 0x26, 0xc5, 0xa2,
+ 0x19, 0xf0, 0x6d, 0xaf, 0x30, 0xe9, 0xf9, 0x15,
+ 0xa7, 0xa8, 0x0a, 0x97, 0x8e, 0x9f, 0xea, 0x3b,
+ 0x7f, 0x38, 0xef, 0x7e, 0x74, 0xfd, 0xe5, 0x65,
+ 0x16, 0x13, 0xa7, 0xd7, 0x43, 0x2d, 0x87, 0x4e,
+ 0xaf, 0x84, 0xe8, 0xf9, 0xe1, 0x64, 0x9e, 0x7e,
+ 0xfe, 0x80, 0x1d, 0xd4, 0xe9, 0xfb, 0xdd, 0x3a,
+ 0xab, 0x1d, 0xca, 0x61, 0x96, 0x20, 0x27, 0xb5,
+ 0x6f, 0xc9, 0x14, 0x5a, 0x7a, 0x3e, 0x28, 0xfc,
+ 0x67, 0x13, 0xdf, 0xba, 0x3b, 0x3a, 0x1e, 0xaf,
+ 0x5e, 0xca, 0xf1, 0x0f, 0xdf, 0xab, 0xd6, 0x3f,
+ 0xfc, 0x9b, 0x4f, 0xff, 0xa8, 0x11, 0xbe, 0x75,
+ 0x98, 0xdc, 0xfd, 0x5a, 0x3a, 0x70, 0x42, 0x12,
+ 0xa6, 0x7a, 0x94, 0xe2, 0xf2, 0x15, 0x12, 0xa2,
+ 0xe3, 0x3f, 0x50, 0xd3, 0xf8, 0xd1, 0xa0, 0xe9,
+ 0xec, 0x6d, 0x21, 0x3a, 0x7d, 0x40, 0xf9, 0x58,
+ 0x74, 0xff, 0xf2, 0xf5, 0xcf, 0xd4, 0x1b, 0x90,
+ 0x75, 0xfb, 0xce, 0x86, 0xee, 0x8d, 0x1f, 0x1a,
+ 0xe9, 0x16, 0x49, 0xe7, 0x3f, 0xdf, 0x3a, 0x7e,
+ 0xca, 0xb5, 0xfe, 0xea, 0x74, 0x3c, 0xf2, 0xf2,
+ 0x39, 0x3b, 0xbe, 0xdb, 0x93, 0xa6, 0xd7, 0x71,
+ 0x8d, 0xd3, 0x93, 0x70, 0x35, 0x6e, 0x30, 0x89,
+ 0x65, 0x15, 0x51, 0x0f, 0xf7, 0x90, 0xf3, 0x1b,
+ 0x5d, 0xca, 0xf3, 0xe8, 0xcc, 0x82, 0xfe, 0x84,
+ 0x93, 0x51, 0x95, 0x0c, 0x20, 0x99, 0x19, 0xfe,
+ 0x25, 0x87, 0x6a, 0x2f, 0xca, 0x6b, 0x29, 0xbf,
+ 0x33, 0xba, 0x5d, 0xc3, 0xe3, 0x8a, 0x1e, 0x5d,
+ 0x61, 0x1a, 0xde, 0x45, 0x3f, 0xf9, 0xcc, 0xd7,
+ 0xba, 0xc5, 0x37, 0x50, 0xd1, 0x45, 0x4f, 0xe7,
+ 0x58, 0xa6, 0xea, 0x1a, 0x2e, 0x89, 0xff, 0x9d,
+ 0xaf, 0x75, 0x8a, 0x6e, 0xa1, 0xa2, 0x4b, 0x9f,
+ 0xce, 0xb1, 0x4d, 0xd4, 0x34, 0x5e, 0x50, 0xad,
+ 0xfc, 0x3d, 0x04, 0xef, 0x3b, 0xb3, 0xb4, 0x52,
+ 0x68, 0xed, 0x87, 0x78, 0x86, 0x2f, 0xeb, 0xa9,
+ 0x4a, 0xc7, 0x6b, 0x95, 0x2e, 0xce, 0xdb, 0x26,
+ 0x4f, 0xfe, 0x73, 0x35, 0xee, 0xb1, 0x4d, 0xd4,
+ 0x34, 0x4b, 0x33, 0x77, 0x83, 0xa7, 0x93, 0x75,
+ 0x0d, 0x11, 0x9c, 0xfd, 0xe5, 0x65, 0x16, 0x13,
+ 0xa6, 0xfb, 0xce, 0x93, 0x0e, 0x9f, 0x78, 0x71,
+ 0xae, 0x13, 0xd3, 0x61, 0x6f, 0x51, 0x69, 0xfb,
+ 0x5f, 0xe1, 0xd1, 0x3a, 0x75, 0x56, 0x93, 0xa0,
+ 0x53, 0x10, 0x63, 0xf7, 0xd3, 0x32, 0x55, 0x3f,
+ 0xf6, 0x7c, 0x3a, 0x0e, 0x14, 0xbd, 0x58, 0x74,
+ 0xfb, 0xea, 0xfa, 0xe9, 0xd1, 0xe3, 0xec, 0x6c,
+ 0x8d, 0x3b, 0x7a, 0xbc, 0xe9, 0xff, 0xfb, 0xdc,
+ 0xf7, 0x9a, 0xd2, 0xf5, 0xf8, 0x2b, 0xc3, 0xbf,
+ 0x9d, 0x3f, 0xf5, 0xb3, 0x3e, 0x0d, 0x57, 0x1b,
+ 0xc7, 0x3a, 0x7f, 0xd8, 0x5f, 0x63, 0xcb, 0xf6,
+ 0xbb, 0x3a, 0x4e, 0xe3, 0x15, 0x7d, 0xdc, 0x64,
+ 0xed, 0x42, 0xa7, 0x04, 0x9a, 0x3b, 0xf6, 0x3a,
+ 0xa3, 0xcf, 0xfe, 0x73, 0x35, 0xee, 0xb1, 0x4d,
+ 0xd4, 0x34, 0x4d, 0x33, 0xff, 0x9c, 0xcd, 0x7b,
+ 0xac, 0x53, 0x75, 0x0d, 0x13, 0x8c, 0xff, 0xe7,
+ 0x33, 0x5e, 0xeb, 0x14, 0xdd, 0x43, 0x45, 0x03,
+ 0x3e, 0x14, 0xdd, 0x43, 0x45, 0xc1, 0x32, 0xf8,
+ 0xe9, 0xfd, 0xf7, 0xaf, 0xb9, 0xb6, 0x1d, 0x27,
+ 0x59, 0xfc, 0x60, 0xc3, 0xb1, 0x59, 0xfd, 0xe7,
+ 0x75, 0x50, 0x58, 0x4e, 0x9f, 0xe7, 0xba, 0xc5,
+ 0x37, 0x50, 0xd1, 0x24, 0xc9, 0xd8, 0x3f, 0x5d,
+ 0x34, 0x8a, 0x17, 0x81, 0xdf, 0x2d, 0x35, 0x1e,
+ 0xda, 0x52, 0x02, 0x95, 0x61, 0x95, 0x98, 0x55,
+ 0x4f, 0xfb, 0xa6, 0xba, 0xc5, 0x37, 0x50, 0xd1,
+ 0x6a, 0x4f, 0xfb, 0x5e, 0xeb, 0x14, 0xdd, 0x43,
+ 0x44, 0xab, 0x07, 0x49, 0xdd, 0x11, 0x30, 0xc4,
+ 0x86, 0xf4, 0x69, 0xfc, 0xeb, 0x14, 0xdd, 0x43,
+ 0x44, 0x53, 0x3f, 0x9d, 0x62, 0x9b, 0xa8, 0x68,
+ 0x8d, 0x26, 0xef, 0x07, 0x4f, 0x85, 0x37, 0x50,
+ 0xd1, 0x4f, 0xc9, 0xdc, 0x61, 0xe3, 0xd8, 0xbc,
+ 0xff, 0xe7, 0x33, 0x5e, 0xeb, 0x14, 0xdd, 0x43,
+ 0x44, 0xd5, 0x3f, 0x9d, 0x62, 0x9b, 0xa8, 0x68,
+ 0xae, 0xe7, 0x93, 0x75, 0x0d, 0x15, 0xf4, 0xe0,
+ 0x84, 0x25, 0x4b, 0xe5, 0x38, 0xbc, 0x81, 0x3e,
+ 0x66, 0x23, 0xce, 0x7a, 0xd2, 0x74, 0xff, 0xaf,
+ 0x01, 0xdc, 0xd5, 0x6e, 0x83, 0xa5, 0x93, 0xa7,
+ 0xfb, 0xc3, 0x74, 0x79, 0xf7, 0xc9, 0xd0, 0x27,
+ 0x93, 0xa2, 0x12, 0x75, 0xa3, 0x8d, 0xa2, 0x1f,
+ 0x8e, 0x56, 0x10, 0xd3, 0xff, 0x9c, 0xcd, 0x7b,
+ 0xac, 0x53, 0x75, 0x0d, 0x13, 0xdc, 0xfe, 0x75,
+ 0x8a, 0x6e, 0xa1, 0xa2, 0xe1, 0x9f, 0xf9, 0xda,
+ 0xf7, 0x58, 0xa6, 0xea, 0x1a, 0x24, 0xf8, 0x55,
+ 0xc1, 0xba, 0x0e, 0xde, 0x77, 0xd2, 0x10, 0x48,
+ 0x58, 0xd2, 0x90, 0xc7, 0x09, 0x84, 0x8a, 0xa9,
+ 0x36, 0x3b, 0x9f, 0xce, 0xb1, 0x4d, 0xd4, 0x34,
+ 0x45, 0x53, 0xf9, 0xd6, 0x29, 0xba, 0x86, 0x8a,
+ 0x66, 0x7f, 0xf3, 0x99, 0xaf, 0x75, 0x8a, 0x6e,
+ 0xa1, 0xa2, 0x67, 0x9f, 0xfc, 0xe6, 0x6b, 0xdd,
+ 0x62, 0x9b, 0xa8, 0x68, 0xa3, 0x62, 0x84, 0xc6,
+ 0xb9, 0x3b, 0xe8, 0x77, 0x95, 0x29, 0xff, 0x9d,
+ 0xaf, 0x75, 0x8a, 0x6e, 0xa1, 0xa2, 0x3a, 0x9b,
+ 0xbc, 0x1d, 0x3f, 0x7a, 0xff, 0xcd, 0xd0, 0x74,
+ 0xf8, 0x53, 0x75, 0x0d, 0x14, 0xd4, 0xff, 0xcf,
+ 0xc7, 0xbf, 0x45, 0x7b, 0x51, 0x68, 0xe9, 0xfb,
+ 0xca, 0xca, 0x2c, 0x27, 0x4f, 0xff, 0x5e, 0x71,
+ 0x6f, 0x1d, 0xfe, 0x71, 0xaf, 0x3a, 0x65, 0x01,
+ 0xd3, 0xfd, 0x5d, 0xa5, 0x53, 0xc8, 0xe1, 0x44,
+ 0x7f, 0xcb, 0x7a, 0xa6, 0xc9, 0xdc, 0x62, 0x75,
+ 0x3c, 0x8b, 0xd9, 0x75, 0x26, 0x19, 0x86, 0xb4,
+ 0xf8, 0x53, 0x75, 0x0d, 0x15, 0x54, 0xff, 0xb5,
+ 0xee, 0xb1, 0x4d, 0xd4, 0x34, 0x4d, 0xb2, 0x75,
+ 0x9f, 0xb3, 0x0c, 0x27, 0xf3, 0xac, 0x53, 0x75,
+ 0x0d, 0x15, 0xfc, 0xfe, 0x75, 0x8a, 0x6e, 0xa1,
+ 0xa2, 0xc6, 0x9f, 0x0a, 0x6e, 0xa1, 0xa2, 0xd5,
+ 0x9f, 0xf6, 0xbd, 0xd6, 0x29, 0xba, 0x86, 0x8a,
+ 0x0a, 0x4e, 0xb3, 0xf6, 0x61, 0x84, 0xf8, 0x53,
+ 0x75, 0x0d, 0x17, 0x14, 0xf3, 0x7b, 0x7f, 0x90,
+ 0xe9, 0xfc, 0xac, 0xd6, 0xca, 0x2d, 0xe7, 0x49,
+ 0xd6, 0x88, 0xcd, 0x30, 0xc9, 0x3c, 0xfe, 0x75,
+ 0x8a, 0x6e, 0xa1, 0xa2, 0xe9, 0x9f, 0xff, 0xcb,
+ 0x8f, 0xf7, 0xbc, 0x7b, 0x7e, 0x2f, 0xa5, 0xf2,
+ 0xd7, 0x67, 0x4f, 0xf9, 0xf6, 0x23, 0xaf, 0xa2,
+ 0xc2, 0x74, 0xef, 0xeb, 0x85, 0x14, 0xb9, 0x69,
+ 0x9f, 0xf0, 0xad, 0x38, 0xda, 0xe5, 0x42, 0x74,
+ 0xdd, 0xe0, 0xe9, 0xf9, 0xba, 0xfd, 0xe3, 0x72,
+ 0x74, 0xfc, 0x0d, 0x69, 0xfe, 0xc9, 0xd3, 0xff,
+ 0xfe, 0xe8, 0xbc, 0xe2, 0xe9, 0xcf, 0xf7, 0x00,
+ 0xda, 0xd7, 0x45, 0x0e, 0x9e, 0x4d, 0xd4, 0x34,
+ 0x49, 0x93, 0xfc, 0x37, 0x4e, 0x73, 0xaf, 0xa9,
+ 0xd0, 0x27, 0xc6, 0xc2, 0xb9, 0xfb, 0x90, 0x37,
+ 0x55, 0x07, 0x11, 0xd3, 0xff, 0xb1, 0xec, 0xd2,
+ 0x9e, 0x1a, 0xb4, 0xba, 0x74, 0xfa, 0xf3, 0xe6,
+ 0x69, 0xd3, 0xff, 0xed, 0x41, 0x5c, 0x7e, 0xf3,
+ 0x6e, 0x08, 0x42, 0x54, 0x3c, 0xfe, 0x32, 0x4d,
+ 0x3f, 0x22, 0x76, 0x9f, 0x53, 0xa7, 0xff, 0x77,
+ 0xfd, 0xca, 0x8d, 0x70, 0xbf, 0xc9, 0xd3, 0x82,
+ 0x10, 0x95, 0x3f, 0x0e, 0xd0, 0xcf, 0x54, 0xa7,
+ 0x17, 0x93, 0xeb, 0x60, 0xdf, 0x1c, 0xe9, 0xf7,
+ 0xb3, 0x45, 0x84, 0xe9, 0xfe, 0x54, 0xc7, 0xfb,
+ 0xca, 0xd4, 0xe8, 0x13, 0xe0, 0x61, 0x44, 0xff,
+ 0x5e, 0x83, 0x85, 0xf3, 0xaf, 0x3a, 0x7f, 0xf6,
+ 0xd1, 0x8f, 0x2f, 0xed, 0xaf, 0x0f, 0x8e, 0x8b,
+ 0x45, 0x26, 0x48, 0x42, 0x73, 0x3e, 0xfd, 0xe3,
+ 0x72, 0x74, 0xff, 0x9e, 0xbf, 0xa3, 0xa8, 0xff,
+ 0xb7, 0x9d, 0x1c, 0x73, 0xe8, 0x68, 0x9a, 0x7b,
+ 0x34, 0x5f, 0x27, 0x4f, 0xf7, 0xba, 0x75, 0x10,
+ 0x33, 0xd5, 0x3a, 0x1a, 0x3e, 0x0e, 0x22, 0x39,
+ 0xc1, 0x08, 0x4e, 0x9f, 0xff, 0x5b, 0x33, 0xf5,
+ 0x05, 0xf3, 0x5b, 0x62, 0xa1, 0x4e, 0x2f, 0x22,
+ 0xd3, 0x2b, 0xf4, 0x21, 0xf0, 0x85, 0x3f, 0x61,
+ 0x78, 0x27, 0xa8, 0x3a, 0x7e, 0x1d, 0x1f, 0xab,
+ 0xce, 0x8e, 0x4f, 0x64, 0x4b, 0xe6, 0x7b, 0xb8,
+ 0xc5, 0xee, 0xde, 0x34, 0x5d, 0x4c, 0x5e, 0x5d,
+ 0x70, 0xd0, 0xe8, 0x42, 0x86, 0xf4, 0xc3, 0x0b,
+ 0xc4, 0x4d, 0x15, 0xeb, 0x2f, 0xcf, 0x2b, 0x19,
+ 0x6e, 0x63, 0xc2, 0xeb, 0x08, 0xe9, 0xff, 0xc3,
+ 0x61, 0xe7, 0x16, 0xd7, 0xec, 0x5e, 0x74, 0xe1,
+ 0xbe, 0x39, 0xd2, 0xb1, 0x3e, 0x76, 0x24, 0xcf,
+ 0xfd, 0x78, 0xfa, 0xd1, 0xd7, 0x18, 0xde, 0x39,
+ 0xd3, 0xf6, 0xa3, 0x82, 0x10, 0x9d, 0x27, 0x23,
+ 0x25, 0x88, 0x4c, 0xf6, 0x7c, 0xab, 0xf1, 0xb4,
+ 0xd4, 0x99, 0xb2, 0x54, 0x3d, 0x9e, 0xe3, 0xcc,
+ 0x7e, 0xb4, 0xc3, 0x48, 0x49, 0xd8, 0x76, 0x08,
+ 0x58, 0xd6, 0x16, 0x79, 0x34, 0xee, 0x94, 0x85,
+ 0x3f, 0x9d, 0x62, 0x9b, 0xa8, 0x68, 0x8d, 0x67,
+ 0xc2, 0x9b, 0xa8, 0x68, 0xa9, 0x66, 0xd4, 0x34,
+ 0x43, 0x52, 0x75, 0x9e, 0x8e, 0x98, 0x4f, 0xfc,
+ 0xed, 0x7b, 0xac, 0x53, 0x75, 0x0d, 0x11, 0xf4,
+ 0xfe, 0x75, 0x8a, 0x6e, 0xa1, 0xa2, 0xc7, 0x9c,
+ 0xdc, 0x76, 0x74, 0x3a, 0x7e, 0x6e, 0xbf, 0x78,
+ 0xdc, 0x9d, 0x3f, 0xdf, 0xd0, 0x57, 0x73, 0x9d,
+ 0x3a, 0x78, 0x0c, 0xf0, 0x9d, 0x3f, 0xff, 0xca,
+ 0x3f, 0xbe, 0x6f, 0x18, 0xf2, 0x63, 0xd9, 0xae,
+ 0xd2, 0x74, 0x79, 0x10, 0xf8, 0x21, 0x9d, 0xba,
+ 0x86, 0x8b, 0x42, 0x7f, 0xda, 0x16, 0xf4, 0xd1,
+ 0xa2, 0xc2, 0x74, 0x85, 0x0f, 0x94, 0x49, 0xa7,
+ 0xe6, 0xdd, 0x73, 0xf5, 0x01, 0xd3, 0xe5, 0xcd,
+ 0xe1, 0x4e, 0x9f, 0xfe, 0xbc, 0xd6, 0xda, 0xc2,
+ 0xb6, 0xbc, 0x61, 0x4e, 0x8a, 0x0f, 0xd7, 0xe4,
+ 0xb0, 0xa8, 0xc9, 0xb8, 0x53, 0x4f, 0xf8, 0x0a,
+ 0x98, 0xf3, 0x5b, 0xb4, 0x1d, 0x3f, 0xf5, 0xd7,
+ 0xdd, 0xfd, 0xe2, 0xb7, 0xc9, 0xd3, 0xec, 0xe3,
+ 0x7f, 0xd0, 0xe9, 0xfe, 0xff, 0x74, 0x73, 0x8b,
+ 0xfa, 0x9d, 0x37, 0xee, 0xcf, 0x91, 0x0a, 0x67,
+ 0xf5, 0xe1, 0xaf, 0x63, 0xcc, 0x3a, 0x7f, 0x3e,
+ 0xc6, 0xbf, 0x5a, 0x0e, 0x9d, 0x78, 0xd3, 0xa7,
+ 0xcd, 0x73, 0xdf, 0x7f, 0x3a, 0x39, 0x3c, 0x6d,
+ 0x1a, 0x9f, 0xeb, 0xb0, 0xda, 0x25, 0x84, 0xe8,
+ 0xb4, 0xc0, 0xa9, 0x34, 0xd7, 0x8a, 0x91, 0x4f,
+ 0x5e, 0x37, 0x27, 0x4f, 0xee, 0x9e, 0xff, 0x6f,
+ 0xba, 0x9d, 0x27, 0x71, 0x8b, 0xaa, 0xfc, 0x69,
+ 0x32, 0x98, 0xf3, 0x0b, 0xeb, 0x84, 0x46, 0x21,
+ 0xdc, 0x02, 0x6f, 0x9f, 0x56, 0x15, 0x19, 0x8c,
+ 0xb7, 0x88, 0xf7, 0xa9, 0x04, 0xfc, 0xdf, 0xee,
+ 0x7e, 0xad, 0x1d, 0x3d, 0x78, 0xdc, 0x9d, 0x26,
+ 0xea, 0xcf, 0x4b, 0xe6, 0x53, 0xe1, 0x4d, 0xd4,
+ 0x34, 0x5a, 0xd3, 0xfe, 0xd7, 0xba, 0xc5, 0x37,
+ 0x50, 0xd1, 0x41, 0xc9, 0xdc, 0x6a, 0x28, 0xac,
+ 0xb1, 0x86, 0x13, 0xff, 0x9c, 0xcd, 0x7b, 0xac,
+ 0x53, 0x75, 0x0d, 0x14, 0x5c, 0xfe, 0x75, 0x8a,
+ 0x6e, 0xa1, 0xa2, 0xea, 0x87, 0xb2, 0x48, 0x52,
+ 0x11, 0x9e, 0x26, 0x62, 0x66, 0x27, 0x64, 0x81,
+ 0x1e, 0x55, 0x4e, 0xb2, 0xa5, 0x3e, 0x14, 0xdd,
+ 0x43, 0x44, 0x43, 0x3b, 0x17, 0xc9, 0xd2, 0x75,
+ 0x9e, 0x65, 0x26, 0x13, 0xf9, 0xd6, 0x29, 0xba,
+ 0x86, 0x88, 0xda, 0x7f, 0x3a, 0xc5, 0x37, 0x50,
+ 0xd1, 0x4d, 0xcf, 0xe7, 0x58, 0xa6, 0xea, 0x1a,
+ 0x2a, 0x09, 0xfc, 0xeb, 0x14, 0xdd, 0x43, 0x45,
+ 0x4d, 0x3e, 0x14, 0xdd, 0x43, 0x45, 0x61, 0x3e,
+ 0xf0, 0x79, 0xec, 0x4e, 0x9f, 0xe7, 0xba, 0xc5,
+ 0x37, 0x50, 0xd1, 0x1f, 0xce, 0xb5, 0xa0, 0xe9,
+ 0x3a, 0xd1, 0x6a, 0x86, 0x1a, 0x53, 0xf4, 0x19,
+ 0xff, 0xce, 0x66, 0xbd, 0xd6, 0x29, 0xba, 0x86,
+ 0x89, 0xbe, 0x7f, 0xe6, 0x6b, 0xdd, 0x62, 0x9b,
+ 0xa8, 0x68, 0x9f, 0xa7, 0xcd, 0xdd, 0xba, 0xe2,
+ 0xba, 0x4e, 0x96, 0x0e, 0x86, 0xec, 0x78, 0xdd,
+ 0x9b, 0x4f, 0xff, 0x2a, 0xaa, 0xaa, 0xaa, 0xaa,
+ 0xd3, 0x53, 0xa7, 0xc3, 0xea, 0x35, 0x85, 0x4c,
+ 0x10, 0x95, 0x16, 0x6f, 0x42, 0x4f, 0x2e, 0xca,
+ 0x71, 0xa0, 0x85, 0x46, 0x3d, 0x61, 0x4d, 0x3f,
+ 0x0e, 0xa6, 0x3c, 0x27, 0x4f, 0x50, 0xcf, 0x3c,
+ 0xe9, 0xf5, 0x7f, 0xde, 0xbc, 0xe9, 0xfd, 0x85,
+ 0x63, 0x80, 0x05, 0x3a, 0x42, 0xa7, 0xfb, 0x64,
+ 0x7e, 0x28, 0x9f, 0xf2, 0xd3, 0xcf, 0x55, 0xe3,
+ 0xe3, 0xba, 0x9d, 0x38, 0x15, 0xb3, 0xa7, 0xfe,
+ 0xe5, 0x73, 0xb5, 0xbc, 0x63, 0xcc, 0x3a, 0x76,
+ 0x7c, 0xd1, 0xd0, 0xa7, 0xc3, 0x54, 0x48, 0x54,
+ 0xf9, 0x3c, 0x4e, 0x30, 0xa7, 0x61, 0x97, 0xd1,
+ 0xf2, 0xf9, 0x3d, 0xad, 0x75, 0x61, 0xd3, 0x6f,
+ 0xce, 0x81, 0x37, 0x2c, 0x24, 0x9c, 0x10, 0x84,
+ 0xe9, 0xea, 0x3f, 0xe5, 0x29, 0xc5, 0xe4, 0xf5,
+ 0x39, 0xf2, 0x1d, 0x0a, 0x88, 0xfc, 0x1e, 0x76,
+ 0x63, 0x3f, 0xf5, 0x1d, 0x82, 0xff, 0xdb, 0x4b,
+ 0x9d, 0x3a, 0x79, 0x73, 0x54, 0x34, 0x41, 0xd3,
+ 0xf6, 0xe1, 0x78, 0xfd, 0xbc, 0xe8, 0x14, 0x52,
+ 0xe5, 0x1d, 0xb1, 0x6c, 0xc3, 0xc9, 0xd3, 0x04,
+ 0x27, 0x43, 0xcd, 0x60, 0x45, 0xa7, 0xaa, 0xbe,
+ 0x6c, 0x53, 0x8d, 0x0c, 0xfa, 0xbd, 0x79, 0x05,
+ 0x4e, 0x8f, 0x1e, 0xf7, 0x53, 0x39, 0xc1, 0x08,
+ 0x4a, 0x82, 0x9c, 0x5e, 0x4f, 0x78, 0x3e, 0x68,
+ 0xa8, 0x43, 0x79, 0xe1, 0x98, 0xf2, 0x6f, 0x18,
+ 0x86, 0xe7, 0xdf, 0x27, 0x7f, 0xd5, 0x3a, 0x7b,
+ 0x9d, 0xf8, 0x0e, 0x9f, 0xf9, 0x7e, 0x0f, 0xad,
+ 0x2d, 0x2f, 0xc0, 0x74, 0x79, 0x10, 0x60, 0x1c,
+ 0xa9, 0x14, 0xf9, 0x6c, 0x71, 0xe3, 0xa7, 0xb9,
+ 0xb6, 0x71, 0xce, 0x86, 0x8f, 0x2d, 0xb1, 0x2c,
+ 0xfd, 0x9b, 0x6b, 0xea, 0xc3, 0xc4, 0x05, 0x3e,
+ 0xdf, 0xf3, 0x85, 0x34, 0x40, 0x4e, 0x37, 0x53,
+ 0xfc, 0xa3, 0x47, 0x0b, 0x6b, 0xcc, 0x3a, 0x7c,
+ 0xa0, 0xf5, 0x35, 0x3a, 0x7f, 0x0b, 0x55, 0xf7,
+ 0xf3, 0xe3, 0xa7, 0xa9, 0x00, 0xa9, 0x53, 0x04,
+ 0x25, 0x42, 0x9b, 0x70, 0x90, 0xcf, 0xda, 0x2f,
+ 0x7f, 0xfc, 0x53, 0x8d, 0x04, 0x2a, 0xa4, 0x8b,
+ 0x7b, 0xf2, 0xfe, 0x11, 0x3e, 0x77, 0x92, 0x8e,
+ 0xe1, 0x17, 0x3e, 0xef, 0x3d, 0xef, 0x53, 0x44,
+ 0x0f, 0x3f, 0xec, 0x77, 0x42, 0xf0, 0x5c, 0xaf,
+ 0x27, 0x4e, 0xd1, 0xa0, 0xe9, 0x82, 0x13, 0xa7,
+ 0xf0, 0xfa, 0xdb, 0x75, 0x7b, 0x90, 0xd8, 0x84,
+ 0x6e, 0x39, 0x45, 0xf8, 0xb9, 0xcf, 0xfd, 0xfb,
+ 0xe9, 0x8d, 0x7f, 0x5d, 0xa5, 0x4e, 0x85, 0x3e,
+ 0xab, 0x23, 0x9f, 0xfd, 0x6c, 0x66, 0xbe, 0xc5,
+ 0x37, 0x50, 0xd1, 0x0c, 0x46, 0x0f, 0xc7, 0xe4,
+ 0x13, 0xf5, 0x8a, 0x6e, 0xa1, 0xa2, 0x0a, 0x9e,
+ 0xcd, 0x54, 0x05, 0x4e, 0xd1, 0xa0, 0xa9, 0xee,
+ 0xff, 0xbd, 0x0a, 0x9f, 0xde, 0xa2, 0xf3, 0x55,
+ 0x01, 0x50, 0x54, 0xfd, 0x68, 0xb8, 0x56, 0x15,
+ 0x30, 0x42, 0x54, 0xfd, 0xf5, 0xfd, 0x1e, 0x12,
+ 0xa2, 0xd3, 0x0a, 0x42, 0x16, 0x0d, 0xe0, 0x90,
+ 0x06, 0x7f, 0x0a, 0x09, 0x57, 0x51, 0x69, 0xbc,
+ 0x25, 0x38, 0xfc, 0xa5, 0xaf, 0x4f, 0x5f, 0x11,
+ 0xd8, 0xcf, 0xf9, 0x5f, 0xbf, 0xba, 0x8a, 0xd4,
+ 0xe9, 0xfe, 0xce, 0x15, 0xb7, 0x2a, 0x05, 0x3a,
+ 0x7f, 0x96, 0x97, 0xf1, 0x2a, 0x5b, 0x0e, 0x85,
+ 0x3f, 0x4c, 0x1d, 0x4f, 0xff, 0xcd, 0x6e, 0xbf,
+ 0x71, 0xc2, 0xe8, 0xef, 0x3d, 0xef, 0x53, 0x45,
+ 0xf7, 0x3e, 0xf6, 0x7f, 0x6f, 0x3a, 0x7f, 0xdf,
+ 0xf3, 0xf3, 0x8b, 0x1f, 0x54, 0xe9, 0xfd, 0x90,
+ 0x75, 0xfb, 0xf1, 0x67, 0x88, 0x06, 0x76, 0x8b,
+ 0xcf, 0x10, 0x0c, 0x59, 0xf4, 0xf6, 0x85, 0x36,
+ 0xbc, 0xf1, 0x00, 0xcf, 0x6f, 0xe9, 0x79, 0xe2,
+ 0x01, 0x9f, 0xde, 0x4c, 0x58, 0x00, 0xa7, 0x88,
+ 0x06, 0x77, 0xbf, 0xc9, 0xe2, 0x01, 0x8e, 0x51,
+ 0x72, 0xc2, 0x2c, 0x17, 0xb6, 0x3e, 0x9c, 0x2b,
+ 0x93, 0xc4, 0x03, 0x07, 0x88, 0x06, 0x65, 0x61,
+ 0xe2, 0x01, 0x8e, 0x4d, 0xcf, 0x85, 0xe7, 0xbc,
+ 0xce, 0x54, 0xf1, 0x00, 0xce, 0xce, 0xa1, 0xe2,
+ 0x01, 0x9f, 0xf7, 0xf5, 0xee, 0xc7, 0x93, 0x44,
+ 0xf1, 0x00, 0xcd, 0xbc, 0x9e, 0x20, 0x19, 0xfd,
+ 0xfd, 0x0d, 0x6a, 0xa0, 0x3c, 0x40, 0x33, 0xef,
+ 0x74, 0xdf, 0x80, 0xf1, 0x00, 0xcd, 0xea, 0x9e,
+ 0x20, 0x18, 0x13, 0xd9, 0xc9, 0xb4, 0xfb, 0x3f,
+ 0x5a, 0x5e, 0x68, 0x80, 0x66, 0x02, 0x9e, 0x20,
+ 0x17, 0x1b, 0x59, 0xf7, 0x95, 0x9b, 0xc9, 0xe2,
+ 0x01, 0x9e, 0xef, 0x7e, 0x87, 0x88, 0x06, 0x72,
+ 0x8a, 0x1e, 0x20, 0x19, 0xff, 0x5d, 0x35, 0xe5,
+ 0x6f, 0xe0, 0xa9, 0xe2, 0x01, 0x9f, 0x77, 0xaf,
+ 0x7a, 0x9e, 0x20, 0x18, 0xb4, 0x40, 0x61, 0x32,
+ 0x61, 0x01, 0xe2, 0x01, 0x87, 0xaa, 0x8f, 0xe4,
+ 0x8e, 0xe1, 0x31, 0xe5, 0x6c, 0x19, 0x00, 0xd2,
+ 0xa5, 0xd9, 0x85, 0x37, 0x64, 0x53, 0xeb, 0xcd,
+ 0x76, 0x93, 0xc4, 0x03, 0x3f, 0xb9, 0x54, 0x68,
+ 0x57, 0x27, 0x88, 0x07, 0x93, 0x69, 0x38, 0x54,
+ 0x27, 0x88, 0x06, 0x10, 0xfd, 0xc5, 0x42, 0x7b,
+ 0xdf, 0x7d, 0x4f, 0x10, 0x0c, 0xfd, 0xad, 0x3e,
+ 0xe9, 0x79, 0xe2, 0x01, 0x8b, 0x44, 0x50, 0x08,
+ 0x3b, 0x2f, 0x9f, 0xec, 0x2d, 0x5d, 0x5e, 0xc4,
+ 0x07, 0x88, 0x06, 0x5e, 0x3c, 0x40, 0x33, 0x6d,
+ 0x1c, 0x9f, 0x1e, 0x11, 0xa6, 0x10, 0x1e, 0x20,
+ 0x19, 0xf6, 0xe6, 0xbe, 0xa4, 0xf1, 0x00, 0xcf,
+ 0xde, 0xff, 0x6f, 0xba, 0x9e, 0x20, 0x18, 0x54,
+ 0x49, 0x7c, 0x8b, 0x26, 0xb1, 0xcb, 0x20, 0x3a,
+ 0xe1, 0xb6, 0xd2, 0x00, 0xb0, 0x60, 0x8b, 0x4b,
+ 0xc0, 0x4f, 0x59, 0x5b, 0x19, 0x8f, 0x03, 0x8a,
+ 0x12, 0x7d, 0x61, 0x83, 0x3b, 0x75, 0x0d, 0x10,
+ 0x0b, 0x91, 0x79, 0x3d, 0xd1, 0xb8, 0x72, 0xc3,
+ 0xa6, 0x02, 0x95, 0x2e, 0x85, 0x4e, 0xc2, 0xd0,
+ 0x74, 0xc1, 0x09, 0x51, 0xe3, 0xd9, 0xe3, 0x8a,
+ 0xb4, 0x24, 0x11, 0xc9, 0xcc, 0xf5, 0x4a, 0x71,
+ 0xe0, 0xcf, 0x66, 0xad, 0xfd, 0x9d, 0x14, 0x32,
+ 0xba, 0x1e, 0x4e, 0x94, 0x97, 0x1f, 0x1c, 0x02,
+ 0x18, 0xbd, 0x4b, 0x67, 0xe1, 0x69, 0xea, 0x34,
+ 0x1d, 0x3f, 0xe7, 0xd7, 0x87, 0xed, 0x8a, 0x3d,
+ 0x0e, 0x9f, 0xf8, 0x71, 0xb6, 0xf5, 0x10, 0x75,
+ 0x61, 0xd3, 0xf7, 0x50, 0x8f, 0xaf, 0x05, 0x4f,
+ 0x35, 0x8d, 0x68, 0xe9, 0xf5, 0xb4, 0xf5, 0xa4,
+ 0xe9, 0xeb, 0xfa, 0xbc, 0xa8, 0x13, 0xeb, 0xf9,
+ 0x1b, 0x79, 0x44, 0x2a, 0x6f, 0x76, 0x5b, 0xe4,
+ 0x1c, 0x21, 0xec, 0x26, 0x67, 0xbd, 0xfc, 0xd4,
+ 0xe9, 0xdd, 0xb7, 0x35, 0x3a, 0x7f, 0xe0, 0x32,
+ 0xd3, 0x1e, 0xe7, 0x1d, 0xf4, 0x3a, 0x7f, 0xec,
+ 0xd6, 0xf9, 0x5a, 0x6b, 0x74, 0xe4, 0xe9, 0xfc,
+ 0xfb, 0xaf, 0x5a, 0xe6, 0xce, 0x85, 0x47, 0x27,
+ 0x88, 0xb5, 0x23, 0xb4, 0x69, 0xf6, 0xb6, 0xe7,
+ 0x95, 0x3a, 0x6a, 0xd4, 0xe9, 0xc1, 0x08, 0x4e,
+ 0x98, 0x1a, 0x53, 0x8b, 0xc8, 0x13, 0xd6, 0xa9,
+ 0x94, 0xed, 0x05, 0x95, 0x0f, 0x45, 0xdb, 0x21,
+ 0x01, 0xc4, 0x43, 0x3f, 0xb3, 0xfb, 0xa4, 0x1d,
+ 0x5e, 0x74, 0xff, 0x7e, 0xdb, 0x5b, 0x82, 0x10,
+ 0x95, 0x39, 0x9b, 0x93, 0xa3, 0x07, 0xaa, 0xd8,
+ 0xea, 0x7d, 0x6d, 0x3d, 0x5e, 0x74, 0x2a, 0x61,
+ 0xde, 0x38, 0xd8, 0x45, 0xe4, 0x92, 0x7f, 0xf5,
+ 0xf3, 0xac, 0xba, 0x5f, 0x60, 0xbe, 0x4e, 0x9b,
+ 0x1a, 0x74, 0xcd, 0x54, 0xe9, 0xf5, 0xb6, 0xf7,
+ 0xf9, 0xb3, 0x59, 0xd4, 0x56, 0x38, 0x22, 0xe1,
+ 0xce, 0xd3, 0xdc, 0xde, 0x34, 0xe9, 0xff, 0x96,
+ 0xfe, 0xfc, 0x5f, 0xfe, 0xa1, 0x3a, 0x5e, 0x14,
+ 0x44, 0x7c, 0x97, 0x24, 0x31, 0x43, 0x6e, 0x28,
+ 0xf8, 0xf4, 0xb9, 0x8f, 0xe7, 0xa1, 0x7a, 0x42,
+ 0xbf, 0xc4, 0x23, 0x4b, 0x56, 0xc4, 0x7c, 0xc0,
+ 0x4d, 0xfc, 0x60, 0xd9, 0x94, 0x0a, 0xda, 0x38,
+ 0x19, 0xfe, 0xb1, 0xfa, 0xe5, 0xf7, 0x83, 0xa7,
+ 0xef, 0x82, 0xf9, 0xd7, 0x9d, 0x3e, 0xea, 0xd3,
+ 0xd7, 0x8e, 0x54, 0x2a, 0x24, 0x6c, 0xdb, 0xa9,
+ 0x6c, 0xff, 0xe1, 0xe9, 0xfe, 0xf7, 0xad, 0xd7,
+ 0xcb, 0xf3, 0xa5, 0xd4, 0xd1, 0x02, 0xcb, 0x26,
+ 0xa0, 0x52, 0x5e, 0xc9, 0xbc, 0x08, 0xfc, 0xff,
+ 0xbd, 0xc5, 0x8f, 0x75, 0x70, 0x00, 0xa5, 0x4f,
+ 0xfe, 0xcd, 0x76, 0x9e, 0x0c, 0x5b, 0xfe, 0x78,
+ 0x8e, 0x85, 0x44, 0x9f, 0x91, 0x27, 0xff, 0xf8,
+ 0x68, 0xbf, 0x35, 0xba, 0xfa, 0xab, 0x39, 0xc2,
+ 0xfd, 0x0e, 0x9d, 0x47, 0xde, 0x74, 0x2a, 0x7d,
+ 0x0c, 0x84, 0x4e, 0x21, 0x75, 0xa4, 0x5d, 0xb3,
+ 0x4f, 0xe7, 0xb5, 0x7f, 0xdc, 0x59, 0xd3, 0xff,
+ 0x85, 0x3f, 0x6d, 0xbf, 0x6a, 0x2b, 0x53, 0xa7,
+ 0xf6, 0xb5, 0x8b, 0x65, 0xd4, 0xe8, 0xb3, 0xf9,
+ 0x6c, 0x8f, 0x3f, 0x7b, 0xa6, 0x6e, 0xd8, 0x74,
+ 0xfa, 0xf9, 0xf0, 0xd4, 0xe9, 0xff, 0xea, 0xe6,
+ 0x94, 0xf6, 0x38, 0x37, 0xde, 0x3c, 0xc3, 0xa4,
+ 0xb4, 0x1f, 0xe8, 0x49, 0xe3, 0xc8, 0xf6, 0xc1,
+ 0x1e, 0x61, 0x57, 0x3f, 0xef, 0xfb, 0xad, 0x36,
+ 0xda, 0x95, 0xea, 0x74, 0xee, 0x74, 0x4e, 0x9f,
+ 0x03, 0x7f, 0x6d, 0xe7, 0x42, 0x9e, 0x27, 0x63,
+ 0x73, 0xca, 0xca, 0x5a, 0x3a, 0x15, 0x55, 0x2b,
+ 0xe3, 0xa1, 0xb3, 0x5a, 0xc2, 0x2b, 0x24, 0x53,
+ 0xe5, 0xa1, 0x5b, 0xd4, 0xe9, 0xfb, 0xbe, 0xb8,
+ 0xba, 0x6a, 0x74, 0xf0, 0x36, 0x9a, 0x9d, 0x30,
+ 0x42, 0x74, 0x54, 0xdc, 0x04, 0x8a, 0x7d, 0xec,
+ 0x6d, 0xe0, 0xa7, 0x1a, 0x18, 0xc2, 0x3a, 0x5b,
+ 0x92, 0x9a, 0xc2, 0x2a, 0x70, 0x42, 0x12, 0xa7,
+ 0x9f, 0x9b, 0x42, 0x9c, 0x5e, 0x4f, 0xaf, 0x9f,
+ 0x02, 0xa7, 0xd3, 0xfa, 0x5a, 0x27, 0xc9, 0xf2,
+ 0xf9, 0xfb, 0xf4, 0xd5, 0xab, 0xc9, 0xd3, 0xff,
+ 0xdf, 0xcb, 0x56, 0x37, 0xac, 0x5c, 0x7b, 0x93,
+ 0xa7, 0xd4, 0x71, 0xfd, 0x74, 0x9d, 0x3e, 0xf5,
+ 0x56, 0x86, 0x1f, 0x2f, 0xd9, 0xf2, 0xe8, 0x83,
+ 0xb3, 0xe5, 0xfb, 0x36, 0xbc, 0xf9, 0x7e, 0xcf,
+ 0x76, 0xfb, 0xa9, 0xf2, 0xfd, 0x8e, 0x4f, 0x47,
+ 0xe4, 0x53, 0xe5, 0xba, 0xdf, 0xcf, 0x97, 0xec,
+ 0x1f, 0x2f, 0xd9, 0xb7, 0x27, 0xcb, 0xf5, 0x85,
+ 0xbc, 0x9f, 0xf3, 0xfa, 0xed, 0x26, 0x7a, 0xf8,
+ 0xbc, 0x03, 0xe5, 0xfb, 0x07, 0xcb, 0xf6, 0x60,
+ 0x29, 0xf2, 0xfd, 0x9f, 0xeb, 0x06, 0x8d, 0xb6,
+ 0xbe, 0x4f, 0x97, 0xec, 0xfd, 0x78, 0xf5, 0x7b,
+ 0xa0, 0xf9, 0x7e, 0xc0, 0x11, 0x47, 0xf2, 0x2a,
+ 0xa2, 0xcf, 0x0d, 0x0b, 0x93, 0xe5, 0xfb, 0x07,
+ 0xcb, 0xf6, 0xcd, 0x74, 0xc1, 0x09, 0xf2, 0xfd,
+ 0x87, 0xab, 0x11, 0xe4, 0xd6, 0xe1, 0x09, 0x4c,
+ 0x27, 0x44, 0xa5, 0x86, 0x35, 0x85, 0xd6, 0x57,
+ 0x82, 0x4d, 0x3d, 0x6f, 0x5e, 0x85, 0xcb, 0xf4,
+ 0xe4, 0x47, 0xcf, 0xfa, 0xd3, 0x9b, 0x10, 0xee,
+ 0x1a, 0x3a, 0x67, 0xd0, 0x54, 0x50, 0x89, 0x6a,
+ 0x50, 0xbe, 0x7b, 0x02, 0xb9, 0x2b, 0xb3, 0x8c,
+ 0x73, 0xff, 0xf5, 0x2f, 0x15, 0x6d, 0xad, 0x2f,
+ 0x38, 0x56, 0x6b, 0x47, 0x42, 0xae, 0xe1, 0xd9,
+ 0x37, 0x8b, 0xf6, 0x73, 0x93, 0xb2, 0xc9, 0xff,
+ 0x74, 0x5a, 0x7e, 0xb8, 0xc7, 0x68, 0x74, 0xfd,
+ 0xfd, 0xe9, 0x8d, 0x79, 0xd3, 0x82, 0x10, 0x95,
+ 0x3b, 0xaa, 0x80, 0xa7, 0x17, 0x93, 0xfe, 0xfe,
+ 0xbf, 0xa8, 0xdb, 0x6d, 0x13, 0xa7, 0xfb, 0xfa,
+ 0x0e, 0x0f, 0x50, 0x52, 0x74, 0x72, 0x99, 0x8b,
+ 0x10, 0x40, 0x95, 0xf2, 0xcc, 0x9f, 0xcf, 0xfb,
+ 0xff, 0xf7, 0x6d, 0xcd, 0x78, 0x97, 0x27, 0x4e,
+ 0x08, 0x42, 0x58, 0x84, 0x13, 0xe1, 0x4d, 0xd4,
+ 0x2c, 0x42, 0x07, 0x1a, 0xa9, 0xc1, 0x08, 0x4b,
+ 0x10, 0x7a, 0x0b, 0x10, 0x79, 0xc6, 0xaa, 0x65,
+ 0x65, 0xa2, 0x4d, 0x1a, 0xe7, 0xd9, 0x5c, 0xab,
+ 0x0e, 0x9e, 0xff, 0x97, 0xa1, 0xd3, 0xba, 0xa8,
+ 0x0e, 0x8a, 0x0f, 0x01, 0x84, 0x73, 0xe4, 0x5c,
+ 0x2b, 0x0a, 0x9f, 0x7f, 0x7f, 0xfb, 0x2a, 0x6b,
+ 0x42, 0xa6, 0x08, 0x4a, 0x8b, 0x3f, 0x5a, 0x92,
+ 0xe4, 0x98, 0x22, 0x93, 0xfb, 0xfd, 0x54, 0x18,
+ 0xb6, 0xf2, 0x9c, 0x6e, 0xe1, 0x53, 0x80, 0xf3,
+ 0x36, 0xc3, 0x4e, 0x7f, 0xf6, 0x14, 0x15, 0xbb,
+ 0xe7, 0x7f, 0xbd, 0x0e, 0x9f, 0xd5, 0xea, 0xca,
+ 0x87, 0x69, 0x3a, 0x15, 0x5d, 0x8d, 0xa6, 0x7a,
+ 0x30, 0x51, 0x8e, 0xb3, 0x4d, 0x2a, 0x95, 0x38,
+ 0x21, 0x09, 0x53, 0xe7, 0x83, 0x7f, 0xc9, 0x4e,
+ 0x2f, 0x27, 0xff, 0xbf, 0x4f, 0x0a, 0x40, 0xbf,
+ 0x4d, 0xa3, 0xfa, 0x74, 0xff, 0xf5, 0xab, 0xb9,
+ 0xfa, 0xf6, 0x97, 0xd3, 0xc2, 0x74, 0xf3, 0x7e,
+ 0x00, 0xd8, 0xe8, 0x79, 0xfb, 0xea, 0x84, 0xff,
+ 0xe7, 0xd8, 0x81, 0x9e, 0xaf, 0x5a, 0xad, 0x9d,
+ 0x3d, 0xee, 0x6d, 0x87, 0x42, 0xa7, 0x1c, 0xf3,
+ 0x7d, 0x86, 0x57, 0xc8, 0x7b, 0x4a, 0x9f, 0xb8,
+ 0xf5, 0xf7, 0xe9, 0x79, 0xd3, 0xfe, 0xd1, 0xe2,
+ 0xf6, 0x2f, 0x69, 0x01, 0xd3, 0xfe, 0xad, 0x54,
+ 0x72, 0xae, 0xe7, 0xc7, 0x4f, 0xfb, 0xfa, 0xd6,
+ 0x34, 0x47, 0xdc, 0x9d, 0x16, 0x8e, 0xf4, 0x33,
+ 0xf2, 0x03, 0x0f, 0xa7, 0x9f, 0xd6, 0xda, 0x3a,
+ 0x7c, 0x3c, 0xdd, 0xfc, 0xe9, 0xff, 0xb8, 0xfe,
+ 0xbc, 0x2b, 0x6a, 0xe1, 0x69, 0x3a, 0x34, 0xfc,
+ 0x2a, 0x4d, 0x3f, 0xfd, 0x79, 0xad, 0xb5, 0x85,
+ 0x6d, 0x78, 0xc2, 0x9d, 0x3f, 0xb2, 0xdd, 0x9a,
+ 0xff, 0x19, 0x47, 0x67, 0x47, 0x28, 0xb3, 0xf9,
+ 0x0e, 0x54, 0x27, 0xff, 0xbd, 0x5b, 0xe7, 0x35,
+ 0xf7, 0x4c, 0x6f, 0xfc, 0x74, 0xff, 0xfe, 0xfe,
+ 0x6f, 0x1e, 0x5c, 0xf8, 0x0a, 0xf7, 0x04, 0x21,
+ 0x2a, 0x7b, 0x9b, 0xbe, 0x85, 0x4f, 0x68, 0x37,
+ 0x27, 0x4e, 0x7f, 0xfb, 0x34, 0x43, 0x33, 0x82,
+ 0x10, 0x95, 0x3a, 0xfe, 0x85, 0x38, 0xbc, 0x9f,
+ 0xf5, 0xd1, 0x7c, 0xeb, 0xfe, 0xb4, 0x1d, 0x00,
+ 0x3e, 0x8f, 0x94, 0xcf, 0xe7, 0xfe, 0xf3, 0x9e,
+ 0xe8, 0x3a, 0x15, 0x3a, 0x9a, 0x18, 0x79, 0x23,
+ 0xa4, 0x80, 0x61, 0x5d, 0xa4, 0x53, 0xde, 0xcf,
+ 0x94, 0xe9, 0xfd, 0xdd, 0x88, 0x01, 0xef, 0x9d,
+ 0x3f, 0xfe, 0x57, 0xfb, 0x9c, 0x75, 0xad, 0x8a,
+ 0x6e, 0xa1, 0xa2, 0x0c, 0x8c, 0x22, 0x53, 0x26,
+ 0x73, 0xea, 0x8f, 0x83, 0xc7, 0x3a, 0x7f, 0x71,
+ 0x5d, 0x78, 0xac, 0x54, 0xe8, 0x7a, 0x67, 0x3e,
+ 0x85, 0xad, 0x48, 0xf2, 0x57, 0x3f, 0xfc, 0xbf,
+ 0xa3, 0x83, 0x5e, 0xfd, 0xf3, 0x7f, 0xe8, 0x74,
+ 0xe5, 0x16, 0x8e, 0x85, 0x5d, 0xf9, 0xe4, 0xee,
+ 0xe3, 0x47, 0x43, 0x1f, 0x47, 0xf9, 0xb1, 0xcb,
+ 0x76, 0x87, 0xc4, 0xad, 0x3e, 0xd6, 0x6d, 0xd4,
+ 0xe9, 0xff, 0xe4, 0x5a, 0xd5, 0x59, 0x79, 0xf5,
+ 0x71, 0xa7, 0x4f, 0xef, 0xfd, 0x5e, 0xc5, 0xf1,
+ 0xd3, 0xfb, 0x3e, 0x6d, 0xec, 0xbd, 0x4a, 0x93,
+ 0x0e, 0x9f, 0xaf, 0xfd, 0x05, 0x5d, 0xe3, 0xc5,
+ 0xea, 0x6b, 0x16, 0x98, 0x5f, 0x93, 0x6a, 0xef,
+ 0x3c, 0x3d, 0xd2, 0xf3, 0xa7, 0xf7, 0xdf, 0xfb,
+ 0x62, 0xa1, 0xd3, 0x99, 0xcd, 0x9d, 0x0a, 0x7e,
+ 0x16, 0x47, 0xa6, 0x33, 0xb3, 0xea, 0x0e, 0x9f,
+ 0xf7, 0x79, 0xaf, 0x51, 0x03, 0x3d, 0x53, 0xa7,
+ 0xfe, 0x5f, 0xee, 0x14, 0x0e, 0x1a, 0xd4, 0xa8,
+ 0xe5, 0x10, 0x8c, 0x42, 0x9f, 0x63, 0xde, 0xa6,
+ 0xa7, 0x41, 0x53, 0xf5, 0x7a, 0xa8, 0xab, 0x0a,
+ 0x82, 0xa0, 0xa8, 0x2a, 0x0a, 0x87, 0x9e, 0xff,
+ 0x82, 0x80, 0x5b, 0xd8, 0x57, 0x10, 0x53, 0x78,
+ 0x54, 0xd8, 0xb2, 0xa7, 0xed, 0xdc, 0xb4, 0xac,
+ 0x2b, 0x81, 0x6b, 0x26, 0xe4, 0xa8, 0x2a, 0x0a,
+ 0x87, 0x96, 0x9e, 0x0a, 0x82, 0xa0, 0xa8, 0x2a,
+ 0x0a, 0x82, 0xa0, 0xa8, 0xa0, 0xde, 0x72, 0x15,
+ 0xe0, 0xa0, 0x05, 0x54, 0x29, 0xb0, 0x54, 0x15,
+ 0x05, 0x43, 0xcb, 0x4a, 0x85, 0x41, 0x50, 0x54,
+ 0x15, 0x05, 0x43, 0xcd, 0x40, 0x02, 0xb2, 0x14,
+ 0xde, 0x15, 0x05, 0x41, 0x50, 0x54, 0x15, 0x14,
+ 0x1a, 0x8e, 0x81, 0x42, 0x15, 0x80, 0xa9, 0x74,
+ 0x2a, 0x0a, 0x82, 0xa0, 0xa8, 0x2a, 0x39, 0x35,
+ 0x14, 0x85, 0x00, 0x2b, 0xb0, 0xa8, 0x2a, 0x0a,
+ 0x82, 0xa7, 0xd8, 0x50, 0x56, 0xca, 0x82, 0xa1,
+ 0xe7, 0x9c, 0x81, 0x58, 0x0a, 0xd0, 0xa0, 0x13,
+ 0x49, 0x0a, 0x82, 0xa0, 0xa8, 0x2a, 0x0a, 0x87,
+ 0x9a, 0x8a, 0x42, 0xbc, 0x14, 0xd8, 0x2a, 0x0a,
+ 0x82, 0xa0, 0xa8, 0x2a, 0x1e, 0x6a, 0x39, 0x0a,
+ 0xc0, 0x57, 0xc2, 0xa5, 0x82, 0xa0, 0xa8, 0x2a,
+ 0x4f, 0x2a, 0x0a, 0xa4, 0xb0, 0x82, 0xa0, 0xa8,
+ 0x2a, 0x0a, 0x8a, 0x0f, 0x99, 0xe1, 0x5d, 0x06,
+ 0x90, 0x69, 0xa0, 0xa0, 0x05, 0x64, 0x2a, 0x56,
+ 0x54, 0x15, 0x05, 0x49, 0xe5, 0x41, 0x54, 0x96,
+ 0x10, 0x54, 0x15, 0x0a, 0x7a, 0x4f, 0x0a, 0xf0,
+ 0xd0, 0x8d, 0x30, 0x2a, 0x0a, 0x82, 0xa0, 0xa8,
+ 0x2a, 0x0a, 0x85, 0x36, 0x54, 0x85, 0x08, 0x53,
+ 0x02, 0xbe, 0x15, 0x05, 0x41, 0x50, 0x54, 0x09,
+ 0x7d, 0x50, 0xac, 0x85, 0x41, 0x50, 0x54, 0x15,
+ 0x0c, 0x2f, 0xbe, 0x15, 0x90, 0xa9, 0x30, 0xa8,
+ 0x2a, 0x0a, 0x80, 0x16, 0x9d, 0x85, 0x41, 0x50,
+ 0x54, 0x15, 0x05, 0x42, 0x9a, 0x86, 0x82, 0xb0,
+ 0x15, 0xd8, 0x54, 0x2a, 0xfd, 0x6d, 0x0e, 0x4f,
+ 0x3d, 0xe4, 0xa6, 0xd7, 0x11, 0xb6, 0x94, 0x8f,
+ 0x33, 0x71, 0xcf, 0x5a, 0x3a, 0x18, 0x46, 0x31,
+ 0x1f, 0x06, 0xfa, 0xcc, 0x03, 0xcf, 0xbb, 0x55,
+ 0x9b, 0x2c, 0x3d, 0xbc, 0xb6, 0x65, 0x0a, 0x57,
+ 0x11, 0x6f, 0x52, 0x46, 0xf4, 0x99, 0xf3, 0xfe,
+ 0xb7, 0x52, 0x9c, 0x9a, 0xbc, 0xef, 0x2b, 0x0a,
+ 0x9e, 0xf2, 0x68, 0x9d, 0x3b, 0xdc, 0xd9, 0xd3,
+ 0x97, 0xab, 0xa9, 0x44, 0x78, 0x9c, 0xe0, 0x6f,
+ 0x23, 0xf3, 0xfb, 0x1e, 0x0f, 0x22, 0xb4, 0x1d,
+ 0x14, 0xa2, 0x11, 0xa5, 0x09, 0x80, 0xa7, 0x4f,
+ 0xc3, 0xbf, 0xea, 0xa0, 0x3a, 0x6d, 0x13, 0xa5,
+ 0xe3, 0x90, 0xb4, 0x92, 0x1d, 0x26, 0x1d, 0x3a,
+ 0xf8, 0x9d, 0xe4, 0x49, 0x88, 0xae, 0x10, 0x74,
+ 0x7b, 0xa8, 0x7c, 0xff, 0xfb, 0xb5, 0xe1, 0xa2,
+ 0x3a, 0x05, 0x70, 0x42, 0x13, 0xa2, 0x86, 0x76,
+ 0x5b, 0xe3, 0x30, 0xe6, 0x14, 0x08, 0x59, 0xe8,
+ 0x50, 0xb4, 0x49, 0xb4, 0xa9, 0xff, 0xc2, 0xe3,
+ 0x2b, 0xd3, 0xf9, 0x7f, 0x9d, 0xff, 0x76, 0x74,
+ 0xfc, 0xff, 0xf9, 0xf8, 0xb3, 0xa7, 0xd4, 0x78,
+ 0x55, 0xe7, 0x40, 0x9e, 0xa7, 0xcb, 0x67, 0xfd,
+ 0x85, 0x10, 0x7e, 0xc3, 0xa0, 0x3a, 0x75, 0xdb,
+ 0x47, 0x4a, 0xf0, 0x7a, 0xe0, 0x3c, 0x9e, 0x62,
+ 0xdd, 0x07, 0x4f, 0xad, 0xb7, 0xd6, 0x93, 0xa3,
+ 0xc7, 0x95, 0x52, 0x19, 0xe5, 0xfe, 0x50, 0xe9,
+ 0x2d, 0xa6, 0x57, 0xf7, 0x8c, 0xb8, 0xf1, 0x11,
+ 0x4f, 0x77, 0xa2, 0xf3, 0xa7, 0x97, 0xb6, 0xe6,
+ 0xa5, 0x4f, 0x9e, 0xe0, 0x84, 0x27, 0x47, 0xcf,
+ 0x3f, 0xb2, 0x78, 0xe5, 0x12, 0x76, 0xe1, 0x0c,
+ 0x55, 0x58, 0x08, 0xec, 0x7b, 0x86, 0xc4, 0xfc,
+ 0x3d, 0x82, 0xfe, 0x87, 0x4f, 0xf5, 0x1f, 0xb7,
+ 0xe2, 0xc1, 0x53, 0xa7, 0xb9, 0xe5, 0x5b, 0x1d,
+ 0x3f, 0xfe, 0x5c, 0x2b, 0x11, 0x73, 0x62, 0x9b,
+ 0xa8, 0x68, 0xbe, 0x27, 0xf0, 0x77, 0x35, 0x5b,
+ 0xa0, 0xe9, 0xff, 0xfa, 0xf3, 0xd5, 0xea, 0xdb,
+ 0xdf, 0x00, 0xf9, 0x59, 0x65, 0x4d, 0x9b, 0x3a,
+ 0x7c, 0x3e, 0xa3, 0x58, 0x69, 0x84, 0xe7, 0xb3,
+ 0xda, 0xe9, 0xa6, 0x13, 0x98, 0x0a, 0x6a, 0x04,
+ 0xe7, 0xf7, 0xf7, 0xa6, 0x54, 0x40, 0x6a, 0x04,
+ 0xe7, 0xf5, 0x6f, 0x1e, 0xaf, 0x74, 0x1a, 0x61,
+ 0x39, 0xaf, 0x93, 0x4c, 0x27, 0x30, 0x42, 0x79,
+ 0x84, 0xe2, 0xd3, 0x4c, 0xa4, 0xd3, 0xc5, 0xcc,
+ 0x22, 0xaa, 0x03, 0x64, 0x20, 0x91, 0xcb, 0x25,
+ 0x98, 0x4c, 0xe3, 0xe7, 0x97, 0xa9, 0x4f, 0xdc,
+ 0x31, 0xe4, 0x45, 0x55, 0x42, 0xe6, 0x52, 0xa4,
+ 0xff, 0xf7, 0xee, 0xa2, 0xbd, 0xe7, 0xfe, 0x6d,
+ 0xd5, 0x87, 0x42, 0xab, 0xf0, 0xe4, 0xe5, 0x09,
+ 0x70, 0xb7, 0x99, 0x56, 0xed, 0x8b, 0x27, 0xdc,
+ 0xd8, 0xfb, 0xa1, 0xd3, 0xef, 0xdf, 0x5b, 0x68,
+ 0xe9, 0xfe, 0xc6, 0xb3, 0x1e, 0x5a, 0x5e, 0x74,
+ 0xfd, 0xd7, 0xef, 0xe2, 0xda, 0x0e, 0x8f, 0x1f,
+ 0x60, 0x0e, 0x63, 0xe8, 0xb7, 0xcc, 0x25, 0x61,
+ 0x57, 0x61, 0x6e, 0x70, 0x73, 0xcc, 0x3b, 0x0e,
+ 0x09, 0xff, 0xcc, 0xcd, 0x7d, 0xfa, 0x5f, 0x9f,
+ 0x57, 0xc7, 0x4f, 0xff, 0xef, 0xdd, 0x37, 0x5d,
+ 0xfe, 0x3c, 0xb9, 0xc7, 0x7a, 0xc3, 0xa7, 0xef,
+ 0xf6, 0xcf, 0x61, 0x4e, 0x9f, 0xff, 0x6f, 0xf3,
+ 0xbb, 0x8f, 0xae, 0x6a, 0x1b, 0xc1, 0xd3, 0x86,
+ 0xb5, 0x3c, 0x40, 0x73, 0xff, 0xdd, 0x45, 0x70,
+ 0xbc, 0x2c, 0x53, 0x75, 0x0d, 0x10, 0x1b, 0x8d,
+ 0x44, 0x01, 0x1c, 0xb9, 0x7b, 0x8b, 0x4c, 0xdb,
+ 0xd1, 0x89, 0xcf, 0xff, 0xed, 0x7d, 0xd7, 0xc2,
+ 0x3e, 0x67, 0x5c, 0xe2, 0xc3, 0x93, 0xa7, 0xff,
+ 0xfb, 0x5f, 0x7f, 0x69, 0xf7, 0x4b, 0xfa, 0xa8,
+ 0x1c, 0x10, 0x84, 0xa8, 0xc2, 0x32, 0xfe, 0xc3,
+ 0x3f, 0x96, 0xc5, 0x37, 0x50, 0xd1, 0x04, 0xcf,
+ 0xf2, 0xe6, 0xc5, 0x37, 0x50, 0xd1, 0x7c, 0xcf,
+ 0xbc, 0xdb, 0xf7, 0x5e, 0x4f, 0xe9, 0x0e, 0xa7,
+ 0xfd, 0x46, 0xd3, 0xc5, 0x79, 0xfe, 0xb6, 0x3a,
+ 0x70, 0x42, 0x12, 0xa7, 0xec, 0xe2, 0xd3, 0x44,
+ 0xa7, 0x17, 0x91, 0x42, 0x26, 0x7e, 0xc1, 0x3f,
+ 0xf5, 0x0c, 0x5a, 0x6b, 0xfb, 0xa3, 0xab, 0xce,
+ 0x9f, 0xfe, 0xeb, 0x4f, 0xf8, 0x26, 0x3c, 0x00,
+ 0x28, 0xbc, 0xe9, 0xc1, 0x08, 0x4a, 0x9f, 0xdd,
+ 0x40, 0xbf, 0xba, 0x72, 0x53, 0x8b, 0xc9, 0xff,
+ 0xf9, 0xb9, 0xe0, 0x98, 0xf7, 0x3c, 0xd8, 0x78,
+ 0x66, 0xb7, 0x41, 0xd2, 0xdc, 0x22, 0xaf, 0xb4,
+ 0x48, 0x7a, 0xa8, 0xbf, 0x43, 0x68, 0x49, 0x18,
+ 0x93, 0x98, 0xc6, 0xe7, 0xd8, 0xbc, 0xb4, 0xf3,
+ 0xa7, 0xfd, 0x79, 0x51, 0xae, 0x17, 0xf9, 0x3c,
+ 0x41, 0x13, 0xf9, 0x6c, 0x53, 0x75, 0x0d, 0x10,
+ 0x43, 0x8f, 0x26, 0x7e, 0xdc, 0x08, 0xf8, 0x27,
+ 0x4f, 0xdc, 0x7e, 0x43, 0xbf, 0x79, 0xd1, 0xf3,
+ 0xdd, 0xec, 0xae, 0x30, 0x99, 0xe0, 0x1c, 0x7f,
+ 0x0a, 0x89, 0xfe, 0x5f, 0xe7, 0xad, 0xe3, 0x69,
+ 0x3a, 0x7f, 0xfb, 0x43, 0x9b, 0xc2, 0xfb, 0x3f,
+ 0xbc, 0x78, 0xe8, 0x7a, 0x22, 0x3e, 0x75, 0x3f,
+ 0xb3, 0xd5, 0x95, 0x0e, 0xd2, 0x74, 0xf7, 0x9a,
+ 0xf0, 0x4e, 0x9f, 0xff, 0x77, 0x47, 0xd6, 0xf0,
+ 0xe5, 0xcd, 0xe3, 0xb1, 0x3a, 0x7d, 0x79, 0xaf,
+ 0x5a, 0xf2, 0x7f, 0x3d, 0x48, 0xe7, 0xe4, 0xc7,
+ 0xb8, 0xbd, 0xd0, 0xe9, 0xf9, 0x8b, 0xc7, 0xc5,
+ 0xd0, 0x74, 0xff, 0xff, 0xf7, 0xb3, 0xac, 0xdf,
+ 0x81, 0xfe, 0xaf, 0x6c, 0xc7, 0x97, 0x38, 0xef,
+ 0x58, 0x74, 0x72, 0x8e, 0x3f, 0x19, 0x69, 0x8c,
+ 0xe1, 0xeb, 0x53, 0xa7, 0xfd, 0xbf, 0x4b, 0x14,
+ 0xdd, 0x43, 0x44, 0x23, 0x0a, 0x7c, 0x5d, 0x8e,
+ 0xcf, 0xfe, 0x5b, 0xa7, 0xae, 0x7d, 0xfe, 0xdf,
+ 0x75, 0x3a, 0x7f, 0xfb, 0x76, 0x8e, 0xb7, 0x8d,
+ 0x63, 0x82, 0x10, 0x9d, 0x2b, 0xe5, 0x13, 0xcd,
+ 0x26, 0xce, 0x08, 0x42, 0x54, 0xff, 0x58, 0x34,
+ 0x6d, 0xb5, 0xf2, 0x53, 0x8b, 0xc9, 0x82, 0x12,
+ 0xa7, 0x04, 0x21, 0x2a, 0x7e, 0xda, 0x39, 0xc2,
+ 0xd4, 0xa7, 0x17, 0x91, 0xf4, 0x5b, 0x05, 0x1f,
+ 0x88, 0xca, 0x7c, 0x9e, 0xe7, 0xab, 0x0a, 0x71,
+ 0xb3, 0x9c, 0x10, 0x84, 0xa9, 0xd5, 0x51, 0x29,
+ 0xc5, 0xe4, 0x81, 0xe3, 0xff, 0xca, 0xb4, 0xfd,
+ 0xcf, 0xd5, 0xfa, 0x87, 0x4f, 0xee, 0xa3, 0xcf,
+ 0x9b, 0x2f, 0x27, 0x4f, 0xec, 0xe2, 0xdb, 0x5e,
+ 0x6a, 0x74, 0x0a, 0x26, 0x30, 0x59, 0xf3, 0x88,
+ 0x54, 0x77, 0xdc, 0x30, 0x27, 0x52, 0xdc, 0x4d,
+ 0xd8, 0xe9, 0xff, 0xd7, 0xc7, 0xdf, 0x82, 0xd1,
+ 0x70, 0xac, 0x3a, 0x7e, 0x4f, 0x57, 0x1e, 0x68,
+ 0xa9, 0xfd, 0xfb, 0xa5, 0xf5, 0xf7, 0x43, 0xa7,
+ 0xb7, 0x47, 0xa1, 0xd1, 0xc0, 0xf5, 0xe8, 0x36,
+ 0x9e, 0x5d, 0x63, 0x62, 0xa7, 0x04, 0x21, 0x2a,
+ 0x7f, 0xfb, 0xaa, 0x82, 0xef, 0xf9, 0xc7, 0x97,
+ 0xf4, 0x14, 0xe2, 0xf2, 0x56, 0x88, 0x9e, 0x61,
+ 0xf4, 0x2a, 0x7c, 0x6f, 0x2a, 0xa5, 0x2b, 0xd0,
+ 0x85, 0xc4, 0x30, 0xe7, 0xff, 0xcc, 0xb4, 0x5f,
+ 0xee, 0x6b, 0xcf, 0x7a, 0x2f, 0x3a, 0x7c, 0xb9,
+ 0xab, 0x6b, 0x3a, 0x14, 0xff, 0x32, 0xa9, 0x3f,
+ 0xfd, 0xe6, 0xd7, 0xfe, 0x7f, 0xa1, 0xbf, 0xef,
+ 0x43, 0xa7, 0xff, 0xfb, 0x9c, 0x78, 0x36, 0xdf,
+ 0xe6, 0x6e, 0x6b, 0xdb, 0xee, 0x9c, 0x9d, 0x16,
+ 0x8c, 0x0d, 0x53, 0x85, 0x6c, 0x85, 0x28, 0x4d,
+ 0x7c, 0x72, 0xfc, 0xc3, 0xd2, 0xe5, 0x94, 0x7a,
+ 0x39, 0x26, 0xa1, 0x7c, 0x24, 0x6c, 0x85, 0x7e,
+ 0x23, 0x27, 0x04, 0x24, 0xbf, 0x0c, 0x0a, 0xca,
+ 0x9d, 0xcc, 0xa0, 0x9e, 0xe1, 0xa2, 0x18, 0x70,
+ 0xce, 0x6c, 0xbf, 0x3a, 0x7f, 0xfa, 0xfe, 0xec,
+ 0xf4, 0xf5, 0x35, 0xc5, 0x83, 0x4e, 0x95, 0x2f,
+ 0x3e, 0xfe, 0x47, 0x67, 0xec, 0x35, 0xec, 0x79,
+ 0x87, 0x4f, 0xfb, 0xeb, 0x9c, 0x68, 0x36, 0x9a,
+ 0x9d, 0x39, 0xae, 0xc4, 0xe9, 0xff, 0x6f, 0x86,
+ 0xe9, 0x70, 0x42, 0x13, 0xa3, 0x4f, 0x6e, 0xa3,
+ 0xb3, 0xff, 0xdf, 0x57, 0xf0, 0xeb, 0x9f, 0x7f,
+ 0xb7, 0xdd, 0x4e, 0x8b, 0x4c, 0xf9, 0x0b, 0xf1,
+ 0x09, 0x90, 0x10, 0xcf, 0xe5, 0xfb, 0xff, 0x76,
+ 0x03, 0xa7, 0xf3, 0xec, 0x6b, 0xf5, 0xa0, 0xe9,
+ 0xff, 0xe5, 0x6c, 0xa2, 0xee, 0xb9, 0xfd, 0xd1,
+ 0xe1, 0x3d, 0xde, 0xf3, 0xff, 0xd7, 0x95, 0xfa,
+ 0x5e, 0x71, 0xe1, 0x02, 0x1d, 0x3e, 0xda, 0xdf,
+ 0xf2, 0x74, 0xec, 0xef, 0x1c, 0xe9, 0xfd, 0x9c,
+ 0x79, 0xc0, 0xdf, 0x1d, 0x14, 0x26, 0x47, 0xca,
+ 0xff, 0xd3, 0x32, 0x4d, 0xd8, 0xfc, 0xfe, 0xec,
+ 0x0b, 0x8f, 0x6b, 0xce, 0x9f, 0xff, 0xbf, 0x75,
+ 0xef, 0x85, 0xe3, 0x7f, 0x6d, 0x3d, 0x69, 0x3a,
+ 0x7f, 0xd7, 0x5e, 0xec, 0x53, 0x75, 0x0d, 0x10,
+ 0x34, 0xfa, 0xf3, 0x8d, 0x7f, 0x04, 0x52, 0xfd,
+ 0x7a, 0x7f, 0xff, 0xfe, 0xbc, 0xe3, 0x7f, 0xd3,
+ 0x85, 0x47, 0x77, 0x2d, 0xaf, 0x9e, 0x16, 0xcd,
+ 0xfd, 0x2f, 0x3c, 0x41, 0x73, 0xfe, 0xdd, 0xe8,
+ 0x9b, 0xcf, 0x0e, 0x81, 0x3c, 0x41, 0x73, 0xff,
+ 0x63, 0xd8, 0xf2, 0xff, 0x3c, 0x3a, 0x04, 0xf1,
+ 0x05, 0xcf, 0xe5, 0xf7, 0xf3, 0xc3, 0xa0, 0x4f,
+ 0x10, 0x5c, 0xfc, 0xcb, 0xe7, 0x87, 0x40, 0x9e,
+ 0x20, 0xb9, 0xff, 0xfe, 0xdf, 0xff, 0xcc, 0xe1,
+ 0x54, 0xc7, 0x87, 0xdd, 0x28, 0xb0, 0x9e, 0x20,
+ 0xb9, 0xa9, 0xe1, 0xca, 0x74, 0x28, 0xa0, 0x2a,
+ 0xda, 0x89, 0xf3, 0xf8, 0xc2, 0xa9, 0x6f, 0xca,
+ 0x3e, 0x9e, 0xd1, 0x06, 0x9d, 0x3f, 0xf6, 0x3d,
+ 0x8f, 0x2f, 0xf3, 0xc3, 0xa0, 0x4f, 0x10, 0x5c,
+ 0xff, 0x35, 0x54, 0xf5, 0x1c, 0x3a, 0x04, 0xf1,
+ 0x05, 0xcf, 0xb3, 0x55, 0x67, 0x04, 0x45, 0x17,
+ 0x55, 0x69, 0xff, 0xdc, 0x13, 0x1e, 0x45, 0xcd,
+ 0x78, 0x74, 0x09, 0xe2, 0x0b, 0x9f, 0xff, 0xfb,
+ 0xff, 0xf3, 0x38, 0x77, 0x7c, 0x2a, 0x98, 0xf0,
+ 0xfb, 0xa5, 0x16, 0x13, 0xc4, 0x17, 0x16, 0x99,
+ 0x35, 0x28, 0x7a, 0xb9, 0x3f, 0xd8, 0xf0, 0xfb,
+ 0xa5, 0x16, 0x13, 0xc4, 0x17, 0x3f, 0xfd, 0xbb,
+ 0x4b, 0xeb, 0x8f, 0x73, 0xca, 0x8a, 0x95, 0x3f,
+ 0xeb, 0x7b, 0xfb, 0xa8, 0xfe, 0x8e, 0x23, 0xc4,
+ 0x17, 0x08, 0x8e, 0x81, 0x48, 0xaa, 0x84, 0xff,
+ 0x93, 0xc3, 0x9d, 0x05, 0x78, 0x04, 0xf1, 0x05,
+ 0xcf, 0xd8, 0xf6, 0x31, 0xe0, 0x1a, 0x00, 0xb9,
+ 0xf5, 0x83, 0x87, 0x40, 0x9e, 0x20, 0xb9, 0xaf,
+ 0x28, 0x7e, 0x78, 0x3b, 0x8a, 0x51, 0xd7, 0x58,
+ 0x5f, 0xcf, 0xcc, 0xbe, 0x78, 0x74, 0x09, 0xe2,
+ 0x0b, 0x9f, 0xf2, 0x63, 0xc3, 0xee, 0x94, 0x58,
+ 0x4f, 0x10, 0x5c, 0xd7, 0xc3, 0x51, 0x19, 0x53,
+ 0xf9, 0xfd, 0xdf, 0x99, 0xbf, 0xa5, 0xe7, 0x88,
+ 0x2e, 0x7f, 0xd7, 0xe6, 0xd7, 0xfb, 0xe7, 0x5e,
+ 0x78, 0x82, 0xd8, 0x78, 0x51, 0xca, 0xee, 0x38,
+ 0x0b, 0x3f, 0x1f, 0x3d, 0x63, 0x18, 0xcc, 0x63,
+ 0x3d, 0xc2, 0xd4, 0x2e, 0x33, 0xe0, 0x54, 0x00,
+ 0x53, 0x44, 0x16, 0xe4, 0x40, 0x4f, 0xfa, 0xdf,
+ 0x8d, 0x7b, 0x7b, 0x7f, 0x74, 0x1d, 0x3f, 0x87,
+ 0xf7, 0xce, 0x3b, 0x09, 0xd3, 0xea, 0x73, 0xa2,
+ 0x03, 0xa7, 0xeb, 0xa3, 0x70, 0xbc, 0x73, 0xa3,
+ 0xc8, 0x8b, 0xd3, 0x4f, 0x93, 0xce, 0xd1, 0xa0,
+ 0xe9, 0x80, 0xa7, 0x4f, 0x79, 0x59, 0x67, 0x41,
+ 0xd3, 0xf6, 0xf4, 0xca, 0x88, 0x0e, 0x8e, 0x4d,
+ 0xbf, 0xc2, 0xa7, 0xff, 0xf2, 0xfb, 0x9f, 0xaf,
+ 0x69, 0x9b, 0x4e, 0x55, 0x3a, 0xb0, 0xe9, 0x80,
+ 0xa7, 0x4c, 0xbd, 0x0e, 0x9f, 0xeb, 0xcd, 0x55,
+ 0x9d, 0x6d, 0xa3, 0xa7, 0xf5, 0x6f, 0x1e, 0xaf,
+ 0x74, 0x1d, 0x30, 0x42, 0x54, 0xff, 0x7e, 0xdb,
+ 0x6b, 0xeb, 0xee, 0x4e, 0x84, 0x4f, 0xdf, 0xc3,
+ 0x62, 0x2a, 0xc5, 0x7c, 0x11, 0x01, 0x89, 0xb9,
+ 0x15, 0xf8, 0xbd, 0x4e, 0x82, 0x6b, 0xd4, 0x5a,
+ 0x70, 0x42, 0x12, 0xa4, 0xc2, 0x9c, 0x5e, 0x4f,
+ 0xb5, 0xad, 0xd1, 0x29, 0xc8, 0xd9, 0xeb, 0x0b,
+ 0xa9, 0xfd, 0x4e, 0x56, 0xf1, 0x74, 0x1d, 0x0a,
+ 0xd9, 0x03, 0xdc, 0x6d, 0x1d, 0x10, 0x69, 0x31,
+ 0xf4, 0x6a, 0xa2, 0x9d, 0x88, 0x6c, 0x6d, 0x24,
+ 0x7b, 0xe8, 0xd5, 0x86, 0x8f, 0x72, 0xbf, 0xdb,
+ 0x25, 0xcf, 0x5a, 0x2e, 0x4e, 0x9e, 0xb6, 0x5e,
+ 0x4e, 0x9e, 0xda, 0x3a, 0xbc, 0xe8, 0x53, 0xe3,
+ 0xa4, 0x7d, 0xbc, 0x82, 0x7e, 0xff, 0x7c, 0xb3,
+ 0x5e, 0x74, 0xff, 0xf5, 0x2f, 0xfa, 0xf0, 0x67,
+ 0xd7, 0xa6, 0x7d, 0x41, 0xd3, 0xfa, 0xb9, 0x6d,
+ 0x7f, 0xbe, 0x4e, 0x85, 0x45, 0xd7, 0x8b, 0xf5,
+ 0x5a, 0x76, 0xf0, 0xea, 0x74, 0xff, 0xf7, 0xdf,
+ 0xc2, 0xf9, 0xf5, 0x69, 0xcf, 0x7b, 0x53, 0xa3,
+ 0x81, 0xfa, 0x58, 0xfc, 0xfd, 0x43, 0x4f, 0xe3,
+ 0x46, 0x83, 0xa6, 0x7d, 0x07, 0x4f, 0xb1, 0x7e,
+ 0x7d, 0x4e, 0x9f, 0xfe, 0xc2, 0xf5, 0x76, 0x7f,
+ 0xa0, 0xad, 0x54, 0x05, 0x4f, 0xe0, 0x58, 0xa6,
+ 0xea, 0x1e, 0x20, 0x48, 0x7a, 0x2c, 0xf9, 0x27,
+ 0x15, 0x19, 0x9b, 0xde, 0x74, 0xf6, 0x68, 0xdf,
+ 0x9d, 0x3d, 0x4d, 0x77, 0x27, 0x45, 0x07, 0xbb,
+ 0x63, 0x38, 0x22, 0x9f, 0xdf, 0xd0, 0xd6, 0xaa,
+ 0x03, 0xa7, 0x04, 0x21, 0x3e, 0x1f, 0x53, 0xb7,
+ 0xfc, 0x97, 0x0f, 0xa3, 0x8d, 0x4c, 0x72, 0x89,
+ 0x50, 0x2d, 0xcf, 0xff, 0xaf, 0xfe, 0xe8, 0xea,
+ 0xe7, 0x1d, 0xeb, 0xde, 0xa7, 0x45, 0x07, 0xf9,
+ 0xd0, 0x92, 0x1b, 0xba, 0xaf, 0x17, 0x9a, 0xdc,
+ 0x32, 0xbd, 0x08, 0xdd, 0x8d, 0x02, 0x7d, 0xec,
+ 0xae, 0x6a, 0x54, 0xf2, 0x2e, 0x6a, 0x54, 0xc1,
+ 0x09, 0x50, 0xf3, 0xdd, 0xb2, 0x70, 0x90, 0x4d,
+ 0x61, 0x29, 0xc6, 0xba, 0x7f, 0xfd, 0x79, 0x54,
+ 0xbb, 0xfe, 0x71, 0xe5, 0xfd, 0x07, 0x40, 0x0f,
+ 0xe0, 0x24, 0xb3, 0xff, 0xf9, 0x5b, 0x7b, 0xe0,
+ 0xe1, 0x9a, 0xda, 0x63, 0x7f, 0x9a, 0x9d, 0x3f,
+ 0x9a, 0xa5, 0xf8, 0xed, 0x44, 0xe9, 0xcf, 0xd1,
+ 0x3a, 0x7c, 0xfb, 0xcd, 0xf2, 0x54, 0xbc, 0xd1,
+ 0xe0, 0xe4, 0x6a, 0x7b, 0x3d, 0x2f, 0x07, 0x4c,
+ 0x05, 0x3a, 0x60, 0x29, 0xd3, 0xee, 0xdf, 0x7f,
+ 0x77, 0x8d, 0x50, 0x05, 0x61, 0x51, 0x19, 0xf4,
+ 0xd9, 0xff, 0xb3, 0x8b, 0x67, 0x55, 0x05, 0xd3,
+ 0x93, 0xa7, 0xf5, 0x29, 0xe1, 0xea, 0xbc, 0x9d,
+ 0x3c, 0x06, 0x6b, 0xea, 0x7f, 0x79, 0x46, 0x9d,
+ 0xc5, 0x74, 0x9d, 0x0a, 0x7b, 0x1a, 0x73, 0x3d,
+ 0x5e, 0xe9, 0xc9, 0xd3, 0x82, 0x10, 0x95, 0x3e,
+ 0xbe, 0x9f, 0xee, 0xa5, 0x38, 0xbc, 0x9f, 0x5b,
+ 0x82, 0x10, 0x9d, 0x0a, 0x7c, 0x19, 0x39, 0x9e,
+ 0x0e, 0xfd, 0xe7, 0x4c, 0x98, 0x3a, 0x70, 0x42,
+ 0x12, 0xa7, 0xef, 0x6f, 0x4c, 0x7b, 0x25, 0x38,
+ 0xbc, 0x9f, 0x58, 0x2e, 0xda, 0x3a, 0x55, 0xe0,
+ 0x89, 0x51, 0x31, 0xf9, 0xf4, 0xf7, 0xbf, 0xdb,
+ 0xf9, 0x47, 0x6d, 0xc2, 0xda, 0x15, 0x72, 0xd5,
+ 0xe4, 0x56, 0xc9, 0xd1, 0xd8, 0x61, 0x6b, 0x88,
+ 0x7a, 0xe9, 0x05, 0x61, 0x41, 0x98, 0xc3, 0xa7,
+ 0xe5, 0x60, 0x8e, 0xe4, 0xe9, 0xff, 0xef, 0x32,
+ 0x97, 0xd7, 0x85, 0xff, 0xf7, 0xe0, 0x1d, 0x18,
+ 0x3f, 0xdc, 0x95, 0x49, 0xdc, 0x64, 0x22, 0x3e,
+ 0x56, 0x56, 0xa5, 0x11, 0x91, 0xbe, 0x52, 0x6f,
+ 0x32, 0xc0, 0x6e, 0xb7, 0x7e, 0xe9, 0x1b, 0x92,
+ 0x4a, 0x18, 0xa6, 0x57, 0xcf, 0xa3, 0x3e, 0x6a,
+ 0x79, 0xf4, 0x67, 0x4d, 0x59, 0x28, 0x2f, 0x13,
+ 0xe6, 0xfb, 0x4f, 0x52, 0x04, 0xb4, 0xdf, 0xce,
+ 0xe1, 0xd6, 0xb2, 0x5e, 0xcd, 0x67, 0x3f, 0xdc,
+ 0x66, 0xad, 0xa1, 0xd8, 0x18, 0x51, 0x71, 0x4b,
+ 0x14, 0xeb, 0x3c, 0x30, 0xdf, 0x18, 0x8c, 0x3a,
+ 0x11, 0x74, 0xef, 0xc4, 0x4c, 0x5c, 0xfe, 0x75,
+ 0x8a, 0x6e, 0xa1, 0xa2, 0xe3, 0x9f, 0xce, 0xb1,
+ 0x4d, 0xd4, 0x34, 0x5d, 0x73, 0xff, 0x3b, 0x5e,
+ 0xeb, 0x14, 0xdd, 0x43, 0x44, 0xa3, 0x0b, 0x08,
+ 0xef, 0xc7, 0x94, 0x72, 0x77, 0xd0, 0xed, 0x0e,
+ 0xfd, 0x0f, 0x0e, 0x3a, 0x06, 0xe2, 0x2f, 0xe6,
+ 0xa7, 0x19, 0x3b, 0x6f, 0x3b, 0x9f, 0xfc, 0xe6,
+ 0x6b, 0xdd, 0x62, 0x9b, 0xa8, 0x68, 0x96, 0xa7,
+ 0xc2, 0x9b, 0xa8, 0x68, 0x8d, 0xe7, 0xfd, 0xaf,
+ 0x75, 0x8a, 0x6e, 0xa1, 0xa2, 0x5f, 0x93, 0xac,
+ 0xfd, 0x98, 0x61, 0x3f, 0x9d, 0x62, 0x9b, 0xa8,
+ 0x68, 0xaa, 0xe7, 0xfb, 0xa5, 0xfe, 0xe9, 0xce,
+ 0xb0, 0xe9, 0xb9, 0xf1, 0xd3, 0xf5, 0x8a, 0x6e,
+ 0xa1, 0xa2, 0x40, 0x8e, 0x07, 0x98, 0xe1, 0x79,
+ 0xf5, 0x77, 0xfb, 0x49, 0xd0, 0xf3, 0xcb, 0xa4,
+ 0x92, 0x3a, 0x23, 0xd3, 0x61, 0xa3, 0x3f, 0xf7,
+ 0xee, 0x87, 0x71, 0x2f, 0xff, 0x79, 0x3a, 0x1c,
+ 0x7e, 0x02, 0x53, 0x3f, 0x9d, 0x62, 0x9b, 0xa8,
+ 0x68, 0xb2, 0x27, 0xf3, 0xac, 0x53, 0x75, 0x0d,
+ 0x16, 0xbc, 0xfe, 0x75, 0x8a, 0x6e, 0xa1, 0xa2,
+ 0xe4, 0x9f, 0x0a, 0x6e, 0xa1, 0xa2, 0xec, 0x9f,
+ 0xf6, 0xbd, 0xd6, 0x29, 0xba, 0x86, 0x8a, 0x3a,
+ 0x4e, 0xb3, 0xf6, 0x61, 0x84, 0xf8, 0x53, 0x75,
+ 0x0d, 0x14, 0xac, 0xff, 0xff, 0xf6, 0x16, 0x85,
+ 0xc7, 0x9b, 0x6f, 0x38, 0xf3, 0x93, 0x1e, 0x6b,
+ 0x0b, 0x45, 0x9d, 0x3e, 0x73, 0x35, 0xee, 0xb4,
+ 0x59, 0x34, 0x61, 0x14, 0x2e, 0x77, 0xbe, 0x19,
+ 0x14, 0x93, 0xfa, 0x39, 0xf6, 0x10, 0x80, 0xee,
+ 0xa7, 0x79, 0x85, 0x8b, 0x68, 0x6c, 0xcf, 0xf3,
+ 0xdd, 0x62, 0x9b, 0xa8, 0x68, 0x8e, 0x27, 0xfb,
+ 0xce, 0xb1, 0x4d, 0xd4, 0x34, 0x56, 0xb2, 0x76,
+ 0xa2, 0x0b, 0x28, 0x33, 0xff, 0x9c, 0xcd, 0x7b,
+ 0xac, 0x53, 0x75, 0x0d, 0x12, 0xdc, 0xd7, 0x49,
+ 0xd3, 0xfb, 0x9b, 0x63, 0x17, 0xd5, 0x3a, 0x29,
+ 0x3c, 0x9f, 0x0b, 0x4e, 0xc7, 0x2f, 0x3a, 0x73,
+ 0xd8, 0x87, 0x4f, 0xff, 0xd8, 0xda, 0x41, 0xce,
+ 0x35, 0xf7, 0x5f, 0xf7, 0xbd, 0x4e, 0x83, 0x44,
+ 0x37, 0x3f, 0xed, 0x7b, 0xac, 0x53, 0x75, 0x0d,
+ 0x13, 0x04, 0xe1, 0xec, 0x05, 0x4f, 0xef, 0xde,
+ 0x72, 0xa3, 0x53, 0xa4, 0xe5, 0x4d, 0x92, 0x82,
+ 0x3e, 0x47, 0x6c, 0x6d, 0x17, 0xd8, 0x2f, 0x94,
+ 0x6e, 0xa3, 0x93, 0x99, 0xd8, 0x95, 0x3f, 0xed,
+ 0x7b, 0xac, 0x53, 0x75, 0x0d, 0x13, 0x1c, 0x9d,
+ 0xe3, 0xe2, 0x60, 0xe4, 0xfc, 0xb5, 0xe1, 0x9b,
+ 0xc1, 0xd3, 0xff, 0xff, 0xcf, 0xae, 0x2f, 0xb0,
+ 0xd7, 0x16, 0x97, 0x5e, 0x17, 0x4b, 0xeb, 0xef,
+ 0xf8, 0xe9, 0xe4, 0xdd, 0x43, 0x45, 0x63, 0x3f,
+ 0xee, 0x2b, 0xcf, 0xef, 0xb5, 0xfe, 0x4e, 0x8e,
+ 0x89, 0x8d, 0xd2, 0x5c, 0x30, 0x81, 0xc9, 0x5c,
+ 0xff, 0xe5, 0xfe, 0x7a, 0x76, 0xbf, 0xb4, 0x51,
+ 0x3a, 0x7f, 0xd7, 0xce, 0x2e, 0xb4, 0xbd, 0x70,
+ 0x74, 0xff, 0xaf, 0x91, 0xf7, 0x74, 0x02, 0xaf,
+ 0x3a, 0x7f, 0xff, 0xef, 0xf7, 0x45, 0xa7, 0x0f,
+ 0xf6, 0xdf, 0xc2, 0xe9, 0x7d, 0xf7, 0xf0, 0x54,
+ 0xe9, 0xfc, 0xdd, 0xe8, 0x69, 0xfc, 0x68, 0xd0,
+ 0x74, 0xec, 0x79, 0xd6, 0x9e, 0x6a, 0x22, 0xe1,
+ 0x27, 0xe7, 0xf9, 0x41, 0xe2, 0x7e, 0x9b, 0xb6,
+ 0x8e, 0x9f, 0x6f, 0xe8, 0xee, 0xa7, 0x47, 0xcf,
+ 0x06, 0xa3, 0x13, 0xe6, 0x5f, 0xd5, 0xe7, 0x4f,
+ 0x28, 0xef, 0xce, 0x9e, 0xad, 0x54, 0x07, 0x42,
+ 0x9f, 0x36, 0x09, 0x82, 0x3f, 0x3e, 0x57, 0x83,
+ 0xb7, 0x9d, 0x39, 0x7e, 0xf3, 0xa1, 0xa3, 0xc3,
+ 0xc9, 0x44, 0xfc, 0xac, 0xbf, 0xfb, 0xa1, 0xd2,
+ 0xa9, 0xd1, 0xe3, 0x7d, 0xa5, 0xd3, 0x01, 0x4a,
+ 0x98, 0x21, 0x2a, 0x3c, 0x6a, 0xc2, 0x2b, 0x3f,
+ 0xb5, 0xff, 0xbc, 0xe3, 0xc5, 0x38, 0xd0, 0xcf,
+ 0x73, 0xb4, 0xd4, 0xe9, 0xcb, 0xf6, 0x8e, 0x9b,
+ 0xea, 0x74, 0x34, 0x6c, 0x44, 0x72, 0x78, 0x41,
+ 0x6d, 0xe7, 0x4b, 0xa1, 0xd3, 0x0f, 0x43, 0xa3,
+ 0xc6, 0xa7, 0xa8, 0x94, 0x2a, 0x39, 0x2d, 0x53,
+ 0xc4, 0x38, 0x4c, 0x9b, 0x19, 0x3a, 0x7e, 0x02,
+ 0xe2, 0xdb, 0x69, 0xd3, 0x82, 0x10, 0x95, 0x3f,
+ 0xf5, 0xa7, 0x2b, 0x47, 0x5b, 0xc6, 0xd2, 0x53,
+ 0x8b, 0xc9, 0xef, 0x0b, 0x7f, 0x27, 0x48, 0x4e,
+ 0x9f, 0x33, 0xd9, 0x06, 0x9d, 0x14, 0x1e, 0xdf,
+ 0x1c, 0x97, 0xb0, 0xf9, 0xfc, 0x9e, 0xaf, 0xed,
+ 0xb6, 0x9d, 0x35, 0xe4, 0xe8, 0xa4, 0xf2, 0x30,
+ 0x67, 0x3d, 0x9f, 0xdb, 0xce, 0x9f, 0xfd, 0xea,
+ 0xe2, 0xf9, 0xfd, 0xb6, 0xfd, 0xd4, 0xe8, 0x13,
+ 0xed, 0xc9, 0x0c, 0x9c, 0xab, 0xac, 0x9c, 0xc2,
+ 0x22, 0xdc, 0x45, 0x85, 0x8d, 0x98, 0x8c, 0x9b,
+ 0x4e, 0xc0, 0x2d, 0xf4, 0x9a, 0xc2, 0xc3, 0x2f,
+ 0xbd, 0x61, 0x21, 0x3e, 0x14, 0xdd, 0x43, 0x45,
+ 0x6f, 0x3f, 0xed, 0x7b, 0xac, 0x53, 0x75, 0x0d,
+ 0x13, 0x84, 0x9d, 0x67, 0xec, 0xc3, 0x09, 0xbb,
+ 0xc1, 0xd3, 0xe1, 0x4d, 0xd4, 0x34, 0x5a, 0x33,
+ 0x7b, 0xa1, 0xd3, 0xff, 0x61, 0x69, 0xde, 0x3e,
+ 0x3f, 0xbc, 0x7a, 0x0e, 0x95, 0xb4, 0x7c, 0xb5,
+ 0x18, 0x93, 0xb8, 0xc4, 0x6a, 0x58, 0xbe, 0x21,
+ 0x2b, 0x3c, 0x9b, 0xa8, 0x68, 0xb6, 0xa7, 0xec,
+ 0x2b, 0x17, 0xdc, 0x9d, 0x33, 0xac, 0x4f, 0x63,
+ 0x25, 0x73, 0xf9, 0xd6, 0x29, 0xba, 0x86, 0x8b,
+ 0x96, 0x7f, 0x3a, 0xc5, 0x37, 0x50, 0xd1, 0x76,
+ 0xc2, 0xb3, 0xe3, 0xa8, 0x28, 0x7c, 0x7f, 0xfc,
+ 0xc3, 0x6f, 0xa4, 0xb1, 0x0f, 0x4f, 0x08, 0x71,
+ 0xe3, 0x38, 0xc4, 0x3e, 0xff, 0x09, 0x7a, 0x96,
+ 0x64, 0xee, 0x7f, 0x3a, 0xc5, 0x37, 0x50, 0xd1,
+ 0x53, 0xcf, 0x26, 0xea, 0x1a, 0x2b, 0x99, 0xfc,
+ 0xeb, 0x14, 0xdd, 0x43, 0x45, 0x9d, 0x02, 0x7c,
+ 0xd8, 0x2b, 0x9f, 0x0a, 0x6e, 0xa1, 0xa2, 0x42,
+ 0x9f, 0xef, 0x53, 0x5c, 0xfd, 0x59, 0x53, 0xa6,
+ 0x7b, 0xac, 0xfa, 0x80, 0x61, 0x3d, 0xc6, 0x61,
+ 0x58, 0x74, 0xfe, 0xbc, 0x56, 0xb6, 0x34, 0x1d,
+ 0x27, 0x5a, 0x62, 0x1b, 0x08, 0xba, 0x96, 0xe4,
+ 0x9a, 0x7f, 0xf3, 0x99, 0xaf, 0x75, 0x8a, 0x6e,
+ 0xa1, 0xa2, 0x7c, 0x84, 0x54, 0x95, 0xc7, 0x8e,
+ 0xc7, 0x08, 0xf3, 0xe1, 0x4d, 0xd4, 0x34, 0x56,
+ 0x53, 0xfe, 0xd7, 0xba, 0xc5, 0x37, 0x50, 0xd1,
+ 0x37, 0x4d, 0xe7, 0x59, 0xfb, 0x30, 0xc2, 0x7c,
+ 0x29, 0xba, 0x86, 0x89, 0x5a, 0x7f, 0xba, 0x63,
+ 0xdc, 0x3b, 0x4b, 0xa9, 0xd3, 0xe7, 0x33, 0x5e,
+ 0xeb, 0x3e, 0xdd, 0x30, 0x9f, 0x0a, 0x6e, 0xa1,
+ 0xa2, 0x5c, 0x9f, 0xef, 0x6b, 0xf3, 0xf5, 0x65,
+ 0x4e, 0x9e, 0x6d, 0xef, 0xa9, 0xd3, 0xe7, 0x33,
+ 0x5e, 0xeb, 0x44, 0x5e, 0x0c, 0x34, 0xe2, 0x7f,
+ 0xe7, 0x6b, 0xdd, 0x62, 0x9b, 0xa8, 0x68, 0x8e,
+ 0xe7, 0xfb, 0x38, 0xb7, 0xbb, 0x7f, 0x53, 0xa7,
+ 0xee, 0x37, 0xea, 0x97, 0xf3, 0xa6, 0xef, 0x07,
+ 0x4f, 0xcd, 0xd7, 0xef, 0x1b, 0x93, 0xa7, 0xc2,
+ 0x9b, 0xa8, 0x68, 0xa8, 0x67, 0xd7, 0x8c, 0xdd,
+ 0x07, 0x4f, 0xff, 0xf7, 0x7b, 0xc7, 0xf5, 0x18,
+ 0xdf, 0x65, 0x71, 0xec, 0xd6, 0xf9, 0x3a, 0x4e,
+ 0x6e, 0x93, 0x3c, 0xe3, 0x0c, 0x38, 0xd1, 0x7b,
+ 0x31, 0xc9, 0x87, 0x11, 0x3c, 0xf8, 0x53, 0x75,
+ 0x0d, 0x15, 0x44, 0xff, 0xb5, 0xee, 0xb1, 0x4d,
+ 0xd4, 0x34, 0x4d, 0x72, 0x75, 0x9f, 0xb3, 0x0c,
+ 0x27, 0xf3, 0xac, 0x53, 0x75, 0x0d, 0x15, 0x64,
+ 0xff, 0xce, 0xd7, 0xba, 0xc5, 0x37, 0x50, 0xd1,
+ 0x22, 0x4f, 0x85, 0x37, 0x50, 0xd1, 0x69, 0x4f,
+ 0xfb, 0x5e, 0xeb, 0x14, 0xdd, 0x43, 0x44, 0xfb,
+ 0x27, 0x59, 0xfb, 0x30, 0xc2, 0x7f, 0xf3, 0x99,
+ 0xaf, 0x75, 0x8a, 0x6e, 0xa1, 0xa2, 0x84, 0x9f,
+ 0x63, 0xd4, 0x28, 0x9d, 0x3e, 0x14, 0xdd, 0x43,
+ 0x45, 0x1f, 0x3f, 0xff, 0x5f, 0x38, 0x5e, 0xae,
+ 0xcf, 0xf4, 0x15, 0xaa, 0x80, 0xa9, 0xf3, 0x99,
+ 0xaf, 0x72, 0xa2, 0xd2, 0xc9, 0xf8, 0x8c, 0x21,
+ 0x57, 0x95, 0xe8, 0x86, 0x43, 0xd2, 0xed, 0x33,
+ 0xa4, 0x6e, 0x89, 0x0e, 0x5a, 0x49, 0xda, 0x3b,
+ 0xc4, 0x30, 0x80, 0x4f, 0x98, 0xc1, 0xa7, 0xf3,
+ 0xac, 0x53, 0x75, 0x0d, 0x11, 0x14, 0xfd, 0x62,
+ 0x9b, 0xa8, 0x68, 0x8a, 0xe7, 0xfb, 0x8e, 0xeb,
+ 0x14, 0xdd, 0x43, 0x45, 0x71, 0x0e, 0x3f, 0xad,
+ 0x35, 0x9e, 0xbc, 0x6e, 0x4e, 0x9f, 0xd7, 0xe1,
+ 0x00, 0x3b, 0xa9, 0xd2, 0x6e, 0xbe, 0x7a, 0x75,
+ 0x20, 0x9f, 0xfb, 0x7c, 0xff, 0x7f, 0x3d, 0xe0,
+ 0x6c, 0xe9, 0xf5, 0xfb, 0x91, 0xb3, 0xa7, 0x66,
+ 0xbe, 0xc1, 0xf5, 0x65, 0x12, 0x7c, 0x29, 0xba,
+ 0x86, 0x8a, 0x7a, 0x38, 0xd4, 0x7d, 0xac, 0x25,
+ 0xec, 0xd2, 0x7f, 0xf6, 0xbd, 0xdc, 0xff, 0x43,
+ 0x5a, 0xa8, 0x0e, 0x87, 0x22, 0x0b, 0x93, 0x89,
+ 0xce, 0xe6, 0xce, 0x9f, 0x2b, 0xc1, 0xdb, 0xce,
+ 0x9e, 0x4d, 0xd4, 0x34, 0x56, 0x70, 0xd1, 0xe9,
+ 0x89, 0x44, 0xfd, 0x43, 0x17, 0xef, 0xa9, 0xd3,
+ 0x96, 0x8f, 0x1d, 0x3e, 0xc8, 0x3a, 0xfd, 0xe7,
+ 0x4e, 0xef, 0x6a, 0x74, 0xfa, 0xda, 0xa3, 0xb0,
+ 0x1d, 0x27, 0x5a, 0x37, 0x04, 0x8b, 0x05, 0xda,
+ 0x39, 0xf2, 0xae, 0xa3, 0x93, 0xff, 0x3b, 0x5e,
+ 0xeb, 0x14, 0xdd, 0x43, 0x44, 0x8b, 0x3f, 0x9d,
+ 0x62, 0x9b, 0xa8, 0x68, 0xb2, 0x67, 0xf3, 0xac,
+ 0x53, 0x75, 0x0d, 0x16, 0xc4, 0xeb, 0xad, 0x9d,
+ 0x3e, 0x14, 0xdd, 0x43, 0x45, 0xb7, 0x27, 0x3c,
+ 0xf2, 0xac, 0x6a, 0x7f, 0xdc, 0x6f, 0x1a, 0xdc,
+ 0x33, 0x8b, 0xfa, 0x80, 0xe9, 0xf9, 0x7e, 0xfe,
+ 0x7b, 0x61, 0xd3, 0xe1, 0x4d, 0xd4, 0x34, 0x5e,
+ 0x13, 0xd9, 0xe2, 0xbc, 0x1d, 0x3f, 0xf2, 0xf5,
+ 0x65, 0x2f, 0xcd, 0xff, 0x35, 0x3a, 0x7d, 0x7f,
+ 0x03, 0x7a, 0x9d, 0x3e, 0x5e, 0xbd, 0xed, 0x4e,
+ 0x9d, 0x95, 0x01, 0xd2, 0x73, 0x71, 0xa9, 0xc2,
+ 0xd0, 0x9d, 0x65, 0xf4, 0x98, 0x60, 0x90, 0x08,
+ 0xff, 0x29, 0xc9, 0x4c, 0xef, 0x5d, 0x27, 0x4f,
+ 0x85, 0x37, 0x50, 0xd1, 0x7a, 0x4f, 0xfb, 0xfb,
+ 0x97, 0xaf, 0x4c, 0xfa, 0x83, 0xa7, 0xd6, 0xcc,
+ 0x6f, 0x27, 0x49, 0xdc, 0xa2, 0xd2, 0xc7, 0x3a,
+ 0x98, 0x37, 0xa0, 0xc2, 0xb2, 0x29, 0xe8, 0x85,
+ 0xad, 0xc7, 0xe2, 0x84, 0x9e, 0x8d, 0x2c, 0x57,
+ 0x18, 0x98, 0x03, 0xbf, 0xc2, 0x17, 0xb8, 0xeb,
+ 0x03, 0x19, 0xb4, 0xdd, 0xe0, 0xe9, 0xeb, 0xc6,
+ 0xe4, 0xe9, 0xfd, 0x7e, 0x10, 0x03, 0xba, 0x9d,
+ 0x26, 0xeb, 0xe7, 0xa7, 0x52, 0x09, 0xf0, 0xa6,
+ 0xea, 0x1a, 0x22, 0x39, 0xff, 0xec, 0x77, 0x5a,
+ 0xdb, 0x3f, 0x6d, 0xb8, 0x2b, 0x76, 0x3a, 0x7f,
+ 0xcf, 0x5a, 0x06, 0xf3, 0x9f, 0x64, 0xe9, 0xff,
+ 0xfe, 0x5c, 0x6f, 0xb2, 0xb8, 0xfd, 0xe7, 0x1e,
+ 0xc5, 0xf8, 0x27, 0x4d, 0x43, 0x0a, 0x98, 0x21,
+ 0x2a, 0x7f, 0xe7, 0xb9, 0x31, 0xe6, 0xb0, 0xb4,
+ 0x38, 0x06, 0xb4, 0x22, 0xf3, 0xfa, 0xf8, 0xff,
+ 0xbc, 0x6e, 0x4e, 0x9f, 0xff, 0x91, 0xc3, 0xbf,
+ 0xf6, 0x5c, 0x2b, 0x9f, 0xe8, 0x0e, 0x8e, 0x31,
+ 0x56, 0xdf, 0x1a, 0xd5, 0x65, 0xa8, 0x61, 0x4a,
+ 0xd0, 0x9f, 0x6c, 0x24, 0xb2, 0xba, 0xd8, 0xd6,
+ 0x7c, 0x29, 0xba, 0x86, 0x88, 0xba, 0x7d, 0x90,
+ 0x75, 0xfb, 0xcb, 0x67, 0xb2, 0x4e, 0xb3, 0xe8,
+ 0xd3, 0x08, 0x72, 0x63, 0x8f, 0x87, 0xb4, 0xff,
+ 0xcc, 0xd7, 0xba, 0xc5, 0x37, 0x50, 0xd1, 0x33,
+ 0x4e, 0xa5, 0x6a, 0x74, 0xe4, 0xf3, 0x0e, 0x9b,
+ 0x89, 0xbb, 0x9d, 0x3f, 0x66, 0xe8, 0xb0, 0x34,
+ 0x74, 0x37, 0x73, 0xcd, 0x68, 0x7e, 0x7c, 0x9b,
+ 0x8f, 0x34, 0x74, 0xff, 0xcd, 0xfe, 0xcf, 0x93,
+ 0xdc, 0xe6, 0xd0, 0xe9, 0xff, 0xfe, 0xef, 0x7e,
+ 0x9f, 0xbe, 0x71, 0xdf, 0x0c, 0x2b, 0xc5, 0x68,
+ 0x3a, 0x2d, 0x16, 0x38, 0x47, 0x9f, 0xff, 0x73,
+ 0xef, 0xd1, 0x75, 0xf6, 0xe1, 0xc1, 0x08, 0x4a,
+ 0x9e, 0x4d, 0xd4, 0x34, 0x59, 0xf3, 0xfe, 0xf6,
+ 0x15, 0xfe, 0xca, 0xe6, 0xa7, 0x4f, 0xff, 0x78,
+ 0x71, 0xbc, 0x2d, 0xb7, 0xee, 0xb7, 0xf3, 0xa7,
+ 0x04, 0x21, 0x2a, 0x7f, 0xda, 0xfa, 0xfe, 0xd3,
+ 0x9b, 0x12, 0x9c, 0x5e, 0x4f, 0xf2, 0xe3, 0xdc,
+ 0xff, 0x75, 0xa3, 0xa7, 0xfb, 0xdf, 0xe7, 0xaf,
+ 0x3d, 0xe6, 0xa7, 0x42, 0x27, 0xe2, 0x2b, 0x0c,
+ 0x2b, 0xc1, 0xf0, 0x1b, 0x72, 0x96, 0xd8, 0xe6,
+ 0x7f, 0x87, 0x43, 0x8f, 0x28, 0xa9, 0xd3, 0xff,
+ 0xff, 0xf5, 0xd8, 0x2b, 0x77, 0xfe, 0x9d, 0x47,
+ 0xeb, 0x78, 0x75, 0x7f, 0x74, 0x32, 0xd8, 0x74,
+ 0xea, 0xad, 0x07, 0x4e, 0xe2, 0xbc, 0x1d, 0x0f,
+ 0x46, 0x25, 0x61, 0x15, 0x91, 0xc9, 0xea, 0x41,
+ 0xda, 0x1d, 0x3e, 0xc7, 0xd6, 0xc4, 0xc9, 0xff,
+ 0x78, 0x5f, 0x63, 0x47, 0x7b, 0xc9, 0xa2, 0x0d,
+ 0x71, 0xa5, 0x9f, 0x6a, 0x79, 0x8a, 0x74, 0xfc,
+ 0xfc, 0x7f, 0x69, 0xc9, 0xd2, 0xb4, 0x3d, 0x3f,
+ 0x92, 0xcf, 0xff, 0xfb, 0x43, 0x9b, 0xc6, 0x56,
+ 0xff, 0x4e, 0x6c, 0x7d, 0x46, 0xb0, 0xe8, 0x7a,
+ 0x68, 0x17, 0x0a, 0xff, 0x93, 0x4f, 0xc3, 0x7c,
+ 0xd7, 0x0a, 0x74, 0xff, 0xfe, 0xef, 0xfb, 0xd3,
+ 0x87, 0x5f, 0xee, 0x6b, 0xea, 0x71, 0xe0, 0x9d,
+ 0x3f, 0xff, 0xd5, 0xaa, 0x8e, 0x55, 0xcc, 0xbc,
+ 0xd7, 0xad, 0x75, 0xf6, 0x74, 0xf6, 0x2f, 0xcd,
+ 0x8e, 0x8f, 0x22, 0x27, 0x0c, 0xd3, 0x31, 0xba,
+ 0x34, 0x5f, 0x93, 0xff, 0x3f, 0x3d, 0xbd, 0xec,
+ 0xce, 0x55, 0x87, 0x4f, 0xfd, 0xeb, 0xfd, 0xdd,
+ 0x78, 0x3e, 0xac, 0x3a, 0x29, 0x44, 0x5d, 0x51,
+ 0xa6, 0xf3, 0x47, 0x4e, 0xcf, 0xa8, 0x3a, 0x77,
+ 0xd5, 0x0e, 0x8e, 0x07, 0x9c, 0xc1, 0x7f, 0x8e,
+ 0xc2, 0xa6, 0xf3, 0xc9, 0x1d, 0xc2, 0xcf, 0x5c,
+ 0xa7, 0xff, 0xfe, 0x6f, 0x5c, 0x79, 0x8e, 0x69,
+ 0xfa, 0x3d, 0x71, 0xea, 0x6a, 0x9e, 0xa0, 0xe9,
+ 0xe0, 0xed, 0xd4, 0xe9, 0xfe, 0x7b, 0x35, 0xf9,
+ 0xaa, 0xf4, 0x3a, 0x14, 0xf6, 0xb4, 0x82, 0x7a,
+ 0xeb, 0xef, 0x9d, 0x1f, 0x3c, 0x1e, 0xc8, 0x27,
+ 0xba, 0xf7, 0xb5, 0x3a, 0x7f, 0xd9, 0xa8, 0x3d,
+ 0x4d, 0x2f, 0xbc, 0x9d, 0x0a, 0x7c, 0xb6, 0x49,
+ 0x33, 0x5d, 0x9d, 0x26, 0x1d, 0x14, 0x9a, 0x86,
+ 0xe4, 0x62, 0x7f, 0xff, 0xd8, 0xf5, 0x39, 0xba,
+ 0x72, 0x22, 0xb9, 0x07, 0x5f, 0xbf, 0x16, 0x74,
+ 0xe0, 0x84, 0x25, 0x4f, 0x73, 0xce, 0xfc, 0xa7,
+ 0x17, 0x93, 0xfe, 0xdc, 0x27, 0xb7, 0x85, 0x77,
+ 0x07, 0x42, 0xa6, 0x44, 0x84, 0xfe, 0x84, 0x5e,
+ 0x0c, 0xa7, 0xfe, 0xbf, 0xd3, 0x9b, 0x1f, 0x51,
+ 0xac, 0x3a, 0x7d, 0x79, 0x7b, 0x30, 0x74, 0x29,
+ 0xf5, 0xd5, 0x12, 0x60, 0x60, 0xe9, 0xfa, 0x86,
+ 0x9f, 0xc6, 0x8d, 0x07, 0x4f, 0xee, 0x98, 0xbc,
+ 0xe3, 0xd9, 0x3a, 0x6f, 0x09, 0xd0, 0xdd, 0xcf,
+ 0xff, 0xc6, 0xb8, 0x35, 0x9f, 0xfb, 0x95, 0xe4,
+ 0x57, 0x3e, 0x4f, 0x72, 0x74, 0xfd, 0x8e, 0xe8,
+ 0x6b, 0x1e, 0x3a, 0x39, 0x3f, 0x6c, 0x22, 0xc9,
+ 0xdc, 0x63, 0x3b, 0xe1, 0xb8, 0x0e, 0x2b, 0x45,
+ 0x05, 0x3c, 0xc3, 0x62, 0xe5, 0x09, 0xf4, 0x65,
+ 0xa6, 0x1f, 0x3e, 0x35, 0x6a, 0x38, 0x81, 0x35,
+ 0x61, 0x66, 0x25, 0x36, 0x6a, 0x08, 0x23, 0x15,
+ 0xfc, 0x22, 0x2b, 0x1b, 0x56, 0x61, 0x58, 0x12,
+ 0x1e, 0x28, 0x4a, 0xf5, 0x85, 0x5c, 0x39, 0xb0,
+ 0xb8, 0xc5, 0x3d, 0x12, 0x7f, 0xf3, 0x99, 0xaf,
+ 0x75, 0x8a, 0x6e, 0xa1, 0xa2, 0x6c, 0x9f, 0xce,
+ 0xb1, 0x4d, 0xd4, 0x34, 0x55, 0xb3, 0xf9, 0xef,
+ 0xef, 0x3f, 0x57, 0x9d, 0x3d, 0x78, 0xdc, 0x9d,
+ 0x26, 0xea, 0xcf, 0x53, 0xe6, 0x93, 0xe1, 0x4d,
+ 0xd4, 0x34, 0x56, 0x93, 0xff, 0xc8, 0xa3, 0x60,
+ 0xd6, 0x6b, 0xd7, 0xc8, 0x74, 0xff, 0xf3, 0xeb,
+ 0x7f, 0x56, 0x6d, 0xe7, 0x2a, 0xc3, 0xa6, 0xce,
+ 0x55, 0x12, 0xfa, 0x95, 0x3f, 0x95, 0xb7, 0x5c,
+ 0xfd, 0x40, 0x74, 0xfd, 0x45, 0xe3, 0xd6, 0xc3,
+ 0xa7, 0xfa, 0xdb, 0xfe, 0xa1, 0xa5, 0xf5, 0x3a,
+ 0x7f, 0x3e, 0xf3, 0xbf, 0x07, 0x67, 0x49, 0xdc,
+ 0x6a, 0x7e, 0x56, 0x59, 0xe8, 0x63, 0xe0, 0xb7,
+ 0x4d, 0xbe, 0x5b, 0x93, 0xc9, 0xfc, 0xeb, 0x14,
+ 0xdd, 0x43, 0x45, 0x81, 0x3e, 0x14, 0xdd, 0x43,
+ 0x44, 0xeb, 0x3f, 0xff, 0xb0, 0xb4, 0x73, 0x6c,
+ 0x75, 0x6b, 0x78, 0xf5, 0x7b, 0xa0, 0xe9, 0xf3,
+ 0x99, 0xaf, 0x75, 0xa2, 0x55, 0xa3, 0x09, 0xf0,
+ 0xa6, 0xea, 0x1a, 0x2d, 0x99, 0xff, 0x01, 0x6a,
+ 0xec, 0x79, 0x34, 0x4e, 0x93, 0xac, 0xfb, 0x34,
+ 0xc2, 0x79, 0x37, 0x50, 0xd1, 0x73, 0x49, 0x87,
+ 0x4c, 0xeb, 0x13, 0x76, 0x12, 0xb9, 0xfc, 0xeb,
+ 0x14, 0xdd, 0x43, 0x45, 0xdf, 0x3c, 0xee, 0x9c,
+ 0x80, 0xe8, 0x56, 0xdb, 0x02, 0xeb, 0x0e, 0x14,
+ 0x31, 0xa5, 0x4b, 0xd2, 0xa0, 0x45, 0xcd, 0x90,
+ 0xd0, 0x04, 0x2b, 0x2a, 0xc3, 0x92, 0xbe, 0xa7,
+ 0x73, 0xfe, 0xfe, 0xb9, 0x6b, 0x56, 0x6b, 0xce,
+ 0x9f, 0xdf, 0xa2, 0xdb, 0xf2, 0xbd, 0x0e, 0x9f,
+ 0x0a, 0x6e, 0xa1, 0xa2, 0x57, 0x9f, 0xf7, 0xf4,
+ 0x3c, 0xe1, 0x68, 0xb0, 0x9d, 0x3d, 0xde, 0x8b,
+ 0xce, 0x9f, 0xff, 0xde, 0xce, 0xb3, 0x7e, 0x0c,
+ 0x07, 0x7f, 0x42, 0x7a, 0x83, 0xa3, 0x94, 0x41,
+ 0xe9, 0x0c, 0x72, 0x8e, 0x5c, 0x43, 0x0a, 0x76,
+ 0xbd, 0xca, 0x9b, 0xb5, 0x9c, 0x56, 0x31, 0x59,
+ 0xd9, 0x5e, 0x4a, 0x9f, 0xfd, 0x8d, 0xf6, 0x55,
+ 0xfe, 0x1a, 0x3b, 0x01, 0x53, 0xfb, 0x51, 0xdc,
+ 0x8b, 0x72, 0xe5, 0x3e, 0x7a, 0x8e, 0x49, 0xc8,
+ 0xaa, 0xb9, 0x91, 0xd9, 0xb6, 0x85, 0x6c, 0xff,
+ 0xe7, 0x33, 0x5e, 0xeb, 0x14, 0xdd, 0x43, 0x44,
+ 0xc3, 0x3f, 0xff, 0x5b, 0xba, 0x8e, 0x81, 0xdd,
+ 0x32, 0xf0, 0xad, 0x5e, 0x74, 0xff, 0xcd, 0xd5,
+ 0xd2, 0xfe, 0xf7, 0x3f, 0x57, 0x9d, 0x3f, 0x97,
+ 0x68, 0xcf, 0x4d, 0x13, 0xa7, 0xda, 0x2f, 0xd6,
+ 0x1d, 0x1f, 0x3d, 0x8e, 0xcc, 0xe7, 0xe6, 0x2d,
+ 0xff, 0x3c, 0x47, 0x4f, 0x96, 0xff, 0x9e, 0x23,
+ 0xa7, 0xec, 0x7b, 0x35, 0xda, 0x78, 0x1e, 0xc3,
+ 0x0b, 0xe7, 0xff, 0xfd, 0xfb, 0x0b, 0x7e, 0x6f,
+ 0x1c, 0x3f, 0x74, 0x7a, 0xff, 0x4b, 0xea, 0x74,
+ 0xfc, 0xdb, 0xae, 0x7e, 0xa0, 0x3a, 0x7f, 0xf2,
+ 0xe4, 0x0a, 0xfb, 0xa7, 0x34, 0x76, 0x13, 0xa1,
+ 0x4f, 0xf7, 0xc6, 0x33, 0xf5, 0x7d, 0xd1, 0x9b,
+ 0x93, 0xa7, 0xff, 0xfc, 0x36, 0xd9, 0x7f, 0x9e,
+ 0x1d, 0x7e, 0xb8, 0xdf, 0x65, 0x73, 0x53, 0xa5,
+ 0x74, 0xa2, 0x7c, 0x4b, 0xe7, 0xbe, 0xa0, 0xea,
+ 0x74, 0xf6, 0xf5, 0xe6, 0xce, 0x93, 0xb8, 0xd5,
+ 0x70, 0x7c, 0xc2, 0x89, 0x1e, 0xda, 0x48, 0xc4,
+ 0x3c, 0x3f, 0x0c, 0x0c, 0x94, 0x76, 0x47, 0x3e,
+ 0x14, 0xdd, 0x43, 0x45, 0x5d, 0x3f, 0xcf, 0x75,
+ 0x8a, 0x6e, 0xa1, 0xa2, 0x3c, 0x93, 0xac, 0xfc,
+ 0x74, 0xc2, 0x7f, 0x3a, 0xc5, 0x37, 0x50, 0xd1,
+ 0x60, 0xcf, 0xe7, 0x58, 0xa6, 0xea, 0x1a, 0x2c,
+ 0xa9, 0xfc, 0xeb, 0x14, 0xdd, 0x43, 0x45, 0xa7,
+ 0x3c, 0x9b, 0xa8, 0x68, 0xb7, 0x27, 0xfe, 0x5b,
+ 0x1b, 0xff, 0x0c, 0x5d, 0x21, 0x3a, 0x04, 0xfb,
+ 0xea, 0x57, 0x3f, 0xcb, 0xfe, 0xd8, 0xb5, 0xcf,
+ 0x8e, 0x9f, 0xf6, 0xbd, 0xd6, 0x29, 0xba, 0x86,
+ 0x8a, 0x1e, 0x7f, 0xe6, 0x6f, 0x2b, 0xce, 0x3d,
+ 0xff, 0x30, 0xe9, 0xfa, 0xbb, 0x4d, 0x73, 0xe3,
+ 0xa7, 0xef, 0xf1, 0xb6, 0x2b, 0x53, 0xa7, 0xff,
+ 0xeb, 0xe7, 0x0b, 0xd5, 0xd9, 0xfe, 0x82, 0xb5,
+ 0x50, 0x15, 0x27, 0x5a, 0x74, 0x3e, 0x21, 0x61,
+ 0xce, 0xa3, 0x65, 0x1b, 0xb2, 0xee, 0x23, 0x09,
+ 0xfc, 0xeb, 0x14, 0xdd, 0x43, 0x45, 0xe7, 0x0a,
+ 0xc9, 0x06, 0x7a, 0x27, 0x2a, 0x57, 0x2f, 0x86,
+ 0x98, 0xc0, 0x04, 0x99, 0x87, 0x78, 0x3b, 0xfc,
+ 0xa4, 0xb6, 0xcd, 0xb3, 0xf9, 0xd6, 0x29, 0xba,
+ 0x86, 0x8a, 0x5a, 0x7f, 0x3a, 0xc5, 0x37, 0x50,
+ 0xd1, 0x61, 0x4f, 0xe7, 0x58, 0xa6, 0xea, 0x1a,
+ 0x2c, 0xb9, 0xe7, 0x74, 0x6e, 0x3b, 0x76, 0x3a,
+ 0x73, 0xba, 0xb0, 0xe9, 0xe4, 0x72, 0xd5, 0x0f,
+ 0x43, 0xb3, 0x29, 0xff, 0xce, 0x66, 0xbd, 0xd6,
+ 0x29, 0xba, 0x86, 0x8a, 0x32, 0x7f, 0x39, 0x5b,
+ 0x28, 0xa8, 0x0e, 0x87, 0xa7, 0x7a, 0x27, 0x6c,
+ 0x3b, 0xd8, 0x45, 0xd4, 0xe3, 0x2a, 0x53, 0xff,
+ 0x3b, 0x5e, 0xeb, 0x14, 0xdd, 0x43, 0x44, 0x73,
+ 0x3f, 0xf9, 0xcc, 0xd7, 0xba, 0xc5, 0x37, 0x50,
+ 0xd1, 0x39, 0x4f, 0xe7, 0x58, 0xa6, 0xea, 0x1a,
+ 0x2c, 0xc9, 0xff, 0x9c, 0xa0, 0x15, 0xce, 0x36,
+ 0x97, 0x9d, 0x3f, 0x9d, 0x62, 0x9b, 0xa8, 0x68,
+ 0xb7, 0x67, 0xff, 0x39, 0x9a, 0xf7, 0x58, 0xa6,
+ 0xea, 0x1a, 0x29, 0x09, 0xff, 0x9d, 0xaf, 0x75,
+ 0x8a, 0x6e, 0xa1, 0xa2, 0x52, 0x8a, 0x13, 0xf5,
+ 0x69, 0x31, 0x8a, 0x40, 0x3b, 0xfa, 0x1e, 0x4e,
+ 0xdb, 0xd4, 0xa7, 0xfd, 0xaf, 0x75, 0x8a, 0x6e,
+ 0xa1, 0xa2, 0x76, 0x9f, 0xff, 0x7b, 0x9e, 0xd8,
+ 0xad, 0xfb, 0xcf, 0xd7, 0xf6, 0x87, 0x49, 0xcc,
+ 0x44, 0xfe, 0xa3, 0x4f, 0xfd, 0xac, 0xc5, 0xa6,
+ 0xe1, 0x7a, 0xbc, 0xe9, 0xff, 0xbf, 0x78, 0xda,
+ 0x2e, 0xbf, 0xda, 0x4e, 0x9b, 0x89, 0xdc, 0xa2,
+ 0x1e, 0xa8, 0x70, 0xc4, 0x71, 0x71, 0x42, 0xbe,
+ 0x7c, 0x29, 0xba, 0x86, 0x88, 0xb2, 0x7f, 0xda,
+ 0xf7, 0x58, 0xa6, 0xea, 0x1a, 0x25, 0xd9, 0xff,
+ 0xfa, 0xf9, 0xc2, 0xf5, 0x76, 0x7f, 0xa0, 0xad,
+ 0x54, 0x05, 0x49, 0xd6, 0x8d, 0x36, 0x18, 0x71,
+ 0x23, 0x4f, 0xfe, 0x73, 0x35, 0xee, 0xb1, 0x4d,
+ 0xd4, 0x34, 0x4c, 0x53, 0xf5, 0x8a, 0x6e, 0xa1,
+ 0xa2, 0xa9, 0x9f, 0xff, 0xfc, 0x3b, 0x8a, 0x5f,
+ 0x79, 0x76, 0x36, 0xa3, 0xe0, 0xe7, 0x1e, 0x17,
+ 0x9d, 0x0e, 0x45, 0x66, 0x9a, 0xcf, 0xfe, 0x73,
+ 0x35, 0xee, 0xb1, 0x4d, 0xd4, 0x34, 0x4e, 0x93,
+ 0xfb, 0xda, 0x2a, 0xfd, 0x6c, 0x74, 0xf9, 0xa5,
+ 0x69, 0x6a, 0x74, 0xfc, 0x1b, 0xf3, 0x6b, 0xf9,
+ 0xd3, 0xde, 0xc2, 0xbb, 0xc7, 0xad, 0x52, 0x89,
+ 0xff, 0xbb, 0xae, 0x56, 0x97, 0x76, 0xd7, 0x98,
+ 0x74, 0x31, 0x10, 0x58, 0x39, 0x9f, 0xf6, 0xbd,
+ 0xd6, 0x29, 0xba, 0x86, 0x89, 0xde, 0x7d, 0x9e,
+ 0xf5, 0x9e, 0x2a, 0x4e, 0xe5, 0x39, 0xbb, 0x8c,
+ 0x29, 0x84, 0x7a, 0x8d, 0x3f, 0xf9, 0xcc, 0xd7,
+ 0xba, 0xc5, 0x37, 0x50, 0xd1, 0x42, 0xcf, 0xfe,
+ 0x73, 0x35, 0xee, 0xb1, 0x4d, 0xd4, 0x34, 0x52,
+ 0x53, 0xff, 0xfa, 0xea, 0xee, 0xb6, 0xd6, 0x35,
+ 0x99, 0xc2, 0xe7, 0xb6, 0x1d, 0x14, 0x2e, 0x4b,
+ 0x3c, 0xe1, 0x21, 0xfc, 0x24, 0x4c, 0x8f, 0xb4,
+ 0x09, 0x3d, 0xa9, 0x71, 0x29, 0x4f, 0xe7, 0x58,
+ 0xa6, 0xea, 0x1a, 0x22, 0x49, 0xff, 0xce, 0x66,
+ 0xbd, 0xd6, 0x29, 0xba, 0x86, 0x89, 0x7a, 0x7f,
+ 0xf0, 0xeb, 0x55, 0x56, 0xdb, 0x85, 0xa5, 0xa3,
+ 0xa7, 0xfb, 0xdb, 0xfe, 0xf2, 0xd2, 0xf4, 0x3a,
+ 0x7c, 0x29, 0xba, 0x86, 0x8a, 0x5e, 0x7f, 0xf5,
+ 0xbd, 0x41, 0x51, 0x5a, 0x5f, 0xe6, 0x1d, 0x3e,
+ 0x6f, 0xf3, 0x16, 0xa7, 0x4f, 0xb5, 0xb5, 0x8d,
+ 0x4e, 0x92, 0xf2, 0x7a, 0x2c, 0x2a, 0x93, 0x95,
+ 0x37, 0xae, 0x53, 0x2c, 0xf1, 0xa3, 0x0c, 0xc2,
+ 0x6a, 0x7f, 0x3a, 0xc5, 0x37, 0x50, 0xd1, 0x4e,
+ 0x4f, 0xfb, 0xc3, 0xb5, 0xc5, 0xdf, 0xd0, 0xe9,
+ 0xff, 0x5e, 0x14, 0x6d, 0xc1, 0x08, 0x4a, 0x9b,
+ 0xc1, 0x3a, 0x6a, 0x1d, 0xca, 0x23, 0x78, 0x8e,
+ 0xdb, 0xcf, 0x27, 0xc2, 0x9b, 0xa8, 0x68, 0xaf,
+ 0x27, 0xff, 0xeb, 0xe7, 0x0b, 0xd5, 0xd9, 0xfe,
+ 0x82, 0xb5, 0x50, 0x15, 0x27, 0x5a, 0x23, 0x78,
+ 0x8c, 0x27, 0xfe, 0x76, 0xbd, 0xd6, 0x29, 0xba,
+ 0x86, 0x89, 0x1e, 0x77, 0x80, 0xa7, 0x4e, 0x4b,
+ 0x61, 0x4e, 0x2e, 0xe7, 0xc2, 0x9b, 0xa8, 0x68,
+ 0x92, 0x27, 0x9d, 0xaf, 0x72, 0x9e, 0xcd, 0x94,
+ 0xcf, 0xfc, 0xed, 0x7b, 0xac, 0x53, 0x75, 0x0d,
+ 0x12, 0x54, 0xf8, 0x53, 0x75, 0x0d, 0x17, 0x8c,
+ 0xfd, 0xdf, 0xe9, 0xda, 0x6a, 0x74, 0xfa, 0xb5,
+ 0xcd, 0xa1, 0xd3, 0xfc, 0xf7, 0x58, 0xa6, 0xea,
+ 0x1a, 0x24, 0xd9, 0x3a, 0xd1, 0x8f, 0x49, 0x80,
+ 0x98, 0x69, 0x34, 0x2a, 0xf3, 0x65, 0x07, 0x6f,
+ 0x8f, 0x33, 0x95, 0x6f, 0x43, 0x21, 0xa8, 0x68,
+ 0xb0, 0xaf, 0x10, 0xc0, 0xc9, 0xbf, 0x71, 0x89,
+ 0xc2, 0xc7, 0x01, 0x99, 0x44, 0x75, 0xcf, 0x8f,
+ 0x27, 0x99, 0x43, 0x57, 0x6e, 0xe6, 0xba, 0x4a,
+ 0x59, 0x4b, 0x40, 0x75, 0x4c, 0xf6, 0xaf, 0xa7,
+ 0x4b, 0x38, 0xf1, 0xdb, 0x35, 0x4f, 0xb3, 0x1a,
+ 0x4e, 0x1b, 0x31, 0x1f, 0x9f, 0x89, 0xda, 0x8d,
+ 0xac, 0x2a, 0x81, 0x2c, 0x5d, 0xb9, 0x85, 0x8f,
+ 0xe7, 0xbc, 0x6b, 0x49, 0x5f, 0xcd, 0x76, 0xe7,
+ 0xdd, 0x31, 0xad, 0xb4, 0xa6, 0x10, 0xca, 0x50,
+ 0xe2, 0x8f, 0xaf, 0xac, 0xec, 0xa3, 0x7c, 0xf7,
+ 0x74, 0x00,
};
-static const unsigned kPreloadedHSTSBits = 97871;
+static const unsigned kPreloadedHSTSBits = 100424;
-static const unsigned kHSTSRootPosition = 97293;
+static const unsigned kHSTSRootPosition = 99844;
#endif // NET_HTTP_TRANSPORT_SECURITY_STATE_STATIC_H_
diff --git a/net/http/transport_security_state_static.json b/net/http/transport_security_state_static.json
index 59eb9f7..cc830c0 100644
--- a/net/http/transport_security_state_static.json
+++ b/net/http/transport_security_state_static.json
@@ -1524,7 +1524,47 @@
{ "name": "webandwords.com.au", "include_subdomains": true, "mode": "force-https" },
{ "name": "webtiles.co.uk", "include_subdomains": true, "mode": "force-https" },
{ "name": "yoursecondphone.co", "include_subdomains": true, "mode": "force-https" },
- { "name": "zlavomat.sk", "include_subdomains": true, "mode": "force-https" }
+ { "name": "zlavomat.sk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "alainwolf.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "arguggi.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "azabani.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bitmon.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bjornjohansen.no", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bookingapp.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cackette.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "caremad.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "clerkendweller.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cyon.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fakturoid.cz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "finn.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fm83.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "grandmascookieblog.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "khanovaskola.cz", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ki-on.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kingmanhall.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kpebetka.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mirindadomo.ru", "include_subdomains": true, "mode": "force-https" },
+ { "name": "myvirtualserver.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "neftaly.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nu3.at", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nu3.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nu3.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nu3.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nu3.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nu3.dk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nu3.fi", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nu3.fr", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nu3.no", "include_subdomains": true, "mode": "force-https" },
+ { "name": "nu3.se", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ovenapp.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ruudkoot.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "seomobo.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "seowarp.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "shenyuqi.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "souvik.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "topodin.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wpletter.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "yahvehyireh.com", "include_subdomains": true, "mode": "force-https" }
],
// |ReportUMAOnPinFailure| uses these to report which domain was associated
diff --git a/net/net.gyp b/net/net.gyp
index da91a92..5ddf430 100644
--- a/net/net.gyp
+++ b/net/net.gyp
@@ -1570,6 +1570,7 @@
'../base/base.gyp:base',
'cert_verify_status_android_java',
'certificate_mime_types_java',
+ 'network_change_notifier_types_java',
'net_errors_java',
'private_key_types_java',
'remote_android_keystore_aidl',
@@ -1640,6 +1641,14 @@
'includes': [ '../build/android/java_cpp_enum.gypi' ],
},
{
+ 'target_name': 'network_change_notifier_types_java',
+ 'type': 'none',
+ 'variables': {
+ 'source_file': 'base/network_change_notifier.h',
+ },
+ 'includes': [ '../build/android/java_cpp_enum.gypi' ],
+ },
+ {
'target_name': 'private_key_types_java',
'type': 'none',
'variables': {
diff --git a/net/net.gypi b/net/net.gypi
index cc9ff35..89a0503 100644
--- a/net/net.gypi
+++ b/net/net.gypi
@@ -64,6 +64,8 @@
'cert/cert_database.cc',
'cert/cert_database.h',
'cert/cert_database_openssl.cc',
+ 'cert/cert_policy_enforcer.cc',
+ 'cert/cert_policy_enforcer.h',
'cert/cert_status_flags.cc',
'cert/cert_status_flags.h',
'cert/cert_verifier.cc',
@@ -1297,6 +1299,7 @@
'base/upload_bytes_element_reader_unittest.cc',
'base/upload_file_element_reader_unittest.cc',
'base/url_util_unittest.cc',
+ 'cert/cert_policy_enforcer_unittest.cc',
'cert/cert_verify_proc_unittest.cc',
'cert/crl_set_unittest.cc',
'cert/ct_log_response_parser_unittest.cc',
diff --git a/net/net_unittests.isolate b/net/net_unittests.isolate
index e57f957..e062a7d 100644
--- a/net/net_unittests.isolate
+++ b/net/net_unittests.isolate
@@ -26,7 +26,7 @@
'../third_party/pywebsocket/',
'../third_party/tlslite/',
'<(PRODUCT_DIR)/net_unittests<(EXECUTABLE_SUFFIX)',
- '<(PRODUCT_DIR)/pyproto/',
+ '<(PRODUCT_DIR)/pyproto/google/',
'tools/testserver/',
],
'read_only': 1,
diff --git a/net/proxy/dhcp_proxy_script_fetcher_win_unittest.cc b/net/proxy/dhcp_proxy_script_fetcher_win_unittest.cc
index c3368ac..d9c4356 100644
--- a/net/proxy/dhcp_proxy_script_fetcher_win_unittest.cc
+++ b/net/proxy/dhcp_proxy_script_fetcher_win_unittest.cc
@@ -36,11 +36,7 @@
it != adapter_names.end();
++it) {
const std::string& adapter_name = *it;
- std::string pac_url =
- DhcpProxyScriptAdapterFetcher::GetPacURLFromDhcp(adapter_name);
- printf("Adapter '%s' has PAC URL '%s' configured in DHCP.\n",
- adapter_name.c_str(),
- pac_url.c_str());
+ DhcpProxyScriptAdapterFetcher::GetPacURLFromDhcp(adapter_name);
}
}
@@ -84,11 +80,9 @@
FAIL() << "Received completion for test in which this is error.";
}
finished_ = true;
- printf("Result code %d PAC data length %d\n", result, pac_text_.size());
}
void OnTimeout() {
- printf("Timeout!");
OnCompletion(0);
}
@@ -134,8 +128,7 @@
fetcher.RunTest();
fetcher.WaitUntilDone();
- printf("PAC URL was %s\n",
- fetcher.fetcher_->GetPacURL().possibly_invalid_spec().c_str());
+ fetcher.fetcher_->GetPacURL().possibly_invalid_spec();
fetcher.FinishTestAllowCleanup();
}
diff --git a/net/proxy/proxy_resolver_v8_tracing.cc b/net/proxy/proxy_resolver_v8_tracing.cc
index 17145d1..c498f74 100644
--- a/net/proxy/proxy_resolver_v8_tracing.cc
+++ b/net/proxy/proxy_resolver_v8_tracing.cc
@@ -6,6 +6,7 @@
#include "base/bind.h"
#include "base/message_loop/message_loop_proxy.h"
+#include "base/profiler/scoped_tracker.h"
#include "base/strings/stringprintf.h"
#include "base/synchronization/cancellation_flag.h"
#include "base/synchronization/waitable_event.h"
@@ -717,6 +718,11 @@
}
void ProxyResolverV8Tracing::Job::OnDnsOperationComplete(int result) {
+ // TODO(vadimt): Remove ScopedTracker below once crbug.com/436634 is fixed.
+ tracked_objects::ScopedTracker tracking_profile(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "436634 ProxyResolverV8Tracing::Job::OnDnsOperationComplete"));
+
CheckIsOnOriginThread();
DCHECK(!cancelled_.IsSet());
diff --git a/net/quic/congestion_control/cube_root.cc b/net/quic/congestion_control/cube_root.cc
index c563ad9..191cccc 100644
--- a/net/quic/congestion_control/cube_root.cc
+++ b/net/quic/congestion_control/cube_root.cc
@@ -64,7 +64,7 @@
if (msb < 7) {
// MSB in our table.
- return ((cube_root_table[static_cast<uint32>(a)]) + 31) >> 6;
+ return ((cube_root_table[a]) + 31) >> 6;
}
// MSB 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, ...
// cubic_shift 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, ...
@@ -72,9 +72,8 @@
cubic_shift = ((cubic_shift * 342) >> 10); // Div by 3, biased high.
// 4 to 6 bits accuracy depending on MSB.
- uint32 down_shifted_to_6bit = (a >> (cubic_shift * 3));
- uint64 root = ((cube_root_table[down_shifted_to_6bit] + 10) << cubic_shift)
- >> 6;
+ uint64 root =
+ ((cube_root_table[a >> (cubic_shift * 3)] + 10) << cubic_shift) >> 6;
// Make one Newton-Raphson iteration.
// Since x has an error (inaccuracy due to the use of fix point) we get a
diff --git a/net/quic/congestion_control/cubic.cc b/net/quic/congestion_control/cubic.cc
index eaec621..55ce803 100644
--- a/net/quic/congestion_control/cubic.cc
+++ b/net/quic/congestion_control/cubic.cc
@@ -161,8 +161,8 @@
// suddenly, leading to more than one iteration through the following loop.
while (true) {
// Update estimated TCP congestion_window.
- uint32 required_ack_count =
- estimated_tcp_congestion_window_ / Alpha();
+ QuicPacketCount required_ack_count = static_cast<QuicPacketCount>(
+ estimated_tcp_congestion_window_ / Alpha());
if (acked_packets_count_ < required_ack_count) {
break;
}
diff --git a/net/quic/congestion_control/cubic.h b/net/quic/congestion_control/cubic.h
index fd53533..76faf56 100644
--- a/net/quic/congestion_control/cubic.h
+++ b/net/quic/congestion_control/cubic.h
@@ -71,7 +71,7 @@
QuicPacketCount last_max_congestion_window_;
// Number of acked packets since the cycle started (epoch).
- uint32 acked_packets_count_;
+ QuicPacketCount acked_packets_count_;
// TCP Reno equivalent congestion window in packets.
QuicPacketCount estimated_tcp_congestion_window_;
diff --git a/net/quic/congestion_control/cubic_test.cc b/net/quic/congestion_control/cubic_test.cc
index 915274a..0b99b0a 100644
--- a/net/quic/congestion_control/cubic_test.cc
+++ b/net/quic/congestion_control/cubic_test.cc
@@ -35,8 +35,8 @@
TEST_F(CubicTest, AboveOrigin) {
// Convex growth.
const QuicTime::Delta rtt_min = hundred_ms_;
- uint32 current_cwnd = 10;
- uint32 expected_cwnd = current_cwnd + 1;
+ QuicPacketCount current_cwnd = 10;
+ QuicPacketCount expected_cwnd = current_cwnd + 1;
// Initialize the state.
clock_.AdvanceTime(one_ms_);
EXPECT_EQ(expected_cwnd,
@@ -44,7 +44,7 @@
current_cwnd = expected_cwnd;
// Normal TCP phase.
for (int i = 0; i < 48; ++i) {
- for (uint32 n = 1; n < current_cwnd / kNConnectionAlpha; ++n) {
+ for (QuicPacketCount n = 1; n < current_cwnd / kNConnectionAlpha; ++n) {
// Call once per ACK.
EXPECT_NEAR(current_cwnd,
cubic_.CongestionWindowAfterAck(current_cwnd, rtt_min), 1);
@@ -56,7 +56,7 @@
}
// Cubic phase.
for (int i = 0; i < 52; ++i) {
- for (uint32 n = 1; n < current_cwnd; ++n) {
+ for (QuicPacketCount n = 1; n < current_cwnd; ++n) {
// Call once per ACK.
EXPECT_EQ(current_cwnd,
cubic_.CongestionWindowAfterAck(current_cwnd, rtt_min));
@@ -74,15 +74,15 @@
TEST_F(CubicTest, CwndIncreaseStatsDuringConvexRegion) {
const QuicTime::Delta rtt_min = hundred_ms_;
- uint32 current_cwnd = 10;
- uint32 expected_cwnd = current_cwnd + 1;
+ QuicPacketCount current_cwnd = 10;
+ QuicPacketCount expected_cwnd = current_cwnd + 1;
// Initialize controller state.
clock_.AdvanceTime(one_ms_);
expected_cwnd = cubic_.CongestionWindowAfterAck(current_cwnd, rtt_min);
current_cwnd = expected_cwnd;
// Testing Reno mode increase.
for (int i = 0; i < 48; ++i) {
- for (uint32 n = 1; n < current_cwnd / kNConnectionAlpha; ++n) {
+ for (QuicPacketCount n = 1; n < current_cwnd / kNConnectionAlpha; ++n) {
// Call once per ACK, causing cwnd growth in Reno mode.
cubic_.CongestionWindowAfterAck(current_cwnd, rtt_min);
}
@@ -94,13 +94,13 @@
EXPECT_NEAR(1u, stats_.cwnd_increase_cubic_mode, 1);
expected_cwnd++;
}
- uint32 old_cwnd = current_cwnd;
+ QuicPacketCount old_cwnd = current_cwnd;
stats_.cwnd_increase_cubic_mode = 0;
stats_.cwnd_increase_congestion_avoidance = 0;
// Testing Cubic mode increase.
for (int i = 0; i < 52; ++i) {
- for (uint32 n = 1; n < current_cwnd; ++n) {
+ for (QuicPacketCount n = 1; n < current_cwnd; ++n) {
// Call once per ACK.
cubic_.CongestionWindowAfterAck(current_cwnd, rtt_min);
}
@@ -120,16 +120,16 @@
TEST_F(CubicTest, LossEvents) {
const QuicTime::Delta rtt_min = hundred_ms_;
- uint32 current_cwnd = 422;
- uint32 expected_cwnd = current_cwnd + 1;
+ QuicPacketCount current_cwnd = 422;
+ QuicPacketCount expected_cwnd = current_cwnd + 1;
// Initialize the state.
clock_.AdvanceTime(one_ms_);
EXPECT_EQ(expected_cwnd,
cubic_.CongestionWindowAfterAck(current_cwnd, rtt_min));
- expected_cwnd = static_cast<int>(current_cwnd * kNConnectionBeta);
+ expected_cwnd = static_cast<QuicPacketCount>(current_cwnd * kNConnectionBeta);
EXPECT_EQ(expected_cwnd,
cubic_.CongestionWindowAfterPacketLoss(current_cwnd));
- expected_cwnd = static_cast<int>(current_cwnd * kNConnectionBeta);
+ expected_cwnd = static_cast<QuicPacketCount>(current_cwnd * kNConnectionBeta);
EXPECT_EQ(expected_cwnd,
cubic_.CongestionWindowAfterPacketLoss(current_cwnd));
}
@@ -137,19 +137,19 @@
TEST_F(CubicTest, BelowOrigin) {
// Concave growth.
const QuicTime::Delta rtt_min = hundred_ms_;
- uint32 current_cwnd = 422;
- uint32 expected_cwnd = current_cwnd + 1;
+ QuicPacketCount current_cwnd = 422;
+ QuicPacketCount expected_cwnd = current_cwnd + 1;
// Initialize the state.
clock_.AdvanceTime(one_ms_);
EXPECT_EQ(expected_cwnd,
cubic_.CongestionWindowAfterAck(current_cwnd, rtt_min));
- expected_cwnd = static_cast<int>(current_cwnd * kNConnectionBeta);
+ expected_cwnd = static_cast<QuicPacketCount>(current_cwnd * kNConnectionBeta);
EXPECT_EQ(expected_cwnd,
cubic_.CongestionWindowAfterPacketLoss(current_cwnd));
current_cwnd = expected_cwnd;
// First update after loss to initialize the epoch.
current_cwnd = cubic_.CongestionWindowAfterAck(current_cwnd, rtt_min);
- uint32 old_cwnd = current_cwnd;
+ QuicPacketCount old_cwnd = current_cwnd;
// Cubic phase.
stats_.cwnd_increase_cubic_mode = 0;
stats_.cwnd_increase_congestion_avoidance = 0;
diff --git a/net/quic/congestion_control/pacing_sender.cc b/net/quic/congestion_control/pacing_sender.cc
index 7e9f81a..447890b 100644
--- a/net/quic/congestion_control/pacing_sender.cc
+++ b/net/quic/congestion_control/pacing_sender.cc
@@ -27,9 +27,9 @@
sender_->SetFromConfig(config, is_server, using_pacing);
}
-void PacingSender::ResumeConnectionState(
+bool PacingSender::ResumeConnectionState(
const CachedNetworkParameters& cached_network_params) {
- sender_->ResumeConnectionState(cached_network_params);
+ return sender_->ResumeConnectionState(cached_network_params);
}
void PacingSender::SetNumEmulatedConnections(int num_connections) {
diff --git a/net/quic/congestion_control/pacing_sender.h b/net/quic/congestion_control/pacing_sender.h
index d7d3b2d..854b052 100644
--- a/net/quic/congestion_control/pacing_sender.h
+++ b/net/quic/congestion_control/pacing_sender.h
@@ -39,7 +39,7 @@
void SetFromConfig(const QuicConfig& config,
bool is_server,
bool using_pacing) override;
- void ResumeConnectionState(
+ bool ResumeConnectionState(
const CachedNetworkParameters& cached_network_params) override;
void SetNumEmulatedConnections(int num_connections) override;
void OnCongestionEvent(bool rtt_updated,
diff --git a/net/quic/congestion_control/rtt_stats.cc b/net/quic/congestion_control/rtt_stats.cc
index 32e3b58..6c2687d 100644
--- a/net/quic/congestion_control/rtt_stats.cc
+++ b/net/quic/congestion_control/rtt_stats.cc
@@ -79,9 +79,9 @@
mean_deviation_ = QuicTime::Delta::FromMicroseconds(
rtt_sample.ToMicroseconds() / 2);
} else {
- mean_deviation_ = QuicTime::Delta::FromMicroseconds(
+ mean_deviation_ = QuicTime::Delta::FromMicroseconds(static_cast<int64>(
kOneMinusBeta * mean_deviation_.ToMicroseconds() +
- kBeta * std::abs(smoothed_rtt_.Subtract(rtt_sample).ToMicroseconds()));
+ kBeta * std::abs(smoothed_rtt_.Subtract(rtt_sample).ToMicroseconds())));
smoothed_rtt_ = smoothed_rtt_.Multiply(kOneMinusAlpha).Add(
rtt_sample.Multiply(kAlpha));
DVLOG(1) << " smoothed_rtt(us):" << smoothed_rtt_.ToMicroseconds()
diff --git a/net/quic/congestion_control/send_algorithm_interface.h b/net/quic/congestion_control/send_algorithm_interface.h
index 322ff1d..c50f6a6 100644
--- a/net/quic/congestion_control/send_algorithm_interface.h
+++ b/net/quic/congestion_control/send_algorithm_interface.h
@@ -116,7 +116,8 @@
virtual CongestionControlType GetCongestionControlType() const = 0;
// Called by the Session when we get a bandwidth estimate from the client.
- virtual void ResumeConnectionState(
+ // Returns true if initial connection state is changed as a result.
+ virtual bool ResumeConnectionState(
const CachedNetworkParameters& cached_network_params) = 0;
};
diff --git a/net/quic/congestion_control/send_algorithm_simulator.cc b/net/quic/congestion_control/send_algorithm_simulator.cc
index f08acff..7653943 100644
--- a/net/quic/congestion_control/send_algorithm_simulator.cc
+++ b/net/quic/congestion_control/send_algorithm_simulator.cc
@@ -26,8 +26,14 @@
SendAlgorithmSimulator::Sender::Sender(SendAlgorithmInterface* send_algorithm,
RttStats* rtt_stats)
+ : Sender(send_algorithm, rtt_stats, QuicTime::Delta::Zero()) {}
+
+SendAlgorithmSimulator::Sender::Sender(SendAlgorithmInterface* send_algorithm,
+ RttStats* rtt_stats,
+ QuicTime::Delta additional_rtt)
: send_algorithm(send_algorithm),
rtt_stats(rtt_stats),
+ additional_rtt(additional_rtt),
last_sent(0),
last_acked(0),
next_acked(1),
@@ -38,6 +44,18 @@
last_transfer_bandwidth(QuicBandwidth::Zero()),
last_transfer_loss_rate(0) {}
+SendAlgorithmSimulator::Transfer::Transfer(Sender* sender,
+ QuicByteCount num_bytes,
+ QuicTime start_time,
+ string name)
+ : sender(sender),
+ num_bytes(num_bytes),
+ bytes_acked(0),
+ bytes_lost(0),
+ bytes_in_flight(0),
+ start_time(start_time),
+ name(name) {}
+
SendAlgorithmSimulator::SendAlgorithmSimulator(
MockClock* clock,
QuicBandwidth bandwidth,
@@ -59,12 +77,13 @@
SendAlgorithmSimulator::~SendAlgorithmSimulator() {}
void SendAlgorithmSimulator::AddTransfer(Sender* sender, size_t num_bytes) {
- AddTransfer(sender, num_bytes, clock_->Now());
+ AddTransfer(sender, num_bytes, clock_->Now(),
+ StringPrintf("#%zu", pending_transfers_.size()));
}
void SendAlgorithmSimulator::AddTransfer(
- Sender* sender, size_t num_bytes, QuicTime start_time) {
- pending_transfers_.push_back(Transfer(sender, num_bytes, start_time));
+ Sender* sender, size_t num_bytes, QuicTime start_time, string name) {
+ pending_transfers_.push_back(Transfer(sender, num_bytes, start_time, name));
// Record initial stats from when the transfer begins.
pending_transfers_.back().sender->RecordStats();
}
@@ -102,8 +121,9 @@
clock_->AdvanceTime(ack_event.time_delta);
HandlePendingAck(ack_event.transfer);
} else {
- DVLOG(1) << "Sending, advancing time:"
- << send_event.time_delta.ToMicroseconds() << "us";
+ DVLOG(1) << "Sending transfer '" << send_event.transfer->name
+ << "', advancing time:" << send_event.time_delta.ToMicroseconds()
+ << "us";
clock_->AdvanceTime(send_event.time_delta);
SendDataNow(send_event.transfer);
bytes_sent += kPacketSize;
@@ -133,7 +153,8 @@
}
}
DVLOG(1) << "NextSendTime returning delta(ms):"
- << next_send_time.ToMilliseconds();
+ << next_send_time.ToMilliseconds() << ", transfer '"
+ << transfer->name;
return PacketEvent(next_send_time, transfer);
}
@@ -213,10 +234,9 @@
ack_delay = ack_delay.Add(delayed_ack_timer_);
}
- DVLOG(1) << "FindNextAcked found next_acked_:"
- << transfer->sender->next_acked
+ DVLOG(1) << "FindNextAck found next_acked_:" << transfer->sender->next_acked
<< " last_acked:" << transfer->sender->last_acked
- << " ack_delay(ms):" << ack_delay.ToMilliseconds();
+ << " ack_time(ms):" << ack_delay.ToMilliseconds();
return ack_delay;
}
@@ -248,9 +268,9 @@
SendAlgorithmInterface::CongestionVector acked_packets;
SendAlgorithmInterface::CongestionVector lost_packets;
DVLOG(1) << "Acking packets from:" << sender->last_acked
- << " to " << sender->next_acked
- << " bytes_in_flight:" << transfer->bytes_in_flight
- << " Now():" << (clock_->Now().ToDebuggingValue() / 1000) << "ms";
+ << " to " << sender->next_acked
+ << " bytes_in_flight:" << transfer->bytes_in_flight
+ << " Now():" << (clock_->Now().ToDebuggingValue() / 1000) << "ms";
// Some entries may be missing from the sent_packets_ array, if they were
// dropped due to buffer overruns.
SentPacket largest_observed;
@@ -282,7 +302,7 @@
sent_packets_.erase(it++);
}
- DCHECK(largest_observed.ack_time.IsInitialized());
+ DCHECK(!largest_observed.lost);
DVLOG(1) << "Updating RTT from send_time:"
<< largest_observed.send_time.ToDebuggingValue() << " to ack_time:"
<< largest_observed.ack_time.ToDebuggingValue();
@@ -327,7 +347,9 @@
Sender* sender = transfer->sender;
++sender->last_sent;
DVLOG(1) << "Sending packet:" << sender->last_sent
+ << " name:" << transfer->name
<< " bytes_in_flight:" << transfer->bytes_in_flight
+ << " cwnd:" << sender->send_algorithm->GetCongestionWindow()
<< " Now():" << (clock_->Now().ToDebuggingValue() / 1000) << "ms";
sender->send_algorithm->OnPacketSent(
clock_->Now(), transfer->bytes_in_flight,
@@ -344,12 +366,12 @@
packet_lost = true;
}
DVLOG(1) << "losing packet:" << sender->last_sent
- << " due to random loss.";
+ << " name:" << transfer->name << " due to random loss.";
// If the number of bytes in flight are less than the bdp, there's
// no buffering delay. Bytes lost from the buffer are not counted.
QuicByteCount bdp = bandwidth_.ToBytesPerPeriod(rtt_);
- QuicTime ack_time = clock_->Now().Add(rtt_);
+ QuicTime ack_time = clock_->Now().Add(rtt_).Add(sender->additional_rtt);
if (kPacketSize > bdp) {
ack_time = ack_time.Add(bandwidth_.TransferTime(kPacketSize - bdp));
}
@@ -360,7 +382,7 @@
sender->last_sent, clock_->Now(), ack_time, packet_lost, transfer));
} else {
DVLOG(1) << "losing packet:" << sender->last_sent
- << " because the buffer was full.";
+ << " name:" << transfer->name << " because the buffer was full.";
}
transfer->bytes_in_flight += kPacketSize;
}
diff --git a/net/quic/congestion_control/send_algorithm_simulator.h b/net/quic/congestion_control/send_algorithm_simulator.h
index 3e61d88..7f52d8f 100644
--- a/net/quic/congestion_control/send_algorithm_simulator.h
+++ b/net/quic/congestion_control/send_algorithm_simulator.h
@@ -27,7 +27,11 @@
class SendAlgorithmSimulator {
public:
struct Sender {
- Sender(SendAlgorithmInterface* send_algorithm, RttStats* rtt_stats);
+ Sender(SendAlgorithmInterface* send_algorithm,
+ RttStats* rtt_stats);
+ Sender(SendAlgorithmInterface* send_algorithm,
+ RttStats* rtt_stats,
+ QuicTime::Delta additional_rtt);
void RecordStats() {
QuicByteCount cwnd = send_algorithm->GetCongestionWindow();
@@ -53,6 +57,7 @@
SendAlgorithmInterface* send_algorithm;
RttStats* rtt_stats;
+ QuicTime::Delta additional_rtt;
// Last sequence number the sender sent.
QuicPacketSequenceNumber last_sent;
@@ -72,13 +77,10 @@
};
struct Transfer {
- Transfer(Sender* sender, QuicByteCount num_bytes, QuicTime start_time)
- : sender(sender),
- num_bytes(num_bytes),
- bytes_acked(0),
- bytes_lost(0),
- bytes_in_flight(0),
- start_time(start_time) {}
+ Transfer(Sender* sender,
+ QuicByteCount num_bytes,
+ QuicTime start_time,
+ string name);
Sender* sender;
QuicByteCount num_bytes;
@@ -86,6 +88,7 @@
QuicByteCount bytes_lost;
QuicByteCount bytes_in_flight;
QuicTime start_time;
+ string name;
};
struct SentPacket {
@@ -154,7 +157,8 @@
void AddTransfer(Sender* sender, size_t num_bytes);
// Adds a pending sending to start at the specified time.
- void AddTransfer(Sender* sender, size_t num_bytes, QuicTime start_time);
+ void AddTransfer(
+ Sender* sender, size_t num_bytes, QuicTime start_time, string name);
// Convenience method to transfer all bytes.
void TransferBytes();
diff --git a/net/quic/congestion_control/tcp_cubic_sender.cc b/net/quic/congestion_control/tcp_cubic_sender.cc
index 5fa1559..2378eeb 100644
--- a/net/quic/congestion_control/tcp_cubic_sender.cc
+++ b/net/quic/congestion_control/tcp_cubic_sender.cc
@@ -72,24 +72,30 @@
}
}
-void TcpCubicSender::ResumeConnectionState(
+bool TcpCubicSender::ResumeConnectionState(
const CachedNetworkParameters& cached_network_params) {
// If the previous bandwidth estimate is less than an hour old, store in
// preparation for doing bandwidth resumption.
int64 seconds_since_estimate =
clock_->WallNow().ToUNIXSeconds() - cached_network_params.timestamp();
if (seconds_since_estimate > kNumSecondsPerHour) {
- return;
+ return false;
}
QuicBandwidth bandwidth = QuicBandwidth::FromBytesPerSecond(
cached_network_params.bandwidth_estimate_bytes_per_second());
QuicTime::Delta rtt_ms =
QuicTime::Delta::FromMilliseconds(cached_network_params.min_rtt_ms());
- congestion_window_ = bandwidth.ToBytesPerPeriod(rtt_ms) / kMaxPacketSize;
+
+ // Make sure CWND is in appropriate range (in case of bad data).
+ QuicPacketCount new_congestion_window =
+ bandwidth.ToBytesPerPeriod(rtt_ms) / kMaxPacketSize;
+ congestion_window_ = max(min(new_congestion_window, kMaxTcpCongestionWindow),
+ kMinCongestionWindowForBandwidthResumption);
// TODO(rjshade): Set appropriate CWND when previous connection was in slow
// start at time of estimate.
+ return true;
}
void TcpCubicSender::SetNumEmulatedConnections(int num_connections) {
diff --git a/net/quic/congestion_control/tcp_cubic_sender.h b/net/quic/congestion_control/tcp_cubic_sender.h
index eeb9331..e07e480 100644
--- a/net/quic/congestion_control/tcp_cubic_sender.h
+++ b/net/quic/congestion_control/tcp_cubic_sender.h
@@ -44,7 +44,7 @@
void SetFromConfig(const QuicConfig& config,
bool is_server,
bool using_pacing) override;
- void ResumeConnectionState(
+ bool ResumeConnectionState(
const CachedNetworkParameters& cached_network_params) override;
void SetNumEmulatedConnections(int num_connections) override;
void OnCongestionEvent(bool rtt_updated,
@@ -118,7 +118,7 @@
QuicPacketCount congestion_window_;
// Congestion window before the last loss event or RTO.
- QuicByteCount previous_congestion_window_;
+ QuicPacketCount previous_congestion_window_;
// Slow start congestion window in packets, aka ssthresh.
QuicPacketCount slowstart_threshold_;
diff --git a/net/quic/congestion_control/tcp_cubic_sender_test.cc b/net/quic/congestion_control/tcp_cubic_sender_test.cc
index e4737eb..ebea8ae 100644
--- a/net/quic/congestion_control/tcp_cubic_sender_test.cc
+++ b/net/quic/congestion_control/tcp_cubic_sender_test.cc
@@ -718,14 +718,26 @@
// Ensure that an old estimate is not used for bandwidth resumption.
cached_network_params.set_timestamp(clock_.WallNow().ToUNIXSeconds() -
(kNumSecondsPerHour + 1));
- sender_->ResumeConnectionState(cached_network_params);
+ EXPECT_FALSE(sender_->ResumeConnectionState(cached_network_params));
EXPECT_EQ(10u, sender_->congestion_window());
// If the estimate is new enough, make sure it is used.
cached_network_params.set_timestamp(clock_.WallNow().ToUNIXSeconds() -
(kNumSecondsPerHour - 1));
- sender_->ResumeConnectionState(cached_network_params);
+ EXPECT_TRUE(sender_->ResumeConnectionState(cached_network_params));
EXPECT_EQ(kNumberOfPackets, sender_->congestion_window());
+
+ // Resumed CWND is limited to be in a sensible range.
+ cached_network_params.set_bandwidth_estimate_bytes_per_second(
+ (kMaxTcpCongestionWindow + 1) * kMaxPacketSize);
+ EXPECT_TRUE(sender_->ResumeConnectionState(cached_network_params));
+ EXPECT_EQ(kMaxTcpCongestionWindow, sender_->congestion_window());
+
+ cached_network_params.set_bandwidth_estimate_bytes_per_second(
+ (kMinCongestionWindowForBandwidthResumption - 1) * kMaxPacketSize);
+ EXPECT_TRUE(sender_->ResumeConnectionState(cached_network_params));
+ EXPECT_EQ(kMinCongestionWindowForBandwidthResumption,
+ sender_->congestion_window());
}
} // namespace test
diff --git a/net/quic/congestion_control/tcp_loss_algorithm.h b/net/quic/congestion_control/tcp_loss_algorithm.h
index 03047cf..a5f245e 100644
--- a/net/quic/congestion_control/tcp_loss_algorithm.h
+++ b/net/quic/congestion_control/tcp_loss_algorithm.h
@@ -21,7 +21,7 @@
class NET_EXPORT_PRIVATE TCPLossAlgorithm : public LossDetectionInterface {
public:
// TCP retransmits after 3 nacks.
- static const size_t kNumberOfNacksBeforeRetransmission = 3;
+ static const QuicPacketCount kNumberOfNacksBeforeRetransmission = 3;
TCPLossAlgorithm();
~TCPLossAlgorithm() override {}
diff --git a/net/quic/crypto/cert_compressor.cc b/net/quic/crypto/cert_compressor.cc
index ba42152..95bb553 100644
--- a/net/quic/crypto/cert_compressor.cc
+++ b/net/quic/crypto/cert_compressor.cc
@@ -260,7 +260,7 @@
void SerializeCertEntries(uint8* out, const vector<CertEntry>& entries) {
for (vector<CertEntry>::const_iterator i = entries.begin();
i != entries.end(); ++i) {
- *out++ = i->type;
+ *out++ = static_cast<uint8>(i->type);
switch (i->type) {
case CertEntry::COMPRESSED:
break;
diff --git a/net/quic/crypto/crypto_framer.cc b/net/quic/crypto/crypto_framer.cc
index 029ec53..79e17ed 100644
--- a/net/quic/crypto/crypto_framer.cc
+++ b/net/quic/crypto/crypto_framer.cc
@@ -112,7 +112,7 @@
DCHECK(false) << "Failed to write message tag.";
return nullptr;
}
- if (!writer.WriteUInt16(num_entries)) {
+ if (!writer.WriteUInt16(static_cast<uint16>(num_entries))) {
DCHECK(false) << "Failed to write size.";
return nullptr;
}
diff --git a/net/quic/crypto/crypto_utils.cc b/net/quic/crypto/crypto_utils.cc
index 67af2e9..c595775 100644
--- a/net/quic/crypto/crypto_utils.cc
+++ b/net/quic/crypto/crypto_utils.cc
@@ -28,19 +28,21 @@
// a 4-byte timestamp + 28 random bytes.
nonce->reserve(kNonceSize);
nonce->resize(kNonceSize);
- uint32 gmt_unix_time = now.ToUNIXSeconds();
+
+ uint32 gmt_unix_time = static_cast<uint32>(now.ToUNIXSeconds());
// The time in the nonce must be encoded in big-endian because the
// strike-register depends on the nonces being ordered by time.
(*nonce)[0] = static_cast<char>(gmt_unix_time >> 24);
(*nonce)[1] = static_cast<char>(gmt_unix_time >> 16);
(*nonce)[2] = static_cast<char>(gmt_unix_time >> 8);
(*nonce)[3] = static_cast<char>(gmt_unix_time);
+ size_t bytes_written = 4;
- size_t bytes_written = sizeof(gmt_unix_time);
if (orbit.size() == 8) {
memcpy(&(*nonce)[bytes_written], orbit.data(), orbit.size());
bytes_written += orbit.size();
}
+
random_generator->RandBytes(&(*nonce)[bytes_written],
kNonceSize - bytes_written);
}
diff --git a/net/quic/crypto/p256_key_exchange_nss.cc b/net/quic/crypto/p256_key_exchange_nss.cc
index 73aa03d..3296a6f 100644
--- a/net/quic/crypto/p256_key_exchange_nss.cc
+++ b/net/quic/crypto/p256_key_exchange_nss.cc
@@ -5,6 +5,7 @@
#include "net/quic/crypto/p256_key_exchange.h"
#include "base/logging.h"
+#include "base/numerics/safe_conversions.h"
#include "base/sys_byteorder.h"
using base::StringPiece;
@@ -131,7 +132,7 @@
}
// TODO(thaidn): determine how large encrypted private key can be
- uint16 private_key_size = private_key.size();
+ uint16 private_key_size = base::checked_cast<uint16>(private_key.size());
const size_t result_size = sizeof(private_key_size) +
private_key_size +
public_key.size();
diff --git a/net/quic/crypto/quic_crypto_server_config.cc b/net/quic/crypto/quic_crypto_server_config.cc
index 5a650b6..4623ff5 100644
--- a/net/quic/crypto/quic_crypto_server_config.cc
+++ b/net/quic/crypto/quic_crypto_server_config.cc
@@ -251,9 +251,13 @@
string encoded_public_values;
// First three bytes encode the length of the public value.
- encoded_public_values.push_back(curve25519_public_value.size());
- encoded_public_values.push_back(curve25519_public_value.size() >> 8);
- encoded_public_values.push_back(curve25519_public_value.size() >> 16);
+ DCHECK_LT(curve25519_public_value.size(), (1U << 24));
+ encoded_public_values.push_back(
+ static_cast<char>(curve25519_public_value.size()));
+ encoded_public_values.push_back(
+ static_cast<char>(curve25519_public_value.size() >> 8));
+ encoded_public_values.push_back(
+ static_cast<char>(curve25519_public_value.size() >> 16));
encoded_public_values.append(curve25519_public_value.data(),
curve25519_public_value.size());
@@ -263,9 +267,13 @@
scoped_ptr<P256KeyExchange> p256(P256KeyExchange::New(p256_private_key));
StringPiece p256_public_value = p256->public_value();
- encoded_public_values.push_back(p256_public_value.size());
- encoded_public_values.push_back(p256_public_value.size() >> 8);
- encoded_public_values.push_back(p256_public_value.size() >> 16);
+ DCHECK_LT(p256_public_value.size(), (1U << 24));
+ encoded_public_values.push_back(
+ static_cast<char>(p256_public_value.size()));
+ encoded_public_values.push_back(
+ static_cast<char>(p256_public_value.size() >> 8));
+ encoded_public_values.push_back(
+ static_cast<char>(p256_public_value.size() >> 16));
encoded_public_values.append(p256_public_value.data(),
p256_public_value.size());
}
diff --git a/net/quic/crypto/quic_server_info.h b/net/quic/crypto/quic_server_info.h
index c6525c8..2ea7525 100644
--- a/net/quic/crypto/quic_server_info.h
+++ b/net/quic/crypto/quic_server_info.h
@@ -89,6 +89,14 @@
const State& state() const;
State* mutable_state();
+ base::TimeTicks wait_for_data_start_time() const {
+ return wait_for_data_start_time_;
+ }
+
+ base::TimeTicks wait_for_data_end_time() const {
+ return wait_for_data_end_time_;
+ }
+
protected:
// Parse parses pickled data and fills out the public member fields of this
// object. It returns true iff the parse was successful. The public member
@@ -97,6 +105,10 @@
std::string Serialize();
State state_;
+ // Time when WaitForDataReady was called and when it has finished.
+ base::TimeTicks wait_for_data_start_time_;
+ base::TimeTicks wait_for_data_end_time_;
+
private:
// ParseInner is a helper function for Parse.
bool ParseInner(const std::string& data);
diff --git a/net/quic/crypto/source_address_token.cc b/net/quic/crypto/source_address_token.cc
index 5faedaa..5c1877a 100644
--- a/net/quic/crypto/source_address_token.cc
+++ b/net/quic/crypto/source_address_token.cc
@@ -20,10 +20,10 @@
string SourceAddressToken::SerializeAsString() const {
string out;
- out.push_back(ip_.size());
+ out.push_back(static_cast<char>(ip_.size()));
out.append(ip_);
string time_str = base::Int64ToString(timestamp_);
- out.push_back(time_str.size());
+ out.push_back(static_cast<char>(time_str.size()));
out.append(time_str);
// TODO(rtenneti): Implement serialization of optional CachedNetworkParameters
// when they are used.
diff --git a/net/quic/crypto/source_address_token.h b/net/quic/crypto/source_address_token.h
index f9a5098..32f11c5 100644
--- a/net/quic/crypto/source_address_token.h
+++ b/net/quic/crypto/source_address_token.h
@@ -8,6 +8,7 @@
#include <string>
#include "base/basictypes.h"
+#include "base/logging.h"
#include "base/strings/string_piece.h"
#include "net/base/net_export.h"
#include "net/quic/crypto/cached_network_parameters.h"
@@ -31,6 +32,8 @@
}
void set_ip(base::StringPiece ip) {
ip_ = ip.as_string();
+ DCHECK_LE(ip_.size(),
+ static_cast<size_t>(std::numeric_limits<char>::max()));
}
int64 timestamp() const {
diff --git a/net/quic/crypto/strike_register.cc b/net/quic/crypto/strike_register.cc
index d727ece..fd5dc4f 100644
--- a/net/quic/crypto/strike_register.cc
+++ b/net/quic/crypto/strike_register.cc
@@ -66,9 +66,9 @@
uint32 child(unsigned n) const { return data_[n] >> 8; }
- uint8 critbyte() const { return data_[0]; }
+ uint8 critbyte() const { return static_cast<uint8>(data_[0]); }
- uint8 otherbits() const { return data_[1]; }
+ uint8 otherbits() const { return static_cast<uint8>(data_[1]); }
// These bytes are organised thus:
// <24 bits> left child
@@ -194,9 +194,10 @@
}
// Now we need to find the first bit where we differ from |best_match|.
- unsigned differing_byte;
+ uint8 differing_byte;
uint8 new_other_bits;
- for (differing_byte = 0; differing_byte < sizeof(value); differing_byte++) {
+ for (differing_byte = 0; differing_byte < arraysize(value);
+ differing_byte++) {
new_other_bits = value[differing_byte] ^ best_match[differing_byte];
if (new_other_bits) {
break;
diff --git a/net/quic/quic_bandwidth.cc b/net/quic/quic_bandwidth.cc
index dbce39d..8612d5f 100644
--- a/net/quic/quic_bandwidth.cc
+++ b/net/quic/quic_bandwidth.cc
@@ -96,7 +96,7 @@
}
QuicBandwidth QuicBandwidth::Scale(float scale_factor) const {
- return QuicBandwidth(bits_per_second_ * scale_factor);
+ return QuicBandwidth(static_cast<int64>(bits_per_second_ * scale_factor));
}
QuicTime::Delta QuicBandwidth::TransferTime(QuicByteCount bytes) const {
diff --git a/net/quic/quic_client_session.cc b/net/quic/quic_client_session.cc
index 97d6c3b..ef8bc20 100644
--- a/net/quic/quic_client_session.cc
+++ b/net/quic/quic_client_session.cc
@@ -286,6 +286,24 @@
}
}
const QuicConnectionStats stats = connection()->GetStats();
+ if (server_info_ && stats.min_rtt_us > 0) {
+ base::TimeTicks wait_for_data_start_time =
+ server_info_->wait_for_data_start_time();
+ base::TimeTicks wait_for_data_end_time =
+ server_info_->wait_for_data_end_time();
+ if (!wait_for_data_start_time.is_null() &&
+ !wait_for_data_end_time.is_null()) {
+ base::TimeDelta wait_time =
+ wait_for_data_end_time - wait_for_data_start_time;
+ const base::HistogramBase::Sample kMaxWaitToRtt = 1000;
+ base::HistogramBase::Sample wait_to_rtt =
+ static_cast<base::HistogramBase::Sample>(
+ 100 * wait_time.InMicroseconds() / stats.min_rtt_us);
+ UMA_HISTOGRAM_CUSTOM_COUNTS("Net.QuicServerInfo.WaitForDataReadyToRtt",
+ wait_to_rtt, 0, kMaxWaitToRtt, 50);
+ }
+ }
+
if (stats.max_sequence_reordering == 0)
return;
const base::HistogramBase::Sample kMaxReordering = 100;
@@ -300,8 +318,9 @@
UMA_HISTOGRAM_CUSTOM_COUNTS("Net.QuicSession.MaxReorderingTimeLongRtt",
reordering, 0, kMaxReordering, 50);
}
- UMA_HISTOGRAM_COUNTS("Net.QuicSession.MaxReordering",
- stats.max_sequence_reordering);
+ UMA_HISTOGRAM_COUNTS(
+ "Net.QuicSession.MaxReordering",
+ static_cast<base::HistogramBase::Sample>(stats.max_sequence_reordering));
}
void QuicClientSession::OnStreamFrames(
@@ -433,7 +452,7 @@
// Report the TLS cipher suite that most closely resembles the crypto
// parameters of the QUIC connection.
QuicTag aead = crypto_stream_->crypto_negotiated_params().aead;
- int cipher_suite;
+ uint16 cipher_suite;
int security_bits;
switch (aead) {
case kAESG:
@@ -449,9 +468,7 @@
return false;
}
int ssl_connection_status = 0;
- ssl_connection_status |=
- (cipher_suite & SSL_CONNECTION_CIPHERSUITE_MASK) <<
- SSL_CONNECTION_CIPHERSUITE_SHIFT;
+ ssl_connection_status |= cipher_suite;
ssl_connection_status |=
(SSL_CONNECTION_VERSION_QUIC & SSL_CONNECTION_VERSION_MASK) <<
SSL_CONNECTION_VERSION_SHIFT;
@@ -584,6 +601,20 @@
if (event == HANDSHAKE_CONFIRMED) {
UMA_HISTOGRAM_TIMES("Net.QuicSession.HandshakeConfirmedTime",
base::TimeTicks::Now() - handshake_start_);
+ if (server_info_) {
+ // Track how long it has taken to finish handshake once we start waiting
+ // for reading of QUIC server information from disk cache. We could use
+ // this data to compare total time taken if we were to cancel the disk
+ // cache read vs waiting for the read to complete.
+ base::TimeTicks wait_for_data_start_time =
+ server_info_->wait_for_data_start_time();
+ if (!wait_for_data_start_time.is_null()) {
+ UMA_HISTOGRAM_TIMES(
+ "Net.QuicServerInfo.WaitForDataReady.HandshakeConfirmedTime",
+ base::TimeTicks::Now() - wait_for_data_start_time);
+ }
+ }
+
ObserverSet::iterator it = observers_.begin();
while (it != observers_.end()) {
Observer* observer = *it;
diff --git a/net/quic/quic_config.cc b/net/quic/quic_config.cc
index 622cf3f..d2a10a4 100644
--- a/net/quic/quic_config.cc
+++ b/net/quic/quic_config.cc
@@ -484,8 +484,8 @@
QuicTime::Delta max_idle_connection_state_lifetime,
QuicTime::Delta default_idle_conection_state_lifetime) {
idle_connection_state_lifetime_seconds_.set(
- max_idle_connection_state_lifetime.ToSeconds(),
- default_idle_conection_state_lifetime.ToSeconds());
+ static_cast<uint32>(max_idle_connection_state_lifetime.ToSeconds()),
+ static_cast<uint32>(default_idle_conection_state_lifetime.ToSeconds()));
}
QuicTime::Delta QuicConfig::IdleConnectionStateLifetime() const {
@@ -523,7 +523,7 @@
return bytes_for_connection_id_.GetReceivedValue();
}
-void QuicConfig::SetInitialRoundTripTimeUsToSend(size_t rtt) {
+void QuicConfig::SetInitialRoundTripTimeUsToSend(uint32 rtt) {
initial_round_trip_time_us_.SetSendValue(rtt);
}
diff --git a/net/quic/quic_config.h b/net/quic/quic_config.h
index cf3775c..507dd9d 100644
--- a/net/quic/quic_config.h
+++ b/net/quic/quic_config.h
@@ -320,7 +320,7 @@
uint32 ReceivedBytesForConnectionId() const;
// Sets an estimated initial round trip time in us.
- void SetInitialRoundTripTimeUsToSend(size_t rtt_us);
+ void SetInitialRoundTripTimeUsToSend(uint32 rtt_us);
bool HasReceivedInitialRoundTripTimeUs() const;
diff --git a/net/quic/quic_connection.cc b/net/quic/quic_connection.cc
index 62cbc64..c33aec5 100644
--- a/net/quic/quic_connection.cc
+++ b/net/quic/quic_connection.cc
@@ -15,6 +15,7 @@
#include <utility>
#include "base/debug/stack_trace.h"
+#include "base/format_macros.h"
#include "base/logging.h"
#include "base/stl_util.h"
#include "base/strings/stringprintf.h"
@@ -57,10 +58,10 @@
const size_t kMaxFecGroups = 2;
// Maximum number of acks received before sending an ack in response.
-const size_t kMaxPacketsReceivedBeforeAckSend = 20;
+const QuicPacketCount kMaxPacketsReceivedBeforeAckSend = 20;
// Maximum number of tracked packets.
-const size_t kMaxTrackedPackets = 5 * kMaxTcpCongestionWindow;;
+const QuicPacketCount kMaxTrackedPackets = 5 * kMaxTcpCongestionWindow;
bool Near(QuicPacketSequenceNumber a, QuicPacketSequenceNumber b) {
QuicPacketSequenceNumber delta = (a > b) ? a - b : b - a;
@@ -282,9 +283,9 @@
max_undecryptable_packets_ = config.max_undecryptable_packets();
}
-void QuicConnection::ResumeConnectionState(
+bool QuicConnection::ResumeConnectionState(
const CachedNetworkParameters& cached_network_params) {
- sent_packet_manager_.ResumeConnectionState(cached_network_params);
+ return sent_packet_manager_.ResumeConnectionState(cached_network_params);
}
void QuicConnection::SetNumOpenStreams(size_t num_streams) {
@@ -949,14 +950,14 @@
(sent_packet_manager_.GetLeastUnacked() + kMaxTrackedPackets)) {
SendConnectionCloseWithDetails(
QUIC_TOO_MANY_OUTSTANDING_SENT_PACKETS,
- StringPrintf("More than %zu outstanding.", kMaxTrackedPackets));
+ StringPrintf("More than %" PRIu64 " outstanding.", kMaxTrackedPackets));
}
// This occurs if there are received packet gaps and the peer does not raise
// the least unacked fast enough.
if (received_packet_manager_.NumTrackedPackets() > kMaxTrackedPackets) {
SendConnectionCloseWithDetails(
QUIC_TOO_MANY_OUTSTANDING_RECEIVED_PACKETS,
- StringPrintf("More than %zu outstanding.", kMaxTrackedPackets));
+ StringPrintf("More than %" PRIu64 " outstanding.", kMaxTrackedPackets));
}
}
@@ -1138,8 +1139,7 @@
sent_packet_manager_.GetRttStats()->min_rtt().ToMicroseconds();
stats_.srtt_us =
sent_packet_manager_.GetRttStats()->smoothed_rtt().ToMicroseconds();
- stats_.estimated_bandwidth =
- sent_packet_manager_.BandwidthEstimate().ToBytesPerSecond();
+ stats_.estimated_bandwidth = sent_packet_manager_.BandwidthEstimate();
stats_.max_packet_size = packet_generator_.max_packet_length();
return stats_;
}
diff --git a/net/quic/quic_connection.h b/net/quic/quic_connection.h
index abab048..14c45a1 100644
--- a/net/quic/quic_connection.h
+++ b/net/quic/quic_connection.h
@@ -260,8 +260,8 @@
void SetFromConfig(const QuicConfig& config);
// Called by the Session when the client has provided CachedNetworkParameters.
- // Virtual for tests.
- virtual void ResumeConnectionState(
+ // Returns true if this changes the initial connection state.
+ virtual bool ResumeConnectionState(
const CachedNetworkParameters& cached_network_params);
// Sets the number of active streams on the connection for congestion control.
@@ -753,7 +753,7 @@
// Indicates whether an ack should be sent the next time we try to write.
bool ack_queued_;
// Indicates how many consecutive packets have arrived without sending an ack.
- uint32 num_packets_received_since_last_ack_sent_;
+ QuicPacketCount num_packets_received_since_last_ack_sent_;
// Indicates how many consecutive times an ack has arrived which indicates
// the peer needs to stop waiting for some packets.
int stop_waiting_count_;
diff --git a/net/quic/quic_connection_logger.cc b/net/quic/quic_connection_logger.cc
index 205a571..4a12521 100644
--- a/net/quic/quic_connection_logger.cc
+++ b/net/quic/quic_connection_logger.cc
@@ -58,7 +58,8 @@
dict->SetString("packet_sequence_number",
base::Uint64ToString(serialized_packet.sequence_number));
dict->SetInteger("size", packet_size);
- dict->SetInteger("sent_time_us", sent_time.ToDebuggingValue());
+ dict->SetInteger("sent_time_us",
+ static_cast<int>(sent_time.ToDebuggingValue()));
return dict;
}
@@ -85,7 +86,7 @@
base::Uint64ToString(header->packet_sequence_number));
dict->SetInteger("entropy_flag", header->entropy_flag);
dict->SetInteger("fec_flag", header->fec_flag);
- dict->SetInteger("fec_group", header->fec_group);
+ dict->SetInteger("fec_group", static_cast<int>(header->fec_group));
return dict;
}
@@ -104,8 +105,9 @@
base::DictionaryValue* dict = new base::DictionaryValue();
dict->SetString("largest_observed",
base::Uint64ToString(frame->largest_observed));
- dict->SetInteger("delta_time_largest_observed_us",
- frame->delta_time_largest_observed.ToMicroseconds());
+ dict->SetInteger(
+ "delta_time_largest_observed_us",
+ static_cast<int>(frame->delta_time_largest_observed.ToMicroseconds()));
dict->SetInteger("entropy_hash",
frame->entropy_hash);
dict->SetBoolean("truncated", frame->is_truncated);
@@ -132,8 +134,9 @@
for (PacketTimeList::const_iterator it = received_times.begin();
it != received_times.end(); ++it) {
base::DictionaryValue* info = new base::DictionaryValue();
- info->SetInteger("sequence_number", it->first);
- info->SetInteger("received", it->second.ToDebuggingValue());
+ info->SetInteger("sequence_number", static_cast<int>(it->first));
+ info->SetInteger("received",
+ static_cast<int>(it->second.ToDebuggingValue()));
received->Append(info);
}
@@ -147,7 +150,8 @@
switch (frame->type) {
case kTCP:
dict->SetString("type", "TCP");
- dict->SetInteger("receive_window", frame->tcp.receive_window);
+ dict->SetInteger("receive_window",
+ static_cast<int>(frame->tcp.receive_window));
break;
}
@@ -552,17 +556,22 @@
// There is a gap between the largest packet previously received and
// the current packet. This indicates either loss, or out-of-order
// delivery.
- UMA_HISTOGRAM_COUNTS("Net.QuicSession.PacketGapReceived", delta - 1);
+ UMA_HISTOGRAM_COUNTS("Net.QuicSession.PacketGapReceived",
+ static_cast<base::HistogramBase::Sample>(delta - 1));
}
largest_received_packet_sequence_number_ = header.packet_sequence_number;
}
- if (header.packet_sequence_number < received_packets_.size())
- received_packets_[header.packet_sequence_number] = true;
+ if (header.packet_sequence_number < received_packets_.size()) {
+ received_packets_[static_cast<size_t>(header.packet_sequence_number)] =
+ true;
+ }
if (header.packet_sequence_number < last_received_packet_sequence_number_) {
++num_out_of_order_received_packets_;
- UMA_HISTOGRAM_COUNTS("Net.QuicSession.OutOfOrderGapReceived",
- last_received_packet_sequence_number_ -
- header.packet_sequence_number);
+ UMA_HISTOGRAM_COUNTS(
+ "Net.QuicSession.OutOfOrderGapReceived",
+ static_cast<base::HistogramBase::Sample>(
+ last_received_packet_sequence_number_ -
+ header.packet_sequence_number));
}
last_received_packet_sequence_number_ = header.packet_sequence_number;
}
@@ -580,8 +589,10 @@
const size_t kApproximateLargestSoloAckBytes = 100;
if (last_received_packet_sequence_number_ < received_acks_.size() &&
- last_received_packet_size_ < kApproximateLargestSoloAckBytes)
- received_acks_[last_received_packet_sequence_number_] = true;
+ last_received_packet_size_ < kApproximateLargestSoloAckBytes) {
+ received_acks_[static_cast<size_t>(last_received_packet_sequence_number_)] =
+ true;
+ }
if (frame.is_truncated)
++num_truncated_acks_received_;
@@ -839,7 +850,7 @@
base::HistogramBase* histogram = base::Histogram::FactoryGet(
prefix + connection_description_, 1, 1000, 75,
base::HistogramBase::kUmaTargetedHistogramFlag);
- histogram->Add(numerator / divisor);
+ histogram->Add(static_cast<base::HistogramBase::Sample>(numerator / divisor));
}
void QuicConnectionLogger::RecordLossHistograms() const {
diff --git a/net/quic/quic_connection_logger.h b/net/quic/quic_connection_logger.h
index 29acfdc..fdd813a 100644
--- a/net/quic/quic_connection_logger.h
+++ b/net/quic/quic_connection_logger.h
@@ -132,7 +132,7 @@
// The number of times that OnPacketHeader was called.
// If the network replicates packets, then this number may be slightly
// different from the real number of distinct packets received.
- QuicPacketSequenceNumber num_packets_received_;
+ QuicPacketCount num_packets_received_;
// Number of times a truncated ACK frame was sent.
size_t num_truncated_acks_sent_;
// Number of times a truncated ACK frame was received.
diff --git a/net/quic/quic_connection_stats.cc b/net/quic/quic_connection_stats.cc
index 6625c61..10425de 100644
--- a/net/quic/quic_connection_stats.cc
+++ b/net/quic/quic_connection_stats.cc
@@ -33,7 +33,7 @@
min_rtt_us(0),
srtt_us(0),
max_packet_size(0),
- estimated_bandwidth(0),
+ estimated_bandwidth(QuicBandwidth::Zero()),
packets_reordered(0),
max_sequence_reordering(0),
max_time_reordering_us(0),
@@ -70,7 +70,7 @@
<< ", min_rtt(us): " << s.min_rtt_us
<< ", srtt(us): " << s.srtt_us
<< ", max packet size: " << s.max_packet_size
- << ", estimated bandwidth: " << s.estimated_bandwidth
+ << ", estimated bandwidth: " << s.estimated_bandwidth.ToBytesPerSecond()
<< ", tcp_loss_events: " << s.tcp_loss_events
<< ", packets reordered: " << s.packets_reordered
<< ", max sequence reordering: " << s.max_sequence_reordering
diff --git a/net/quic/quic_connection_stats.h b/net/quic/quic_connection_stats.h
index 2abdb59..247d2c5 100644
--- a/net/quic/quic_connection_stats.h
+++ b/net/quic/quic_connection_stats.h
@@ -9,6 +9,8 @@
#include "base/basictypes.h"
#include "net/base/net_export.h"
+#include "net/quic/quic_bandwidth.h"
+#include "net/quic/quic_protocol.h"
#include "net/quic/quic_time.h"
namespace net {
@@ -20,47 +22,52 @@
NET_EXPORT_PRIVATE friend std::ostream& operator<<(
std::ostream& os, const QuicConnectionStats& s);
- uint64 bytes_sent; // Includes retransmissions, fec.
- uint32 packets_sent;
- uint64 stream_bytes_sent; // non-retransmitted bytes sent in a stream frame.
- uint32 packets_discarded; // Packets serialized and discarded before sending.
+ QuicByteCount bytes_sent; // Includes retransmissions, fec.
+ QuicPacketCount packets_sent;
+ // Non-retransmitted bytes sent in a stream frame.
+ QuicByteCount stream_bytes_sent;
+ // Packets serialized and discarded before sending.
+ QuicPacketCount packets_discarded;
// These include version negotiation and public reset packets, which do not
// have sequence numbers or frame data.
- uint64 bytes_received; // Includes duplicate data for a stream, fec.
- uint32 packets_received; // Includes packets which were not processable.
- uint32 packets_processed; // Excludes packets which were not processable.
- uint64 stream_bytes_received; // Bytes received in a stream frame.
+ QuicByteCount bytes_received; // Includes duplicate data for a stream, fec.
+ // Includes packets which were not processable.
+ QuicPacketCount packets_received;
+ // Excludes packets which were not processable.
+ QuicPacketCount packets_processed;
+ QuicByteCount stream_bytes_received; // Bytes received in a stream frame.
- uint64 bytes_retransmitted;
- uint32 packets_retransmitted;
+ QuicByteCount bytes_retransmitted;
+ QuicPacketCount packets_retransmitted;
- uint64 bytes_spuriously_retransmitted;
- uint32 packets_spuriously_retransmitted;
+ QuicByteCount bytes_spuriously_retransmitted;
+ QuicPacketCount packets_spuriously_retransmitted;
// Number of packets abandoned as lost by the loss detection algorithm.
- uint32 packets_lost;
- uint32 slowstart_packets_lost; // Number of packets lost exiting slow start.
+ QuicPacketCount packets_lost;
+ // Number of packets lost exiting slow start.
+ QuicPacketCount slowstart_packets_lost;
- uint32 packets_revived;
- uint32 packets_dropped; // Duplicate or less than least unacked.
+ QuicPacketCount packets_revived;
+ QuicPacketCount packets_dropped; // Duplicate or less than least unacked.
uint32 crypto_retransmit_count;
// Count of times the loss detection alarm fired. At least one packet should
// be lost when the alarm fires.
uint32 loss_timeout_count;
- uint32 tlp_count;
- uint32 rto_count; // Count of times the rto timer fired.
- uint32 spurious_rto_count;
+ size_t tlp_count;
+ size_t rto_count; // Count of times the rto timer fired.
+ size_t spurious_rto_count;
int64 min_rtt_us; // Minimum RTT in microseconds.
int64 srtt_us; // Smoothed RTT in microseconds.
- uint32 max_packet_size; // In bytes.
- uint64 estimated_bandwidth; // In bytes per second.
+ QuicByteCount max_packet_size;
+ QuicBandwidth estimated_bandwidth;
// Reordering stats for received packets.
// Number of packets received out of sequence number order.
- uint32 packets_reordered;
+ QuicPacketCount packets_reordered;
// Maximum reordering observed in sequence space.
- uint32 max_sequence_reordering;
+ QuicPacketSequenceNumber max_sequence_reordering;
// Maximum reordering observed in microseconds
int64 max_time_reordering_us;
@@ -69,9 +76,9 @@
// one or more lost packets.
uint32 tcp_loss_events;
// Total amount of cwnd increase by TCPCubic in congestion avoidance.
- uint32 cwnd_increase_congestion_avoidance;
+ QuicPacketCount cwnd_increase_congestion_avoidance;
// Total amount of cwnd increase by TCPCubic in cubic mode.
- uint32 cwnd_increase_cubic_mode;
+ QuicPacketCount cwnd_increase_cubic_mode;
// Creation time, as reported by the QuicClock.
QuicTime connection_creation_time;
diff --git a/net/quic/quic_connection_test.cc b/net/quic/quic_connection_test.cc
index ede61c8..32d7544 100644
--- a/net/quic/quic_connection_test.cc
+++ b/net/quic/quic_connection_test.cc
@@ -1166,8 +1166,8 @@
}
EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
.WillOnce(Return(lost_packets));
- EXPECT_CALL(entropy_calculator_,
- EntropyHash(511)).WillOnce(testing::Return(0));
+ EXPECT_CALL(entropy_calculator_, EntropyHash(511))
+ .WillOnce(Return(static_cast<QuicPacketEntropyHash>(0)));
EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
ProcessAckPacket(&frame);
diff --git a/net/quic/quic_crypto_client_stream.cc b/net/quic/quic_crypto_client_stream.cc
index 1c41e0a..fd740dd 100644
--- a/net/quic/quic_crypto_client_stream.cc
+++ b/net/quic/quic_crypto_client_stream.cc
@@ -256,8 +256,8 @@
session()->connection()->supported_versions().front(),
cached, &crypto_negotiated_params_, &out);
// Pad the inchoate client hello to fill up a packet.
- const size_t kFramingOverhead = 50; // A rough estimate.
- const size_t max_packet_size =
+ const QuicByteCount kFramingOverhead = 50; // A rough estimate.
+ const QuicByteCount max_packet_size =
session()->connection()->max_packet_length();
if (max_packet_size <= kFramingOverhead) {
DLOG(DFATAL) << "max_packet_length (" << max_packet_size
@@ -270,7 +270,8 @@
CloseConnection(QUIC_INTERNAL_ERROR);
return;
}
- out.set_minimum_size(max_packet_size - kFramingOverhead);
+ out.set_minimum_size(
+ static_cast<size_t>(max_packet_size - kFramingOverhead));
next_state_ = STATE_RECV_REJ;
SendHandshakeMessage(out);
return;
diff --git a/net/quic/quic_data_writer.cc b/net/quic/quic_data_writer.cc
index 11b6b55..d48f89f 100644
--- a/net/quic/quic_data_writer.cc
+++ b/net/quic/quic_data_writer.cc
@@ -11,9 +11,6 @@
#include "base/basictypes.h"
#include "base/logging.h"
-using base::StringPiece;
-using std::numeric_limits;
-
namespace net {
QuicDataWriter::QuicDataWriter(size_t size)
@@ -47,8 +44,8 @@
}
bool QuicDataWriter::WriteUInt48(uint64 value) {
- uint32 hi = value >> 32;
- uint32 lo = value & GG_UINT64_C(0x00000000FFFFFFFF);
+ uint16 hi = static_cast<uint16>(value >> 32);
+ uint32 lo = static_cast<uint32>(value);
return WriteUInt32(lo) && WriteUInt16(hi);
}
@@ -61,10 +58,10 @@
if (value < (GG_UINT64_C(1) << kUFloat16MantissaEffectiveBits)) {
// Fast path: either the value is denormalized, or has exponent zero.
// Both cases are represented by the value itself.
- result = value;
+ result = static_cast<uint16>(value);
} else if (value >= kUFloat16MaxValue) {
// Value is out of range; clamp it to the maximum representable.
- result = numeric_limits<uint16>::max();
+ result = std::numeric_limits<uint16>::max();
} else {
// The highest bit is between position 13 and 42 (zero-based), which
// corresponds to exponent 1-30. In the output, mantissa is from 0 to 10,
@@ -89,17 +86,17 @@
// Hidden bit (position 11) is set. We should remove it and increment the
// exponent. Equivalently, we just add it to the exponent.
// This hides the bit.
- result = value + (exponent << kUFloat16MantissaBits);
+ result = static_cast<uint16>(value + (exponent << kUFloat16MantissaBits));
}
return WriteBytes(&result, sizeof(result));
}
-bool QuicDataWriter::WriteStringPiece16(StringPiece val) {
- if (val.length() > numeric_limits<uint16>::max()) {
+bool QuicDataWriter::WriteStringPiece16(base::StringPiece val) {
+ if (val.size() > std::numeric_limits<uint16>::max()) {
return false;
}
- if (!WriteUInt16(val.size())) {
+ if (!WriteUInt16(static_cast<uint16>(val.size()))) {
return false;
}
return WriteBytes(val.data(), val.size());
@@ -127,7 +124,7 @@
}
#ifdef ARCH_CPU_64_BITS
- DCHECK_LE(length, numeric_limits<uint32>::max());
+ DCHECK_LE(length, std::numeric_limits<uint32>::max());
#endif
return buffer_ + length_;
diff --git a/net/quic/quic_fec_group.cc b/net/quic/quic_fec_group.cc
index 5d55aed..3d52810 100644
--- a/net/quic/quic_fec_group.cc
+++ b/net/quic/quic_fec_group.cc
@@ -164,8 +164,9 @@
size_t QuicFecGroup::NumMissingPackets() const {
if (min_protected_packet_ == kNoSequenceNumber)
return numeric_limits<size_t>::max();
- return (max_protected_packet_ - min_protected_packet_ + 1) -
- received_packets_.size();
+ return static_cast<size_t>(
+ (max_protected_packet_ - min_protected_packet_ + 1) -
+ received_packets_.size());
}
} // namespace net
diff --git a/net/quic/quic_flags.cc b/net/quic/quic_flags.cc
index e737933..c9658c1 100644
--- a/net/quic/quic_flags.cc
+++ b/net/quic/quic_flags.cc
@@ -32,10 +32,6 @@
// When true, defaults to BBR congestion control instead of Cubic.
bool FLAGS_quic_use_bbr_congestion_control = false;
-// If true, the server will accept slightly more streams than the negotiated
-// limit.
-bool FLAGS_quic_allow_more_open_streams = false;
-
// If true, QUIC will be more resilliant to junk packets with valid connection
// IDs.
bool FLAGS_quic_drop_junk_packets = true;
diff --git a/net/quic/quic_flags.h b/net/quic/quic_flags.h
index 2ffe618..32c5edf 100644
--- a/net/quic/quic_flags.h
+++ b/net/quic/quic_flags.h
@@ -14,7 +14,6 @@
NET_EXPORT_PRIVATE extern bool FLAGS_send_quic_crypto_reject_reason;
NET_EXPORT_PRIVATE extern bool FLAGS_enable_quic_fec;
NET_EXPORT_PRIVATE extern bool FLAGS_quic_use_bbr_congestion_control;
-NET_EXPORT_PRIVATE extern bool FLAGS_quic_allow_more_open_streams;
NET_EXPORT_PRIVATE extern bool FLAGS_quic_drop_junk_packets;
NET_EXPORT_PRIVATE extern bool FLAGS_quic_allow_bbr;
NET_EXPORT_PRIVATE extern bool FLAGS_allow_truncated_connection_ids_for_quic;
diff --git a/net/quic/quic_flow_controller.cc b/net/quic/quic_flow_controller.cc
index 722b243..59ae8c0 100644
--- a/net/quic/quic_flow_controller.cc
+++ b/net/quic/quic_flow_controller.cc
@@ -16,9 +16,9 @@
QuicFlowController::QuicFlowController(QuicConnection* connection,
QuicStreamId id,
bool is_server,
- uint64 send_window_offset,
- uint64 receive_window_offset,
- uint64 max_receive_window)
+ QuicStreamOffset send_window_offset,
+ QuicStreamOffset receive_window_offset,
+ QuicByteCount max_receive_window)
: connection_(connection),
id_(id),
is_enabled_(true),
@@ -38,7 +38,7 @@
<< ", setting send window offset to: " << send_window_offset_;
}
-void QuicFlowController::AddBytesConsumed(uint64 bytes_consumed) {
+void QuicFlowController::AddBytesConsumed(QuicByteCount bytes_consumed) {
if (!IsEnabled()) {
return;
}
@@ -49,7 +49,8 @@
MaybeSendWindowUpdate();
}
-bool QuicFlowController::UpdateHighestReceivedOffset(uint64 new_offset) {
+bool QuicFlowController::UpdateHighestReceivedOffset(
+ QuicStreamOffset new_offset) {
if (!IsEnabled()) {
return false;
}
@@ -66,7 +67,7 @@
return true;
}
-void QuicFlowController::AddBytesSent(uint64 bytes_sent) {
+void QuicFlowController::AddBytesSent(QuicByteCount bytes_sent) {
if (!IsEnabled()) {
return;
}
@@ -111,8 +112,8 @@
// (receive window offset - consumed bytes) < (max window / 2).
// This is behaviour copied from SPDY.
DCHECK_LT(bytes_consumed_, receive_window_offset_);
- size_t consumed_window = receive_window_offset_ - bytes_consumed_;
- size_t threshold = (max_receive_window_ / 2);
+ QuicStreamOffset consumed_window = receive_window_offset_ - bytes_consumed_;
+ QuicByteCount threshold = (max_receive_window_ / 2);
if (consumed_window < threshold) {
// Update our receive window.
@@ -151,7 +152,8 @@
}
}
-bool QuicFlowController::UpdateSendWindowOffset(uint64 new_send_window_offset) {
+bool QuicFlowController::UpdateSendWindowOffset(
+ QuicStreamOffset new_send_window_offset) {
if (!IsEnabled()) {
return false;
}
diff --git a/net/quic/quic_flow_controller.h b/net/quic/quic_flow_controller.h
index 0df2b0e..371b8c9 100644
--- a/net/quic/quic_flow_controller.h
+++ b/net/quic/quic_flow_controller.h
@@ -28,30 +28,30 @@
QuicFlowController(QuicConnection* connection,
QuicStreamId id,
bool is_server,
- uint64 send_window_offset,
- uint64 receive_window_offset,
- uint64 max_receive_window);
+ QuicStreamOffset send_window_offset,
+ QuicStreamOffset receive_window_offset,
+ QuicByteCount max_receive_window);
~QuicFlowController() {}
// Called when we see a new highest received byte offset from the peer, either
// via a data frame or a RST.
// Returns true if this call changes highest_received_byte_offset_, and false
// in the case where |new_offset| is <= highest_received_byte_offset_.
- bool UpdateHighestReceivedOffset(uint64 new_offset);
+ bool UpdateHighestReceivedOffset(QuicStreamOffset new_offset);
// Called when bytes received from the peer are consumed locally. This may
// trigger the sending of a WINDOW_UPDATE frame using |connection|.
- void AddBytesConsumed(uint64 bytes_consumed);
+ void AddBytesConsumed(QuicByteCount bytes_consumed);
// Called when bytes are sent to the peer.
- void AddBytesSent(uint64 bytes_sent);
+ void AddBytesSent(QuicByteCount bytes_sent);
// Set a new send window offset.
// Returns true if this increases send_window_offset_ and is now blocked.
- bool UpdateSendWindowOffset(uint64 new_send_window_offset);
+ bool UpdateSendWindowOffset(QuicStreamOffset new_send_window_offset);
// Returns the current available send window.
- uint64 SendWindowSize() const;
+ QuicByteCount SendWindowSize() const;
// Send a BLOCKED frame if appropriate.
void MaybeSendBlocked();
@@ -68,9 +68,9 @@
// Returns true if flow control receive limits have been violated by the peer.
bool FlowControlViolation();
- uint64 bytes_consumed() const { return bytes_consumed_; }
+ QuicByteCount bytes_consumed() const { return bytes_consumed_; }
- uint64 highest_received_byte_offset() const {
+ QuicStreamOffset highest_received_byte_offset() const {
return highest_received_byte_offset_;
}
@@ -97,29 +97,29 @@
// Track number of bytes received from the peer, which have been consumed
// locally.
- uint64 bytes_consumed_;
+ QuicByteCount bytes_consumed_;
// The highest byte offset we have seen from the peer. This could be the
// highest offset in a data frame, or a final value in a RST.
- uint64 highest_received_byte_offset_;
+ QuicStreamOffset highest_received_byte_offset_;
// Tracks number of bytes sent to the peer.
- uint64 bytes_sent_;
+ QuicByteCount bytes_sent_;
// The absolute offset in the outgoing byte stream. If this offset is reached
// then we become flow control blocked until we receive a WINDOW_UPDATE.
- uint64 send_window_offset_;
+ QuicStreamOffset send_window_offset_;
// The absolute offset in the incoming byte stream. The peer should never send
// us bytes which are beyond this offset.
- uint64 receive_window_offset_;
+ QuicStreamOffset receive_window_offset_;
// Largest size the receive window can grow to.
- uint64 max_receive_window_;
+ QuicByteCount max_receive_window_;
// Keep track of the last time we sent a BLOCKED frame. We should only send
// another when the number of bytes we have sent has changed.
- uint64 last_blocked_send_window_offset_;
+ QuicStreamOffset last_blocked_send_window_offset_;
DISALLOW_COPY_AND_ASSIGN(QuicFlowController);
};
diff --git a/net/quic/quic_flow_controller_test.cc b/net/quic/quic_flow_controller_test.cc
index f960169..e3fcafe 100644
--- a/net/quic/quic_flow_controller_test.cc
+++ b/net/quic/quic_flow_controller_test.cc
@@ -4,6 +4,7 @@
#include "net/quic/quic_flow_controller.h"
+#include "base/format_macros.h"
#include "base/strings/stringprintf.h"
#include "net/quic/quic_utils.h"
#include "net/quic/test_tools/quic_connection_peer.h"
@@ -12,13 +13,9 @@
#include "net/test/gtest_util.h"
#include "testing/gmock/include/gmock/gmock.h"
-using base::StringPrintf;
-
namespace net {
namespace test {
-using ::testing::_;
-
class QuicFlowControllerTest : public ::testing::Test {
public:
QuicFlowControllerTest()
@@ -37,9 +34,9 @@
protected:
QuicStreamId stream_id_;
- uint64 send_window_;
- uint64 receive_window_;
- uint64 max_receive_window_;
+ QuicByteCount send_window_;
+ QuicByteCount receive_window_;
+ QuicByteCount max_receive_window_;
scoped_ptr<QuicFlowController> flow_controller_;
MockConnection connection_;
};
@@ -80,8 +77,8 @@
SendConnectionClose(QUIC_FLOW_CONTROL_SENT_TOO_MUCH_DATA));
EXPECT_DFATAL(
flow_controller_->AddBytesSent(send_window_ * 10),
- StringPrintf("Trying to send an extra %d bytes",
- static_cast<int>(send_window_ * 10)));
+ base::StringPrintf("Trying to send an extra %" PRIu64 " bytes",
+ send_window_ * 10));
EXPECT_TRUE(flow_controller_->IsBlocked());
EXPECT_EQ(0u, flow_controller_->SendWindowSize());
}
@@ -104,7 +101,7 @@
QuicFlowControllerPeer::ReceiveWindowSize(flow_controller_.get()));
// Consume enough bytes to send a WINDOW_UPDATE frame.
- EXPECT_CALL(connection_, SendWindowUpdate(stream_id_, _)).Times(1);
+ EXPECT_CALL(connection_, SendWindowUpdate(stream_id_, ::testing::_)).Times(1);
flow_controller_->AddBytesConsumed(1 + receive_window_ / 2);
diff --git a/net/quic/quic_framer.cc b/net/quic/quic_framer.cc
index d2a7694..c381695 100644
--- a/net/quic/quic_framer.cc
+++ b/net/quic/quic_framer.cc
@@ -781,12 +781,12 @@
// The FEC group number is the sequence number of the first fec
// protected packet, or 0 if this packet is not protected.
if (header.is_in_fec_group == IN_FEC_GROUP) {
- DCHECK_GE(header.packet_sequence_number, header.fec_group);
- DCHECK_GT(255u, header.packet_sequence_number - header.fec_group);
+ DCHECK_LE(header.fec_group, header.packet_sequence_number);
+ DCHECK_LT(header.packet_sequence_number - header.fec_group, 255u);
// Offset from the current packet sequence number to the first fec
// protected packet.
uint8 first_fec_protected_packet_offset =
- header.packet_sequence_number - header.fec_group;
+ static_cast<uint8>(header.packet_sequence_number - header.fec_group);
if (!writer->WriteBytes(&first_fec_protected_packet_offset, 1)) {
return false;
}
@@ -987,18 +987,20 @@
QuicPacketSequenceNumber last_missing = *iter;
++iter;
for (; iter != frame.missing_packets.end(); ++iter) {
- if (cur_range_length != numeric_limits<uint8>::max() &&
+ if (cur_range_length < numeric_limits<uint8>::max() &&
*iter == (last_missing + 1)) {
++cur_range_length;
} else {
- ack_info.nack_ranges[last_missing - cur_range_length] = cur_range_length;
+ ack_info.nack_ranges[last_missing - cur_range_length] =
+ static_cast<uint8>(cur_range_length);
cur_range_length = 0;
}
ack_info.max_delta = max(ack_info.max_delta, *iter - last_missing);
last_missing = *iter;
}
// Include the last nack range.
- ack_info.nack_ranges[last_missing - cur_range_length] = cur_range_length;
+ ack_info.nack_ranges[last_missing - cur_range_length] =
+ static_cast<uint8>(cur_range_length);
// Include the range to the largest observed.
ack_info.max_delta =
max(ack_info.max_delta, frame.largest_observed - last_missing);
@@ -1904,7 +1906,7 @@
break;
}
default:
- type_byte = frame.type;
+ type_byte = static_cast<uint8>(frame.type);
break;
}
@@ -1957,7 +1959,9 @@
return false;
}
if (!no_stream_frame_length) {
- if (!writer->WriteUInt16(frame.data.TotalBufferSize())) {
+ if ((frame.data.TotalBufferSize() > std::numeric_limits<uint16>::max()) ||
+ !writer->WriteUInt16(
+ static_cast<uint16>(frame.data.TotalBufferSize()))) {
LOG(DFATAL) << "Writing stream frame length failed";
return false;
}
@@ -2071,7 +2075,7 @@
}
const uint8 num_missing_ranges =
- min(ack_info.nack_ranges.size(), max_num_ranges);
+ static_cast<uint8>(min(ack_info.nack_ranges.size(), max_num_ranges));
if (!writer->WriteBytes(&num_missing_ranges, 1)) {
return false;
}
@@ -2098,11 +2102,11 @@
// Append revived packets.
// If not all the revived packets fit, only mention the ones that do.
- uint8 num_revived_packets = min(frame.revived_packets.size(),
- kMaxRevivedPackets);
- num_revived_packets = min(
+ uint8 num_revived_packets =
+ static_cast<uint8>(min(frame.revived_packets.size(), kMaxRevivedPackets));
+ num_revived_packets = static_cast<uint8>(min(
static_cast<size_t>(num_revived_packets),
- (writer->capacity() - writer->length()) / largest_observed_length);
+ (writer->capacity() - writer->length()) / largest_observed_length));
if (!writer->WriteBytes(&num_revived_packets, 1)) {
return false;
}
diff --git a/net/quic/quic_protocol.h b/net/quic/quic_protocol.h
index 4cd53a9..d5b8d1b 100644
--- a/net/quic/quic_protocol.h
+++ b/net/quic/quic_protocol.h
@@ -59,8 +59,6 @@
// Default maximum packet size used in Linux TCP implementations.
const QuicByteCount kDefaultTCPMSS = 1460;
-// Maximum size of the initial congestion window in packets.
-const QuicPacketCount kMaxInitialWindow = 100;
// We match SPDY's use of 32 when secure (since we'd compete with SPDY).
const QuicPacketCount kInitialCongestionWindowSecure = 32;
// Be conservative, and just use double a typical TCP ICWND for HTTP.
@@ -69,9 +67,11 @@
// Default size of initial flow control window, for both stream and session.
const uint32 kDefaultFlowControlSendWindow = 16 * 1024; // 16 KB
-// Maximum size of the congestion window, in packets, for TCP congestion control
-// algorithms.
-const size_t kMaxTcpCongestionWindow = 200;
+// Minimum size of the CWND, in packets, when doing bandwidth resumption.
+const QuicPacketCount kMinCongestionWindowForBandwidthResumption = 10;
+
+// Maximum size of the CWND, in packets, for TCP congestion control algorithms.
+const QuicPacketCount kMaxTcpCongestionWindow = 200;
// Default size of the socket receive buffer in bytes.
const QuicByteCount kDefaultSocketReceiveBuffer = 256 * 1024;
@@ -1089,7 +1089,7 @@
QuicTime sent_time;
// Zero when the packet is serialized, non-zero once it's sent.
QuicByteCount bytes_sent;
- size_t nack_count;
+ QuicPacketCount nack_count;
// Reason why this packet was transmitted.
TransmissionType transmission_type;
// Stores the sequence numbers of all transmissions of this packet.
diff --git a/net/quic/quic_received_packet_manager.cc b/net/quic/quic_received_packet_manager.cc
index e8be74a..195dbd8 100644
--- a/net/quic/quic_received_packet_manager.cc
+++ b/net/quic/quic_received_packet_manager.cc
@@ -164,9 +164,9 @@
// Record how out of order stats.
++stats_->packets_reordered;
- uint32 sequence_gap = ack_frame_.largest_observed - sequence_number;
stats_->max_sequence_reordering =
- max(stats_->max_sequence_reordering, sequence_gap);
+ max(stats_->max_sequence_reordering,
+ ack_frame_.largest_observed - sequence_number);
int64 reordering_time_us =
receipt_time.Subtract(time_largest_observed_).ToMicroseconds();
stats_->max_time_reordering_us = max(stats_->max_time_reordering_us,
diff --git a/net/quic/quic_sent_packet_manager.cc b/net/quic/quic_sent_packet_manager.cc
index 142871e..56c327c 100644
--- a/net/quic/quic_sent_packet_manager.cc
+++ b/net/quic/quic_sent_packet_manager.cc
@@ -163,9 +163,9 @@
}
}
-void QuicSentPacketManager::ResumeConnectionState(
+bool QuicSentPacketManager::ResumeConnectionState(
const CachedNetworkParameters& cached_network_params) {
- send_algorithm_->ResumeConnectionState(cached_network_params);
+ return send_algorithm_->ResumeConnectionState(cached_network_params);
}
void QuicSentPacketManager::SetNumOpenStreams(size_t num_streams) {
@@ -285,7 +285,7 @@
// threshold is to tolerate re-ordering. This handles both StretchAcks
// and Forward Acks.
// The nack count only increases when the largest observed increases.
- size_t min_nacks = ack_frame.largest_observed - sequence_number;
+ QuicPacketCount min_nacks = ack_frame.largest_observed - sequence_number;
// Truncated acks can nack the largest observed, so use a min of 1.
if (min_nacks == 0) {
min_nacks = 1;
diff --git a/net/quic/quic_sent_packet_manager.h b/net/quic/quic_sent_packet_manager.h
index 2a94e09..e651efe 100644
--- a/net/quic/quic_sent_packet_manager.h
+++ b/net/quic/quic_sent_packet_manager.h
@@ -101,7 +101,8 @@
virtual void SetFromConfig(const QuicConfig& config);
// Pass the CachedNetworkParameters to the send algorithm.
- void ResumeConnectionState(
+ // Returns true if this changes the initial connection state.
+ bool ResumeConnectionState(
const CachedNetworkParameters& cached_network_params);
void SetNumOpenStreams(size_t num_streams);
diff --git a/net/quic/quic_server.cc b/net/quic/quic_server.cc
index fecb4e5..7b0f454 100644
--- a/net/quic/quic_server.cc
+++ b/net/quic/quic_server.cc
@@ -74,7 +74,8 @@
// These send and receive buffer sizes are sized for a single connection,
// because the default usage of QuicServer is as a test server with one or
// two clients. Adjust higher for use with many clients.
- rc = socket->SetReceiveBufferSize(TcpReceiver::kReceiveWindowTCP);
+ rc = socket->SetReceiveBufferSize(
+ static_cast<int32>(TcpReceiver::kReceiveWindowTCP));
if (rc < 0) {
LOG(ERROR) << "SetReceiveBufferSize() failed: " << ErrorToString(rc);
return rc;
diff --git a/net/quic/quic_session.cc b/net/quic/quic_session.cc
index e4b163f..f05395e 100644
--- a/net/quic/quic_session.cc
+++ b/net/quic/quic_session.cc
@@ -7,7 +7,6 @@
#include "base/stl_util.h"
#include "net/quic/crypto/proof_verifier.h"
#include "net/quic/quic_connection.h"
-#include "net/quic/quic_flags.h"
#include "net/quic/quic_flow_controller.h"
#include "net/quic/quic_headers_stream.h"
#include "net/ssl/ssl_info.h"
@@ -438,7 +437,7 @@
DVLOG(1) << ENDPOINT << "Received final byte offset " << final_byte_offset
<< " for stream " << stream_id;
- uint64 offset_diff = final_byte_offset - it->second;
+ QuicByteCount offset_diff = final_byte_offset - it->second;
if (flow_controller_->UpdateHighestReceivedOffset(
flow_controller_->highest_received_byte_offset() + offset_diff)) {
// If the final offset violates flow control, close the connection now.
@@ -465,20 +464,18 @@
connection_->SetFromConfig(config_);
QuicVersion version = connection()->version();
- if (FLAGS_quic_allow_more_open_streams) {
- uint32 max_streams = config_.MaxStreamsPerConnection();
- if (is_server()) {
- // A server should accept a small number of additional streams beyond the
- // limit sent to the client. This helps avoid early connection termination
- // when FIN/RSTs for old streams are lost or arrive out of order.
- // Use a minimum number of additional streams, or a percentage increase,
- // whichever is larger.
- max_streams =
- max(max_streams + kMaxStreamsMinimumIncrement,
- static_cast<uint32>(max_streams * kMaxStreamsMultiplier));
- }
- set_max_open_streams(max_streams);
+ uint32 max_streams = config_.MaxStreamsPerConnection();
+ if (is_server()) {
+ // A server should accept a small number of additional streams beyond the
+ // limit sent to the client. This helps avoid early connection termination
+ // when FIN/RSTs for old streams are lost or arrive out of order.
+ // Use a minimum number of additional streams, or a percentage increase,
+ // whichever is larger.
+ max_streams =
+ max(max_streams + kMaxStreamsMinimumIncrement,
+ static_cast<uint32>(max_streams * kMaxStreamsMultiplier));
}
+ set_max_open_streams(max_streams);
if (version == QUIC_VERSION_19) {
// QUIC_VERSION_19 doesn't support independent stream/session flow
@@ -486,7 +483,8 @@
if (config_.HasReceivedInitialFlowControlWindowBytes()) {
// Streams which were created before the SHLO was received (0-RTT
// requests) are now informed of the peer's initial flow control window.
- uint32 new_window = config_.ReceivedInitialFlowControlWindowBytes();
+ QuicStreamOffset new_window =
+ config_.ReceivedInitialFlowControlWindowBytes();
OnNewStreamFlowControlWindow(new_window);
OnNewSessionFlowControlWindow(new_window);
}
@@ -508,7 +506,7 @@
}
}
-void QuicSession::OnNewStreamFlowControlWindow(uint32 new_window) {
+void QuicSession::OnNewStreamFlowControlWindow(QuicStreamOffset new_window) {
if (new_window < kDefaultFlowControlSendWindow) {
LOG(ERROR)
<< "Peer sent us an invalid stream flow control send window: "
@@ -530,7 +528,7 @@
}
}
-void QuicSession::OnNewSessionFlowControlWindow(uint32 new_window) {
+void QuicSession::OnNewSessionFlowControlWindow(QuicStreamOffset new_window) {
if (new_window < kDefaultFlowControlSendWindow) {
LOG(ERROR)
<< "Peer sent us an invalid session flow control send window: "
@@ -563,9 +561,6 @@
// Discard originally encrypted packets, since they can't be decrypted by
// the peer.
connection_->NeuterUnencryptedPackets();
- if (!FLAGS_quic_allow_more_open_streams) {
- max_open_streams_ = config_.MaxStreamsPerConnection();
- }
break;
default:
diff --git a/net/quic/quic_session.h b/net/quic/quic_session.h
index 43f4042..7bc743a 100644
--- a/net/quic/quic_session.h
+++ b/net/quic/quic_session.h
@@ -280,11 +280,11 @@
// Called in OnConfigNegotiated when we receive a new stream level flow
// control window in a negotiated config. Closes the connection if invalid.
- void OnNewStreamFlowControlWindow(uint32 new_window);
+ void OnNewStreamFlowControlWindow(QuicStreamOffset new_window);
// Called in OnConfigNegotiated when we receive a new session level flow
// control window in a negotiated config. Closes the connection if invalid.
- void OnNewSessionFlowControlWindow(uint32 new_window);
+ void OnNewSessionFlowControlWindow(QuicStreamOffset new_window);
// Keep track of highest received byte offset of locally closed streams, while
// waiting for a definitive final highest offset from the peer.
diff --git a/net/quic/quic_stream_factory.cc b/net/quic/quic_stream_factory.cc
index 32adeda..e7612a0 100644
--- a/net/quic/quic_stream_factory.cc
+++ b/net/quic/quic_stream_factory.cc
@@ -871,7 +871,8 @@
// that is more than large enough for a full receive window, and yet
// does not consume "too much" memory. If we see bursty packet loss, we may
// revisit this setting and test for its impact.
- const int32 kSocketBufferSize(TcpReceiver::kReceiveWindowTCP);
+ const int32 kSocketBufferSize =
+ static_cast<int32>(TcpReceiver::kReceiveWindowTCP);
rv = socket->SetReceiveBufferSize(kSocketBufferSize);
if (rv != OK) {
HistogramCreateSessionFailure(CREATION_ERROR_SETTING_RECEIVE_BUFFER);
@@ -928,7 +929,8 @@
http_server_properties_->GetServerNetworkStats(
server_id.host_port_pair());
if (stats != nullptr) {
- config.SetInitialRoundTripTimeUsToSend(stats->srtt.InMicroseconds());
+ config.SetInitialRoundTripTimeUsToSend(
+ static_cast<uint32>(stats->srtt.InMicroseconds()));
}
}
diff --git a/net/quic/quic_stream_sequencer.cc b/net/quic/quic_stream_sequencer.cc
index 5df81e5..153e6cf 100644
--- a/net/quic/quic_stream_sequencer.cc
+++ b/net/quic/quic_stream_sequencer.cc
@@ -160,7 +160,7 @@
size_t iov_index = 0;
size_t iov_offset = 0;
size_t frame_offset = 0;
- size_t initial_bytes_consumed = num_bytes_consumed_;
+ QuicStreamOffset initial_bytes_consumed = num_bytes_consumed_;
while (iov_index < iov_len &&
it != buffered_frames_.end() &&
@@ -194,7 +194,7 @@
buffered_frames_.erase(buffered_frames_.begin());
RecordBytesConsumed(frame_offset);
}
- return num_bytes_consumed_ - initial_bytes_consumed;
+ return static_cast<int>(num_bytes_consumed_ - initial_bytes_consumed);
}
bool QuicStreamSequencer::HasBytesToRead() const {
diff --git a/net/quic/quic_time.cc b/net/quic/quic_time.cc
index e20a338..5d653a3 100644
--- a/net/quic/quic_time.cc
+++ b/net/quic/quic_time.cc
@@ -67,7 +67,8 @@
}
QuicTime::Delta QuicTime::Delta::Multiply(double d) const {
- return QuicTime::Delta::FromMicroseconds(ToMicroseconds() * d);
+ return QuicTime::Delta::FromMicroseconds(
+ static_cast<int64>(ToMicroseconds() * d));
}
// static
diff --git a/net/quic/quic_unacked_packet_map.cc b/net/quic/quic_unacked_packet_map.cc
index bbff3c9..1267707 100644
--- a/net/quic/quic_unacked_packet_map.cc
+++ b/net/quic/quic_unacked_packet_map.cc
@@ -182,7 +182,7 @@
}
void QuicUnackedPacketMap::NackPacket(QuicPacketSequenceNumber sequence_number,
- size_t min_nacks) {
+ QuicPacketCount min_nacks) {
DCHECK_GE(sequence_number, least_unacked_);
DCHECK_LT(sequence_number, least_unacked_ + unacked_packets_.size());
unacked_packets_[sequence_number - least_unacked_].nack_count =
diff --git a/net/quic/quic_unacked_packet_map.h b/net/quic/quic_unacked_packet_map.h
index 165e41f..6c56dd6 100644
--- a/net/quic/quic_unacked_packet_map.h
+++ b/net/quic/quic_unacked_packet_map.h
@@ -38,7 +38,7 @@
// Sets the nack count to the max of the current nack count and |min_nacks|.
void NackPacket(QuicPacketSequenceNumber sequence_number,
- size_t min_nacks);
+ QuicPacketCount min_nacks);
// Marks |sequence_number| as no longer in flight.
void RemoveFromInFlight(QuicPacketSequenceNumber sequence_number);
@@ -164,7 +164,7 @@
// The packet at the 0th index of unacked_packets_.
QuicPacketSequenceNumber least_unacked_;
- size_t bytes_in_flight_;
+ QuicByteCount bytes_in_flight_;
// Number of retransmittable crypto handshake packets.
size_t pending_crypto_packet_count_;
diff --git a/net/quic/quic_utils.cc b/net/quic/quic_utils.cc
index f144651..a0e1de5 100644
--- a/net/quic/quic_utils.cc
+++ b/net/quic/quic_utils.cc
@@ -259,13 +259,13 @@
// static
string QuicUtils::TagToString(QuicTag tag) {
- char chars[4];
+ char chars[sizeof tag];
bool ascii = true;
const QuicTag orig_tag = tag;
- for (size_t i = 0; i < sizeof(chars); i++) {
- chars[i] = tag;
- if ((chars[i] == 0 || chars[i] == '\xff') && i == 3) {
+ for (size_t i = 0; i < arraysize(chars); i++) {
+ chars[i] = static_cast<char>(tag);
+ if ((chars[i] == 0 || chars[i] == '\xff') && i == arraysize(chars) - 1) {
chars[i] = ' ';
}
if (!isprint(static_cast<unsigned char>(chars[i]))) {
diff --git a/net/quic/reliable_quic_stream.cc b/net/quic/reliable_quic_stream.cc
index 70b6d9a..116d843 100644
--- a/net/quic/reliable_quic_stream.cc
+++ b/net/quic/reliable_quic_stream.cc
@@ -363,7 +363,7 @@
if (flow_controller_.IsEnabled()) {
// How much data we are allowed to write from flow control.
- uint64 send_window = flow_controller_.SendWindowSize();
+ QuicByteCount send_window = flow_controller_.SendWindowSize();
// TODO(rjshade): Remove connection_flow_controller_->IsEnabled() check when
// removing QUIC_VERSION_19.
if (stream_contributes_to_connection_flow_control_ &&
@@ -383,7 +383,7 @@
fin = false;
// Writing more data would be a violation of flow control.
- write_length = send_window;
+ write_length = static_cast<size_t>(send_window);
}
}
@@ -466,7 +466,8 @@
// As there may be more bytes in flight and we need to ensure that both
// endpoints have the same connection level flow control state, mark all
// unreceived or buffered bytes as consumed.
- uint64 bytes_to_consume = flow_controller_.highest_received_byte_offset() -
+ QuicByteCount bytes_to_consume =
+ flow_controller_.highest_received_byte_offset() -
flow_controller_.bytes_consumed();
AddBytesConsumed(bytes_to_consume);
}
@@ -487,7 +488,8 @@
}
}
-bool ReliableQuicStream::MaybeIncreaseHighestReceivedOffset(uint64 new_offset) {
+bool ReliableQuicStream::MaybeIncreaseHighestReceivedOffset(
+ QuicStreamOffset new_offset) {
if (!flow_controller_.IsEnabled()) {
return false;
}
@@ -508,7 +510,7 @@
return true;
}
-void ReliableQuicStream::AddBytesSent(uint64 bytes) {
+void ReliableQuicStream::AddBytesSent(QuicByteCount bytes) {
if (flow_controller_.IsEnabled()) {
flow_controller_.AddBytesSent(bytes);
if (stream_contributes_to_connection_flow_control_) {
@@ -517,7 +519,7 @@
}
}
-void ReliableQuicStream::AddBytesConsumed(uint64 bytes) {
+void ReliableQuicStream::AddBytesConsumed(QuicByteCount bytes) {
if (flow_controller_.IsEnabled()) {
// Only adjust stream level flow controller if we are still reading.
if (!read_side_closed_) {
@@ -530,7 +532,7 @@
}
}
-void ReliableQuicStream::UpdateSendWindowOffset(uint64 new_window) {
+void ReliableQuicStream::UpdateSendWindowOffset(QuicStreamOffset new_window) {
if (flow_controller_.UpdateSendWindowOffset(new_window)) {
OnCanWrite();
}
diff --git a/net/quic/reliable_quic_stream.h b/net/quic/reliable_quic_stream.h
index 24bc349..698fefb 100644
--- a/net/quic/reliable_quic_stream.h
+++ b/net/quic/reliable_quic_stream.h
@@ -103,17 +103,17 @@
// Called when we see a frame which could increase the highest offset.
// Returns true if the highest offset did increase.
- bool MaybeIncreaseHighestReceivedOffset(uint64 new_offset);
+ bool MaybeIncreaseHighestReceivedOffset(QuicStreamOffset new_offset);
// Called when bytese are sent to the peer.
- void AddBytesSent(uint64 bytes);
+ void AddBytesSent(QuicByteCount bytes);
// Called by the stream sequencer as bytes are consumed from the buffer.
// If our receive window has dropped below the threshold, then send a
// WINDOW_UPDATE frame.
- void AddBytesConsumed(uint64 bytes);
+ void AddBytesConsumed(QuicByteCount bytes);
// Updates the flow controller's send window offset and calls OnCanWrite if
// it was blocked before.
- void UpdateSendWindowOffset(uint64 new_offset);
+ void UpdateSendWindowOffset(QuicStreamOffset new_offset);
// Returns true if the stream is flow control blocked, by the stream flow
// control window or the connection flow control window.
diff --git a/net/quic/test_tools/mock_crypto_client_stream.cc b/net/quic/test_tools/mock_crypto_client_stream.cc
index dd0e30b..eef3b80 100644
--- a/net/quic/test_tools/mock_crypto_client_stream.cc
+++ b/net/quic/test_tools/mock_crypto_client_stream.cc
@@ -100,6 +100,7 @@
session()->config()->ProcessPeerHello(msg, CLIENT, &error_details);
ASSERT_EQ(QUIC_NO_ERROR, error);
ASSERT_TRUE(session()->config()->negotiated());
+ session()->OnConfigNegotiated();
}
QuicClientSessionBase* MockCryptoClientStream::client_session() {
diff --git a/net/quic/test_tools/quic_flow_controller_peer.cc b/net/quic/test_tools/quic_flow_controller_peer.cc
index 35882ed..d6a1098 100644
--- a/net/quic/test_tools/quic_flow_controller_peer.cc
+++ b/net/quic/test_tools/quic_flow_controller_peer.cc
@@ -15,43 +15,44 @@
// static
void QuicFlowControllerPeer::SetSendWindowOffset(
QuicFlowController* flow_controller,
- uint64 offset) {
+ QuicStreamOffset offset) {
flow_controller->send_window_offset_ = offset;
}
// static
void QuicFlowControllerPeer::SetReceiveWindowOffset(
QuicFlowController* flow_controller,
- uint64 offset) {
+ QuicStreamOffset offset) {
flow_controller->receive_window_offset_ = offset;
}
// static
void QuicFlowControllerPeer::SetMaxReceiveWindow(
- QuicFlowController* flow_controller, uint64 window_size) {
+ QuicFlowController* flow_controller,
+ QuicByteCount window_size) {
flow_controller->max_receive_window_ = window_size;
}
// static
-uint64 QuicFlowControllerPeer::SendWindowOffset(
+QuicStreamOffset QuicFlowControllerPeer::SendWindowOffset(
QuicFlowController* flow_controller) {
return flow_controller->send_window_offset_;
}
// static
-uint64 QuicFlowControllerPeer::SendWindowSize(
+QuicByteCount QuicFlowControllerPeer::SendWindowSize(
QuicFlowController* flow_controller) {
return flow_controller->SendWindowSize();
}
// static
-uint64 QuicFlowControllerPeer::ReceiveWindowOffset(
+QuicStreamOffset QuicFlowControllerPeer::ReceiveWindowOffset(
QuicFlowController* flow_controller) {
return flow_controller->receive_window_offset_;
}
// static
-uint64 QuicFlowControllerPeer::ReceiveWindowSize(
+QuicByteCount QuicFlowControllerPeer::ReceiveWindowSize(
QuicFlowController* flow_controller) {
return flow_controller->receive_window_offset_ -
flow_controller->highest_received_byte_offset_;
diff --git a/net/quic/test_tools/quic_flow_controller_peer.h b/net/quic/test_tools/quic_flow_controller_peer.h
index 213d40d..4270d96 100644
--- a/net/quic/test_tools/quic_flow_controller_peer.h
+++ b/net/quic/test_tools/quic_flow_controller_peer.h
@@ -16,21 +16,22 @@
class QuicFlowControllerPeer {
public:
static void SetSendWindowOffset(QuicFlowController* flow_controller,
- uint64 offset);
+ QuicStreamOffset offset);
static void SetReceiveWindowOffset(QuicFlowController* flow_controller,
- uint64 offset);
+ QuicStreamOffset offset);
static void SetMaxReceiveWindow(QuicFlowController* flow_controller,
- uint64 window_size);
+ QuicByteCount window_size);
- static uint64 SendWindowOffset(QuicFlowController* flow_controller);
+ static QuicStreamOffset SendWindowOffset(QuicFlowController* flow_controller);
- static uint64 SendWindowSize(QuicFlowController* flow_controller);
+ static QuicByteCount SendWindowSize(QuicFlowController* flow_controller);
- static uint64 ReceiveWindowOffset(QuicFlowController* flow_controller);
+ static QuicStreamOffset ReceiveWindowOffset(
+ QuicFlowController* flow_controller);
- static uint64 ReceiveWindowSize(QuicFlowController* flow_controller);
+ static QuicByteCount ReceiveWindowSize(QuicFlowController* flow_controller);
private:
DISALLOW_COPY_AND_ASSIGN(QuicFlowControllerPeer);
diff --git a/net/quic/test_tools/quic_sent_packet_manager_peer.cc b/net/quic/test_tools/quic_sent_packet_manager_peer.cc
index bb9fb38..311b688 100644
--- a/net/quic/test_tools/quic_sent_packet_manager_peer.cc
+++ b/net/quic/test_tools/quic_sent_packet_manager_peer.cc
@@ -72,7 +72,7 @@
}
// static
-size_t QuicSentPacketManagerPeer::GetNackCount(
+QuicPacketCount QuicSentPacketManagerPeer::GetNackCount(
const QuicSentPacketManager* sent_packet_manager,
QuicPacketSequenceNumber sequence_number) {
return sent_packet_manager->unacked_packets_.
diff --git a/net/quic/test_tools/quic_sent_packet_manager_peer.h b/net/quic/test_tools/quic_sent_packet_manager_peer.h
index dfc524d..2d850d3 100644
--- a/net/quic/test_tools/quic_sent_packet_manager_peer.h
+++ b/net/quic/test_tools/quic_sent_packet_manager_peer.h
@@ -42,7 +42,7 @@
static RttStats* GetRttStats(QuicSentPacketManager* sent_packet_manager);
- static size_t GetNackCount(
+ static QuicPacketCount GetNackCount(
const QuicSentPacketManager* sent_packet_manager,
QuicPacketSequenceNumber sequence_number);
diff --git a/net/quic/test_tools/quic_test_utils.h b/net/quic/test_tools/quic_test_utils.h
index 9df03eb..6b6efe3 100644
--- a/net/quic/test_tools/quic_test_utils.h
+++ b/net/quic/test_tools/quic_test_utils.h
@@ -319,6 +319,8 @@
QuicStreamOffset byte_offset));
MOCK_METHOD0(OnCanWrite, void());
+ MOCK_METHOD1(ResumeConnectionState, bool(const CachedNetworkParameters&));
+
void ProcessUdpPacketInternal(const IPEndPoint& self_address,
const IPEndPoint& peer_address,
const QuicEncryptedPacket& packet) {
@@ -483,7 +485,7 @@
MOCK_CONST_METHOD0(InRecovery, bool());
MOCK_CONST_METHOD0(GetSlowStartThreshold, QuicByteCount());
MOCK_CONST_METHOD0(GetCongestionControlType, CongestionControlType());
- MOCK_METHOD1(ResumeConnectionState, void(const CachedNetworkParameters&));
+ MOCK_METHOD1(ResumeConnectionState, bool(const CachedNetworkParameters&));
private:
DISALLOW_COPY_AND_ASSIGN(MockSendAlgorithm);
diff --git a/net/socket/buffered_write_stream_socket.cc b/net/socket/buffered_write_stream_socket.cc
deleted file mode 100644
index e69de29..0000000
--- a/net/socket/buffered_write_stream_socket.cc
+++ /dev/null
diff --git a/net/socket/buffered_write_stream_socket.h b/net/socket/buffered_write_stream_socket.h
deleted file mode 100644
index e69de29..0000000
--- a/net/socket/buffered_write_stream_socket.h
+++ /dev/null
diff --git a/net/socket/buffered_write_stream_socket_unittest.cc b/net/socket/buffered_write_stream_socket_unittest.cc
deleted file mode 100644
index e69de29..0000000
--- a/net/socket/buffered_write_stream_socket_unittest.cc
+++ /dev/null
diff --git a/net/socket/client_socket_pool_manager_impl.cc b/net/socket/client_socket_pool_manager_impl.cc
index 5ed31fc..190023c 100644
--- a/net/socket/client_socket_pool_manager_impl.cc
+++ b/net/socket/client_socket_pool_manager_impl.cc
@@ -42,6 +42,7 @@
ChannelIDService* channel_id_service,
TransportSecurityState* transport_security_state,
CTVerifier* cert_transparency_verifier,
+ CertPolicyEnforcer* cert_policy_enforcer,
const std::string& ssl_session_cache_shard,
ProxyService* proxy_service,
SSLConfigService* ssl_config_service,
@@ -55,6 +56,7 @@
channel_id_service_(channel_id_service),
transport_security_state_(transport_security_state),
cert_transparency_verifier_(cert_transparency_verifier),
+ cert_policy_enforcer_(cert_policy_enforcer),
ssl_session_cache_shard_(ssl_session_cache_shard),
proxy_service_(proxy_service),
ssl_config_service_(ssl_config_service),
@@ -85,6 +87,7 @@
channel_id_service,
transport_security_state,
cert_transparency_verifier,
+ cert_policy_enforcer,
ssl_session_cache_shard,
socket_factory,
transport_socket_pool_.get(),
@@ -297,22 +300,17 @@
std::pair<SSLSocketPoolMap::iterator, bool> ssl_https_ret =
ssl_socket_pools_for_https_proxies_.insert(std::make_pair(
http_proxy,
- new SSLClientSocketPool(max_sockets_per_proxy_server(pool_type_),
- max_sockets_per_group(pool_type_),
- &ssl_for_https_proxy_pool_histograms_,
- host_resolver_,
- cert_verifier_,
- channel_id_service_,
- transport_security_state_,
- cert_transparency_verifier_,
- ssl_session_cache_shard_,
- socket_factory_,
- tcp_https_ret.first->second /* https proxy */,
- NULL /* no socks proxy */,
- NULL /* no http proxy */,
- ssl_config_service_.get(),
- enable_ssl_connect_job_waiting_,
- net_log_)));
+ new SSLClientSocketPool(
+ max_sockets_per_proxy_server(pool_type_),
+ max_sockets_per_group(pool_type_),
+ &ssl_for_https_proxy_pool_histograms_, host_resolver_,
+ cert_verifier_, channel_id_service_, transport_security_state_,
+ cert_transparency_verifier_, cert_policy_enforcer_,
+ ssl_session_cache_shard_, socket_factory_,
+ tcp_https_ret.first->second /* https proxy */,
+ NULL /* no socks proxy */, NULL /* no http proxy */,
+ ssl_config_service_.get(), enable_ssl_connect_job_waiting_,
+ net_log_)));
DCHECK(tcp_https_ret.second);
std::pair<HTTPProxySocketPoolMap::iterator, bool> ret =
@@ -341,21 +339,14 @@
SSLClientSocketPool* new_pool = new SSLClientSocketPool(
max_sockets_per_proxy_server(pool_type_),
- max_sockets_per_group(pool_type_),
- &ssl_pool_histograms_,
- host_resolver_,
- cert_verifier_,
- channel_id_service_,
- transport_security_state_,
- cert_transparency_verifier_,
- ssl_session_cache_shard_,
- socket_factory_,
+ max_sockets_per_group(pool_type_), &ssl_pool_histograms_, host_resolver_,
+ cert_verifier_, channel_id_service_, transport_security_state_,
+ cert_transparency_verifier_, cert_policy_enforcer_,
+ ssl_session_cache_shard_, socket_factory_,
NULL, /* no tcp pool, we always go through a proxy */
GetSocketPoolForSOCKSProxy(proxy_server),
- GetSocketPoolForHTTPProxy(proxy_server),
- ssl_config_service_.get(),
- enable_ssl_connect_job_waiting_,
- net_log_);
+ GetSocketPoolForHTTPProxy(proxy_server), ssl_config_service_.get(),
+ enable_ssl_connect_job_waiting_, net_log_);
std::pair<SSLSocketPoolMap::iterator, bool> ret =
ssl_socket_pools_for_proxies_.insert(std::make_pair(proxy_server,
diff --git a/net/socket/client_socket_pool_manager_impl.h b/net/socket/client_socket_pool_manager_impl.h
index f9f8d3b..ca609d5 100644
--- a/net/socket/client_socket_pool_manager_impl.h
+++ b/net/socket/client_socket_pool_manager_impl.h
@@ -65,6 +65,7 @@
ChannelIDService* channel_id_service,
TransportSecurityState* transport_security_state,
CTVerifier* cert_transparency_verifier,
+ CertPolicyEnforcer* cert_policy_enforcer,
const std::string& ssl_session_cache_shard,
ProxyService* proxy_service,
SSLConfigService* ssl_config_service,
@@ -114,6 +115,7 @@
ChannelIDService* const channel_id_service_;
TransportSecurityState* const transport_security_state_;
CTVerifier* const cert_transparency_verifier_;
+ CertPolicyEnforcer* const cert_policy_enforcer_;
const std::string ssl_session_cache_shard_;
ProxyService* const proxy_service_;
const scoped_refptr<SSLConfigService> ssl_config_service_;
diff --git a/net/socket/ssl_client_socket.h b/net/socket/ssl_client_socket.h
index 7adfa8c..11b19a1 100644
--- a/net/socket/ssl_client_socket.h
+++ b/net/socket/ssl_client_socket.h
@@ -16,6 +16,7 @@
namespace net {
+class CertPolicyEnforcer;
class CertVerifier;
class ChannelIDService;
class CTVerifier;
@@ -34,23 +35,27 @@
: cert_verifier(NULL),
channel_id_service(NULL),
transport_security_state(NULL),
- cert_transparency_verifier(NULL) {}
+ cert_transparency_verifier(NULL),
+ cert_policy_enforcer(NULL) {}
SSLClientSocketContext(CertVerifier* cert_verifier_arg,
ChannelIDService* channel_id_service_arg,
TransportSecurityState* transport_security_state_arg,
CTVerifier* cert_transparency_verifier_arg,
+ CertPolicyEnforcer* cert_policy_enforcer_arg,
const std::string& ssl_session_cache_shard_arg)
: cert_verifier(cert_verifier_arg),
channel_id_service(channel_id_service_arg),
transport_security_state(transport_security_state_arg),
cert_transparency_verifier(cert_transparency_verifier_arg),
+ cert_policy_enforcer(cert_policy_enforcer_arg),
ssl_session_cache_shard(ssl_session_cache_shard_arg) {}
CertVerifier* cert_verifier;
ChannelIDService* channel_id_service;
TransportSecurityState* transport_security_state;
CTVerifier* cert_transparency_verifier;
+ CertPolicyEnforcer* cert_policy_enforcer;
// ssl_session_cache_shard is an opaque string that identifies a shard of the
// SSL session cache. SSL sockets with the same ssl_session_cache_shard may
// resume each other's SSL sessions but we'll never sessions between shards.
@@ -149,6 +154,10 @@
// sessions.
static void ClearSessionCache();
+ // Get the maximum SSL version supported by the underlying library and
+ // cryptographic implementation.
+ static uint16 GetMaxSupportedSSLVersion();
+
virtual bool set_was_npn_negotiated(bool negotiated);
virtual bool was_spdy_negotiated() const;
diff --git a/net/socket/ssl_client_socket_nss.cc b/net/socket/ssl_client_socket_nss.cc
index 3e5bde0..3651e8d 100644
--- a/net/socket/ssl_client_socket_nss.cc
+++ b/net/socket/ssl_client_socket_nss.cc
@@ -91,6 +91,7 @@
#include "net/base/net_errors.h"
#include "net/base/net_log.h"
#include "net/cert/asn1_util.h"
+#include "net/cert/cert_policy_enforcer.h"
#include "net/cert/cert_status_flags.h"
#include "net/cert/cert_verifier.h"
#include "net/cert/ct_ev_whitelist.h"
@@ -2473,10 +2474,7 @@
if (ok == SECSuccess &&
channel_info.length == sizeof(channel_info) &&
channel_info.cipherSuite) {
- nss_handshake_state_.ssl_connection_status |=
- (static_cast<int>(channel_info.cipherSuite) &
- SSL_CONNECTION_CIPHERSUITE_MASK) <<
- SSL_CONNECTION_CIPHERSUITE_SHIFT;
+ nss_handshake_state_.ssl_connection_status |= channel_info.cipherSuite;
nss_handshake_state_.ssl_connection_status |=
(static_cast<int>(channel_info.compressionMethod) &
@@ -2834,6 +2832,7 @@
nss_fd_(NULL),
net_log_(transport_->socket()->NetLog()),
transport_security_state_(context.transport_security_state),
+ policy_enforcer_(context.cert_policy_enforcer),
valid_thread_id_(base::kInvalidThreadId) {
EnterFunction("");
InitCore();
@@ -2856,6 +2855,19 @@
SSL_ClearSessionCache();
}
+#if !defined(CKM_NSS_TLS_MASTER_KEY_DERIVE_DH_SHA256)
+#define CKM_NSS_TLS_MASTER_KEY_DERIVE_DH_SHA256 (CKM_NSS + 24)
+#endif
+
+// static
+uint16 SSLClientSocket::GetMaxSupportedSSLVersion() {
+ if (PK11_TokenExists(CKM_NSS_TLS_MASTER_KEY_DERIVE_DH_SHA256)) {
+ return SSL_PROTOCOL_VERSION_TLS1_2;
+ } else {
+ return SSL_PROTOCOL_VERSION_TLS1_1;
+ }
+}
+
bool SSLClientSocketNSS::GetSSLInfo(SSLInfo* ssl_info) {
EnterFunction("");
ssl_info->Reset();
@@ -3518,21 +3530,6 @@
result = ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN;
}
- scoped_refptr<ct::EVCertsWhitelist> ev_whitelist =
- SSLConfigService::GetEVCertsWhitelist();
- if (server_cert_verify_result_.cert_status & CERT_STATUS_IS_EV) {
- if (ev_whitelist.get() && ev_whitelist->IsValid()) {
- const SHA256HashValue fingerprint(
- X509Certificate::CalculateFingerprint256(
- server_cert_verify_result_.verified_cert->os_cert_handle()));
-
- UMA_HISTOGRAM_BOOLEAN(
- "Net.SSL_EVCertificateInWhitelist",
- ev_whitelist->ContainsCertificateHash(
- std::string(reinterpret_cast<const char*>(fingerprint.data), 8)));
- }
- }
-
if (result == OK) {
// Only check Certificate Transparency if there were no other errors with
// the connection.
@@ -3556,20 +3553,31 @@
// Note that this is a completely synchronous operation: The CT Log Verifier
// gets all the data it needs for SCT verification and does not do any
// external communication.
- int result = cert_transparency_verifier_->Verify(
+ cert_transparency_verifier_->Verify(
server_cert_verify_result_.verified_cert.get(),
core_->state().stapled_ocsp_response,
- core_->state().sct_list_from_tls_extension,
- &ct_verify_result_,
- net_log_);
+ core_->state().sct_list_from_tls_extension, &ct_verify_result_, net_log_);
// TODO(ekasper): wipe stapled_ocsp_response and sct_list_from_tls_extension
// from the state after verification is complete, to conserve memory.
- VLOG(1) << "CT Verification complete: result " << result
- << " Invalid scts: " << ct_verify_result_.invalid_scts.size()
- << " Verified scts: " << ct_verify_result_.verified_scts.size()
- << " scts from unknown logs: "
- << ct_verify_result_.unknown_logs_scts.size();
+ if (!policy_enforcer_) {
+ server_cert_verify_result_.cert_status &= ~CERT_STATUS_IS_EV;
+ } else {
+ if (server_cert_verify_result_.cert_status & CERT_STATUS_IS_EV) {
+ scoped_refptr<ct::EVCertsWhitelist> ev_whitelist =
+ SSLConfigService::GetEVCertsWhitelist();
+ if (!policy_enforcer_->DoesConformToCTEVPolicy(
+ server_cert_verify_result_.verified_cert.get(),
+ ev_whitelist.get(), ct_verify_result_)) {
+ // TODO(eranm): Log via the BoundNetLog, see crbug.com/437766
+ VLOG(1) << "EV certificate for "
+ << server_cert_verify_result_.verified_cert->subject()
+ .GetDisplayName()
+ << " does not conform to CT policy, removing EV status.";
+ server_cert_verify_result_.cert_status &= ~CERT_STATUS_IS_EV;
+ }
+ }
+ }
}
void SSLClientSocketNSS::EnsureThreadIdAssigned() const {
diff --git a/net/socket/ssl_client_socket_nss.h b/net/socket/ssl_client_socket_nss.h
index 71f09c0..10bb57f 100644
--- a/net/socket/ssl_client_socket_nss.h
+++ b/net/socket/ssl_client_socket_nss.h
@@ -36,6 +36,7 @@
namespace net {
class BoundNetLog;
+class CertPolicyEnforcer;
class CertVerifier;
class ChannelIDService;
class CTVerifier;
@@ -199,6 +200,8 @@
TransportSecurityState* transport_security_state_;
+ CertPolicyEnforcer* const policy_enforcer_;
+
// pinning_failure_log contains a message produced by
// TransportSecurityState::CheckPublicKeyPins in the event of a
// pinning failure. It is a (somewhat) human-readable string.
diff --git a/net/socket/ssl_client_socket_openssl.cc b/net/socket/ssl_client_socket_openssl.cc
index 05eb1cb..4e86c05 100644
--- a/net/socket/ssl_client_socket_openssl.cc
+++ b/net/socket/ssl_client_socket_openssl.cc
@@ -24,6 +24,7 @@
#include "crypto/openssl_util.h"
#include "crypto/scoped_openssl_types.h"
#include "net/base/net_errors.h"
+#include "net/cert/cert_policy_enforcer.h"
#include "net/cert/cert_verifier.h"
#include "net/cert/ct_ev_whitelist.h"
#include "net/cert/ct_verifier.h"
@@ -81,11 +82,10 @@
#endif
// Used for encoding the |connection_status| field of an SSLInfo object.
-int EncodeSSLConnectionStatus(int cipher_suite,
+int EncodeSSLConnectionStatus(uint16 cipher_suite,
int compression,
int version) {
- return ((cipher_suite & SSL_CONNECTION_CIPHERSUITE_MASK) <<
- SSL_CONNECTION_CIPHERSUITE_SHIFT) |
+ return cipher_suite |
((compression & SSL_CONNECTION_COMPRESSION_MASK) <<
SSL_CONNECTION_COMPRESSION_SHIFT) |
((version & SSL_CONNECTION_VERSION_MASK) <<
@@ -345,6 +345,11 @@
context->session_cache()->Flush();
}
+// static
+uint16 SSLClientSocket::GetMaxSupportedSSLVersion() {
+ return SSL_PROTOCOL_VERSION_TLS1_2;
+}
+
SSLClientSocketOpenSSL::SSLClientSocketOpenSSL(
scoped_ptr<ClientSocketHandle> transport_socket,
const HostPortPair& host_and_port,
@@ -376,6 +381,7 @@
handshake_succeeded_(false),
marked_session_as_good_(false),
transport_security_state_(context.transport_security_state),
+ policy_enforcer_(context.cert_policy_enforcer),
net_log_(transport_->socket()->NetLog()),
weak_factory_(this) {
}
@@ -625,7 +631,7 @@
ssl_info->security_bits = SSL_CIPHER_get_bits(cipher, NULL);
ssl_info->connection_status = EncodeSSLConnectionStatus(
- SSL_CIPHER_get_id(cipher), 0 /* no compression */,
+ static_cast<uint16>(SSL_CIPHER_get_id(cipher)), 0 /* no compression */,
GetNetSSLVersion(ssl_));
if (!SSL_get_secure_renegotiation_support(ssl_))
@@ -788,7 +794,7 @@
// appended to the cipher removal |command|.
for (size_t i = 0; i < sk_SSL_CIPHER_num(ciphers); ++i) {
const SSL_CIPHER* cipher = sk_SSL_CIPHER_value(ciphers, i);
- const uint16 id = SSL_CIPHER_get_id(cipher);
+ const uint16 id = static_cast<uint16>(SSL_CIPHER_get_id(cipher));
// Remove any ciphers with a strength of less than 80 bits. Note the NSS
// implementation uses "effective" bits here but OpenSSL does not provide
// this detail. This only impacts Triple DES: reports 112 vs. 168 bits,
@@ -960,7 +966,7 @@
// Only record OCSP histograms if OCSP was requested.
if (ssl_config_.signed_cert_timestamps_enabled ||
IsOCSPStaplingSupported()) {
- uint8_t* ocsp_response;
+ const uint8_t* ocsp_response;
size_t ocsp_response_len;
SSL_get0_ocsp_response(ssl_, &ocsp_response, &ocsp_response_len);
@@ -968,7 +974,7 @@
UMA_HISTOGRAM_BOOLEAN("Net.OCSPResponseStapled", ocsp_response_len != 0);
}
- uint8_t* sct_list;
+ const uint8_t* sct_list;
size_t sct_list_len;
SSL_get0_signed_cert_timestamp_list(ssl_, &sct_list, &sct_list_len);
set_signed_cert_timestamps_received(sct_list_len != 0);
@@ -1140,21 +1146,6 @@
result = ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN;
}
- scoped_refptr<ct::EVCertsWhitelist> ev_whitelist =
- SSLConfigService::GetEVCertsWhitelist();
- if (server_cert_verify_result_.cert_status & CERT_STATUS_IS_EV) {
- if (ev_whitelist.get() && ev_whitelist->IsValid()) {
- const SHA256HashValue fingerprint(
- X509Certificate::CalculateFingerprint256(
- server_cert_verify_result_.verified_cert->os_cert_handle()));
-
- UMA_HISTOGRAM_BOOLEAN(
- "Net.SSL_EVCertificateInWhitelist",
- ev_whitelist->ContainsCertificateHash(
- std::string(reinterpret_cast<const char*>(fingerprint.data), 8)));
- }
- }
-
if (result == OK) {
// Only check Certificate Transparency if there were no other errors with
// the connection.
@@ -1201,13 +1192,13 @@
// update IsOCSPStaplingSupported for Mac. https://crbug.com/430714
if (IsOCSPStaplingSupported()) {
#if defined(OS_WIN)
- uint8_t* ocsp_response_raw;
+ const uint8_t* ocsp_response_raw;
size_t ocsp_response_len;
SSL_get0_ocsp_response(ssl_, &ocsp_response_raw, &ocsp_response_len);
CRYPT_DATA_BLOB ocsp_response_blob;
ocsp_response_blob.cbData = ocsp_response_len;
- ocsp_response_blob.pbData = ocsp_response_raw;
+ ocsp_response_blob.pbData = const_cast<BYTE*>(ocsp_response_raw);
BOOL ok = CertSetCertificateContextProperty(
server_cert_->os_cert_handle(),
CERT_OCSP_RESPONSE_PROP_ID,
@@ -1228,7 +1219,7 @@
if (!cert_transparency_verifier_)
return;
- uint8_t* ocsp_response_raw;
+ const uint8_t* ocsp_response_raw;
size_t ocsp_response_len;
SSL_get0_ocsp_response(ssl_, &ocsp_response_raw, &ocsp_response_len);
std::string ocsp_response;
@@ -1237,7 +1228,7 @@
ocsp_response_len);
}
- uint8_t* sct_list_raw;
+ const uint8_t* sct_list_raw;
size_t sct_list_len;
SSL_get0_signed_cert_timestamp_list(ssl_, &sct_list_raw, &sct_list_len);
std::string sct_list;
@@ -1247,15 +1238,28 @@
// Note that this is a completely synchronous operation: The CT Log Verifier
// gets all the data it needs for SCT verification and does not do any
// external communication.
- int result = cert_transparency_verifier_->Verify(
- server_cert_verify_result_.verified_cert.get(),
- ocsp_response, sct_list, &ct_verify_result_, net_log_);
+ cert_transparency_verifier_->Verify(
+ server_cert_verify_result_.verified_cert.get(), ocsp_response, sct_list,
+ &ct_verify_result_, net_log_);
- VLOG(1) << "CT Verification complete: result " << result
- << " Invalid scts: " << ct_verify_result_.invalid_scts.size()
- << " Verified scts: " << ct_verify_result_.verified_scts.size()
- << " scts from unknown logs: "
- << ct_verify_result_.unknown_logs_scts.size();
+ if (!policy_enforcer_) {
+ server_cert_verify_result_.cert_status &= ~CERT_STATUS_IS_EV;
+ } else {
+ if (server_cert_verify_result_.cert_status & CERT_STATUS_IS_EV) {
+ scoped_refptr<ct::EVCertsWhitelist> ev_whitelist =
+ SSLConfigService::GetEVCertsWhitelist();
+ if (!policy_enforcer_->DoesConformToCTEVPolicy(
+ server_cert_verify_result_.verified_cert.get(),
+ ev_whitelist.get(), ct_verify_result_)) {
+ // TODO(eranm): Log via the BoundNetLog, see crbug.com/437766
+ VLOG(1) << "EV certificate for "
+ << server_cert_verify_result_.verified_cert->subject()
+ .GetDisplayName()
+ << " does not conform to CT policy, removing EV status.";
+ server_cert_verify_result_.cert_status &= ~CERT_STATUS_IS_EV;
+ }
+ }
+ }
}
void SSLClientSocketOpenSSL::OnHandshakeIOComplete(int result) {
diff --git a/net/socket/ssl_client_socket_openssl.h b/net/socket/ssl_client_socket_openssl.h
index 53d33c4..6343cb7 100644
--- a/net/socket/ssl_client_socket_openssl.h
+++ b/net/socket/ssl_client_socket_openssl.h
@@ -304,6 +304,8 @@
TransportSecurityState* transport_security_state_;
+ CertPolicyEnforcer* const policy_enforcer_;
+
// pinning_failure_log contains a message produced by
// TransportSecurityState::CheckPublicKeyPins in the event of a
// pinning failure. It is a (somewhat) human-readable string.
diff --git a/net/socket/ssl_client_socket_pool.cc b/net/socket/ssl_client_socket_pool.cc
index 56df1d8..c3b98b8 100644
--- a/net/socket/ssl_client_socket_pool.cc
+++ b/net/socket/ssl_client_socket_pool.cc
@@ -197,6 +197,7 @@
context.channel_id_service,
context.transport_security_state,
context.cert_transparency_verifier,
+ context.cert_policy_enforcer,
(params->privacy_mode() == PRIVACY_MODE_ENABLED
? "pm/" + context.ssl_session_cache_shard
: context.ssl_session_cache_shard)),
@@ -634,6 +635,7 @@
ChannelIDService* channel_id_service,
TransportSecurityState* transport_security_state,
CTVerifier* cert_transparency_verifier,
+ CertPolicyEnforcer* cert_policy_enforcer,
const std::string& ssl_session_cache_shard,
ClientSocketFactory* client_socket_factory,
TransportClientSocketPool* transport_pool,
@@ -661,6 +663,7 @@
channel_id_service,
transport_security_state,
cert_transparency_verifier,
+ cert_policy_enforcer,
ssl_session_cache_shard),
base::Bind(
&SSLClientSocketPool::GetOrCreateSSLConnectJobMessenger,
diff --git a/net/socket/ssl_client_socket_pool.h b/net/socket/ssl_client_socket_pool.h
index c7f613e..59e754a 100644
--- a/net/socket/ssl_client_socket_pool.h
+++ b/net/socket/ssl_client_socket_pool.h
@@ -23,6 +23,7 @@
namespace net {
+class CertPolicyEnforcer;
class CertVerifier;
class ClientSocketFactory;
class ConnectJobFactory;
@@ -285,6 +286,7 @@
ChannelIDService* channel_id_service,
TransportSecurityState* transport_security_state,
CTVerifier* cert_transparency_verifier,
+ CertPolicyEnforcer* cert_policy_enforcer,
const std::string& ssl_session_cache_shard,
ClientSocketFactory* client_socket_factory,
TransportClientSocketPool* transport_pool,
diff --git a/net/socket/ssl_client_socket_pool_unittest.cc b/net/socket/ssl_client_socket_pool_unittest.cc
index 23bb111..1e4a14f 100644
--- a/net/socket/ssl_client_socket_pool_unittest.cc
+++ b/net/socket/ssl_client_socket_pool_unittest.cc
@@ -143,22 +143,15 @@
void CreatePool(bool transport_pool, bool http_proxy_pool, bool socks_pool) {
ssl_histograms_.reset(new ClientSocketPoolHistograms("SSLUnitTest"));
pool_.reset(new SSLClientSocketPool(
- kMaxSockets,
- kMaxSocketsPerGroup,
- ssl_histograms_.get(),
- NULL /* host_resolver */,
- NULL /* cert_verifier */,
- NULL /* channel_id_service */,
- NULL /* transport_security_state */,
- NULL /* cert_transparency_verifier */,
- std::string() /* ssl_session_cache_shard */,
- &socket_factory_,
+ kMaxSockets, kMaxSocketsPerGroup, ssl_histograms_.get(),
+ NULL /* host_resolver */, NULL /* cert_verifier */,
+ NULL /* channel_id_service */, NULL /* transport_security_state */,
+ NULL /* cert_transparency_verifier */, NULL /* cert_policy_enforcer */,
+ std::string() /* ssl_session_cache_shard */, &socket_factory_,
transport_pool ? &transport_socket_pool_ : NULL,
socks_pool ? &socks_socket_pool_ : NULL,
- http_proxy_pool ? &http_proxy_socket_pool_ : NULL,
- NULL,
- enable_ssl_connect_job_waiting_,
- NULL));
+ http_proxy_pool ? &http_proxy_socket_pool_ : NULL, NULL,
+ enable_ssl_connect_job_waiting_, NULL));
}
scoped_refptr<SSLSocketParams> SSLParams(ProxyServer::Scheme proxy,
diff --git a/net/spdy/spdy_http_stream_unittest.cc b/net/spdy/spdy_http_stream_unittest.cc
index f22b75f..04b5088 100644
--- a/net/spdy/spdy_http_stream_unittest.cc
+++ b/net/spdy/spdy_http_stream_unittest.cc
@@ -754,16 +754,18 @@
// Verify that the window size has decreased.
ASSERT_TRUE(http_stream->stream() != NULL);
- EXPECT_NE(static_cast<int>(kSpdyStreamInitialWindowSize),
- http_stream->stream()->send_window_size());
+ EXPECT_NE(
+ static_cast<int>(SpdySession::GetInitialWindowSize(session_->protocol())),
+ http_stream->stream()->send_window_size());
// Read window update.
deterministic_data_->RunFor(1);
// Verify the window update.
ASSERT_TRUE(http_stream->stream() != NULL);
- EXPECT_EQ(static_cast<int>(kSpdyStreamInitialWindowSize),
- http_stream->stream()->send_window_size());
+ EXPECT_EQ(
+ static_cast<int>(SpdySession::GetInitialWindowSize(session_->protocol())),
+ http_stream->stream()->send_window_size());
// Read response headers.
deterministic_data_->RunFor(1);
diff --git a/net/spdy/spdy_network_transaction_unittest.cc b/net/spdy/spdy_network_transaction_unittest.cc
index 3836fd3..4c6c205 100644
--- a/net/spdy/spdy_network_transaction_unittest.cc
+++ b/net/spdy/spdy_network_transaction_unittest.cc
@@ -4416,7 +4416,8 @@
scoped_ptr<SpdyFrame> initial_window_update(
spdy_util_.ConstructSpdyWindowUpdate(
kSessionFlowControlStreamId,
- kDefaultInitialRecvWindowSize - kSpdySessionInitialWindowSize));
+ kDefaultInitialRecvWindowSize -
+ SpdySession::GetInitialWindowSize(GetParam().protocol)));
// Construct the persisted SETTINGS frame.
const SettingsMap& settings =
@@ -5909,10 +5910,10 @@
SpdyHttpStream* stream = static_cast<SpdyHttpStream*>(trans->stream_.get());
ASSERT_TRUE(stream != NULL);
ASSERT_TRUE(stream->stream() != NULL);
- EXPECT_EQ(static_cast<int>(kSpdyStreamInitialWindowSize) +
- kDeltaWindowSize * kDeltaCount -
- kMaxSpdyFrameChunkSize * kFrameCount,
- stream->stream()->send_window_size());
+ EXPECT_EQ(
+ static_cast<int>(SpdySession::GetInitialWindowSize(GetParam().protocol)) +
+ kDeltaWindowSize * kDeltaCount - kMaxSpdyFrameChunkSize * kFrameCount,
+ stream->stream()->send_window_size());
data.RunFor(1);
@@ -5925,8 +5926,10 @@
// Test that received data frames and sent WINDOW_UPDATE frames change
// the recv_window_size_ correctly.
TEST_P(SpdyNetworkTransactionTest, WindowUpdateSent) {
+ const int32 initial_window_size =
+ SpdySession::GetInitialWindowSize(GetParam().protocol);
// Amount of body required to trigger a sent window update.
- const size_t kTargetSize = kSpdyStreamInitialWindowSize / 2 + 1;
+ const size_t kTargetSize = initial_window_size / 2 + 1;
scoped_ptr<SpdyFrame> req(
spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true));
@@ -5955,7 +5958,7 @@
reads.push_back(CreateMockRead(*body_frames.back()));
remaining -= frame_size;
}
- reads.push_back(MockRead(ASYNC, ERR_IO_PENDING, 0)); // Yield.
+ reads.push_back(MockRead(ASYNC, ERR_IO_PENDING, 0)); // Yield.
DelayedSocketData data(1, vector_as_array(&reads), reads.size(),
vector_as_array(&writes), writes.size());
@@ -5979,7 +5982,7 @@
ASSERT_TRUE(stream->stream() != NULL);
// All data has been read, but not consumed. The window reflects this.
- EXPECT_EQ(static_cast<int>(kSpdyStreamInitialWindowSize - kTargetSize),
+ EXPECT_EQ(static_cast<int>(initial_window_size - kTargetSize),
stream->stream()->recv_window_size());
const HttpResponseInfo* response = trans->GetResponseInfo();
@@ -5993,7 +5996,7 @@
scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(kTargetSize));
EXPECT_EQ(static_cast<int>(kTargetSize),
trans->Read(buf.get(), kTargetSize, CompletionCallback()));
- EXPECT_EQ(static_cast<int>(kSpdyStreamInitialWindowSize),
+ EXPECT_EQ(static_cast<int>(initial_window_size),
stream->stream()->recv_window_size());
EXPECT_THAT(base::StringPiece(buf->data(), kTargetSize), Each(Eq('x')));
@@ -6083,22 +6086,22 @@
// After that, next read is artifically enforced, which causes a
// WINDOW_UPDATE to be read and I/O process resumes.
TEST_P(SpdyNetworkTransactionTest, FlowControlStallResume) {
+ const int32 initial_window_size =
+ SpdySession::GetInitialWindowSize(GetParam().protocol);
// Number of frames we need to send to zero out the window size: data
// frames plus SYN_STREAM plus the last data frame; also we need another
// data frame that we will send once the WINDOW_UPDATE is received,
// therefore +3.
- size_t num_writes = kSpdyStreamInitialWindowSize / kMaxSpdyFrameChunkSize + 3;
+ size_t num_writes = initial_window_size / kMaxSpdyFrameChunkSize + 3;
// Calculate last frame's size; 0 size data frame is legal.
- size_t last_frame_size =
- kSpdyStreamInitialWindowSize % kMaxSpdyFrameChunkSize;
+ size_t last_frame_size = initial_window_size % kMaxSpdyFrameChunkSize;
// Construct content for a data frame of maximum size.
std::string content(kMaxSpdyFrameChunkSize, 'a');
scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost(
- kRequestUrl, 1, kSpdyStreamInitialWindowSize + kUploadDataSize,
- LOWEST, NULL, 0));
+ kRequestUrl, 1, initial_window_size + kUploadDataSize, LOWEST, NULL, 0));
// Full frames.
scoped_ptr<SpdyFrame> body1(
@@ -6151,7 +6154,7 @@
writes.get(), num_writes);
ScopedVector<UploadElementReader> element_readers;
- std::string upload_data_string(kSpdyStreamInitialWindowSize, 'a');
+ std::string upload_data_string(initial_window_size, 'a');
upload_data_string.append(kUploadData, kUploadDataSize);
element_readers.push_back(new UploadBytesElementReader(
upload_data_string.c_str(), upload_data_string.size()));
@@ -6194,21 +6197,22 @@
// Test we correctly handle the case where the SETTINGS frame results in
// unstalling the send window.
TEST_P(SpdyNetworkTransactionTest, FlowControlStallResumeAfterSettings) {
+ const int32 initial_window_size =
+ SpdySession::GetInitialWindowSize(GetParam().protocol);
+
// Number of frames we need to send to zero out the window size: data
// frames plus SYN_STREAM plus the last data frame; also we need another
// data frame that we will send once the SETTING is received, therefore +3.
- size_t num_writes = kSpdyStreamInitialWindowSize / kMaxSpdyFrameChunkSize + 3;
+ size_t num_writes = initial_window_size / kMaxSpdyFrameChunkSize + 3;
// Calculate last frame's size; 0 size data frame is legal.
- size_t last_frame_size =
- kSpdyStreamInitialWindowSize % kMaxSpdyFrameChunkSize;
+ size_t last_frame_size = initial_window_size % kMaxSpdyFrameChunkSize;
// Construct content for a data frame of maximum size.
std::string content(kMaxSpdyFrameChunkSize, 'a');
scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost(
- kRequestUrl, 1, kSpdyStreamInitialWindowSize + kUploadDataSize,
- LOWEST, NULL, 0));
+ kRequestUrl, 1, initial_window_size + kUploadDataSize, LOWEST, NULL, 0));
// Full frames.
scoped_ptr<SpdyFrame> body1(
@@ -6236,8 +6240,7 @@
// rest of the data.
SettingsMap settings;
settings[SETTINGS_INITIAL_WINDOW_SIZE] =
- SettingsFlagsAndValue(
- SETTINGS_FLAG_NONE, kSpdyStreamInitialWindowSize * 2);
+ SettingsFlagsAndValue(SETTINGS_FLAG_NONE, initial_window_size * 2);
scoped_ptr<SpdyFrame> settings_frame_large(
spdy_util_.ConstructSpdySettings(settings));
@@ -6265,7 +6268,7 @@
vector_as_array(&writes), writes.size());
ScopedVector<UploadElementReader> element_readers;
- std::string upload_data_string(kSpdyStreamInitialWindowSize, 'a');
+ std::string upload_data_string(initial_window_size, 'a');
upload_data_string.append(kUploadData, kUploadDataSize);
element_readers.push_back(new UploadBytesElementReader(
upload_data_string.c_str(), upload_data_string.size()));
@@ -6312,21 +6315,21 @@
// Test we correctly handle the case where the SETTINGS frame results in a
// negative send window size.
TEST_P(SpdyNetworkTransactionTest, FlowControlNegativeSendWindowSize) {
+ const int32 initial_window_size =
+ SpdySession::GetInitialWindowSize(GetParam().protocol);
// Number of frames we need to send to zero out the window size: data
// frames plus SYN_STREAM plus the last data frame; also we need another
// data frame that we will send once the SETTING is received, therefore +3.
- size_t num_writes = kSpdyStreamInitialWindowSize / kMaxSpdyFrameChunkSize + 3;
+ size_t num_writes = initial_window_size / kMaxSpdyFrameChunkSize + 3;
// Calculate last frame's size; 0 size data frame is legal.
- size_t last_frame_size =
- kSpdyStreamInitialWindowSize % kMaxSpdyFrameChunkSize;
+ size_t last_frame_size = initial_window_size % kMaxSpdyFrameChunkSize;
// Construct content for a data frame of maximum size.
std::string content(kMaxSpdyFrameChunkSize, 'a');
scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost(
- kRequestUrl, 1, kSpdyStreamInitialWindowSize + kUploadDataSize,
- LOWEST, NULL, 0));
+ kRequestUrl, 1, initial_window_size + kUploadDataSize, LOWEST, NULL, 0));
// Full frames.
scoped_ptr<SpdyFrame> body1(
@@ -6354,16 +6357,15 @@
// negative.
SettingsMap new_settings;
new_settings[SETTINGS_INITIAL_WINDOW_SIZE] =
- SettingsFlagsAndValue(
- SETTINGS_FLAG_NONE, kSpdyStreamInitialWindowSize / 2);
+ SettingsFlagsAndValue(SETTINGS_FLAG_NONE, initial_window_size / 2);
scoped_ptr<SpdyFrame> settings_frame_small(
spdy_util_.ConstructSpdySettings(new_settings));
// Construct read frames for WINDOW_UPDATE that makes the send_window_size
// positive.
scoped_ptr<SpdyFrame> session_window_update_init_size(
- spdy_util_.ConstructSpdyWindowUpdate(0, kSpdyStreamInitialWindowSize));
+ spdy_util_.ConstructSpdyWindowUpdate(0, initial_window_size));
scoped_ptr<SpdyFrame> window_update_init_size(
- spdy_util_.ConstructSpdyWindowUpdate(1, kSpdyStreamInitialWindowSize));
+ spdy_util_.ConstructSpdyWindowUpdate(1, initial_window_size));
reads.push_back(CreateMockRead(*settings_frame_small, i++));
reads.push_back(CreateMockRead(*session_window_update_init_size, i++));
@@ -6386,7 +6388,7 @@
vector_as_array(&writes), writes.size());
ScopedVector<UploadElementReader> element_readers;
- std::string upload_data_string(kSpdyStreamInitialWindowSize, 'a');
+ std::string upload_data_string(initial_window_size, 'a');
upload_data_string.append(kUploadData, kUploadDataSize);
element_readers.push_back(new UploadBytesElementReader(
upload_data_string.c_str(), upload_data_string.size()));
diff --git a/net/spdy/spdy_session.cc b/net/spdy/spdy_session.cc
index 1c9abce..4b91909 100644
--- a/net/spdy/spdy_session.cc
+++ b/net/spdy/spdy_session.cc
@@ -655,7 +655,7 @@
check_ping_status_pending_(false),
send_connection_header_prefix_(false),
flow_control_state_(FLOW_CONTROL_NONE),
- stream_initial_send_window_size_(kSpdyStreamInitialWindowSize),
+ stream_initial_send_window_size_(GetInitialWindowSize(default_protocol)),
stream_initial_recv_window_size_(stream_initial_recv_window_size == 0
? kDefaultInitialRecvWindowSize
: stream_initial_recv_window_size),
@@ -729,6 +729,7 @@
connection_->socket()->GetNegotiatedProtocol();
if (protocol_negotiated != kProtoUnknown) {
protocol_ = protocol_negotiated;
+ stream_initial_send_window_size_ = GetInitialWindowSize(protocol_);
}
DCHECK_GE(protocol_, kProtoSPDYMinimumVersion);
DCHECK_LE(protocol_, kProtoSPDYMaximumVersion);
@@ -739,8 +740,8 @@
if (protocol_ >= kProtoSPDY31) {
flow_control_state_ = FLOW_CONTROL_STREAM_AND_SESSION;
- session_send_window_size_ = kSpdySessionInitialWindowSize;
- session_recv_window_size_ = kSpdySessionInitialWindowSize;
+ session_send_window_size_ = GetInitialWindowSize(protocol_);
+ session_recv_window_size_ = GetInitialWindowSize(protocol_);
} else if (protocol_ >= kProtoSPDY3) {
flow_control_state_ = FLOW_CONTROL_STREAM;
} else {
@@ -2778,7 +2779,7 @@
settings_map[SETTINGS_MAX_CONCURRENT_STREAMS] =
SettingsFlagsAndValue(SETTINGS_FLAG_NONE, kMaxConcurrentPushedStreams);
if (flow_control_state_ >= FLOW_CONTROL_STREAM &&
- stream_initial_recv_window_size_ != kSpdyStreamInitialWindowSize) {
+ stream_initial_recv_window_size_ != GetInitialWindowSize(protocol_)) {
settings_map[SETTINGS_INITIAL_WINDOW_SIZE] =
SettingsFlagsAndValue(SETTINGS_FLAG_NONE,
stream_initial_recv_window_size_);
@@ -3195,7 +3196,8 @@
delta_window_size, session_recv_window_size_));
session_unacked_recv_window_bytes_ += delta_window_size;
- if (session_unacked_recv_window_bytes_ > kSpdySessionInitialWindowSize / 2) {
+ if (session_unacked_recv_window_bytes_ >
+ GetInitialWindowSize(protocol_) / 2) {
SendWindowUpdateFrame(kSessionFlowControlStreamId,
session_unacked_recv_window_bytes_,
HIGHEST);
diff --git a/net/spdy/spdy_session.h b/net/spdy/spdy_session.h
index 862918b..06dfae6 100644
--- a/net/spdy/spdy_session.h
+++ b/net/spdy/spdy_session.h
@@ -511,6 +511,10 @@
return buffered_spdy_framer_->GetDataFrameMaximumPayload();
}
+ static int32 GetInitialWindowSize(NextProto protocol) {
+ return protocol < kProtoSPDY4MinimumVersion ? 65536 : 65535;
+ }
+
// https://http2.github.io/http2-spec/#TLSUsage mandates minimum security
// standards for TLS.
bool HasAcceptableTransportSecurity() const;
diff --git a/net/spdy/spdy_session_unittest.cc b/net/spdy/spdy_session_unittest.cc
index 6ec3383..ce53711 100644
--- a/net/spdy/spdy_session_unittest.cc
+++ b/net/spdy/spdy_session_unittest.cc
@@ -1235,7 +1235,7 @@
if (session->flow_control_state_ ==
SpdySession::FLOW_CONTROL_STREAM_AND_SESSION) {
// Unclaimed push body consumed bytes from the session window.
- EXPECT_EQ(kSpdySessionInitialWindowSize - kUploadDataSize,
+ EXPECT_EQ(SpdySession::GetInitialWindowSize(GetParam()) - kUploadDataSize,
session->session_recv_window_size_);
EXPECT_EQ(0, session->session_unacked_recv_window_bytes_);
}
@@ -1254,7 +1254,7 @@
if (session->flow_control_state_ ==
SpdySession::FLOW_CONTROL_STREAM_AND_SESSION) {
// Verify that the session window reclaimed the evicted stream body.
- EXPECT_EQ(kSpdySessionInitialWindowSize,
+ EXPECT_EQ(SpdySession::GetInitialWindowSize(GetParam()),
session->session_recv_window_size_);
EXPECT_EQ(kUploadDataSize, session->session_unacked_recv_window_bytes_);
}
@@ -1553,7 +1553,8 @@
scoped_ptr<SpdyFrame> initial_window_update(
spdy_util_.ConstructSpdyWindowUpdate(
kSessionFlowControlStreamId,
- kDefaultInitialRecvWindowSize - kSpdySessionInitialWindowSize));
+ kDefaultInitialRecvWindowSize -
+ SpdySession::GetInitialWindowSize(GetParam())));
std::vector<MockWrite> writes;
if ((GetParam() >= kProtoSPDY4MinimumVersion) &&
(GetParam() <= kProtoSPDY4MaximumVersion)) {
@@ -3081,9 +3082,9 @@
session->buffered_spdy_framer_->protocol_version());
EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION,
session->flow_control_state());
- EXPECT_EQ(kSpdySessionInitialWindowSize,
+ EXPECT_EQ(SpdySession::GetInitialWindowSize(GetParam()),
session->session_send_window_size_);
- EXPECT_EQ(kSpdySessionInitialWindowSize,
+ EXPECT_EQ(SpdySession::GetInitialWindowSize(GetParam()),
session->session_recv_window_size_);
EXPECT_EQ(0, session->session_unacked_recv_window_bytes_);
}
@@ -3510,16 +3511,16 @@
session_deps_.host_resolver->set_synchronous_mode(true);
+ const int32 initial_window_size =
+ SpdySession::GetInitialWindowSize(GetParam());
const int32 delta_window_size = 100;
MockConnect connect_data(SYNCHRONOUS, OK);
MockRead reads[] = {
MockRead(ASYNC, 0, 1) // EOF
};
- scoped_ptr<SpdyFrame> window_update(
- spdy_util_.ConstructSpdyWindowUpdate(
- kSessionFlowControlStreamId,
- kSpdySessionInitialWindowSize + delta_window_size));
+ scoped_ptr<SpdyFrame> window_update(spdy_util_.ConstructSpdyWindowUpdate(
+ kSessionFlowControlStreamId, initial_window_size + delta_window_size));
MockWrite writes[] = {
CreateMockWrite(*window_update, 0),
};
@@ -3534,18 +3535,17 @@
EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION,
session->flow_control_state());
- EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_);
+ EXPECT_EQ(initial_window_size, session->session_recv_window_size_);
EXPECT_EQ(0, session->session_unacked_recv_window_bytes_);
session->IncreaseRecvWindowSize(delta_window_size);
- EXPECT_EQ(kSpdySessionInitialWindowSize + delta_window_size,
+ EXPECT_EQ(initial_window_size + delta_window_size,
session->session_recv_window_size_);
EXPECT_EQ(delta_window_size, session->session_unacked_recv_window_bytes_);
// Should trigger sending a WINDOW_UPDATE frame.
- session->IncreaseRecvWindowSize(kSpdySessionInitialWindowSize);
- EXPECT_EQ(kSpdySessionInitialWindowSize + delta_window_size +
- kSpdySessionInitialWindowSize,
+ session->IncreaseRecvWindowSize(initial_window_size);
+ EXPECT_EQ(initial_window_size + delta_window_size + initial_window_size,
session->session_recv_window_size_);
EXPECT_EQ(0, session->session_unacked_recv_window_bytes_);
@@ -3553,9 +3553,8 @@
// DecreaseRecvWindowSize() expects |in_io_loop_| to be true.
session->in_io_loop_ = true;
- session->DecreaseRecvWindowSize(
- kSpdySessionInitialWindowSize + delta_window_size +
- kSpdySessionInitialWindowSize);
+ session->DecreaseRecvWindowSize(initial_window_size + delta_window_size +
+ initial_window_size);
session->in_io_loop_ = false;
EXPECT_EQ(0, session->session_recv_window_size_);
EXPECT_EQ(0, session->session_unacked_recv_window_bytes_);
@@ -3584,16 +3583,18 @@
EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION,
session->flow_control_state());
+ const int32 initial_window_size =
+ SpdySession::GetInitialWindowSize(GetParam());
const int32 delta_window_size = 100;
- EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_);
+ EXPECT_EQ(initial_window_size, session->session_send_window_size_);
session->IncreaseSendWindowSize(delta_window_size);
- EXPECT_EQ(kSpdySessionInitialWindowSize + delta_window_size,
+ EXPECT_EQ(initial_window_size + delta_window_size,
session->session_send_window_size_);
session->DecreaseSendWindowSize(delta_window_size);
- EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_);
+ EXPECT_EQ(initial_window_size, session->session_send_window_size_);
}
// Incoming data for an inactive stream should not cause the session
@@ -3621,12 +3622,14 @@
EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION,
session->flow_control_state());
- EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_);
+ EXPECT_EQ(SpdySession::GetInitialWindowSize(GetParam()),
+ session->session_recv_window_size_);
EXPECT_EQ(0, session->session_unacked_recv_window_bytes_);
data.RunFor(1);
- EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_);
+ EXPECT_EQ(SpdySession::GetInitialWindowSize(GetParam()),
+ session->session_recv_window_size_);
EXPECT_EQ(kUploadDataSize, session->session_unacked_recv_window_bytes_);
data.RunFor(1);
@@ -3711,7 +3714,9 @@
stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND));
EXPECT_TRUE(stream->HasUrlFromHeaders());
- EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_);
+ const int32 initial_window_size =
+ SpdySession::GetInitialWindowSize(GetParam());
+ EXPECT_EQ(initial_window_size, session->session_recv_window_size_);
EXPECT_EQ(0, session->session_unacked_recv_window_bytes_);
data.RunFor(4);
@@ -3719,7 +3724,7 @@
EXPECT_TRUE(data.at_write_eof());
EXPECT_TRUE(data.at_read_eof());
- EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_);
+ EXPECT_EQ(initial_window_size, session->session_recv_window_size_);
EXPECT_EQ(msg_data_size, session->session_unacked_recv_window_bytes_);
stream->Close();
@@ -3727,7 +3732,7 @@
EXPECT_EQ(OK, delegate.WaitForClose());
- EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_);
+ EXPECT_EQ(initial_window_size, session->session_recv_window_size_);
EXPECT_EQ(msg_data_size, session->session_unacked_recv_window_bytes_);
}
@@ -3786,25 +3791,27 @@
stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND));
EXPECT_TRUE(stream->HasUrlFromHeaders());
- EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_);
+ const int32 initial_window_size =
+ SpdySession::GetInitialWindowSize(GetParam());
+ EXPECT_EQ(initial_window_size, session->session_send_window_size_);
data.RunFor(1);
- EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_);
+ EXPECT_EQ(initial_window_size, session->session_send_window_size_);
data.RunFor(1);
EXPECT_TRUE(data.at_write_eof());
EXPECT_TRUE(data.at_read_eof());
- EXPECT_EQ(kSpdySessionInitialWindowSize - msg_data_size,
+ EXPECT_EQ(initial_window_size - msg_data_size,
session->session_send_window_size_);
// Closing the stream should increase the session's send window.
stream->Close();
EXPECT_EQ(NULL, stream.get());
- EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_);
+ EXPECT_EQ(initial_window_size, session->session_send_window_size_);
EXPECT_EQ(OK, delegate.WaitForClose());
}
@@ -3875,42 +3882,44 @@
stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND));
EXPECT_TRUE(stream->HasUrlFromHeaders());
- EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_);
- EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_);
+ const int32 initial_window_size =
+ SpdySession::GetInitialWindowSize(GetParam());
+ EXPECT_EQ(initial_window_size, session->session_send_window_size_);
+ EXPECT_EQ(initial_window_size, session->session_recv_window_size_);
EXPECT_EQ(0, session->session_unacked_recv_window_bytes_);
data.RunFor(1);
- EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_);
- EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_);
+ EXPECT_EQ(initial_window_size, session->session_send_window_size_);
+ EXPECT_EQ(initial_window_size, session->session_recv_window_size_);
EXPECT_EQ(0, session->session_unacked_recv_window_bytes_);
data.RunFor(1);
- EXPECT_EQ(kSpdySessionInitialWindowSize - msg_data_size,
+ EXPECT_EQ(initial_window_size - msg_data_size,
session->session_send_window_size_);
- EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_);
+ EXPECT_EQ(initial_window_size, session->session_recv_window_size_);
EXPECT_EQ(0, session->session_unacked_recv_window_bytes_);
data.RunFor(1);
- EXPECT_EQ(kSpdySessionInitialWindowSize - msg_data_size,
+ EXPECT_EQ(initial_window_size - msg_data_size,
session->session_send_window_size_);
- EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_);
+ EXPECT_EQ(initial_window_size, session->session_recv_window_size_);
EXPECT_EQ(0, session->session_unacked_recv_window_bytes_);
data.RunFor(1);
- EXPECT_EQ(kSpdySessionInitialWindowSize - msg_data_size,
+ EXPECT_EQ(initial_window_size - msg_data_size,
session->session_send_window_size_);
- EXPECT_EQ(kSpdySessionInitialWindowSize - msg_data_size,
+ EXPECT_EQ(initial_window_size - msg_data_size,
session->session_recv_window_size_);
EXPECT_EQ(0, session->session_unacked_recv_window_bytes_);
data.RunFor(1);
- EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_);
- EXPECT_EQ(kSpdySessionInitialWindowSize - msg_data_size,
+ EXPECT_EQ(initial_window_size, session->session_send_window_size_);
+ EXPECT_EQ(initial_window_size - msg_data_size,
session->session_recv_window_size_);
EXPECT_EQ(0, session->session_unacked_recv_window_bytes_);
@@ -3921,8 +3930,8 @@
// Draining the delegate's read queue should increase the session's
// receive window.
- EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_);
- EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_);
+ EXPECT_EQ(initial_window_size, session->session_send_window_size_);
+ EXPECT_EQ(initial_window_size, session->session_recv_window_size_);
EXPECT_EQ(msg_data_size, session->session_unacked_recv_window_bytes_);
stream->Close();
@@ -3930,8 +3939,8 @@
EXPECT_EQ(OK, delegate.WaitForClose());
- EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_);
- EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_);
+ EXPECT_EQ(initial_window_size, session->session_send_window_size_);
+ EXPECT_EQ(initial_window_size, session->session_recv_window_size_);
EXPECT_EQ(msg_data_size, session->session_unacked_recv_window_bytes_);
}
diff --git a/net/spdy/spdy_stream_unittest.cc b/net/spdy/spdy_stream_unittest.cc
index e8915bb..b8638d9 100644
--- a/net/spdy/spdy_stream_unittest.cc
+++ b/net/spdy/spdy_stream_unittest.cc
@@ -186,12 +186,9 @@
base::WeakPtr<SpdySession> spdy_session(CreateDefaultSpdySession());
// Conjure up a stream.
- SpdyStream stream(SPDY_PUSH_STREAM,
- spdy_session,
- GURL(),
- DEFAULT_PRIORITY,
- kSpdyStreamInitialWindowSize,
- kSpdyStreamInitialWindowSize,
+ SpdyStream stream(SPDY_PUSH_STREAM, spdy_session, GURL(), DEFAULT_PRIORITY,
+ SpdySession::GetInitialWindowSize(kProtoSPDY31),
+ SpdySession::GetInitialWindowSize(kProtoSPDY31),
BoundNetLog());
stream.set_stream_id(2);
EXPECT_FALSE(stream.HasUrlFromHeaders());
diff --git a/net/spdy/spdy_test_util_common.cc b/net/spdy/spdy_test_util_common.cc
index 9543e64..f0765a0 100644
--- a/net/spdy/spdy_test_util_common.cc
+++ b/net/spdy/spdy_test_util_common.cc
@@ -367,7 +367,8 @@
enable_ping(false),
enable_user_alternate_protocol_ports(false),
protocol(protocol),
- stream_initial_recv_window_size(kSpdyStreamInitialWindowSize),
+ stream_initial_recv_window_size(
+ SpdySession::GetInitialWindowSize(protocol)),
time_func(&base::TimeTicks::Now),
force_spdy_over_ssl(false),
force_spdy_always(false),
@@ -384,8 +385,8 @@
host_resolver->set_synchronous_mode(true);
}
-SpdySessionDependencies::SpdySessionDependencies(
- NextProto protocol, ProxyService* proxy_service)
+SpdySessionDependencies::SpdySessionDependencies(NextProto protocol,
+ ProxyService* proxy_service)
: host_resolver(new MockHostResolver),
cert_verifier(new MockCertVerifier),
transport_security_state(new TransportSecurityState),
@@ -400,7 +401,8 @@
enable_ping(false),
enable_user_alternate_protocol_ports(false),
protocol(protocol),
- stream_initial_recv_window_size(kSpdyStreamInitialWindowSize),
+ stream_initial_recv_window_size(
+ SpdySession::GetInitialWindowSize(protocol)),
time_func(&base::TimeTicks::Now),
force_spdy_over_ssl(false),
force_spdy_always(false),
diff --git a/net/ssl/openssl_platform_key_mac.cc b/net/ssl/openssl_platform_key_mac.cc
index d369244..34857af 100644
--- a/net/ssl/openssl_platform_key_mac.cc
+++ b/net/ssl/openssl_platform_key_mac.cc
@@ -4,7 +4,9 @@
#include "net/ssl/openssl_platform_key.h"
+#include <openssl/ec_key.h>
#include <openssl/err.h>
+#include <openssl/engine.h>
#include <openssl/evp.h>
#include <openssl/rsa.h>
diff --git a/net/ssl/openssl_platform_key_win.cc b/net/ssl/openssl_platform_key_win.cc
index c7db5cb..8c9589a 100644
--- a/net/ssl/openssl_platform_key_win.cc
+++ b/net/ssl/openssl_platform_key_win.cc
@@ -4,15 +4,707 @@
#include "net/ssl/openssl_platform_key.h"
+#include <windows.h>
+#include <NCrypt.h>
+
+#include <string.h>
+
+#include <algorithm>
+#include <vector>
+
+#include <openssl/bn.h>
+#include <openssl/digest.h>
+#include <openssl/ec_key.h>
+#include <openssl/err.h>
+#include <openssl/engine.h>
+#include <openssl/evp.h>
+#include <openssl/md5.h>
+#include <openssl/obj_mac.h>
+#include <openssl/rsa.h>
+#include <openssl/sha.h>
+
+#include "base/debug/debugger.h"
+#include "base/debug/stack_trace.h"
+#include "base/lazy_instance.h"
#include "base/logging.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/win/windows_version.h"
+#include "crypto/scoped_capi_types.h"
+#include "crypto/wincrypt_shim.h"
+#include "net/base/net_errors.h"
+#include "net/cert/x509_certificate.h"
+#include "net/ssl/openssl_ssl_util.h"
namespace net {
+namespace {
+
+using NCryptFreeObjectFunc = SECURITY_STATUS(WINAPI*)(NCRYPT_HANDLE);
+using NCryptGetPropertyFunc =
+ SECURITY_STATUS(WINAPI*)(NCRYPT_HANDLE, // hObject
+ LPCWSTR, // pszProperty
+ PBYTE, // pbOutput
+ DWORD, // cbOutput
+ DWORD*, // pcbResult
+ DWORD); // dwFlags
+using NCryptSignHashFunc =
+ SECURITY_STATUS(WINAPI*)(NCRYPT_KEY_HANDLE, // hKey
+ VOID*, // pPaddingInfo
+ PBYTE, // pbHashValue
+ DWORD, // cbHashValue
+ PBYTE, // pbSignature
+ DWORD, // cbSignature
+ DWORD*, // pcbResult
+ DWORD); // dwFlags
+
+class CNGFunctions {
+ public:
+ CNGFunctions()
+ : ncrypt_free_object_(nullptr),
+ ncrypt_get_property_(nullptr),
+ ncrypt_sign_hash_(nullptr) {
+ HMODULE ncrypt = GetModuleHandle(L"ncrypt.dll");
+ if (ncrypt != nullptr) {
+ ncrypt_free_object_ = reinterpret_cast<NCryptFreeObjectFunc>(
+ GetProcAddress(ncrypt, "NCryptFreeObject"));
+ ncrypt_get_property_ = reinterpret_cast<NCryptGetPropertyFunc>(
+ GetProcAddress(ncrypt, "NCryptGetProperty"));
+ ncrypt_sign_hash_ = reinterpret_cast<NCryptSignHashFunc>(
+ GetProcAddress(ncrypt, "NCryptSignHash"));
+ }
+ }
+
+ NCryptFreeObjectFunc ncrypt_free_object() const {
+ return ncrypt_free_object_;
+ }
+
+ NCryptGetPropertyFunc ncrypt_get_property() const {
+ return ncrypt_get_property_;
+ }
+
+ NCryptSignHashFunc ncrypt_sign_hash() const { return ncrypt_sign_hash_; }
+
+ private:
+ NCryptFreeObjectFunc ncrypt_free_object_;
+ NCryptGetPropertyFunc ncrypt_get_property_;
+ NCryptSignHashFunc ncrypt_sign_hash_;
+};
+
+base::LazyInstance<CNGFunctions>::Leaky g_cng_functions =
+ LAZY_INSTANCE_INITIALIZER;
+
+struct CERT_KEY_CONTEXTDeleter {
+ void operator()(PCERT_KEY_CONTEXT key) {
+ if (key->dwKeySpec == CERT_NCRYPT_KEY_SPEC) {
+ g_cng_functions.Get().ncrypt_free_object()(key->hNCryptKey);
+ } else {
+ CryptReleaseContext(key->hCryptProv, 0);
+ }
+ delete key;
+ }
+};
+
+using ScopedCERT_KEY_CONTEXT =
+ scoped_ptr<CERT_KEY_CONTEXT, CERT_KEY_CONTEXTDeleter>;
+
+// KeyExData contains the data that is contained in the EX_DATA of the
+// RSA and ECDSA objects that are created to wrap Windows system keys.
+struct KeyExData {
+ KeyExData(ScopedCERT_KEY_CONTEXT key, DWORD key_length)
+ : key(key.Pass()), key_length(key_length) {}
+
+ ScopedCERT_KEY_CONTEXT key;
+ DWORD key_length;
+};
+
+// ExDataDup is called when one of the RSA or EC_KEY objects is
+// duplicated. This is not supported and should never happen.
+int ExDataDup(CRYPTO_EX_DATA* to,
+ const CRYPTO_EX_DATA* from,
+ void** from_d,
+ int idx,
+ long argl,
+ void* argp) {
+ CHECK_EQ((void*)nullptr, *from_d);
+ return 0;
+}
+
+// ExDataFree is called when one of the RSA or EC_KEY objects is freed.
+void ExDataFree(void* parent,
+ void* ptr,
+ CRYPTO_EX_DATA* ex_data,
+ int idx,
+ long argl,
+ void* argp) {
+ KeyExData* data = reinterpret_cast<KeyExData*>(ptr);
+ delete data;
+}
+
+extern const RSA_METHOD win_rsa_method;
+extern const ECDSA_METHOD win_ecdsa_method;
+
+// BoringSSLEngine is a BoringSSL ENGINE that implements RSA and ECDSA
+// by forwarding the requested operations to CAPI or CNG.
+class BoringSSLEngine {
+ public:
+ BoringSSLEngine()
+ : rsa_index_(RSA_get_ex_new_index(0 /* argl */,
+ nullptr /* argp */,
+ nullptr /* new_func */,
+ ExDataDup,
+ ExDataFree)),
+ ec_key_index_(EC_KEY_get_ex_new_index(0 /* argl */,
+ nullptr /* argp */,
+ nullptr /* new_func */,
+ ExDataDup,
+ ExDataFree)),
+ engine_(ENGINE_new()) {
+ ENGINE_set_RSA_method(engine_, &win_rsa_method, sizeof(win_rsa_method));
+ ENGINE_set_ECDSA_method(engine_, &win_ecdsa_method,
+ sizeof(win_ecdsa_method));
+ }
+
+ int rsa_ex_index() const { return rsa_index_; }
+ int ec_key_ex_index() const { return ec_key_index_; }
+
+ const ENGINE* engine() const { return engine_; }
+
+ private:
+ const int rsa_index_;
+ const int ec_key_index_;
+ ENGINE* const engine_;
+};
+
+base::LazyInstance<BoringSSLEngine>::Leaky global_boringssl_engine =
+ LAZY_INSTANCE_INITIALIZER;
+
+// Custom RSA_METHOD that uses the platform APIs for signing.
+
+const KeyExData* RsaGetExData(const RSA* rsa) {
+ return reinterpret_cast<const KeyExData*>(
+ RSA_get_ex_data(rsa, global_boringssl_engine.Get().rsa_ex_index()));
+}
+
+size_t RsaMethodSize(const RSA* rsa) {
+ const KeyExData* ex_data = RsaGetExData(rsa);
+ return (ex_data->key_length + 7) / 8;
+}
+
+// Signs |in| using |rsa| with PKCS #1 padding. If |hash_nid| is NID_md5_sha1,
+// |in| is a TLS MD5/SHA-1 concatenation and should be signed as-is. Otherwise
+// |in| is a standard hash function and should be prefixed with the
+// corresponding DigestInfo before signing. The signature is written to |out|
+// and its length written to |*out_len|. This function returns true on success
+// and false on failure.
+bool RsaSignPKCS1(const RSA* rsa,
+ int hash_nid,
+ const uint8_t* in,
+ size_t in_len,
+ uint8_t* out,
+ size_t max_out,
+ size_t* out_len) {
+ const KeyExData* ex_data = RsaGetExData(rsa);
+ if (!ex_data) {
+ NOTREACHED();
+ OPENSSL_PUT_ERROR(RSA, RSA_sign, ERR_R_INTERNAL_ERROR);
+ return false;
+ }
+
+ if (ex_data->key->dwKeySpec == CERT_NCRYPT_KEY_SPEC) {
+ BCRYPT_PKCS1_PADDING_INFO rsa_padding_info;
+ switch (hash_nid) {
+ case NID_md5_sha1:
+ rsa_padding_info.pszAlgId = nullptr;
+ break;
+ case NID_sha1:
+ rsa_padding_info.pszAlgId = BCRYPT_SHA1_ALGORITHM;
+ break;
+ case NID_sha256:
+ rsa_padding_info.pszAlgId = BCRYPT_SHA256_ALGORITHM;
+ break;
+ case NID_sha384:
+ rsa_padding_info.pszAlgId = BCRYPT_SHA384_ALGORITHM;
+ break;
+ case NID_sha512:
+ rsa_padding_info.pszAlgId = BCRYPT_SHA512_ALGORITHM;
+ break;
+ default:
+ OPENSSL_PUT_ERROR(RSA, RSA_sign, RSA_R_UNKNOWN_ALGORITHM_TYPE);
+ return false;
+ }
+
+ DWORD signature_len;
+ SECURITY_STATUS ncrypt_status = g_cng_functions.Get().ncrypt_sign_hash()(
+ ex_data->key->hNCryptKey, &rsa_padding_info, const_cast<PBYTE>(in),
+ in_len, out, max_out, &signature_len, BCRYPT_PAD_PKCS1);
+ if (FAILED(ncrypt_status) || signature_len == 0) {
+ OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
+ return false;
+ }
+ *out_len = signature_len;
+ return true;
+ }
+
+ ALG_ID hash_alg;
+ switch (hash_nid) {
+ case NID_md5_sha1:
+ hash_alg = CALG_SSL3_SHAMD5;
+ break;
+ case NID_sha1:
+ hash_alg = CALG_SHA1;
+ break;
+ case NID_sha256:
+ hash_alg = CALG_SHA_256;
+ break;
+ case NID_sha384:
+ hash_alg = CALG_SHA_384;
+ break;
+ case NID_sha512:
+ hash_alg = CALG_SHA_512;
+ break;
+ default:
+ OPENSSL_PUT_ERROR(RSA, RSA_sign, RSA_R_UNKNOWN_ALGORITHM_TYPE);
+ return false;
+ }
+
+ HCRYPTHASH hash;
+ if (!CryptCreateHash(ex_data->key->hCryptProv, hash_alg, 0, 0, &hash)) {
+ PLOG(ERROR) << "CreateCreateHash failed";
+ OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
+ return false;
+ }
+ DWORD hash_len;
+ DWORD arg_len = sizeof(hash_len);
+ if (!CryptGetHashParam(hash, HP_HASHSIZE, reinterpret_cast<BYTE*>(&hash_len),
+ &arg_len, 0)) {
+ PLOG(ERROR) << "CryptGetHashParam HP_HASHSIZE failed";
+ OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
+ return false;
+ }
+ if (hash_len != in_len) {
+ OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
+ return false;
+ }
+ if (!CryptSetHashParam(hash, HP_HASHVAL, const_cast<BYTE*>(in), 0)) {
+ PLOG(ERROR) << "CryptSetHashParam HP_HASHVAL failed";
+ OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
+ return false;
+ }
+ DWORD signature_len = max_out;
+ if (!CryptSignHash(hash, ex_data->key->dwKeySpec, nullptr, 0, out,
+ &signature_len)) {
+ PLOG(ERROR) << "CryptSignHash failed";
+ OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
+ return false;
+ }
+
+ /* CryptoAPI signs in little-endian, so reverse it. */
+ std::reverse(out, out + signature_len);
+ *out_len = signature_len;
+ return true;
+}
+
+int RsaMethodSign(int hash_nid,
+ const uint8_t* in,
+ unsigned in_len,
+ uint8_t* out,
+ unsigned* out_len,
+ const RSA* rsa) {
+ // TOD(davidben): Switch BoringSSL's sign hook to using size_t rather than
+ // unsigned.
+ size_t len;
+ if (!RsaSignPKCS1(rsa, hash_nid, in, in_len, out, RSA_size(rsa), &len))
+ return 0;
+ *out_len = len;
+ return 1;
+}
+
+int RsaMethodEncrypt(RSA* rsa,
+ size_t* out_len,
+ uint8_t* out,
+ size_t max_out,
+ const uint8_t* in,
+ size_t in_len,
+ int padding) {
+ NOTIMPLEMENTED();
+ OPENSSL_PUT_ERROR(RSA, encrypt, RSA_R_UNKNOWN_ALGORITHM_TYPE);
+ return 0;
+}
+
+int RsaMethodSignRaw(RSA* rsa,
+ size_t* out_len,
+ uint8_t* out,
+ size_t max_out,
+ const uint8_t* in,
+ size_t in_len,
+ int padding) {
+ DCHECK_EQ(RSA_PKCS1_PADDING, padding);
+ if (padding != RSA_PKCS1_PADDING) {
+ OPENSSL_PUT_ERROR(RSA, sign_raw, RSA_R_UNKNOWN_PADDING_TYPE);
+ return 0;
+ }
+
+ // BoringSSL calls only sign_raw, not sign, in pre-TLS-1.2 MD5/SHA1
+ // signatures. This hook is implemented only for that case.
+ //
+ // TODO(davidben): Make client auth in BoringSSL call RSA_sign with
+ // NID_md5_sha1. https://crbug.com/437023
+ if (in_len != MD5_DIGEST_LENGTH + SHA_DIGEST_LENGTH) {
+ OPENSSL_PUT_ERROR(RSA, sign_raw, RSA_R_INVALID_MESSAGE_LENGTH);
+ return 0;
+ }
+ if (!RsaSignPKCS1(rsa, NID_md5_sha1, in, in_len, out, max_out, out_len))
+ return 0;
+ return 1;
+}
+
+int RsaMethodDecrypt(RSA* rsa,
+ size_t* out_len,
+ uint8_t* out,
+ size_t max_out,
+ const uint8_t* in,
+ size_t in_len,
+ int padding) {
+ NOTIMPLEMENTED();
+ OPENSSL_PUT_ERROR(RSA, decrypt, RSA_R_UNKNOWN_ALGORITHM_TYPE);
+ return 0;
+}
+
+int RsaMethodVerifyRaw(RSA* rsa,
+ size_t* out_len,
+ uint8_t* out,
+ size_t max_out,
+ const uint8_t* in,
+ size_t in_len,
+ int padding) {
+ NOTIMPLEMENTED();
+ OPENSSL_PUT_ERROR(RSA, verify_raw, RSA_R_UNKNOWN_ALGORITHM_TYPE);
+ return 0;
+}
+
+int RsaMethodSupportsDigest(const RSA* rsa, const EVP_MD* md) {
+ const KeyExData* ex_data = RsaGetExData(rsa);
+ if (!ex_data) {
+ NOTREACHED();
+ return 0;
+ }
+
+ int hash_nid = EVP_MD_type(md);
+ if (ex_data->key->dwKeySpec == CERT_NCRYPT_KEY_SPEC) {
+ // Only hashes which appear in RsaSignPKCS1 are supported.
+ if (hash_nid != NID_sha1 && hash_nid != NID_sha256 &&
+ hash_nid != NID_sha384 && hash_nid != NID_sha512) {
+ return 0;
+ }
+
+ // If the key is a 1024-bit RSA, assume conservatively that it may only be
+ // able to sign SHA-1 hashes. This is the case for older Estonian ID cards
+ // that have 1024-bit RSA keys.
+ //
+ // CNG does provide NCryptIsAlgSupported and NCryptEnumAlgorithms functions,
+ // however they seem to both return NTE_NOT_SUPPORTED when querying the
+ // NCRYPT_PROV_HANDLE at the key's NCRYPT_PROVIDER_HANDLE_PROPERTY.
+ if (ex_data->key_length <= 1024 && hash_nid != NID_sha1)
+ return 0;
+
+ return 1;
+ } else {
+ // If the key is in CAPI, assume conservatively that the CAPI service
+ // provider may only be able to sign SHA-1 hashes.
+ return hash_nid == NID_sha1;
+ }
+}
+
+const RSA_METHOD win_rsa_method = {
+ {
+ 0, // references
+ 1, // is_static
+ },
+ nullptr, // app_data
+
+ nullptr, // init
+ nullptr, // finish
+ RsaMethodSize,
+ RsaMethodSign,
+ nullptr, // verify
+ RsaMethodEncrypt,
+ RsaMethodSignRaw,
+ RsaMethodDecrypt,
+ RsaMethodVerifyRaw,
+ nullptr, // private_transform
+ nullptr, // mod_exp
+ nullptr, // bn_mod_exp
+ RSA_FLAG_OPAQUE,
+ nullptr, // keygen
+ RsaMethodSupportsDigest,
+};
+
+// Custom ECDSA_METHOD that uses the platform APIs.
+// Note that for now, only signing through ECDSA_sign() is really supported.
+// all other method pointers are either stubs returning errors, or no-ops.
+
+const KeyExData* EcKeyGetExData(const EC_KEY* ec_key) {
+ return reinterpret_cast<const KeyExData*>(EC_KEY_get_ex_data(
+ ec_key, global_boringssl_engine.Get().ec_key_ex_index()));
+}
+
+size_t EcdsaMethodGroupOrderSize(const EC_KEY* ec_key) {
+ const KeyExData* ex_data = EcKeyGetExData(ec_key);
+ // Windows doesn't distinguish the sizes of the curve's degree (which
+ // determines the size of a point on the curve) and the base point's order
+ // (which determines the size of a scalar). For P-256, P-384, and P-521, these
+ // two sizes are the same.
+ //
+ // See
+ // http://msdn.microsoft.com/en-us/library/windows/desktop/aa375520(v=vs.85).aspx
+ // which uses the same length for both.
+ return (ex_data->key_length + 7) / 8;
+}
+
+int EcdsaMethodSign(const uint8_t* digest,
+ size_t digest_len,
+ uint8_t* out_sig,
+ unsigned int* out_sig_len,
+ EC_KEY* ec_key) {
+ const KeyExData* ex_data = EcKeyGetExData(ec_key);
+ // Only CNG supports ECDSA.
+ if (!ex_data || ex_data->key->dwKeySpec != CERT_NCRYPT_KEY_SPEC) {
+ NOTREACHED();
+ OPENSSL_PUT_ERROR(RSA, sign_raw, ERR_R_INTERNAL_ERROR);
+ return 0;
+ }
+
+ size_t degree = (ex_data->key_length + 7) / 8;
+ if (degree == 0) {
+ NOTREACHED();
+ OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
+ return 0;
+ }
+ std::vector<uint8_t> raw_sig(degree * 2);
+
+ DWORD signature_len;
+ SECURITY_STATUS ncrypt_status = g_cng_functions.Get().ncrypt_sign_hash()(
+ ex_data->key->hNCryptKey, nullptr, const_cast<PBYTE>(digest), digest_len,
+ &raw_sig[0], raw_sig.size(), &signature_len, 0);
+ if (FAILED(ncrypt_status) || signature_len != raw_sig.size()) {
+ OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
+ return 0;
+ }
+
+ // Convert the RAW ECDSA signature to a DER-encoded ECDSA-Sig-Value.
+ crypto::ScopedECDSA_SIG sig(ECDSA_SIG_new());
+ if (!sig) {
+ OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
+ return 0;
+ }
+ sig->r = BN_bin2bn(&raw_sig[0], degree, nullptr);
+ sig->s = BN_bin2bn(&raw_sig[degree], degree, nullptr);
+ if (!sig->r || !sig->s) {
+ OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
+ return 0;
+ }
+
+ // Ensure the DER-encoded signature fits in the bounds.
+ int len = i2d_ECDSA_SIG(sig.get(), nullptr);
+ if (len < 0 || len > ECDSA_size(ec_key)) {
+ OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
+ return 0;
+ }
+
+ len = i2d_ECDSA_SIG(sig.get(), &out_sig);
+ if (len < 0) {
+ OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
+ return 0;
+ }
+ *out_sig_len = len;
+ return 1;
+}
+
+int EcdsaMethodVerify(const uint8_t* digest,
+ size_t digest_len,
+ const uint8_t* sig,
+ size_t sig_len,
+ EC_KEY* eckey) {
+ NOTIMPLEMENTED();
+ OPENSSL_PUT_ERROR(ECDSA, ECDSA_do_verify, ECDSA_R_NOT_IMPLEMENTED);
+ return 0;
+}
+
+const ECDSA_METHOD win_ecdsa_method = {
+ {
+ 0, // references
+ 1, // is_static
+ },
+ nullptr, // app_data
+
+ nullptr, // init
+ nullptr, // finish
+ EcdsaMethodGroupOrderSize,
+ EcdsaMethodSign,
+ EcdsaMethodVerify,
+ ECDSA_FLAG_OPAQUE,
+};
+
+// Determines the key type and length of |key|. The type is returned as an
+// OpenSSL EVP_PKEY type. The key length for RSA key is the size of the RSA
+// modulus in bits. For an ECDSA key, it is the number of bits to represent the
+// group order. It returns true on success and false on failure.
+bool GetKeyInfo(PCERT_KEY_CONTEXT key, int* out_type, DWORD* out_length) {
+ if (key->dwKeySpec == CERT_NCRYPT_KEY_SPEC) {
+ DWORD prop_len;
+ SECURITY_STATUS status = g_cng_functions.Get().ncrypt_get_property()(
+ key->hNCryptKey, NCRYPT_ALGORITHM_GROUP_PROPERTY, nullptr, 0, &prop_len,
+ 0);
+ if (FAILED(status) || prop_len == 0 || prop_len % 2 != 0) {
+ LOG(ERROR) << "Could not query CNG key type: " << status;
+ return false;
+ }
+
+ std::vector<BYTE> prop_buf(prop_len);
+ status = g_cng_functions.Get().ncrypt_get_property()(
+ key->hNCryptKey, NCRYPT_ALGORITHM_GROUP_PROPERTY, &prop_buf[0],
+ prop_buf.size(), &prop_len, 0);
+ if (FAILED(status) || prop_len == 0 || prop_len % 2 != 0) {
+ LOG(ERROR) << "Could not query CNG key type: " << status;
+ return false;
+ }
+
+ int type;
+ const wchar_t* alg = reinterpret_cast<const wchar_t*>(&prop_buf[0]);
+ if (wcsncmp(NCRYPT_RSA_ALGORITHM_GROUP, alg, prop_len / 2) == 0) {
+ type = EVP_PKEY_RSA;
+ } else if (wcsncmp(NCRYPT_ECDSA_ALGORITHM_GROUP, alg, prop_len / 2) == 0 ||
+ wcsncmp(NCRYPT_ECDH_ALGORITHM_GROUP, alg, prop_len / 2) == 0) {
+ // Importing an ECDSA key via PKCS #12 seems to label it as ECDH rather
+ // than ECDSA, so also allow ECDH.
+ type = EVP_PKEY_EC;
+ } else {
+ LOG(ERROR) << "Unknown CNG key type: "
+ << std::wstring(alg, wcsnlen(alg, prop_len / 2));
+ return false;
+ }
+
+ DWORD length;
+ prop_len;
+ status = g_cng_functions.Get().ncrypt_get_property()(
+ key->hNCryptKey, NCRYPT_LENGTH_PROPERTY,
+ reinterpret_cast<BYTE*>(&length), sizeof(DWORD), &prop_len, 0);
+ if (FAILED(status)) {
+ LOG(ERROR) << "Could not get CNG key length " << status;
+ return false;
+ }
+ DCHECK_EQ(sizeof(DWORD), prop_len);
+
+ *out_type = type;
+ *out_length = length;
+ return true;
+ }
+
+ crypto::ScopedHCRYPTKEY hcryptkey;
+ if (!CryptGetUserKey(key->hCryptProv, key->dwKeySpec, hcryptkey.receive())) {
+ PLOG(ERROR) << "Could not get CAPI key handle";
+ return false;
+ }
+
+ ALG_ID alg_id;
+ DWORD prop_len = sizeof(alg_id);
+ if (!CryptGetKeyParam(hcryptkey.get(), KP_ALGID,
+ reinterpret_cast<BYTE*>(&alg_id), &prop_len, 0)) {
+ PLOG(ERROR) << "Could not query CAPI key type";
+ return false;
+ }
+
+ if (alg_id != CALG_RSA_SIGN && alg_id != CALG_RSA_KEYX) {
+ LOG(ERROR) << "Unknown CAPI key type: " << alg_id;
+ return false;
+ }
+
+ DWORD length;
+ prop_len = sizeof(DWORD);
+ if (!CryptGetKeyParam(hcryptkey.get(), KP_KEYLEN,
+ reinterpret_cast<BYTE*>(&length), &prop_len, 0)) {
+ PLOG(ERROR) << "Could not get CAPI key length";
+ return false;
+ }
+ DCHECK_EQ(sizeof(DWORD), prop_len);
+
+ *out_type = EVP_PKEY_RSA;
+ *out_length = length;
+ return true;
+}
+
+crypto::ScopedEVP_PKEY CreateRSAWrapper(ScopedCERT_KEY_CONTEXT key,
+ DWORD key_length) {
+ crypto::ScopedRSA rsa(RSA_new_method(global_boringssl_engine.Get().engine()));
+ if (!rsa)
+ return nullptr;
+
+ RSA_set_ex_data(rsa.get(), global_boringssl_engine.Get().rsa_ex_index(),
+ new KeyExData(key.Pass(), key_length));
+
+ crypto::ScopedEVP_PKEY pkey(EVP_PKEY_new());
+ if (!pkey || !EVP_PKEY_set1_RSA(pkey.get(), rsa.get()))
+ return nullptr;
+ return pkey.Pass();
+}
+
+crypto::ScopedEVP_PKEY CreateECDSAWrapper(ScopedCERT_KEY_CONTEXT key,
+ DWORD key_length) {
+ crypto::ScopedEC_KEY ec_key(
+ EC_KEY_new_method(global_boringssl_engine.Get().engine()));
+ if (!ec_key)
+ return nullptr;
+
+ EC_KEY_set_ex_data(ec_key.get(),
+ global_boringssl_engine.Get().ec_key_ex_index(),
+ new KeyExData(key.Pass(), key_length));
+
+ crypto::ScopedEVP_PKEY pkey(EVP_PKEY_new());
+ if (!pkey || !EVP_PKEY_set1_EC_KEY(pkey.get(), ec_key.get()))
+ return nullptr;
+
+ return pkey.Pass();
+}
+
+} // namespace
+
crypto::ScopedEVP_PKEY FetchClientCertPrivateKey(
const X509Certificate* certificate) {
- // TODO(davidben): Implement on Windows.
- NOTIMPLEMENTED();
- return crypto::ScopedEVP_PKEY();
+ PCCERT_CONTEXT cert_context = certificate->os_cert_handle();
+
+ HCRYPTPROV_OR_NCRYPT_KEY_HANDLE crypt_prov = 0;
+ DWORD key_spec = 0;
+ BOOL must_free = FALSE;
+ DWORD flags = 0;
+ if (base::win::GetVersion() >= base::win::VERSION_VISTA)
+ flags |= CRYPT_ACQUIRE_PREFER_NCRYPT_KEY_FLAG;
+
+ if (!CryptAcquireCertificatePrivateKey(cert_context, flags, nullptr,
+ &crypt_prov, &key_spec, &must_free)) {
+ PLOG(WARNING) << "Could not acquire private key";
+ return nullptr;
+ }
+
+ // Should never get a cached handle back - ownership must always be
+ // transferred.
+ CHECK_EQ(must_free, TRUE);
+ ScopedCERT_KEY_CONTEXT key(new CERT_KEY_CONTEXT);
+ key->dwKeySpec = key_spec;
+ key->hCryptProv = crypt_prov;
+
+ int key_type;
+ DWORD key_length;
+ if (!GetKeyInfo(key.get(), &key_type, &key_length))
+ return nullptr;
+
+ switch (key_type) {
+ case EVP_PKEY_RSA:
+ return CreateRSAWrapper(key.Pass(), key_length);
+ case EVP_PKEY_EC:
+ return CreateECDSAWrapper(key.Pass(), key_length);
+ default:
+ return nullptr;
+ }
}
} // namespace net
diff --git a/net/ssl/ssl_connection_status_flags.h b/net/ssl/ssl_connection_status_flags.h
index faae306..e2a8193 100644
--- a/net/ssl/ssl_connection_status_flags.h
+++ b/net/ssl/ssl_connection_status_flags.h
@@ -13,7 +13,6 @@
// Status flags for SSLInfo::connection_status.
enum {
// The lower 16 bits are reserved for the TLS ciphersuite id.
- SSL_CONNECTION_CIPHERSUITE_SHIFT = 0,
SSL_CONNECTION_CIPHERSUITE_MASK = 0xffff,
// The next two bits are reserved for the compression used.
@@ -53,9 +52,8 @@
COMPILE_ASSERT(SSL_CONNECTION_VERSION_MAX - 1 <= SSL_CONNECTION_VERSION_MASK,
SSL_CONNECTION_VERSION_MASK_too_small);
-inline int SSLConnectionStatusToCipherSuite(int connection_status) {
- return (connection_status >> SSL_CONNECTION_CIPHERSUITE_SHIFT) &
- SSL_CONNECTION_CIPHERSUITE_MASK;
+inline uint16 SSLConnectionStatusToCipherSuite(int connection_status) {
+ return static_cast<uint16>(connection_status);
}
inline int SSLConnectionStatusToVersion(int connection_status) {
@@ -63,14 +61,12 @@
SSL_CONNECTION_VERSION_MASK;
}
-inline void SSLConnectionStatusSetCipherSuite(int cipher_suite,
+inline void SSLConnectionStatusSetCipherSuite(uint16 cipher_suite,
int* connection_status) {
// Clear out the old ciphersuite.
- *connection_status &=
- ~(SSL_CONNECTION_CIPHERSUITE_MASK << SSL_CONNECTION_CIPHERSUITE_SHIFT);
+ *connection_status &= ~SSL_CONNECTION_CIPHERSUITE_MASK;
// Set the new ciphersuite.
- *connection_status |= ((cipher_suite & SSL_CONNECTION_CIPHERSUITE_MASK)
- << SSL_CONNECTION_CIPHERSUITE_SHIFT);
+ *connection_status |= cipher_suite;
}
inline void SSLConnectionStatusSetVersion(int version, int* connection_status) {
diff --git a/net/ssl/ssl_connection_status_flags_unittest.cc b/net/ssl/ssl_connection_status_flags_unittest.cc
index 64fea13..98e4f53 100644
--- a/net/ssl/ssl_connection_status_flags_unittest.cc
+++ b/net/ssl/ssl_connection_status_flags_unittest.cc
@@ -15,13 +15,13 @@
int expected_version = SSLConnectionStatusToVersion(connection_status);
SSLConnectionStatusSetCipherSuite(12345, &connection_status);
- EXPECT_EQ(12345, SSLConnectionStatusToCipherSuite(connection_status));
+ EXPECT_EQ(12345U, SSLConnectionStatusToCipherSuite(connection_status));
EXPECT_EQ(expected_version, SSLConnectionStatusToVersion(connection_status));
}
TEST(SSLConnectionStatusTest, SetVersion) {
int connection_status = 0xDEADBEEF;
- int expected_cipher_suite =
+ uint16 expected_cipher_suite =
SSLConnectionStatusToCipherSuite(connection_status);
SSLConnectionStatusSetVersion(SSL_CONNECTION_VERSION_TLS1_2,
diff --git a/net/third_party/nss/ssl.gyp b/net/third_party/nss/ssl.gyp
index d6e2253..64d8551 100644
--- a/net/third_party/nss/ssl.gyp
+++ b/net/third_party/nss/ssl.gyp
@@ -79,6 +79,12 @@
'USE_UTIL_DIRECTLY',
],
'msvs_disabled_warnings': [4018, 4244, 4267],
+ 'variables': {
+ 'clang_warning_flags_unset': [
+ # ssl uses PR_ASSERT(!"foo") instead of PR_ASSERT(false && "foo")
+ '-Wstring-conversion',
+ ],
+ },
'conditions': [
['component == "shared_library"', {
'conditions': [
diff --git a/net/third_party/nss/ssl/BUILD.gn b/net/third_party/nss/ssl/BUILD.gn
index b8fe40f..c958c13 100644
--- a/net/third_party/nss/ssl/BUILD.gn
+++ b/net/third_party/nss/ssl/BUILD.gn
@@ -8,14 +8,6 @@
if (is_mac || is_win) {
defines = [ "NSS_PLATFORM_CLIENT_AUTH" ]
}
-
- if (is_clang) {
- cflags = [
- # There is a broken header guard in /usr/include/nss/secmod.h:
- # https://bugzilla.mozilla.org/show_bug.cgi?id=884072
- "-Wno-header-guard",
- ]
- }
}
component("libssl") {
@@ -105,6 +97,11 @@
libs = [ "Security.framework" ]
}
+ if (is_clang) {
+ # SSL triggers some of these Clang warnings.
+ configs -= [ "//build/config/clang:extra_warnings" ]
+ }
+
if (is_posix) {
sources -= [
"win32err.c",
diff --git a/net/tools/dump_cache/simple_cache_dumper.cc b/net/tools/dump_cache/simple_cache_dumper.cc
index dd5ecbf..9be140d 100644
--- a/net/tools/dump_cache/simple_cache_dumper.cc
+++ b/net/tools/dump_cache/simple_cache_dumper.cc
@@ -10,6 +10,7 @@
#include "base/memory/scoped_ptr.h"
#include "base/message_loop/message_loop.h"
#include "base/message_loop/message_loop_proxy.h"
+#include "base/profiler/scoped_tracker.h"
#include "base/threading/thread.h"
#include "net/base/cache_type.h"
#include "net/base/io_buffer.h"
@@ -260,6 +261,11 @@
}
void SimpleCacheDumper::OnIOComplete(int rv) {
+ // TODO(vadimt): Remove ScopedTracker below once crbug.com/422516 is fixed.
+ tracked_objects::ScopedTracker tracking_profile(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "422516 SimpleCacheDumper::OnIOComplete"));
+
rv = DoLoop(rv);
if (rv != ERR_IO_PENDING) {
diff --git a/net/tools/quic/end_to_end_test.cc b/net/tools/quic/end_to_end_test.cc
index dcc9345..f7efc71 100644
--- a/net/tools/quic/end_to_end_test.cc
+++ b/net/tools/quic/end_to_end_test.cc
@@ -854,8 +854,6 @@
}
TEST_P(EndToEndTest, NegotiateMaxOpenStreams) {
- ValueRestore<bool> old_flag(&FLAGS_quic_allow_more_open_streams, true);
-
// Negotiate 1 max open stream.
client_config_.SetMaxStreamsPerConnection(1, 1);
ASSERT_TRUE(Initialize());
diff --git a/net/tools/quic/quic_client.h b/net/tools/quic/quic_client.h
index 4111b1a..6bf87f9 100644
--- a/net/tools/quic/quic_client.h
+++ b/net/tools/quic/quic_client.h
@@ -246,9 +246,8 @@
bool initialized_;
// If overflow_supported_ is true, this will be the number of packets dropped
- // during the lifetime of the server. This may overflow if enough packets
- // are dropped.
- uint32 packets_dropped_;
+ // during the lifetime of the server.
+ QuicPacketCount packets_dropped_;
// True if the kernel supports SO_RXQ_OVFL, the number of packets dropped
// because the socket would otherwise overflow.
diff --git a/net/tools/quic/quic_server.cc b/net/tools/quic/quic_server.cc
index 2694365..fd24059 100644
--- a/net/tools/quic/quic_server.cc
+++ b/net/tools/quic/quic_server.cc
@@ -204,7 +204,7 @@
bool QuicServer::ReadAndDispatchSinglePacket(int fd,
int port,
ProcessPacketInterface* processor,
- uint32* packets_dropped) {
+ QuicPacketCount* packets_dropped) {
// Allocate some extra space so we can send an error if the client goes over
// the limit.
char buf[2 * kMaxPacketSize];
diff --git a/net/tools/quic/quic_server.h b/net/tools/quic/quic_server.h
index 980f9ba..f8a5533 100644
--- a/net/tools/quic/quic_server.h
+++ b/net/tools/quic/quic_server.h
@@ -58,7 +58,7 @@
// dropped packets.
static bool ReadAndDispatchSinglePacket(int fd, int port,
ProcessPacketInterface* processor,
- uint32* packets_dropped);
+ QuicPacketCount* packets_dropped);
void OnShutdown(EpollServer* eps, int fd) override {}
@@ -74,7 +74,7 @@
bool overflow_supported() { return overflow_supported_; }
- uint32 packets_dropped() { return packets_dropped_; }
+ QuicPacketCount packets_dropped() { return packets_dropped_; }
int port() { return port_; }
@@ -110,7 +110,7 @@
// If overflow_supported_ is true this will be the number of packets dropped
// during the lifetime of the server. This may overflow if enough packets
// are dropped.
- uint32 packets_dropped_;
+ QuicPacketCount packets_dropped_;
// True if the kernel supports SO_RXQ_OVFL, the number of packets dropped
// because the socket would otherwise overflow.
diff --git a/net/tools/quic/quic_server_session_test.cc b/net/tools/quic/quic_server_session_test.cc
index b0ed5d1..4705c05 100644
--- a/net/tools/quic/quic_server_session_test.cc
+++ b/net/tools/quic/quic_server_session_test.cc
@@ -192,7 +192,6 @@
}
TEST_P(QuicServerSessionTest, MaxOpenStreams) {
- ValueRestore<bool> old_flag(&FLAGS_quic_allow_more_open_streams, true);
// Test that the server closes the connection if a client attempts to open too
// many data streams. The server accepts slightly more than the negotiated
// stream limit to deal with rare cases where a client FIN/RST is lost.
@@ -230,7 +229,6 @@
}
TEST_P(QuicServerSessionTest, MaxOpenStreamsImplicit) {
- ValueRestore<bool> old_flag(&FLAGS_quic_allow_more_open_streams, true);
// Test that the server closes the connection if a client attempts to open too
// many data streams implicitly. The server accepts slightly more than the
// negotiated stream limit to deal with rare cases where a client FIN/RST is
diff --git a/net/tools/quic/quic_socket_utils.cc b/net/tools/quic/quic_socket_utils.cc
index f11647b..3ac0bf3 100644
--- a/net/tools/quic/quic_socket_utils.cc
+++ b/net/tools/quic/quic_socket_utils.cc
@@ -51,8 +51,9 @@
}
// static
-bool QuicSocketUtils::GetOverflowFromMsghdr(struct msghdr *hdr,
- uint32 *dropped_packets) {
+bool QuicSocketUtils::GetOverflowFromMsghdr(
+ struct msghdr *hdr,
+ QuicPacketCount *dropped_packets) {
if (hdr->msg_controllen > 0) {
struct cmsghdr *cmsg;
for (cmsg = CMSG_FIRSTHDR(hdr);
@@ -99,7 +100,7 @@
// static
int QuicSocketUtils::ReadPacket(int fd, char* buffer, size_t buf_len,
- uint32* dropped_packets,
+ QuicPacketCount* dropped_packets,
IPAddressNumber* self_address,
IPEndPoint* peer_address) {
CHECK(peer_address != nullptr);
diff --git a/net/tools/quic/quic_socket_utils.h b/net/tools/quic/quic_socket_utils.h
index 03b95e5..41d3b93 100644
--- a/net/tools/quic/quic_socket_utils.h
+++ b/net/tools/quic/quic_socket_utils.h
@@ -13,6 +13,7 @@
#include "base/basictypes.h"
#include "net/base/ip_endpoint.h"
+#include "net/quic/quic_bandwidth.h"
#include "net/quic/quic_types.h"
namespace net {
@@ -28,7 +29,7 @@
// If the msghdr contains an SO_RXQ_OVFL entry, this will set dropped_packets
// to the correct value and return true. Otherwise it will return false.
static bool GetOverflowFromMsghdr(struct msghdr *hdr,
- uint32 *dropped_packets);
+ QuicPacketCount *dropped_packets);
// Sets either IP_PKTINFO or IPV6_PKTINFO on the socket, based on
// address_family. Returns the return code from setsockopt.
@@ -52,7 +53,7 @@
static int ReadPacket(int fd,
char* buffer,
size_t buf_len,
- uint32* dropped_packets,
+ QuicPacketCount* dropped_packets,
IPAddressNumber* self_address,
IPEndPoint* peer_address);
diff --git a/net/tools/quic/test_tools/quic_test_utils.h b/net/tools/quic/test_tools/quic_test_utils.h
index e1220cb..d70b22d 100644
--- a/net/tools/quic/test_tools/quic_test_utils.h
+++ b/net/tools/quic/test_tools/quic_test_utils.h
@@ -95,7 +95,7 @@
MOCK_METHOD0(OnCanWrite, void());
MOCK_CONST_METHOD0(HasPendingWrites, bool());
- MOCK_METHOD1(ResumeConnectionState, void(const CachedNetworkParameters&));
+ MOCK_METHOD1(ResumeConnectionState, bool(const CachedNetworkParameters&));
void ReallyProcessUdpPacket(const IPEndPoint& self_address,
const IPEndPoint& peer_address,
diff --git a/net/url_request/sdch_dictionary_fetcher.cc b/net/url_request/sdch_dictionary_fetcher.cc
index 9aeed9a..450a608 100644
--- a/net/url_request/sdch_dictionary_fetcher.cc
+++ b/net/url_request/sdch_dictionary_fetcher.cc
@@ -11,6 +11,7 @@
#include "base/compiler_specific.h"
#include "base/profiler/scoped_tracker.h"
#include "base/thread_task_runner_handle.h"
+#include "net/base/io_buffer.h"
#include "net/base/load_flags.h"
#include "net/base/sdch_net_log_params.h"
#include "net/url_request/url_request_context.h"
diff --git a/net/url_request/url_fetcher_core.cc b/net/url_request/url_fetcher_core.cc
index 23399f3..420e831 100644
--- a/net/url_request/url_fetcher_core.cc
+++ b/net/url_request/url_fetcher_core.cc
@@ -436,16 +436,36 @@
URLRequestThrottlerManager* throttler_manager =
request->context()->throttler_manager();
if (throttler_manager) {
+ // TODO(vadimt): Remove ScopedTracker below once crbug.com/423948 is fixed.
+ tracked_objects::ScopedTracker tracking_profile1(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "423948 URLFetcherCore::OnReadCompleted1"));
+
url_throttler_entry_ = throttler_manager->RegisterRequestUrl(url_);
}
+ // TODO(vadimt): Remove ScopedTracker below once crbug.com/423948 is fixed.
+ tracked_objects::ScopedTracker tracking_profile2(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "423948 URLFetcherCore::OnReadCompleted2"));
+
do {
if (!request_->status().is_success() || bytes_read <= 0)
break;
+ // TODO(vadimt): Remove ScopedTracker below once crbug.com/423948 is fixed.
+ tracked_objects::ScopedTracker tracking_profile3(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "423948 URLFetcherCore::OnReadCompleted3"));
+
current_response_bytes_ += bytes_read;
InformDelegateDownloadProgress();
+ // TODO(vadimt): Remove ScopedTracker below once crbug.com/423948 is fixed.
+ tracked_objects::ScopedTracker tracking_profile4(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "423948 URLFetcherCore::OnReadCompleted4"));
+
const int result =
WriteBuffer(new DrainableIOBuffer(buffer_.get(), bytes_read));
if (result < 0) {
@@ -456,17 +476,38 @@
const URLRequestStatus status = request_->status();
+ // TODO(vadimt): Remove ScopedTracker below once crbug.com/423948 is fixed.
+ tracked_objects::ScopedTracker tracking_profile5(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "423948 URLFetcherCore::OnReadCompleted5"));
+
if (status.is_success())
request_->GetResponseCookies(&cookies_);
// See comments re: HEAD requests in ReadResponse().
if (!status.is_io_pending() || request_type_ == URLFetcher::HEAD) {
+ // TODO(vadimt): Remove ScopedTracker below once crbug.com/423948 is fixed.
+ tracked_objects::ScopedTracker tracking_profile6(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "423948 URLFetcherCore::OnReadCompleted6"));
+
status_ = status;
ReleaseRequest();
+ // TODO(vadimt): Remove ScopedTracker below once crbug.com/423948 is fixed.
+ tracked_objects::ScopedTracker tracking_profile7(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "423948 URLFetcherCore::OnReadCompleted7"));
+
// No more data to write.
const int result = response_writer_->Finish(
base::Bind(&URLFetcherCore::DidFinishWriting, this));
+
+ // TODO(vadimt): Remove ScopedTracker below once crbug.com/423948 is fixed.
+ tracked_objects::ScopedTracker tracking_profile8(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "423948 URLFetcherCore::OnReadCompleted8"));
+
if (result != ERR_IO_PENDING)
DidFinishWriting(result);
}
diff --git a/net/url_request/url_request_simple_job.cc b/net/url_request/url_request_simple_job.cc
index 060a90e..ebc2b5d 100644
--- a/net/url_request/url_request_simple_job.cc
+++ b/net/url_request/url_request_simple_job.cc
@@ -53,9 +53,9 @@
"422489 URLRequestSimpleJob::ReadRawData"));
DCHECK(bytes_read);
- int remaining = byte_range_.last_byte_position() - data_offset_ + 1;
- if (buf_size > remaining)
- buf_size = remaining;
+ buf_size = static_cast<int>(std::min(
+ static_cast<int64>(buf_size),
+ byte_range_.last_byte_position() - data_offset_ + 1));
memcpy(buf->data(), data_->front() + data_offset_, buf_size);
data_offset_ += buf_size;
*bytes_read = buf_size;
@@ -138,9 +138,8 @@
}
data_offset_ = byte_range_.first_byte_position();
- int remaining_bytes = byte_range_.last_byte_position() -
- byte_range_.first_byte_position() + 1;
- set_expected_content_size(remaining_bytes);
+ set_expected_content_size(
+ byte_range_.last_byte_position() - data_offset_ + 1);
NotifyHeadersComplete();
} else {
NotifyStartError(URLRequestStatus(URLRequestStatus::FAILED, result));
diff --git a/net/url_request/url_request_simple_job.h b/net/url_request/url_request_simple_job.h
index 99b6cb6..f605fe4 100644
--- a/net/url_request/url_request_simple_job.h
+++ b/net/url_request/url_request_simple_job.h
@@ -66,7 +66,7 @@
std::string mime_type_;
std::string charset_;
scoped_refptr<base::RefCountedMemory> data_;
- int data_offset_;
+ int64 data_offset_;
base::WeakPtrFactory<URLRequestSimpleJob> weak_factory_;
};
diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc
index 9892a69..b114ecc 100644
--- a/net/url_request/url_request_unittest.cc
+++ b/net/url_request/url_request_unittest.cc
@@ -258,9 +258,9 @@
EXPECT_GT(ssl_info.security_bits, 0);
// The cipher suite TLS_NULL_WITH_NULL_NULL (0) must not be negotiated.
- int cipher_suite = SSLConnectionStatusToCipherSuite(
+ uint16 cipher_suite = SSLConnectionStatusToCipherSuite(
ssl_info.connection_status);
- EXPECT_NE(0, cipher_suite);
+ EXPECT_NE(0U, cipher_suite);
}
void CheckFullRequestHeaders(const HttpRequestHeaders& headers,
@@ -3763,7 +3763,7 @@
ASSERT_LT(upper_bound, 1000000);
}
- int tolerance = upper_bound * 0.005;
+ int tolerance = static_cast<int>(upper_bound * 0.005);
if (tolerance < 2)
tolerance = 2;
@@ -4969,8 +4969,10 @@
base::RunLoop().Run();
- int64 size = 0;
- ASSERT_EQ(true, base::GetFileSize(path, &size));
+ int64 size64 = 0;
+ ASSERT_EQ(true, base::GetFileSize(path, &size64));
+ ASSERT_LE(size64, std::numeric_limits<int>::max());
+ int size = static_cast<int>(size64);
scoped_ptr<char[]> buf(new char[size]);
ASSERT_EQ(size, base::ReadFile(path, buf.get(), size));
diff --git a/net/url_request/view_cache_helper.cc b/net/url_request/view_cache_helper.cc
index 36d3ae5..594f739 100644
--- a/net/url_request/view_cache_helper.cc
+++ b/net/url_request/view_cache_helper.cc
@@ -6,6 +6,7 @@
#include "base/bind.h"
#include "base/bind_helpers.h"
+#include "base/profiler/scoped_tracker.h"
#include "base/strings/stringprintf.h"
#include "net/base/escape.h"
#include "net/base/io_buffer.h"
@@ -362,6 +363,10 @@
}
void ViewCacheHelper::OnIOComplete(int result) {
+ // TODO(vadimt): Remove ScopedTracker below once crbug.com/422516 is fixed.
+ tracked_objects::ScopedTracker tracking_profile(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION("422516 ViewCacheHelper::OnIOComplete"));
+
DoLoop(result);
}
diff --git a/net/websockets/websocket_basic_handshake_stream.cc b/net/websockets/websocket_basic_handshake_stream.cc
index 08ee6ae..bac2438 100644
--- a/net/websockets/websocket_basic_handshake_stream.cc
+++ b/net/websockets/websocket_basic_handshake_stream.cc
@@ -25,6 +25,7 @@
#include "base/strings/stringprintf.h"
#include "base/time/time.h"
#include "crypto/random.h"
+#include "net/base/io_buffer.h"
#include "net/http/http_request_headers.h"
#include "net/http/http_request_info.h"
#include "net/http/http_response_body_drainer.h"
diff --git a/sandbox/linux/BUILD.gn b/sandbox/linux/BUILD.gn
index 0f8f86a..ff4a238 100644
--- a/sandbox/linux/BUILD.gn
+++ b/sandbox/linux/BUILD.gn
@@ -71,6 +71,7 @@
"services/syscall_wrappers_unittest.cc",
"services/thread_helpers_unittests.cc",
"services/yama_unittests.cc",
+ "syscall_broker/broker_file_permission_unittest.cc",
"syscall_broker/broker_process_unittest.cc",
"tests/main.cc",
"tests/scoped_temporary_file.cc",
@@ -108,6 +109,7 @@
"seccomp-bpf/bpf_tests_unittest.cc",
"seccomp-bpf/codegen_unittest.cc",
"seccomp-bpf/errorcode_unittest.cc",
+ "seccomp-bpf/sandbox_bpf_unittest.cc",
"seccomp-bpf/syscall_iterator_unittest.cc",
"seccomp-bpf/syscall_unittest.cc",
]
@@ -115,6 +117,7 @@
if (compile_credentials) {
sources += [
"services/credentials_unittest.cc",
+ "services/proc_util_unittest.cc",
"services/unix_domain_socket_unittest.cc",
]
}
@@ -173,6 +176,7 @@
defines = [ "SANDBOX_IMPLEMENTATION" ]
deps = [
+ ":sandbox_services",
":sandbox_services_headers",
"//base",
]
@@ -235,6 +239,8 @@
"syscall_broker/broker_client.cc",
"syscall_broker/broker_client.h",
"syscall_broker/broker_common.h",
+ "syscall_broker/broker_file_permission.cc",
+ "syscall_broker/broker_file_permission.h",
"syscall_broker/broker_host.cc",
"syscall_broker/broker_host.h",
"syscall_broker/broker_policy.cc",
@@ -249,6 +255,8 @@
sources += [
"services/credentials.cc",
"services/credentials.h",
+ "services/proc_util.cc",
+ "services/proc_util.h",
]
# For capabilities.cc.
configs += [ "//build/config/linux:libcap" ]
diff --git a/sandbox/linux/bpf_dsl/bpf_dsl.cc b/sandbox/linux/bpf_dsl/bpf_dsl.cc
index 0d5aa55..3a35903 100644
--- a/sandbox/linux/bpf_dsl/bpf_dsl.cc
+++ b/sandbox/linux/bpf_dsl/bpf_dsl.cc
@@ -10,12 +10,17 @@
#include "base/memory/ref_counted.h"
#include "sandbox/linux/bpf_dsl/bpf_dsl_impl.h"
#include "sandbox/linux/bpf_dsl/policy_compiler.h"
+#include "sandbox/linux/seccomp-bpf/die.h"
#include "sandbox/linux/seccomp-bpf/errorcode.h"
namespace sandbox {
namespace bpf_dsl {
namespace {
+intptr_t BPFFailure(const struct arch_seccomp_data&, void* aux) {
+ SANDBOX_DIE(static_cast<char*>(aux));
+}
+
class AllowResultExprImpl : public internal::ResultExprImpl {
public:
AllowResultExprImpl() {}
@@ -24,6 +29,8 @@
return ErrorCode(ErrorCode::ERR_ALLOWED);
}
+ bool IsAllow() const override { return true; }
+
private:
~AllowResultExprImpl() override {}
@@ -40,6 +47,8 @@
return pc->Error(err_);
}
+ bool IsDeny() const override { return true; }
+
private:
~ErrorResultExprImpl() override {}
@@ -48,22 +57,6 @@
DISALLOW_COPY_AND_ASSIGN(ErrorResultExprImpl);
};
-class KillResultExprImpl : public internal::ResultExprImpl {
- public:
- explicit KillResultExprImpl(const char* msg) : msg_(msg) { DCHECK(msg_); }
-
- ErrorCode Compile(PolicyCompiler* pc) const override {
- return pc->Kill(msg_);
- }
-
- private:
- ~KillResultExprImpl() override {}
-
- const char* msg_;
-
- DISALLOW_COPY_AND_ASSIGN(KillResultExprImpl);
-};
-
class TraceResultExprImpl : public internal::ResultExprImpl {
public:
TraceResultExprImpl(uint16_t aux) : aux_(aux) {}
@@ -82,46 +75,29 @@
class TrapResultExprImpl : public internal::ResultExprImpl {
public:
- TrapResultExprImpl(TrapRegistry::TrapFnc func, const void* arg)
- : func_(func), arg_(arg) {
+ TrapResultExprImpl(TrapRegistry::TrapFnc func, const void* arg, bool safe)
+ : func_(func), arg_(arg), safe_(safe) {
DCHECK(func_);
}
ErrorCode Compile(PolicyCompiler* pc) const override {
- return pc->Trap(func_, arg_);
+ return pc->Trap(func_, arg_, safe_);
}
+ bool HasUnsafeTraps() const override { return safe_ == false; }
+
+ bool IsDeny() const override { return true; }
+
private:
~TrapResultExprImpl() override {}
TrapRegistry::TrapFnc func_;
const void* arg_;
+ bool safe_;
DISALLOW_COPY_AND_ASSIGN(TrapResultExprImpl);
};
-class UnsafeTrapResultExprImpl : public internal::ResultExprImpl {
- public:
- UnsafeTrapResultExprImpl(TrapRegistry::TrapFnc func, const void* arg)
- : func_(func), arg_(arg) {
- DCHECK(func_);
- }
-
- ErrorCode Compile(PolicyCompiler* pc) const override {
- return pc->UnsafeTrap(func_, arg_);
- }
-
- bool HasUnsafeTraps() const override { return true; }
-
- private:
- ~UnsafeTrapResultExprImpl() override {}
-
- TrapRegistry::TrapFnc func_;
- const void* arg_;
-
- DISALLOW_COPY_AND_ASSIGN(UnsafeTrapResultExprImpl);
-};
-
class IfThenResultExprImpl : public internal::ResultExprImpl {
public:
IfThenResultExprImpl(const BoolExpr& cond,
@@ -258,6 +234,14 @@
return false;
}
+bool ResultExprImpl::IsAllow() const {
+ return false;
+}
+
+bool ResultExprImpl::IsDeny() const {
+ return false;
+}
+
uint64_t DefaultMask(size_t size) {
switch (size) {
case 4:
@@ -291,7 +275,7 @@
}
ResultExpr Kill(const char* msg) {
- return ResultExpr(new const KillResultExprImpl(msg));
+ return Trap(BPFFailure, msg);
}
ResultExpr Trace(uint16_t aux) {
@@ -299,11 +283,13 @@
}
ResultExpr Trap(TrapRegistry::TrapFnc trap_func, const void* aux) {
- return ResultExpr(new const TrapResultExprImpl(trap_func, aux));
+ return ResultExpr(
+ new const TrapResultExprImpl(trap_func, aux, true /* safe */));
}
ResultExpr UnsafeTrap(TrapRegistry::TrapFnc trap_func, const void* aux) {
- return ResultExpr(new const UnsafeTrapResultExprImpl(trap_func, aux));
+ return ResultExpr(
+ new const TrapResultExprImpl(trap_func, aux, false /* unsafe */));
}
BoolExpr BoolConst(bool value) {
diff --git a/sandbox/linux/bpf_dsl/bpf_dsl_impl.h b/sandbox/linux/bpf_dsl/bpf_dsl_impl.h
index 48b9169..2ffaf79 100644
--- a/sandbox/linux/bpf_dsl/bpf_dsl_impl.h
+++ b/sandbox/linux/bpf_dsl/bpf_dsl_impl.h
@@ -47,6 +47,12 @@
// contains an unsafe trap expression.
virtual bool HasUnsafeTraps() const;
+ // IsAllow returns whether the result expression is an "allow" result.
+ virtual bool IsAllow() const;
+
+ // IsAllow returns whether the result expression is a "deny" result.
+ virtual bool IsDeny() const;
+
protected:
ResultExprImpl() {}
virtual ~ResultExprImpl() {}
diff --git a/sandbox/linux/bpf_dsl/bpf_dsl_more_unittest.cc b/sandbox/linux/bpf_dsl/bpf_dsl_more_unittest.cc
index 66669e7..df5dbd5 100644
--- a/sandbox/linux/bpf_dsl/bpf_dsl_more_unittest.cc
+++ b/sandbox/linux/bpf_dsl/bpf_dsl_more_unittest.cc
@@ -42,6 +42,7 @@
#include "sandbox/linux/seccomp-bpf/trap.h"
#include "sandbox/linux/services/linux_syscalls.h"
#include "sandbox/linux/services/syscall_wrappers.h"
+#include "sandbox/linux/syscall_broker/broker_file_permission.h"
#include "sandbox/linux/syscall_broker/broker_process.h"
#include "sandbox/linux/tests/scoped_temporary_file.h"
#include "sandbox/linux/tests/unit_tests.h"
@@ -75,28 +76,6 @@
Die::SuppressInfoMessages(true);
}
-// This test should execute no matter whether we have kernel support. So,
-// we make it a TEST() instead of a BPF_TEST().
-TEST(SandboxBPF, DISABLE_ON_TSAN(CallSupports)) {
- // We check that we don't crash, but it's ok if the kernel doesn't
- // support it.
- bool seccomp_bpf_supported =
- SandboxBPF::SupportsSeccompSandbox(-1) == SandboxBPF::STATUS_AVAILABLE;
- // We want to log whether or not seccomp BPF is actually supported
- // since actual test coverage depends on it.
- RecordProperty("SeccompBPFSupported",
- seccomp_bpf_supported ? "true." : "false.");
- std::cout << "Seccomp BPF supported: "
- << (seccomp_bpf_supported ? "true." : "false.") << "\n";
- RecordProperty("PointerSize", sizeof(void*));
- std::cout << "Pointer size: " << sizeof(void*) << "\n";
-}
-
-SANDBOX_TEST(SandboxBPF, DISABLE_ON_TSAN(CallSupportsTwice)) {
- SandboxBPF::SupportsSeccompSandbox(-1);
- SandboxBPF::SupportsSeccompSandbox(-1);
-}
-
// BPF_TEST does a lot of the boiler-plate code around setting up a
// policy and optional passing data between the caller, the policy and
// any Trap() handlers. This is great for writing short and concise tests,
@@ -131,13 +110,12 @@
};
SANDBOX_TEST(SandboxBPF, DISABLE_ON_TSAN(VerboseAPITesting)) {
- if (SandboxBPF::SupportsSeccompSandbox(-1) ==
- sandbox::SandboxBPF::STATUS_AVAILABLE) {
+ if (SandboxBPF::SupportsSeccompSandbox(
+ SandboxBPF::SeccompLevel::SINGLE_THREADED)) {
static int counter = 0;
- SandboxBPF sandbox;
- sandbox.SetSandboxPolicy(new VerboseAPITestingPolicy(&counter));
- BPF_ASSERT(sandbox.StartSandbox(SandboxBPF::PROCESS_SINGLE_THREADED));
+ SandboxBPF sandbox(new VerboseAPITestingPolicy(&counter));
+ BPF_ASSERT(sandbox.StartSandbox(SandboxBPF::SeccompLevel::SINGLE_THREADED));
BPF_ASSERT_EQ(0, counter);
BPF_ASSERT_EQ(0, syscall(__NR_uname, 0));
@@ -179,6 +157,14 @@
BlacklistNanosleepPolicy::AssertNanosleepFails();
}
+BPF_TEST_C(SandboxBPF, UseVsyscall, BlacklistNanosleepPolicy) {
+ time_t current_time;
+ // time() is implemented as a vsyscall. With an older glibc, with
+ // vsyscall=emulate and some versions of the seccomp BPF patch
+ // we may get SIGKILL-ed. Detect this!
+ BPF_ASSERT_NE(static_cast<time_t>(-1), time(¤t_time));
+}
+
// Now do a simple whitelist test
class WhitelistGetpidPolicy : public Policy {
@@ -396,9 +382,8 @@
// Stack a second sandbox with its own policy. Verify that we can further
// restrict filters, but we cannot relax existing filters.
- SandboxBPF sandbox;
- sandbox.SetSandboxPolicy(new StackingPolicyPartTwo());
- BPF_ASSERT(sandbox.StartSandbox(SandboxBPF::PROCESS_SINGLE_THREADED));
+ SandboxBPF sandbox(new StackingPolicyPartTwo());
+ BPF_ASSERT(sandbox.StartSandbox(SandboxBPF::SeccompLevel::SINGLE_THREADED));
errno = 0;
BPF_ASSERT(syscall(__NR_getppid, 0) == -1);
@@ -756,12 +741,14 @@
class InitializedOpenBroker {
public:
InitializedOpenBroker() : initialized_(false) {
- std::vector<std::string> allowed_files;
- allowed_files.push_back("/proc/allowed");
- allowed_files.push_back("/proc/cpuinfo");
+ std::vector<syscall_broker::BrokerFilePermission> permissions;
+ permissions.push_back(
+ syscall_broker::BrokerFilePermission::ReadOnly("/proc/allowed"));
+ permissions.push_back(
+ syscall_broker::BrokerFilePermission::ReadOnly("/proc/cpuinfo"));
- broker_process_.reset(new syscall_broker::BrokerProcess(
- EPERM, allowed_files, std::vector<std::string>()));
+ broker_process_.reset(
+ new syscall_broker::BrokerProcess(EPERM, permissions));
BPF_ASSERT(broker_process() != NULL);
BPF_ASSERT(broker_process_->Init(base::Bind(&NoOpCallback)));
@@ -2069,8 +2056,8 @@
};
SANDBOX_TEST(SandboxBPF, DISABLE_ON_TSAN(SeccompRetTrace)) {
- if (SandboxBPF::SupportsSeccompSandbox(-1) !=
- sandbox::SandboxBPF::STATUS_AVAILABLE) {
+ if (!SandboxBPF::SupportsSeccompSandbox(
+ SandboxBPF::SeccompLevel::SINGLE_THREADED)) {
return;
}
@@ -2094,9 +2081,8 @@
pid_t my_pid = getpid();
BPF_ASSERT_NE(-1, ptrace(PTRACE_TRACEME, -1, NULL, NULL));
BPF_ASSERT_EQ(0, raise(SIGSTOP));
- SandboxBPF sandbox;
- sandbox.SetSandboxPolicy(new TraceAllPolicy);
- BPF_ASSERT(sandbox.StartSandbox(SandboxBPF::PROCESS_SINGLE_THREADED));
+ SandboxBPF sandbox(new TraceAllPolicy);
+ BPF_ASSERT(sandbox.StartSandbox(SandboxBPF::SeccompLevel::SINGLE_THREADED));
// getpid is allowed.
BPF_ASSERT_EQ(my_pid, sys_getpid());
@@ -2267,8 +2253,8 @@
}
SANDBOX_TEST(SandboxBPF, Tsync) {
- if (SandboxBPF::SupportsSeccompThreadFilterSynchronization() !=
- SandboxBPF::STATUS_AVAILABLE) {
+ if (!(SandboxBPF::SupportsSeccompSandbox(
+ SandboxBPF::SeccompLevel::MULTI_THREADED))) {
return;
}
@@ -2284,9 +2270,8 @@
BPF_ASSERT_EQ(0, HANDLE_EINTR(syscall(__NR_nanosleep, &ts, NULL)));
// Engage the sandbox.
- SandboxBPF sandbox;
- sandbox.SetSandboxPolicy(new BlacklistNanosleepPolicy());
- BPF_ASSERT(sandbox.StartSandbox(SandboxBPF::PROCESS_MULTI_THREADED));
+ SandboxBPF sandbox(new BlacklistNanosleepPolicy());
+ BPF_ASSERT(sandbox.StartSandbox(SandboxBPF::SeccompLevel::MULTI_THREADED));
// This thread should have the filter applied as well.
BlacklistNanosleepPolicy::AssertNanosleepFails();
@@ -2316,9 +2301,8 @@
base::Thread thread("sandbox.linux.StartMultiThreadedAsSingleThreaded");
BPF_ASSERT(thread.Start());
- SandboxBPF sandbox;
- sandbox.SetSandboxPolicy(new AllowAllPolicy());
- BPF_ASSERT(!sandbox.StartSandbox(SandboxBPF::PROCESS_SINGLE_THREADED));
+ SandboxBPF sandbox(new AllowAllPolicy());
+ BPF_ASSERT(!sandbox.StartSandbox(SandboxBPF::SeccompLevel::SINGLE_THREADED));
}
// http://crbug.com/407357
@@ -2329,9 +2313,8 @@
DEATH_MESSAGE(
"Cannot start sandbox; process may be single-threaded when "
"reported as not")) {
- SandboxBPF sandbox;
- sandbox.SetSandboxPolicy(new AllowAllPolicy());
- BPF_ASSERT(!sandbox.StartSandbox(SandboxBPF::PROCESS_MULTI_THREADED));
+ SandboxBPF sandbox(new AllowAllPolicy());
+ BPF_ASSERT(!sandbox.StartSandbox(SandboxBPF::SeccompLevel::MULTI_THREADED));
}
#endif // !defined(THREAD_SANITIZER)
diff --git a/sandbox/linux/bpf_dsl/bpf_dsl_unittest.cc b/sandbox/linux/bpf_dsl/bpf_dsl_unittest.cc
index 6c2875f..cffadc5 100644
--- a/sandbox/linux/bpf_dsl/bpf_dsl_unittest.cc
+++ b/sandbox/linux/bpf_dsl/bpf_dsl_unittest.cc
@@ -15,10 +15,12 @@
#include "base/files/scoped_file.h"
#include "base/macros.h"
#include "build/build_config.h"
+#include "sandbox/linux/bpf_dsl/bpf_dsl_impl.h"
#include "sandbox/linux/bpf_dsl/policy.h"
#include "sandbox/linux/seccomp-bpf/bpf_tests.h"
#include "sandbox/linux/seccomp-bpf/errorcode.h"
#include "sandbox/linux/seccomp-bpf/syscall.h"
+#include "testing/gtest/include/gtest/gtest.h"
#define CASES SANDBOX_BPF_DSL_CASES
@@ -328,6 +330,48 @@
ASSERT_SYSCALL_RESULT(-EACCES, fcntl, sock_fd.get(), F_DUPFD, 0);
}
+static intptr_t DummyTrap(const struct arch_seccomp_data& data, void* aux) {
+ return 0;
+}
+
+TEST(BPFDSL, IsAllowDeny) {
+ ResultExpr allow = Allow();
+ EXPECT_TRUE(allow->IsAllow());
+ EXPECT_FALSE(allow->IsDeny());
+
+ ResultExpr error = Error(ENOENT);
+ EXPECT_FALSE(error->IsAllow());
+ EXPECT_TRUE(error->IsDeny());
+
+ ResultExpr trace = Trace(42);
+ EXPECT_FALSE(trace->IsAllow());
+ EXPECT_FALSE(trace->IsDeny());
+
+ ResultExpr trap = Trap(DummyTrap, nullptr);
+ EXPECT_FALSE(trap->IsAllow());
+ EXPECT_TRUE(trap->IsDeny());
+
+ const Arg<int> arg(0);
+ ResultExpr maybe = If(arg == 0, Allow()).Else(Error(EPERM));
+ EXPECT_FALSE(maybe->IsAllow());
+ EXPECT_FALSE(maybe->IsDeny());
+}
+
+TEST(BPFDSL, HasUnsafeTraps) {
+ ResultExpr allow = Allow();
+ EXPECT_FALSE(allow->HasUnsafeTraps());
+
+ ResultExpr safe = Trap(DummyTrap, nullptr);
+ EXPECT_FALSE(safe->HasUnsafeTraps());
+
+ ResultExpr unsafe = UnsafeTrap(DummyTrap, nullptr);
+ EXPECT_TRUE(unsafe->HasUnsafeTraps());
+
+ const Arg<int> arg(0);
+ ResultExpr maybe = If(arg == 0, allow).Else(unsafe);
+ EXPECT_TRUE(maybe->HasUnsafeTraps());
+}
+
} // namespace
} // namespace bpf_dsl
} // namespace sandbox
diff --git a/sandbox/linux/bpf_dsl/policy_compiler.cc b/sandbox/linux/bpf_dsl/policy_compiler.cc
index 2bc22e9..f91f70c 100644
--- a/sandbox/linux/bpf_dsl/policy_compiler.cc
+++ b/sandbox/linux/bpf_dsl/policy_compiler.cc
@@ -54,12 +54,6 @@
return x != 0 && (x & (x - 1)) == 0;
}
-bool IsDenied(const ErrorCode& code) {
- return (code.err() & SECCOMP_RET_ACTION) == SECCOMP_RET_TRAP ||
- (code.err() >= (SECCOMP_RET_ERRNO + ErrorCode::ERR_MIN_ERRNO) &&
- code.err() <= (SECCOMP_RET_ERRNO + ErrorCode::ERR_MAX_ERRNO));
-}
-
// A Trap() handler that returns an "errno" value. The value is encoded
// in the "aux" parameter.
intptr_t ReturnErrno(const struct arch_seccomp_data&, void* aux) {
@@ -71,11 +65,8 @@
return -err;
}
-intptr_t BPFFailure(const struct arch_seccomp_data&, void* aux) {
- SANDBOX_DIE(static_cast<char*>(aux));
-}
-
bool HasUnsafeTraps(const Policy* policy) {
+ DCHECK(policy);
for (uint32_t sysnum : SyscallSet::ValidOnly()) {
if (policy->EvaluateSyscall(sysnum)->HasUnsafeTraps()) {
return true;
@@ -87,9 +78,8 @@
} // namespace
struct PolicyCompiler::Range {
- Range(uint32_t f, const ErrorCode& e) : from(f), err(e) {}
uint32_t from;
- ErrorCode err;
+ CodeGen::Node node;
};
PolicyCompiler::PolicyCompiler(const Policy* policy, TrapRegistry* registry)
@@ -98,13 +88,14 @@
conds_(),
gen_(),
has_unsafe_traps_(HasUnsafeTraps(policy_)) {
+ DCHECK(policy);
}
PolicyCompiler::~PolicyCompiler() {
}
scoped_ptr<CodeGen::Program> PolicyCompiler::Compile() {
- if (!IsDenied(policy_->InvalidSyscall()->Compile(this))) {
+ if (!policy_->InvalidSyscall()->IsDeny()) {
SANDBOX_DIE("Policies should deny invalid system calls.");
}
@@ -121,8 +112,7 @@
}
for (int sysnum : kSyscallsRequiredForUnsafeTraps) {
- if (!policy_->EvaluateSyscall(sysnum)->Compile(this)
- .Equals(ErrorCode(ErrorCode::ERR_ALLOWED))) {
+ if (!policy_->EvaluateSyscall(sysnum)->IsAllow()) {
SANDBOX_DIE(
"Policies that use UnsafeTrap() must unconditionally allow all "
"required system calls");
@@ -159,13 +149,10 @@
// If the architecture doesn't match SECCOMP_ARCH, disallow the
// system call.
return gen_.MakeInstruction(
- BPF_LD + BPF_W + BPF_ABS,
- SECCOMP_ARCH_IDX,
+ BPF_LD + BPF_W + BPF_ABS, SECCOMP_ARCH_IDX,
gen_.MakeInstruction(
- BPF_JMP + BPF_JEQ + BPF_K,
- SECCOMP_ARCH,
- passed,
- RetExpression(Kill("Invalid audit architecture in BPF filter"))));
+ BPF_JMP + BPF_JEQ + BPF_K, SECCOMP_ARCH, passed,
+ CompileResult(Kill("Invalid audit architecture in BPF filter"))));
}
CodeGen::Node PolicyCompiler::MaybeAddEscapeHatch(CodeGen::Node rest) {
@@ -189,19 +176,13 @@
// For simplicity, we check the full 64-bit instruction pointer even
// on 32-bit architectures.
return gen_.MakeInstruction(
- BPF_LD + BPF_W + BPF_ABS,
- SECCOMP_IP_LSB_IDX,
+ BPF_LD + BPF_W + BPF_ABS, SECCOMP_IP_LSB_IDX,
gen_.MakeInstruction(
- BPF_JMP + BPF_JEQ + BPF_K,
- low,
+ BPF_JMP + BPF_JEQ + BPF_K, low,
gen_.MakeInstruction(
- BPF_LD + BPF_W + BPF_ABS,
- SECCOMP_IP_MSB_IDX,
- gen_.MakeInstruction(
- BPF_JMP + BPF_JEQ + BPF_K,
- hi,
- RetExpression(ErrorCode(ErrorCode::ERR_ALLOWED)),
- rest)),
+ BPF_LD + BPF_W + BPF_ABS, SECCOMP_IP_MSB_IDX,
+ gen_.MakeInstruction(BPF_JMP + BPF_JEQ + BPF_K, hi,
+ CompileResult(Allow()), rest)),
rest));
}
@@ -225,7 +206,7 @@
// On Intel architectures, verify that system call numbers are in the
// expected number range.
CodeGen::Node invalidX32 =
- RetExpression(Kill("Illegal mixing of system call ABIs"));
+ CompileResult(Kill("Illegal mixing of system call ABIs"));
if (kIsX32) {
// The newer x32 API always sets bit 30.
return gen_.MakeInstruction(
@@ -247,24 +228,28 @@
// deal with this disparity by enumerating from MIN_SYSCALL to MAX_SYSCALL,
// and then verifying that the rest of the number range (both positive and
// negative) all return the same ErrorCode.
- const ErrorCode invalid_err = policy_->InvalidSyscall()->Compile(this);
+ const CodeGen::Node invalid_node = CompileResult(policy_->InvalidSyscall());
uint32_t old_sysnum = 0;
- ErrorCode old_err = SyscallSet::IsValid(old_sysnum)
- ? policy_->EvaluateSyscall(old_sysnum)->Compile(this)
- : invalid_err;
+ CodeGen::Node old_node =
+ SyscallSet::IsValid(old_sysnum)
+ ? CompileResult(policy_->EvaluateSyscall(old_sysnum))
+ : invalid_node;
for (uint32_t sysnum : SyscallSet::All()) {
- ErrorCode err =
+ CodeGen::Node node =
SyscallSet::IsValid(sysnum)
- ? policy_->EvaluateSyscall(static_cast<int>(sysnum))->Compile(this)
- : invalid_err;
- if (!err.Equals(old_err)) {
- ranges->push_back(Range(old_sysnum, old_err));
+ ? CompileResult(policy_->EvaluateSyscall(static_cast<int>(sysnum)))
+ : invalid_node;
+ // N.B., here we rely on CodeGen folding (i.e., returning the same
+ // node value for) identical code sequences, otherwise our jump
+ // table will blow up in size.
+ if (node != old_node) {
+ ranges->push_back(Range{old_sysnum, old_node});
old_sysnum = sysnum;
- old_err = err;
+ old_node = node;
}
}
- ranges->push_back(Range(old_sysnum, old_err));
+ ranges->push_back(Range{old_sysnum, old_node});
}
CodeGen::Node PolicyCompiler::AssembleJumpTable(Ranges::const_iterator start,
@@ -278,7 +263,7 @@
} else if (stop - start == 1) {
// If we have narrowed things down to a single range object, we can
// return from the BPF filter program.
- return RetExpression(start->err);
+ return start->node;
}
// Pick the range object that is located at the mid point of our list.
@@ -293,6 +278,10 @@
return gen_.MakeInstruction(BPF_JMP + BPF_JGE + BPF_K, mid->from, jt, jf);
}
+CodeGen::Node PolicyCompiler::CompileResult(const ResultExpr& res) {
+ return RetExpression(res->Compile(this));
+}
+
CodeGen::Node PolicyCompiler::RetExpression(const ErrorCode& err) {
switch (err.error_type()) {
case ErrorCode::ET_COND:
@@ -454,7 +443,7 @@
}
ErrorCode PolicyCompiler::Unexpected64bitArgument() {
- return Kill("Unexpected 64bit argument detected");
+ return Kill("Unexpected 64bit argument detected")->Compile(this);
}
ErrorCode PolicyCompiler::Error(int err) {
@@ -468,28 +457,19 @@
// The performance penalty for this extra round-trip to user-space is not
// actually that bad, as we only ever pay it for denied system calls; and a
// typical program has very few of these.
- return Trap(ReturnErrno, reinterpret_cast<void*>(err));
+ return Trap(ReturnErrno, reinterpret_cast<void*>(err), true);
}
return ErrorCode(err);
}
-ErrorCode PolicyCompiler::MakeTrap(TrapRegistry::TrapFnc fnc,
- const void* aux,
- bool safe) {
+ErrorCode PolicyCompiler::Trap(TrapRegistry::TrapFnc fnc,
+ const void* aux,
+ bool safe) {
uint16_t trap_id = registry_->Add(fnc, aux, safe);
return ErrorCode(trap_id, fnc, aux, safe);
}
-ErrorCode PolicyCompiler::Trap(TrapRegistry::TrapFnc fnc, const void* aux) {
- return MakeTrap(fnc, aux, true /* Safe Trap */);
-}
-
-ErrorCode PolicyCompiler::UnsafeTrap(TrapRegistry::TrapFnc fnc,
- const void* aux) {
- return MakeTrap(fnc, aux, false /* Unsafe Trap */);
-}
-
bool PolicyCompiler::IsRequiredForUnsafeTrap(int sysno) {
for (size_t i = 0; i < arraysize(kSyscallsRequiredForUnsafeTraps); ++i) {
if (sysno == kSyscallsRequiredForUnsafeTraps[i]) {
@@ -513,9 +493,5 @@
&*conds_.insert(failed).first);
}
-ErrorCode PolicyCompiler::Kill(const char* msg) {
- return Trap(BPFFailure, const_cast<char*>(msg));
-}
-
} // namespace bpf_dsl
} // namespace sandbox
diff --git a/sandbox/linux/bpf_dsl/policy_compiler.h b/sandbox/linux/bpf_dsl/policy_compiler.h
index 4ef8cf3..8737c42 100644
--- a/sandbox/linux/bpf_dsl/policy_compiler.h
+++ b/sandbox/linux/bpf_dsl/policy_compiler.h
@@ -13,6 +13,7 @@
#include "base/macros.h"
#include "base/memory/scoped_ptr.h"
+#include "sandbox/linux/bpf_dsl/bpf_dsl_forward.h"
#include "sandbox/linux/seccomp-bpf/codegen.h"
#include "sandbox/linux/seccomp-bpf/errorcode.h"
#include "sandbox/sandbox_export.h"
@@ -37,25 +38,9 @@
// the specified error number.
ErrorCode Error(int err);
- // We can use ErrorCode to request calling of a trap handler. This method
- // performs the required wrapping of the callback function into an
- // ErrorCode object.
- // The "aux" field can carry a pointer to arbitrary data. See EvaluateSyscall
- // for a description of how to pass data from SetSandboxPolicy() to a Trap()
- // handler.
- ErrorCode Trap(TrapRegistry::TrapFnc fnc, const void* aux);
-
- // Calls a user-space trap handler and disables all sandboxing for system
- // calls made from this trap handler.
- // This feature is available only if explicitly enabled by the user having
- // set the CHROME_SANDBOX_DEBUGGING environment variable.
- // Returns an ET_INVALID ErrorCode, if called when not enabled.
- // NOTE: This feature, by definition, disables all security features of
- // the sandbox. It should never be used in production, but it can be
- // very useful to diagnose code that is incompatible with the sandbox.
- // If even a single system call returns "UnsafeTrap", the security of
- // entire sandbox should be considered compromised.
- ErrorCode UnsafeTrap(TrapRegistry::TrapFnc fnc, const void* aux);
+ // Trap returns an ErrorCode to indicate the system call should
+ // instead invoke a trap handler.
+ ErrorCode Trap(TrapRegistry::TrapFnc fnc, const void* aux, bool safe);
// UnsafeTraps require some syscalls to always be allowed.
// This helper function returns true for these calls.
@@ -77,9 +62,6 @@
const ErrorCode& passed,
const ErrorCode& failed);
- // Kill the program and print an error message.
- ErrorCode Kill(const char* msg);
-
// Returns the fatal ErrorCode that is used to indicate that somebody
// attempted to pass a 64bit value in a 32bit system call argument.
// This method is primarily needed for testing purposes.
@@ -88,7 +70,6 @@
private:
struct Range;
typedef std::vector<Range> Ranges;
- typedef std::map<uint32_t, ErrorCode> ErrMap;
typedef std::set<ErrorCode, struct ErrorCode::LessThan> Conds;
// Used by CondExpressionHalf to track which half of the argument it's
@@ -133,6 +114,10 @@
CodeGen::Node AssembleJumpTable(Ranges::const_iterator start,
Ranges::const_iterator stop);
+ // CompileResult compiles an individual result expression into a
+ // CodeGen node.
+ CodeGen::Node CompileResult(const ResultExpr& res);
+
// Returns a BPF program snippet that makes the BPF filter program exit
// with the given ErrorCode "err". N.B. the ErrorCode may very well be a
// conditional expression; if so, this function will recursively call
@@ -153,9 +138,6 @@
CodeGen::Node passed,
CodeGen::Node failed);
- // MakeTrap is the common implementation for Trap and UnsafeTrap.
- ErrorCode MakeTrap(TrapRegistry::TrapFnc fnc, const void* aux, bool safe);
-
const Policy* policy_;
TrapRegistry* registry_;
diff --git a/sandbox/linux/sandbox_linux.gypi b/sandbox/linux/sandbox_linux.gypi
index 08a5c43..89c830e 100644
--- a/sandbox/linux/sandbox_linux.gypi
+++ b/sandbox/linux/sandbox_linux.gypi
@@ -234,6 +234,8 @@
'syscall_broker/broker_client.cc',
'syscall_broker/broker_client.h',
'syscall_broker/broker_common.h',
+ 'syscall_broker/broker_file_permission.cc',
+ 'syscall_broker/broker_file_permission.h',
'syscall_broker/broker_host.cc',
'syscall_broker/broker_host.h',
'syscall_broker/broker_policy.cc',
@@ -252,6 +254,8 @@
'sources': [
'services/credentials.cc',
'services/credentials.h',
+ 'services/proc_util.cc',
+ 'services/proc_util.h',
],
'dependencies': [
# for capabilities.cc.
diff --git a/sandbox/linux/sandbox_linux_test_sources.gypi b/sandbox/linux/sandbox_linux_test_sources.gypi
index cefe962..5aeacf6 100644
--- a/sandbox/linux/sandbox_linux_test_sources.gypi
+++ b/sandbox/linux/sandbox_linux_test_sources.gypi
@@ -21,6 +21,7 @@
'services/syscall_wrappers_unittest.cc',
'services/thread_helpers_unittests.cc',
'services/yama_unittests.cc',
+ 'syscall_broker/broker_file_permission_unittest.cc',
'syscall_broker/broker_process_unittest.cc',
'tests/main.cc',
'tests/scoped_temporary_file.cc',
@@ -45,6 +46,7 @@
'seccomp-bpf/bpf_tests_unittest.cc',
'seccomp-bpf/codegen_unittest.cc',
'seccomp-bpf/errorcode_unittest.cc',
+ 'seccomp-bpf/sandbox_bpf_unittest.cc',
'seccomp-bpf/syscall_iterator_unittest.cc',
'seccomp-bpf/syscall_unittest.cc',
],
@@ -52,6 +54,7 @@
[ 'compile_credentials==1', {
'sources': [
'services/credentials_unittest.cc',
+ 'services/proc_util_unittest.cc',
'services/unix_domain_socket_unittest.cc',
],
}],
diff --git a/sandbox/linux/seccomp-bpf/codegen.cc b/sandbox/linux/seccomp-bpf/codegen.cc
index 3ed06cb..df96760 100644
--- a/sandbox/linux/seccomp-bpf/codegen.cc
+++ b/sandbox/linux/seccomp-bpf/codegen.cc
@@ -49,7 +49,7 @@
const CodeGen::Node CodeGen::kNullNode;
-CodeGen::CodeGen() : program_(), memos_() {
+CodeGen::CodeGen() : program_(), equivalent_(), memos_() {
}
CodeGen::~CodeGen() {
@@ -81,11 +81,11 @@
if (BPF_CLASS(code) == BPF_JMP) {
CHECK_NE(BPF_JA, BPF_OP(code)) << "CodeGen inserts JAs as needed";
- // We need to check |jt| twice because it might get pushed
- // out-of-range by appending a jump for |jf|.
- jt = WithinRange(jt, kBranchRange);
+ // Optimally adding jumps is rather tricky, so we use a quick
+ // approximation: by artificially reducing |jt|'s range, |jt| will
+ // stay within its true range even if we add a jump for |jf|.
+ jt = WithinRange(jt, kBranchRange - 1);
jf = WithinRange(jf, kBranchRange);
- jt = WithinRange(jt, kBranchRange);
return Append(code, k, Offset(jt), Offset(jf));
}
@@ -97,24 +97,26 @@
// proceeds to the next instruction; so we need to arrange for
// that to be |jt|.
jt = WithinRange(jt, 0);
+ CHECK_EQ(0U, Offset(jt)) << "ICE: Failed to setup next instruction";
}
return Append(code, k, 0, 0);
}
CodeGen::Node CodeGen::WithinRange(Node target, size_t range) {
- if (Offset(target) > range) {
- // TODO(mdempsky): If |range > 0|, we might be able to reuse an
- // existing instruction within that range.
-
- // TODO(mdempsky): If |target| is a branch or return, it might be
- // possible to duplicate that instruction rather than jump to it.
-
- // Fall back to emitting a jump instruction.
- target = Append(BPF_JMP | BPF_JA, Offset(target), 0, 0);
+ // Just use |target| if it's already within range.
+ if (Offset(target) <= range) {
+ return target;
}
- CHECK_LE(Offset(target), range) << "ICE: Failed to bring target within range";
- return target;
+ // Alternatively, look for an equivalent instruction within range.
+ if (Offset(equivalent_.at(target)) <= range) {
+ return equivalent_.at(target);
+ }
+
+ // Otherwise, fall back to emitting a jump instruction.
+ Node jump = Append(BPF_JMP | BPF_JA, Offset(target), 0, 0);
+ equivalent_.at(target) = jump;
+ return jump;
}
CodeGen::Node CodeGen::Append(uint16_t code, uint32_t k, size_t jt, size_t jf) {
@@ -127,8 +129,12 @@
}
CHECK_LT(program_.size(), static_cast<size_t>(BPF_MAXINSNS));
+ CHECK_EQ(program_.size(), equivalent_.size());
+
+ Node res = program_.size();
program_.push_back(sock_filter{code, jt, jf, k});
- return program_.size() - 1;
+ equivalent_.push_back(res);
+ return res;
}
size_t CodeGen::Offset(Node target) const {
diff --git a/sandbox/linux/seccomp-bpf/codegen.h b/sandbox/linux/seccomp-bpf/codegen.h
index bca4046..e679664 100644
--- a/sandbox/linux/seccomp-bpf/codegen.h
+++ b/sandbox/linux/seccomp-bpf/codegen.h
@@ -106,6 +106,13 @@
// indices remain stable as we add instructions.
Program program_;
+ // equivalent_ stores the most recent semantically-equivalent node for each
+ // instruction in program_. A node is defined as semantically-equivalent to N
+ // if it has the same instruction code and constant as N and its successor
+ // nodes (if any) are semantically-equivalent to N's successor nodes, or
+ // if it's an unconditional jump to a node semantically-equivalent to N.
+ std::vector<Node> equivalent_;
+
std::map<MemoKey, Node, MemoKeyLess> memos_;
DISALLOW_COPY_AND_ASSIGN(CodeGen);
diff --git a/sandbox/linux/seccomp-bpf/codegen_unittest.cc b/sandbox/linux/seccomp-bpf/codegen_unittest.cc
index a001668..8d4bf5d 100644
--- a/sandbox/linux/seccomp-bpf/codegen_unittest.cc
+++ b/sandbox/linux/seccomp-bpf/codegen_unittest.cc
@@ -367,5 +367,37 @@
}
}
+TEST_F(ProgramTest, JumpReuse) {
+ // As a code size optimization, we try to reuse jumps when possible
+ // instead of emitting new ones. Here we make sure that optimization
+ // is working as intended.
+ //
+ // NOTE: To simplify testing, we rely on implementation details
+ // about what CodeGen::Node values indicate (i.e., vector indices),
+ // but CodeGen users should treat them as opaque values.
+
+ // Populate with 260 initial instruction nodes.
+ std::vector<CodeGen::Node> nodes;
+ nodes.push_back(MakeInstruction(BPF_RET + BPF_K, 0));
+ for (size_t i = 1; i < 260; ++i) {
+ nodes.push_back(
+ MakeInstruction(BPF_ALU + BPF_ADD + BPF_K, i, nodes.back()));
+ }
+
+ // Branching to nodes[0] and nodes[1] should require 3 new
+ // instructions: two far jumps plus the branch itself.
+ CodeGen::Node one =
+ MakeInstruction(BPF_JMP + BPF_JEQ + BPF_K, 0, nodes[0], nodes[1]);
+ EXPECT_EQ(nodes.back() + 3, one); // XXX: Implementation detail!
+ RunTest(one);
+
+ // Branching again to the same target nodes should require only one
+ // new instruction, as we can reuse the previous branch's jumps.
+ CodeGen::Node two =
+ MakeInstruction(BPF_JMP + BPF_JEQ + BPF_K, 1, nodes[0], nodes[1]);
+ EXPECT_EQ(one + 1, two); // XXX: Implementation detail!
+ RunTest(two);
+}
+
} // namespace
} // namespace sandbox
diff --git a/sandbox/linux/seccomp-bpf/errorcode.h b/sandbox/linux/seccomp-bpf/errorcode.h
index fb86fe8..d887773 100644
--- a/sandbox/linux/seccomp-bpf/errorcode.h
+++ b/sandbox/linux/seccomp-bpf/errorcode.h
@@ -21,6 +21,10 @@
// All of the commonly used values are stored in the "err_" field. So, code
// that is using the ErrorCode class typically operates on a single 32bit
// field.
+//
+// TODO(mdempsky): Nuke from orbit. The only reason this class still
+// exists is for Verifier, which will eventually be replaced by a true
+// BPF symbolic evaluator and constraint solver.
class SANDBOX_EXPORT ErrorCode {
public:
enum {
diff --git a/sandbox/linux/seccomp-bpf/errorcode_unittest.cc b/sandbox/linux/seccomp-bpf/errorcode_unittest.cc
index ae68b0a..9f5090e 100644
--- a/sandbox/linux/seccomp-bpf/errorcode_unittest.cc
+++ b/sandbox/linux/seccomp-bpf/errorcode_unittest.cc
@@ -43,7 +43,7 @@
DummyPolicy dummy_policy;
bpf_dsl::PolicyCompiler compiler(&dummy_policy, Trap::Registry());
- ErrorCode e3 = compiler.Trap(NULL, NULL);
+ ErrorCode e3 = compiler.Trap(NULL, NULL, true /* safe */);
SANDBOX_ASSERT((e3.err() & SECCOMP_RET_ACTION) == SECCOMP_RET_TRAP);
uint16_t data = 0xdead;
@@ -61,12 +61,12 @@
SANDBOX_TEST(ErrorCode, Trap) {
DummyPolicy dummy_policy;
bpf_dsl::PolicyCompiler compiler(&dummy_policy, Trap::Registry());
- ErrorCode e0 = compiler.Trap(NULL, "a");
- ErrorCode e1 = compiler.Trap(NULL, "b");
+ ErrorCode e0 = compiler.Trap(NULL, "a", true /* safe */);
+ ErrorCode e1 = compiler.Trap(NULL, "b", true /* safe */);
SANDBOX_ASSERT((e0.err() & SECCOMP_RET_DATA) + 1 ==
(e1.err() & SECCOMP_RET_DATA));
- ErrorCode e2 = compiler.Trap(NULL, "a");
+ ErrorCode e2 = compiler.Trap(NULL, "a", true /* safe */);
SANDBOX_ASSERT((e0.err() & SECCOMP_RET_DATA) ==
(e2.err() & SECCOMP_RET_DATA));
}
@@ -83,9 +83,9 @@
DummyPolicy dummy_policy;
bpf_dsl::PolicyCompiler compiler(&dummy_policy, Trap::Registry());
- ErrorCode e4 = compiler.Trap(NULL, "a");
- ErrorCode e5 = compiler.Trap(NULL, "b");
- ErrorCode e6 = compiler.Trap(NULL, "a");
+ ErrorCode e4 = compiler.Trap(NULL, "a", true /* safe */);
+ ErrorCode e5 = compiler.Trap(NULL, "b", true /* safe */);
+ ErrorCode e6 = compiler.Trap(NULL, "a", true /* safe */);
SANDBOX_ASSERT(!e1.Equals(e4));
SANDBOX_ASSERT(!e3.Equals(e4));
SANDBOX_ASSERT(!e5.Equals(e4));
@@ -105,9 +105,9 @@
DummyPolicy dummy_policy;
bpf_dsl::PolicyCompiler compiler(&dummy_policy, Trap::Registry());
- ErrorCode e4 = compiler.Trap(NULL, "a");
- ErrorCode e5 = compiler.Trap(NULL, "b");
- ErrorCode e6 = compiler.Trap(NULL, "a");
+ ErrorCode e4 = compiler.Trap(NULL, "a", true /* safe */);
+ ErrorCode e5 = compiler.Trap(NULL, "b", true /* safe */);
+ ErrorCode e6 = compiler.Trap(NULL, "a", true /* safe */);
SANDBOX_ASSERT(e1.LessThan(e4));
SANDBOX_ASSERT(e3.LessThan(e4));
SANDBOX_ASSERT(e4.LessThan(e5));
diff --git a/sandbox/linux/seccomp-bpf/sandbox_bpf.cc b/sandbox/linux/seccomp-bpf/sandbox_bpf.cc
index 43c9af6..555f672 100644
--- a/sandbox/linux/seccomp-bpf/sandbox_bpf.cc
+++ b/sandbox/linux/seccomp-bpf/sandbox_bpf.cc
@@ -11,24 +11,18 @@
#endif
#include <errno.h>
-#include <fcntl.h>
#include <linux/filter.h>
-#include <signal.h>
-#include <string.h>
#include <sys/prctl.h>
-#include <sys/stat.h>
-#include <sys/syscall.h>
#include <sys/types.h>
-#include <sys/wait.h>
-#include <time.h>
#include <unistd.h>
#include "base/compiler_specific.h"
+#include "base/files/scoped_file.h"
#include "base/logging.h"
#include "base/macros.h"
#include "base/memory/scoped_ptr.h"
#include "base/posix/eintr_wrapper.h"
-#include "sandbox/linux/bpf_dsl/bpf_dsl.h"
+#include "base/third_party/valgrind/valgrind.h"
#include "sandbox/linux/bpf_dsl/dump_bpf.h"
#include "sandbox/linux/bpf_dsl/policy.h"
#include "sandbox/linux/bpf_dsl/policy_compiler.h"
@@ -42,354 +36,95 @@
#include "sandbox/linux/seccomp-bpf/verifier.h"
#include "sandbox/linux/services/linux_syscalls.h"
#include "sandbox/linux/services/syscall_wrappers.h"
-
-using sandbox::bpf_dsl::Allow;
-using sandbox::bpf_dsl::Error;
-using sandbox::bpf_dsl::ResultExpr;
+#include "sandbox/linux/services/thread_helpers.h"
namespace sandbox {
namespace {
-const int kExpectedExitCode = 100;
+bool IsRunningOnValgrind() { return RUNNING_ON_VALGRIND; }
-#if !defined(NDEBUG)
-void WriteFailedStderrSetupMessage(int out_fd) {
- const char* error_string = strerror(errno);
- static const char msg[] =
- "You have reproduced a puzzling issue.\n"
- "Please, report to crbug.com/152530!\n"
- "Failed to set up stderr: ";
- if (HANDLE_EINTR(write(out_fd, msg, sizeof(msg) - 1)) > 0 && error_string &&
- HANDLE_EINTR(write(out_fd, error_string, strlen(error_string))) > 0 &&
- HANDLE_EINTR(write(out_fd, "\n", 1))) {
- }
-}
-#endif // !defined(NDEBUG)
-
-// We define a really simple sandbox policy. It is just good enough for us
-// to tell that the sandbox has actually been activated.
-class ProbePolicy : public bpf_dsl::Policy {
- public:
- ProbePolicy() {}
- virtual ~ProbePolicy() {}
-
- virtual ResultExpr EvaluateSyscall(int sysnum) const override {
- switch (sysnum) {
- case __NR_getpid:
- // Return EPERM so that we can check that the filter actually ran.
- return Error(EPERM);
- case __NR_exit_group:
- // Allow exit() with a non-default return code.
- return Allow();
- default:
- // Make everything else fail in an easily recognizable way.
- return Error(EINVAL);
- }
- }
-
- private:
- DISALLOW_COPY_AND_ASSIGN(ProbePolicy);
-};
-
-void ProbeProcess(void) {
- if (sys_getpid() < 0 && errno == EPERM) {
- sys_exit_group(kExpectedExitCode);
- }
+bool IsSingleThreaded(int proc_task_fd) {
+ return ThreadHelpers::IsSingleThreaded(proc_task_fd);
}
-class AllowAllPolicy : public bpf_dsl::Policy {
- public:
- AllowAllPolicy() {}
- virtual ~AllowAllPolicy() {}
+// Check if the kernel supports seccomp-filter (a.k.a. seccomp mode 2) via
+// prctl().
+bool KernelSupportsSeccompBPF() {
+ errno = 0;
+ const int rv = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, nullptr);
- virtual ResultExpr EvaluateSyscall(int sysnum) const override {
- DCHECK(SandboxBPF::IsValidSyscallNumber(sysnum));
- return Allow();
- }
-
- private:
- DISALLOW_COPY_AND_ASSIGN(AllowAllPolicy);
-};
-
-void TryVsyscallProcess(void) {
- time_t current_time;
- // time() is implemented as a vsyscall. With an older glibc, with
- // vsyscall=emulate and some versions of the seccomp BPF patch
- // we may get SIGKILL-ed. Detect this!
- if (time(¤t_time) != static_cast<time_t>(-1)) {
- sys_exit_group(kExpectedExitCode);
- }
-}
-
-bool IsSingleThreaded(int proc_fd) {
- if (proc_fd < 0) {
- // Cannot determine whether program is single-threaded. Hope for
- // the best...
+ if (rv == -1 && EFAULT == errno) {
return true;
}
+ return false;
+}
- struct stat sb;
- int task = -1;
- if ((task = openat(proc_fd, "self/task", O_RDONLY | O_DIRECTORY)) < 0 ||
- fstat(task, &sb) != 0 || sb.st_nlink != 3 || IGNORE_EINTR(close(task))) {
- if (task >= 0) {
- if (IGNORE_EINTR(close(task))) {
- }
- }
+// Check if the kernel supports seccomp-filter via the seccomp system call
+// and the TSYNC feature to enable seccomp on all threads.
+bool KernelSupportsSeccompTsync() {
+ errno = 0;
+ const int rv =
+ sys_seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_TSYNC, nullptr);
+
+ if (rv == -1 && errno == EFAULT) {
+ return true;
+ } else {
+ // TODO(jln): turn these into DCHECK after 417888 is considered fixed.
+ CHECK_EQ(-1, rv);
+ CHECK(ENOSYS == errno || EINVAL == errno);
return false;
}
- return true;
}
} // namespace
-SandboxBPF::SandboxBPF()
- : quiet_(false), proc_fd_(-1), sandbox_has_started_(false), policy_() {
+SandboxBPF::SandboxBPF(bpf_dsl::Policy* policy)
+ : proc_task_fd_(), sandbox_has_started_(false), policy_(policy) {
}
SandboxBPF::~SandboxBPF() {
}
-bool SandboxBPF::IsValidSyscallNumber(int sysnum) {
- return SyscallSet::IsValid(sysnum);
-}
-
-bool SandboxBPF::RunFunctionInPolicy(void (*code_in_sandbox)(),
- scoped_ptr<bpf_dsl::Policy> policy) {
- // Block all signals before forking a child process. This prevents an
- // attacker from manipulating our test by sending us an unexpected signal.
- sigset_t old_mask, new_mask;
- if (sigfillset(&new_mask) || sigprocmask(SIG_BLOCK, &new_mask, &old_mask)) {
- SANDBOX_DIE("sigprocmask() failed");
- }
- int fds[2];
- if (pipe2(fds, O_NONBLOCK | O_CLOEXEC)) {
- SANDBOX_DIE("pipe() failed");
- }
-
- if (fds[0] <= 2 || fds[1] <= 2) {
- SANDBOX_DIE("Process started without standard file descriptors");
- }
-
- // This code is using fork() and should only ever run single-threaded.
- // Most of the code below is "async-signal-safe" and only minor changes
- // would be needed to support threads.
- DCHECK(IsSingleThreaded(proc_fd_));
- pid_t pid = fork();
- if (pid < 0) {
- // Die if we cannot fork(). We would probably fail a little later
- // anyway, as the machine is likely very close to running out of
- // memory.
- // But what we don't want to do is return "false", as a crafty
- // attacker might cause fork() to fail at will and could trick us
- // into running without a sandbox.
- sigprocmask(SIG_SETMASK, &old_mask, NULL); // OK, if it fails
- SANDBOX_DIE("fork() failed unexpectedly");
- }
-
- // In the child process
- if (!pid) {
- // Test a very simple sandbox policy to verify that we can
- // successfully turn on sandboxing.
- Die::EnableSimpleExit();
-
- errno = 0;
- if (IGNORE_EINTR(close(fds[0]))) {
- // This call to close() has been failing in strange ways. See
- // crbug.com/152530. So we only fail in debug mode now.
-#if !defined(NDEBUG)
- WriteFailedStderrSetupMessage(fds[1]);
- SANDBOX_DIE(NULL);
-#endif
- }
- if (HANDLE_EINTR(dup2(fds[1], 2)) != 2) {
- // Stderr could very well be a file descriptor to .xsession-errors, or
- // another file, which could be backed by a file system that could cause
- // dup2 to fail while trying to close stderr. It's important that we do
- // not fail on trying to close stderr.
- // If dup2 fails here, we will continue normally, this means that our
- // parent won't cause a fatal failure if something writes to stderr in
- // this child.
-#if !defined(NDEBUG)
- // In DEBUG builds, we still want to get a report.
- WriteFailedStderrSetupMessage(fds[1]);
- SANDBOX_DIE(NULL);
-#endif
- }
- if (IGNORE_EINTR(close(fds[1]))) {
- // This call to close() has been failing in strange ways. See
- // crbug.com/152530. So we only fail in debug mode now.
-#if !defined(NDEBUG)
- WriteFailedStderrSetupMessage(fds[1]);
- SANDBOX_DIE(NULL);
-#endif
- }
-
- SetSandboxPolicy(policy.release());
- if (!StartSandbox(PROCESS_SINGLE_THREADED)) {
- SANDBOX_DIE(NULL);
- }
-
- // Run our code in the sandbox.
- code_in_sandbox();
-
- // code_in_sandbox() is not supposed to return here.
- SANDBOX_DIE(NULL);
- }
-
- // In the parent process.
- if (IGNORE_EINTR(close(fds[1]))) {
- SANDBOX_DIE("close() failed");
- }
- if (sigprocmask(SIG_SETMASK, &old_mask, NULL)) {
- SANDBOX_DIE("sigprocmask() failed");
- }
- int status;
- if (HANDLE_EINTR(waitpid(pid, &status, 0)) != pid) {
- SANDBOX_DIE("waitpid() failed unexpectedly");
- }
- bool rc = WIFEXITED(status) && WEXITSTATUS(status) == kExpectedExitCode;
-
- // If we fail to support sandboxing, there might be an additional
- // error message. If so, this was an entirely unexpected and fatal
- // failure. We should report the failure and somebody must fix
- // things. This is probably a security-critical bug in the sandboxing
- // code.
- if (!rc) {
- char buf[4096];
- ssize_t len = HANDLE_EINTR(read(fds[0], buf, sizeof(buf) - 1));
- if (len > 0) {
- while (len > 1 && buf[len - 1] == '\n') {
- --len;
- }
- buf[len] = '\000';
- SANDBOX_DIE(buf);
- }
- }
- if (IGNORE_EINTR(close(fds[0]))) {
- SANDBOX_DIE("close() failed");
- }
-
- return rc;
-}
-
-bool SandboxBPF::KernelSupportSeccompBPF() {
- return RunFunctionInPolicy(ProbeProcess,
- scoped_ptr<bpf_dsl::Policy>(new ProbePolicy())) &&
- RunFunctionInPolicy(TryVsyscallProcess,
- scoped_ptr<bpf_dsl::Policy>(new AllowAllPolicy()));
-}
-
// static
-SandboxBPF::SandboxStatus SandboxBPF::SupportsSeccompSandbox(int proc_fd) {
- // It the sandbox is currently active, we clearly must have support for
- // sandboxing.
- if (status_ == STATUS_ENABLED) {
- return status_;
- }
-
- // Even if the sandbox was previously available, something might have
- // changed in our run-time environment. Check one more time.
- if (status_ == STATUS_AVAILABLE) {
- if (!IsSingleThreaded(proc_fd)) {
- status_ = STATUS_UNAVAILABLE;
- }
- return status_;
- }
-
- if (status_ == STATUS_UNAVAILABLE && IsSingleThreaded(proc_fd)) {
- // All state transitions resulting in STATUS_UNAVAILABLE are immediately
- // preceded by STATUS_AVAILABLE. Furthermore, these transitions all
- // happen, if and only if they are triggered by the process being multi-
- // threaded.
- // In other words, if a single-threaded process is currently in the
- // STATUS_UNAVAILABLE state, it is safe to assume that sandboxing is
- // actually available.
- status_ = STATUS_AVAILABLE;
- return status_;
- }
-
- // If we have not previously checked for availability of the sandbox or if
- // we otherwise don't believe to have a good cached value, we have to
- // perform a thorough check now.
- if (status_ == STATUS_UNKNOWN) {
- // We create our own private copy of a "Sandbox" object. This ensures that
- // the object does not have any policies configured, that might interfere
- // with the tests done by "KernelSupportSeccompBPF()".
- SandboxBPF sandbox;
-
- // By setting "quiet_ = true" we suppress messages for expected and benign
- // failures (e.g. if the current kernel lacks support for BPF filters).
- sandbox.quiet_ = true;
- sandbox.set_proc_fd(proc_fd);
- status_ = sandbox.KernelSupportSeccompBPF() ? STATUS_AVAILABLE
- : STATUS_UNSUPPORTED;
-
- // As we are performing our tests from a child process, the run-time
- // environment that is visible to the sandbox is always guaranteed to be
- // single-threaded. Let's check here whether the caller is single-
- // threaded. Otherwise, we mark the sandbox as temporarily unavailable.
- if (status_ == STATUS_AVAILABLE && !IsSingleThreaded(proc_fd)) {
- status_ = STATUS_UNAVAILABLE;
- }
- }
- return status_;
-}
-
-// static
-SandboxBPF::SandboxStatus
-SandboxBPF::SupportsSeccompThreadFilterSynchronization() {
- // Applying NO_NEW_PRIVS, a BPF filter, and synchronizing the filter across
- // the thread group are all handled atomically by this syscall.
- const int rv = syscall(
- __NR_seccomp, SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_TSYNC, NULL);
-
- if (rv == -1 && errno == EFAULT) {
- return STATUS_AVAILABLE;
- } else {
- // TODO(jln): turn these into DCHECK after 417888 is considered fixed.
- CHECK_EQ(-1, rv);
- CHECK(ENOSYS == errno || EINVAL == errno);
- return STATUS_UNSUPPORTED;
- }
-}
-
-void SandboxBPF::set_proc_fd(int proc_fd) { proc_fd_ = proc_fd; }
-
-bool SandboxBPF::StartSandbox(SandboxThreadState thread_state) {
- CHECK(thread_state == PROCESS_SINGLE_THREADED ||
- thread_state == PROCESS_MULTI_THREADED);
-
- if (status_ == STATUS_UNSUPPORTED || status_ == STATUS_UNAVAILABLE) {
- SANDBOX_DIE(
- "Trying to start sandbox, even though it is known to be "
- "unavailable");
+bool SandboxBPF::SupportsSeccompSandbox(SeccompLevel level) {
+ // Never pretend to support seccomp with Valgrind, as it
+ // throws the tool off.
+ if (IsRunningOnValgrind()) {
return false;
- } else if (sandbox_has_started_) {
+ }
+
+ switch (level) {
+ case SeccompLevel::SINGLE_THREADED:
+ return KernelSupportsSeccompBPF();
+ case SeccompLevel::MULTI_THREADED:
+ return KernelSupportsSeccompTsync();
+ }
+ NOTREACHED();
+ return false;
+}
+
+bool SandboxBPF::StartSandbox(SeccompLevel seccomp_level) {
+ DCHECK(policy_);
+ CHECK(seccomp_level == SeccompLevel::SINGLE_THREADED ||
+ seccomp_level == SeccompLevel::MULTI_THREADED);
+
+ if (sandbox_has_started_) {
SANDBOX_DIE(
"Cannot repeatedly start sandbox. Create a separate Sandbox "
"object instead.");
return false;
}
- if (proc_fd_ < 0) {
- proc_fd_ = open("/proc", O_RDONLY | O_DIRECTORY);
- }
- if (proc_fd_ < 0) {
- // For now, continue in degraded mode, if we can't access /proc.
- // In the future, we might want to tighten this requirement.
- }
- bool supports_tsync =
- SupportsSeccompThreadFilterSynchronization() == STATUS_AVAILABLE;
+ const bool supports_tsync = KernelSupportsSeccompTsync();
- if (thread_state == PROCESS_SINGLE_THREADED) {
- if (!IsSingleThreaded(proc_fd_)) {
+ if (seccomp_level == SeccompLevel::SINGLE_THREADED) {
+ if (!IsSingleThreaded(proc_task_fd_.get())) {
SANDBOX_DIE("Cannot start sandbox; process is already multi-threaded");
return false;
}
- } else if (thread_state == PROCESS_MULTI_THREADED) {
- if (IsSingleThreaded(proc_fd_)) {
+ } else if (seccomp_level == SeccompLevel::MULTI_THREADED) {
+ if (IsSingleThreaded(proc_task_fd_.get())) {
SANDBOX_DIE("Cannot start sandbox; "
"process may be single-threaded when reported as not");
return false;
@@ -404,30 +139,65 @@
// We no longer need access to any files in /proc. We want to do this
// before installing the filters, just in case that our policy denies
// close().
- if (proc_fd_ >= 0) {
- if (IGNORE_EINTR(close(proc_fd_))) {
- SANDBOX_DIE("Failed to close file descriptor for /proc");
- return false;
- }
- proc_fd_ = -1;
+ if (proc_task_fd_.is_valid()) {
+ proc_task_fd_.reset();
}
// Install the filters.
- InstallFilter(supports_tsync || thread_state == PROCESS_MULTI_THREADED);
-
- // We are now inside the sandbox.
- status_ = STATUS_ENABLED;
+ InstallFilter(supports_tsync ||
+ seccomp_level == SeccompLevel::MULTI_THREADED);
return true;
}
-// Don't take a scoped_ptr here, polymorphism make their use awkward.
-void SandboxBPF::SetSandboxPolicy(bpf_dsl::Policy* policy) {
- DCHECK(!policy_);
- if (sandbox_has_started_) {
- SANDBOX_DIE("Cannot change policy after sandbox has started");
+void SandboxBPF::SetProcTaskFd(base::ScopedFD proc_task_fd) {
+ proc_task_fd_.swap(proc_task_fd);
+}
+
+// static
+bool SandboxBPF::IsValidSyscallNumber(int sysnum) {
+ return SyscallSet::IsValid(sysnum);
+}
+
+// static
+bool SandboxBPF::IsRequiredForUnsafeTrap(int sysno) {
+ return bpf_dsl::PolicyCompiler::IsRequiredForUnsafeTrap(sysno);
+}
+
+// static
+intptr_t SandboxBPF::ForwardSyscall(const struct arch_seccomp_data& args) {
+ return Syscall::Call(
+ args.nr, static_cast<intptr_t>(args.args[0]),
+ static_cast<intptr_t>(args.args[1]), static_cast<intptr_t>(args.args[2]),
+ static_cast<intptr_t>(args.args[3]), static_cast<intptr_t>(args.args[4]),
+ static_cast<intptr_t>(args.args[5]));
+}
+
+scoped_ptr<CodeGen::Program> SandboxBPF::AssembleFilter(
+ bool force_verification) {
+#if !defined(NDEBUG)
+ force_verification = true;
+#endif
+ DCHECK(policy_);
+ bpf_dsl::PolicyCompiler compiler(policy_.get(), Trap::Registry());
+ scoped_ptr<CodeGen::Program> program = compiler.Compile();
+
+ // Make sure compilation resulted in a BPF program that executes
+ // correctly. Otherwise, there is an internal error in our BPF compiler.
+ // There is really nothing the caller can do until the bug is fixed.
+ if (force_verification) {
+ // Verification is expensive. We only perform this step, if we are
+ // compiled in debug mode, or if the caller explicitly requested
+ // verification.
+
+ const char* err = NULL;
+ if (!Verifier::VerifyBPF(&compiler, *program, *policy_, &err)) {
+ bpf_dsl::DumpBPF::PrintProgram(*program);
+ SANDBOX_DIE(err);
+ }
}
- policy_.reset(policy);
+
+ return program.Pass();
}
void SandboxBPF::InstallFilter(bool must_sync_threads) {
@@ -456,69 +226,26 @@
policy_.reset();
if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
- SANDBOX_DIE(quiet_ ? NULL : "Kernel refuses to enable no-new-privs");
+ SANDBOX_DIE("Kernel refuses to enable no-new-privs");
}
// Install BPF filter program. If the thread state indicates multi-threading
// support, then the kernel hass the seccomp system call. Otherwise, fall
// back on prctl, which requires the process to be single-threaded.
if (must_sync_threads) {
- int rv = syscall(__NR_seccomp, SECCOMP_SET_MODE_FILTER,
- SECCOMP_FILTER_FLAG_TSYNC, reinterpret_cast<const char*>(&prog));
+ int rv =
+ sys_seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_TSYNC, &prog);
if (rv) {
- SANDBOX_DIE(quiet_ ? NULL :
+ SANDBOX_DIE(
"Kernel refuses to turn on and synchronize threads for BPF filters");
}
} else {
if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog)) {
- SANDBOX_DIE(quiet_ ? NULL : "Kernel refuses to turn on BPF filters");
+ SANDBOX_DIE("Kernel refuses to turn on BPF filters");
}
}
sandbox_has_started_ = true;
}
-scoped_ptr<CodeGen::Program> SandboxBPF::AssembleFilter(
- bool force_verification) {
-#if !defined(NDEBUG)
- force_verification = true;
-#endif
-
- bpf_dsl::PolicyCompiler compiler(policy_.get(), Trap::Registry());
- scoped_ptr<CodeGen::Program> program = compiler.Compile();
-
- // Make sure compilation resulted in BPF program that executes
- // correctly. Otherwise, there is an internal error in our BPF compiler.
- // There is really nothing the caller can do until the bug is fixed.
- if (force_verification) {
- // Verification is expensive. We only perform this step, if we are
- // compiled in debug mode, or if the caller explicitly requested
- // verification.
-
- const char* err = NULL;
- if (!Verifier::VerifyBPF(&compiler, *program, *policy_, &err)) {
- bpf_dsl::DumpBPF::PrintProgram(*program);
- SANDBOX_DIE(err);
- }
- }
-
- return program.Pass();
-}
-
-bool SandboxBPF::IsRequiredForUnsafeTrap(int sysno) {
- return bpf_dsl::PolicyCompiler::IsRequiredForUnsafeTrap(sysno);
-}
-
-intptr_t SandboxBPF::ForwardSyscall(const struct arch_seccomp_data& args) {
- return Syscall::Call(args.nr,
- static_cast<intptr_t>(args.args[0]),
- static_cast<intptr_t>(args.args[1]),
- static_cast<intptr_t>(args.args[2]),
- static_cast<intptr_t>(args.args[3]),
- static_cast<intptr_t>(args.args[4]),
- static_cast<intptr_t>(args.args[5]));
-}
-
-SandboxBPF::SandboxStatus SandboxBPF::status_ = STATUS_UNKNOWN;
-
} // namespace sandbox
diff --git a/sandbox/linux/seccomp-bpf/sandbox_bpf.h b/sandbox/linux/seccomp-bpf/sandbox_bpf.h
index a7f2d5f..1a9c1f8 100644
--- a/sandbox/linux/seccomp-bpf/sandbox_bpf.h
+++ b/sandbox/linux/seccomp-bpf/sandbox_bpf.h
@@ -2,12 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef SANDBOX_LINUX_SECCOMP_BPF_SANDBOX_BPF_H__
-#define SANDBOX_LINUX_SECCOMP_BPF_SANDBOX_BPF_H__
+#ifndef SANDBOX_LINUX_SECCOMP_BPF_SANDBOX_BPF_H_
+#define SANDBOX_LINUX_SECCOMP_BPF_SANDBOX_BPF_H_
#include <stdint.h>
-#include "base/compiler_specific.h"
+#include "base/files/scoped_file.h"
#include "base/macros.h"
#include "base/memory/scoped_ptr.h"
#include "sandbox/linux/seccomp-bpf/codegen.h"
@@ -19,67 +19,63 @@
class Policy;
}
+// This class can be used to apply a syscall sandboxing policy expressed in a
+// bpf_dsl::Policy object to the current process.
+// Syscall sandboxing policies get inherited by subprocesses and, once applied,
+// can never be removed for the lifetime of the process.
class SANDBOX_EXPORT SandboxBPF {
public:
- enum SandboxStatus {
- STATUS_UNKNOWN, // Status prior to calling supportsSeccompSandbox()
- STATUS_UNSUPPORTED, // The kernel does not appear to support sandboxing
- STATUS_UNAVAILABLE, // Currently unavailable but might work again later
- STATUS_AVAILABLE, // Sandboxing is available but not currently active
- STATUS_ENABLED // The sandbox is now active
+ enum class SeccompLevel {
+ SINGLE_THREADED,
+ MULTI_THREADED,
};
- // Depending on the level of kernel support, seccomp-bpf may require the
- // process to be single-threaded in order to enable it. When calling
- // StartSandbox(), the program should indicate whether or not the sandbox
- // should try and engage with multi-thread support.
- enum SandboxThreadState {
- PROCESS_INVALID,
- PROCESS_SINGLE_THREADED, // The program is currently single-threaded.
- // Note: PROCESS_MULTI_THREADED requires experimental kernel support that
- // has not been contributed to upstream Linux.
- PROCESS_MULTI_THREADED, // The program may be multi-threaded.
- };
-
- // Constructors and destructors.
+ // Ownership of |policy| is transfered here to the sandbox object.
+ // nullptr is allowed for unit tests.
+ explicit SandboxBPF(bpf_dsl::Policy* policy);
// NOTE: Setting a policy and starting the sandbox is a one-way operation.
- // The kernel does not provide any option for unloading a loaded
- // sandbox. Strictly speaking, that means we should disallow calling
- // the destructor, if StartSandbox() has ever been called. In practice,
- // this makes it needlessly complicated to operate on "Sandbox"
- // objects. So, we instead opted to allow object destruction. But it
- // should be noted that during its lifetime, the object probably made
- // irreversible state changes to the runtime environment. These changes
- // stay in effect even after the destructor has been run.
- SandboxBPF();
+ // The kernel does not provide any option for unloading a loaded sandbox. The
+ // sandbox remains engaged even when the object is destructed.
~SandboxBPF();
- // Checks whether a particular system call number is valid on the current
- // architecture. E.g. on ARM there's a non-contiguous range of private
- // system calls.
- static bool IsValidSyscallNumber(int sysnum);
+ // Detect if the kernel supports the specified seccomp level.
+ // See StartSandbox() for a description of these.
+ static bool SupportsSeccompSandbox(SeccompLevel level);
- // There are a lot of reasons why the Seccomp sandbox might not be available.
- // This could be because the kernel does not support Seccomp mode, or it
- // could be because another sandbox is already active.
- // "proc_fd" should be a file descriptor for "/proc", or -1 if not
- // provided by the caller.
- static SandboxStatus SupportsSeccompSandbox(int proc_fd);
+ // This is the main public entry point. It sets up the resources needed by
+ // the sandbox, and enters Seccomp mode.
+ // The calling process must provide a |level| to tell the sandbox which type
+ // of kernel support it should engage.
+ // SINGLE_THREADED will only sandbox the calling thread. Since it would be a
+ // security risk, the sandbox will also check that the current process is
+ // single threaded and crash if it isn't the case.
+ // MULTI_THREADED requires more recent kernel support and allows to sandbox
+ // all the threads of the current process. Be mindful of potential races,
+ // with other threads using disallowed system calls either before or after
+ // the sandbox is engaged.
+ //
+ // It is possible to stack multiple sandboxes by creating separate "Sandbox"
+ // objects and calling "StartSandbox()" on each of them. Please note, that
+ // this requires special care, though, as newly stacked sandboxes can never
+ // relax restrictions imposed by earlier sandboxes. Furthermore, installing
+ // a new policy requires making system calls, that might already be
+ // disallowed.
+ // Finally, stacking does add more kernel overhead than having a single
+ // combined policy. So, it should only be used if there are no alternatives.
+ bool StartSandbox(SeccompLevel level) WARN_UNUSED_RESULT;
- // Determines if the kernel has support for the seccomp() system call to
- // synchronize BPF filters across a thread group.
- static SandboxStatus SupportsSeccompThreadFilterSynchronization();
-
- // The sandbox needs to be able to access files in "/proc/self". If this
- // directory is not accessible when "startSandbox()" gets called, the caller
- // can provide an already opened file descriptor by calling "set_proc_fd()".
+ // The sandbox needs to be able to access files in "/proc/self/task/". If
+ // this directory is not accessible when "StartSandbox()" gets called, the
+ // caller must provide an already opened file descriptor by calling
+ // "SetProcTaskFd()".
// The sandbox becomes the new owner of this file descriptor and will
- // eventually close it when "StartSandbox()" executes.
- void set_proc_fd(int proc_fd);
+ // close it when "StartSandbox()" executes or when the sandbox object
+ // disappears.
+ void SetProcTaskFd(base::ScopedFD proc_task_fd);
- // Set the BPF policy as |policy|. Ownership of |policy| is transfered here
- // to the sandbox object.
- void SetSandboxPolicy(bpf_dsl::Policy* policy);
+ // Checks whether a particular system call number is valid on the current
+ // architecture.
+ static bool IsValidSyscallNumber(int sysnum);
// UnsafeTraps require some syscalls to always be allowed.
// This helper function returns true for these calls.
@@ -95,21 +91,6 @@
// directly suitable as a return value for a trap handler.
static intptr_t ForwardSyscall(const struct arch_seccomp_data& args);
- // This is the main public entry point. It finds all system calls that
- // need rewriting, sets up the resources needed by the sandbox, and
- // enters Seccomp mode.
- // The calling process must specify its current SandboxThreadState, as a way
- // to tell the sandbox which type of kernel support it should engage.
- // It is possible to stack multiple sandboxes by creating separate "Sandbox"
- // objects and calling "StartSandbox()" on each of them. Please note, that
- // this requires special care, though, as newly stacked sandboxes can never
- // relax restrictions imposed by earlier sandboxes. Furthermore, installing
- // a new policy requires making system calls, that might already be
- // disallowed.
- // Finally, stacking does add more kernel overhead than having a single
- // combined policy. So, it should only be used if there are no alternatives.
- bool StartSandbox(SandboxThreadState thread_state) WARN_UNUSED_RESULT;
-
// Assembles a BPF filter program from the current policy. After calling this
// function, you must not call any other sandboxing function.
// Typically, AssembleFilter() is only used by unit tests and by sandbox
@@ -121,34 +102,11 @@
scoped_ptr<CodeGen::Program> AssembleFilter(bool force_verification);
private:
- // Get a file descriptor pointing to "/proc", if currently available.
- int proc_fd() { return proc_fd_; }
-
- // Creates a subprocess and runs "code_in_sandbox" inside of the specified
- // policy. The caller has to make sure that "this" has not yet been
- // initialized with any other policies.
- bool RunFunctionInPolicy(void (*code_in_sandbox)(),
- scoped_ptr<bpf_dsl::Policy> policy);
-
- // Performs a couple of sanity checks to verify that the kernel supports the
- // features that we need for successful sandboxing.
- // The caller has to make sure that "this" has not yet been initialized with
- // any other policies.
- bool KernelSupportSeccompBPF();
-
// Assembles and installs a filter based on the policy that has previously
// been configured with SetSandboxPolicy().
void InstallFilter(bool must_sync_threads);
- // Verify the correctness of a compiled program by comparing it against the
- // current policy. This function should only ever be called by unit tests and
- // by the sandbox internals. It should not be used by production code.
- void VerifyProgram(const CodeGen::Program& program);
-
- static SandboxStatus status_;
-
- bool quiet_;
- int proc_fd_;
+ base::ScopedFD proc_task_fd_;
bool sandbox_has_started_;
scoped_ptr<bpf_dsl::Policy> policy_;
@@ -157,4 +115,4 @@
} // namespace sandbox
-#endif // SANDBOX_LINUX_SECCOMP_BPF_SANDBOX_BPF_H__
+#endif // SANDBOX_LINUX_SECCOMP_BPF_SANDBOX_BPF_H_
diff --git a/sandbox/linux/seccomp-bpf/sandbox_bpf_test_runner.cc b/sandbox/linux/seccomp-bpf/sandbox_bpf_test_runner.cc
index 59ee26f..cb051d2 100644
--- a/sandbox/linux/seccomp-bpf/sandbox_bpf_test_runner.cc
+++ b/sandbox/linux/seccomp-bpf/sandbox_bpf_test_runner.cc
@@ -31,20 +31,12 @@
scoped_ptr<bpf_dsl::Policy> policy =
bpf_tester_delegate_->GetSandboxBPFPolicy();
- if (sandbox::SandboxBPF::SupportsSeccompSandbox(-1) ==
- sandbox::SandboxBPF::STATUS_AVAILABLE) {
- // Ensure the the sandbox is actually available at this time
- int proc_fd;
- SANDBOX_ASSERT((proc_fd = open("/proc", O_RDONLY | O_DIRECTORY)) >= 0);
- SANDBOX_ASSERT(sandbox::SandboxBPF::SupportsSeccompSandbox(proc_fd) ==
- sandbox::SandboxBPF::STATUS_AVAILABLE);
-
+ if (sandbox::SandboxBPF::SupportsSeccompSandbox(
+ SandboxBPF::SeccompLevel::SINGLE_THREADED)) {
// Initialize and then start the sandbox with our custom policy
- sandbox::SandboxBPF sandbox;
- sandbox.set_proc_fd(proc_fd);
- sandbox.SetSandboxPolicy(policy.release());
- SANDBOX_ASSERT(
- sandbox.StartSandbox(sandbox::SandboxBPF::PROCESS_SINGLE_THREADED));
+ sandbox::SandboxBPF sandbox(policy.release());
+ SANDBOX_ASSERT(sandbox.StartSandbox(
+ sandbox::SandboxBPF::SeccompLevel::SINGLE_THREADED));
// Run the actual test.
bpf_tester_delegate_->RunTestFunction();
@@ -58,8 +50,7 @@
}
// Call the compiler and verify the policy. That's the least we can do,
// if we don't have kernel support.
- sandbox::SandboxBPF sandbox;
- sandbox.SetSandboxPolicy(policy.release());
+ sandbox::SandboxBPF sandbox(policy.release());
sandbox.AssembleFilter(true /* force_verification */);
sandbox::UnitTests::IgnoreThisTest();
}
diff --git a/sandbox/linux/seccomp-bpf/sandbox_bpf_unittest.cc b/sandbox/linux/seccomp-bpf/sandbox_bpf_unittest.cc
new file mode 100644
index 0000000..7e478b5
--- /dev/null
+++ b/sandbox/linux/seccomp-bpf/sandbox_bpf_unittest.cc
@@ -0,0 +1,85 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "sandbox/linux/seccomp-bpf/sandbox_bpf.h"
+
+#include <fcntl.h>
+#include <unistd.h>
+
+#include <iostream>
+
+#include "base/files/scoped_file.h"
+#include "base/posix/eintr_wrapper.h"
+#include "sandbox/linux/tests/unit_tests.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace sandbox {
+namespace {
+
+// NOTE: most tests for the SandboxBPF class are currently in
+// bpf_dsl_more_unittest.cc.
+
+TEST(SandboxBPF, CreateDestroy) {
+ // Give an opportunity to dynamic tools to perform some simple testing.
+ SandboxBPF sandbox(nullptr);
+ SandboxBPF* sandbox_ptr = new SandboxBPF(nullptr);
+ delete sandbox_ptr;
+}
+
+// This test should execute no matter whether we have kernel support. So,
+// we make it a TEST() instead of a BPF_TEST().
+TEST(SandboxBPF, DISABLE_ON_TSAN(CallSupports)) {
+ // We check that we don't crash, but it's ok if the kernel doesn't
+ // support it.
+ bool seccomp_bpf_supported = SandboxBPF::SupportsSeccompSandbox(
+ SandboxBPF::SeccompLevel::SINGLE_THREADED);
+ bool seccomp_bpf_tsync_supported = SandboxBPF::SupportsSeccompSandbox(
+ SandboxBPF::SeccompLevel::MULTI_THREADED);
+ // We want to log whether or not seccomp BPF is actually supported
+ // since actual test coverage depends on it.
+ std::cout << "Seccomp BPF supported (single thread): "
+ << (seccomp_bpf_supported ? "true." : "false.") << "\n";
+ std::cout << "Seccomp BPF supported (multi thread): "
+ << (seccomp_bpf_tsync_supported ? "true." : "false.") << "\n";
+ std::cout << "Pointer size: " << sizeof(void*) << "\n";
+}
+
+SANDBOX_TEST(SandboxBPF, DISABLE_ON_TSAN(CallSupportsTwice)) {
+ bool single1 = SandboxBPF::SupportsSeccompSandbox(
+ SandboxBPF::SeccompLevel::SINGLE_THREADED);
+ bool single2 = SandboxBPF::SupportsSeccompSandbox(
+ SandboxBPF::SeccompLevel::SINGLE_THREADED);
+ ASSERT_EQ(single1, single2);
+ bool multi1 = SandboxBPF::SupportsSeccompSandbox(
+ SandboxBPF::SeccompLevel::MULTI_THREADED);
+ bool multi2 = SandboxBPF::SupportsSeccompSandbox(
+ SandboxBPF::SeccompLevel::MULTI_THREADED);
+ ASSERT_EQ(multi1, multi2);
+
+ // Multi threaded support implies single threaded support.
+ if (multi1) {
+ ASSERT_TRUE(single1);
+ }
+}
+
+TEST(SandboxBPF, ProcTaskFdDescriptorGetsClosed) {
+ int pipe_fds[2];
+ ASSERT_EQ(0, pipe(pipe_fds));
+ base::ScopedFD read_end(pipe_fds[0]);
+ base::ScopedFD write_end(pipe_fds[1]);
+
+ {
+ SandboxBPF sandbox(nullptr);
+ sandbox.SetProcTaskFd(write_end.Pass());
+ }
+
+ ASSERT_EQ(0, fcntl(read_end.get(), F_SETFL, O_NONBLOCK));
+ char c;
+ // Check that the sandbox closed the write_end (read will EOF instead of
+ // returning EWOULDBLOCK).
+ ASSERT_EQ(0, read(read_end.get(), &c, 1));
+}
+
+} // namespace
+} // sandbox
diff --git a/sandbox/linux/services/credentials.cc b/sandbox/linux/services/credentials.cc
index a745220..f926ce8 100644
--- a/sandbox/linux/services/credentials.cc
+++ b/sandbox/linux/services/credentials.cc
@@ -4,13 +4,10 @@
#include "sandbox/linux/services/credentials.h"
-#include <dirent.h>
#include <errno.h>
-#include <fcntl.h>
#include <signal.h>
#include <stdio.h>
#include <sys/capability.h>
-#include <sys/stat.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <sys/wait.h>
@@ -24,6 +21,7 @@
#include "base/template_util.h"
#include "base/third_party/valgrind/valgrind.h"
#include "base/threading/thread.h"
+#include "sandbox/linux/services/proc_util.h"
#include "sandbox/linux/services/syscall_wrappers.h"
namespace {
@@ -61,15 +59,6 @@
// TODO(jln): fix base/.
typedef scoped_ptr<FILE, FILECloser> ScopedFILE;
-struct DIRCloser {
- void operator()(DIR* d) const {
- DCHECK(d);
- PCHECK(0 == closedir(d));
- }
-};
-
-typedef scoped_ptr<DIR, DIRCloser> ScopedDIR;
-
COMPILE_ASSERT((base::is_same<uid_t, gid_t>::value), UidAndGidAreSameType);
// generic_id_t can be used for either uid_t or gid_t.
typedef uid_t generic_id_t;
@@ -174,86 +163,6 @@
Credentials::~Credentials() {
}
-int Credentials::CountOpenFds(int proc_fd) {
- DCHECK_LE(0, proc_fd);
- int proc_self_fd = openat(proc_fd, "self/fd", O_DIRECTORY | O_RDONLY);
- PCHECK(0 <= proc_self_fd);
-
- // Ownership of proc_self_fd is transferred here, it must not be closed
- // or modified afterwards except via dir.
- ScopedDIR dir(fdopendir(proc_self_fd));
- CHECK(dir);
-
- int count = 0;
- struct dirent e;
- struct dirent* de;
- while (!readdir_r(dir.get(), &e, &de) && de) {
- if (strcmp(e.d_name, ".") == 0 || strcmp(e.d_name, "..") == 0) {
- continue;
- }
-
- int fd_num;
- CHECK(base::StringToInt(e.d_name, &fd_num));
- if (fd_num == proc_fd || fd_num == proc_self_fd) {
- continue;
- }
-
- ++count;
- }
- return count;
-}
-
-bool Credentials::HasOpenDirectory(int proc_fd) {
- int proc_self_fd = -1;
- if (proc_fd >= 0) {
- proc_self_fd = openat(proc_fd, "self/fd", O_DIRECTORY | O_RDONLY);
- } else {
- proc_self_fd = openat(AT_FDCWD, "/proc/self/fd", O_DIRECTORY | O_RDONLY);
- if (proc_self_fd < 0) {
- // If this process has been chrooted (eg into /proc/self/fdinfo) then
- // the new root dir will not have directory listing permissions for us
- // (hence EACCES). And if we do have this permission, then /proc won't
- // exist anyway (hence ENOENT).
- DPCHECK(errno == EACCES || errno == ENOENT)
- << "Unexpected failure when trying to open /proc/self/fd: ("
- << errno << ") " << strerror(errno);
-
- // If not available, guess false.
- return false;
- }
- }
- PCHECK(0 <= proc_self_fd);
-
- // Ownership of proc_self_fd is transferred here, it must not be closed
- // or modified afterwards except via dir.
- ScopedDIR dir(fdopendir(proc_self_fd));
- CHECK(dir);
-
- struct dirent e;
- struct dirent* de;
- while (!readdir_r(dir.get(), &e, &de) && de) {
- if (strcmp(e.d_name, ".") == 0 || strcmp(e.d_name, "..") == 0) {
- continue;
- }
-
- int fd_num;
- CHECK(base::StringToInt(e.d_name, &fd_num));
- if (fd_num == proc_fd || fd_num == proc_self_fd) {
- continue;
- }
-
- struct stat s;
- // It's OK to use proc_self_fd here, fstatat won't modify it.
- CHECK(fstatat(proc_self_fd, e.d_name, &s, 0) == 0);
- if (S_ISDIR(s.st_mode)) {
- return true;
- }
- }
-
- // No open unmanaged directories found.
- return false;
-}
-
bool Credentials::DropAllCapabilities() {
ScopedCap cap(cap_init());
CHECK(cap);
@@ -341,7 +250,7 @@
bool Credentials::DropFileSystemAccess() {
// Chrooting to a safe empty dir will only be safe if no directory file
// descriptor is available to the process.
- DCHECK(!HasOpenDirectory(-1));
+ DCHECK(!ProcUtil::HasOpenDirectory(-1));
return ChrootToSafeEmptyDir();
}
diff --git a/sandbox/linux/services/credentials.h b/sandbox/linux/services/credentials.h
index 99f8f32..c6a6eb0 100644
--- a/sandbox/linux/services/credentials.h
+++ b/sandbox/linux/services/credentials.h
@@ -27,25 +27,6 @@
Credentials();
~Credentials();
- // Returns the number of file descriptors in the current process's FD
- // table, excluding |proc_fd|, which should be a file descriptor for
- // /proc.
- int CountOpenFds(int proc_fd);
-
- // Checks whether the current process has any directory file descriptor open.
- // Directory file descriptors are "capabilities" that would let a process use
- // system calls such as openat() to bypass restrictions such as
- // DropFileSystemAccess().
- // Sometimes it's useful to call HasOpenDirectory() after file system access
- // has been dropped. In this case, |proc_fd| should be a file descriptor to
- // /proc. The file descriptor in |proc_fd| will be ignored by
- // HasOpenDirectory() and remains owned by the caller. It is very important
- // for the caller to close it.
- // If /proc is available, |proc_fd| can be passed as -1.
- // If |proc_fd| is -1 and /proc is not available, this function will return
- // false.
- bool HasOpenDirectory(int proc_fd);
-
// Drop all capabilities in the effective, inheritable and permitted sets for
// the current process.
bool DropAllCapabilities();
diff --git a/sandbox/linux/services/credentials_unittest.cc b/sandbox/linux/services/credentials_unittest.cc
index 28199fb..5951d4a 100644
--- a/sandbox/linux/services/credentials_unittest.cc
+++ b/sandbox/linux/services/credentials_unittest.cc
@@ -57,56 +57,6 @@
scoped_ptr<Credentials> cred2(new Credentials);
}
-TEST(Credentials, CountOpenFds) {
- base::ScopedFD proc_fd(open("/proc", O_RDONLY | O_DIRECTORY));
- ASSERT_TRUE(proc_fd.is_valid());
- Credentials creds;
- int fd_count = creds.CountOpenFds(proc_fd.get());
- int fd = open("/dev/null", O_RDONLY);
- ASSERT_LE(0, fd);
- EXPECT_EQ(fd_count + 1, creds.CountOpenFds(proc_fd.get()));
- ASSERT_EQ(0, IGNORE_EINTR(close(fd)));
- EXPECT_EQ(fd_count, creds.CountOpenFds(proc_fd.get()));
-}
-
-TEST(Credentials, HasOpenDirectory) {
- Credentials creds;
- // No open directory should exist at startup.
- EXPECT_FALSE(creds.HasOpenDirectory(-1));
- {
- // Have a "/dev" file descriptor around.
- int dev_fd = open("/dev", O_RDONLY | O_DIRECTORY);
- base::ScopedFD dev_fd_closer(dev_fd);
- EXPECT_TRUE(creds.HasOpenDirectory(-1));
- }
- EXPECT_FALSE(creds.HasOpenDirectory(-1));
-}
-
-TEST(Credentials, HasOpenDirectoryWithFD) {
- Credentials creds;
-
- int proc_fd = open("/proc", O_RDONLY | O_DIRECTORY);
- base::ScopedFD proc_fd_closer(proc_fd);
- ASSERT_LE(0, proc_fd);
-
- // Don't pass |proc_fd|, an open directory (proc_fd) should
- // be detected.
- EXPECT_TRUE(creds.HasOpenDirectory(-1));
- // Pass |proc_fd| and no open directory should be detected.
- EXPECT_FALSE(creds.HasOpenDirectory(proc_fd));
-
- {
- // Have a "/dev" file descriptor around.
- int dev_fd = open("/dev", O_RDONLY | O_DIRECTORY);
- base::ScopedFD dev_fd_closer(dev_fd);
- EXPECT_TRUE(creds.HasOpenDirectory(proc_fd));
- }
-
- // The "/dev" file descriptor should now be closed, |proc_fd| is the only
- // directory file descriptor open.
- EXPECT_FALSE(creds.HasOpenDirectory(proc_fd));
-}
-
SANDBOX_TEST(Credentials, DropAllCaps) {
Credentials creds;
CHECK(creds.DropAllCapabilities());
diff --git a/sandbox/linux/services/proc_util.cc b/sandbox/linux/services/proc_util.cc
new file mode 100644
index 0000000..fd0e348
--- /dev/null
+++ b/sandbox/linux/services/proc_util.cc
@@ -0,0 +1,112 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "sandbox/linux/services/proc_util.h"
+
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include "base/logging.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/strings/string_number_conversions.h"
+
+namespace sandbox {
+namespace {
+
+struct DIRCloser {
+ void operator()(DIR* d) const {
+ DCHECK(d);
+ PCHECK(0 == closedir(d));
+ }
+};
+
+typedef scoped_ptr<DIR, DIRCloser> ScopedDIR;
+
+} // namespace
+
+int ProcUtil::CountOpenFds(int proc_fd) {
+ DCHECK_LE(0, proc_fd);
+ int proc_self_fd = openat(proc_fd, "self/fd", O_DIRECTORY | O_RDONLY);
+ PCHECK(0 <= proc_self_fd);
+
+ // Ownership of proc_self_fd is transferred here, it must not be closed
+ // or modified afterwards except via dir.
+ ScopedDIR dir(fdopendir(proc_self_fd));
+ CHECK(dir);
+
+ int count = 0;
+ struct dirent e;
+ struct dirent* de;
+ while (!readdir_r(dir.get(), &e, &de) && de) {
+ if (strcmp(e.d_name, ".") == 0 || strcmp(e.d_name, "..") == 0) {
+ continue;
+ }
+
+ int fd_num;
+ CHECK(base::StringToInt(e.d_name, &fd_num));
+ if (fd_num == proc_fd || fd_num == proc_self_fd) {
+ continue;
+ }
+
+ ++count;
+ }
+ return count;
+}
+
+bool ProcUtil::HasOpenDirectory(int proc_fd) {
+ int proc_self_fd = -1;
+ if (proc_fd >= 0) {
+ proc_self_fd = openat(proc_fd, "self/fd", O_DIRECTORY | O_RDONLY);
+ } else {
+ proc_self_fd = openat(AT_FDCWD, "/proc/self/fd", O_DIRECTORY | O_RDONLY);
+ if (proc_self_fd < 0) {
+ // If this process has been chrooted (eg into /proc/self/fdinfo) then
+ // the new root dir will not have directory listing permissions for us
+ // (hence EACCES). And if we do have this permission, then /proc won't
+ // exist anyway (hence ENOENT).
+ DPCHECK(errno == EACCES || errno == ENOENT)
+ << "Unexpected failure when trying to open /proc/self/fd: ("
+ << errno << ") " << strerror(errno);
+
+ // If not available, guess false.
+ return false;
+ }
+ }
+ PCHECK(0 <= proc_self_fd);
+
+ // Ownership of proc_self_fd is transferred here, it must not be closed
+ // or modified afterwards except via dir.
+ ScopedDIR dir(fdopendir(proc_self_fd));
+ CHECK(dir);
+
+ struct dirent e;
+ struct dirent* de;
+ while (!readdir_r(dir.get(), &e, &de) && de) {
+ if (strcmp(e.d_name, ".") == 0 || strcmp(e.d_name, "..") == 0) {
+ continue;
+ }
+
+ int fd_num;
+ CHECK(base::StringToInt(e.d_name, &fd_num));
+ if (fd_num == proc_fd || fd_num == proc_self_fd) {
+ continue;
+ }
+
+ struct stat s;
+ // It's OK to use proc_self_fd here, fstatat won't modify it.
+ CHECK(fstatat(proc_self_fd, e.d_name, &s, 0) == 0);
+ if (S_ISDIR(s.st_mode)) {
+ return true;
+ }
+ }
+
+ // No open unmanaged directories found.
+ return false;
+}
+
+} // namespace sandbox
diff --git a/sandbox/linux/services/proc_util.h b/sandbox/linux/services/proc_util.h
new file mode 100644
index 0000000..9d9bb2e
--- /dev/null
+++ b/sandbox/linux/services/proc_util.h
@@ -0,0 +1,40 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SANDBOX_LINUX_SERVICES_PROC_UTIL_H_
+#define SANDBOX_LINUX_SERVICES_PROC_UTIL_H_
+
+#include "base/macros.h"
+#include "sandbox/sandbox_export.h"
+
+namespace sandbox {
+
+class SANDBOX_EXPORT ProcUtil {
+ public:
+ // Returns the number of file descriptors in the current process's FD
+ // table, excluding |proc_fd|, which should be a file descriptor for
+ // /proc.
+ static int CountOpenFds(int proc_fd);
+
+ // Checks whether the current process has any directory file descriptor open.
+ // Directory file descriptors are "capabilities" that would let a process use
+ // system calls such as openat() to bypass restrictions such as
+ // DropFileSystemAccess().
+ // Sometimes it's useful to call HasOpenDirectory() after file system access
+ // has been dropped. In this case, |proc_fd| should be a file descriptor to
+ // /proc. The file descriptor in |proc_fd| will be ignored by
+ // HasOpenDirectory() and remains owned by the caller. It is very important
+ // for the caller to close it.
+ // If /proc is available, |proc_fd| can be passed as -1.
+ // If |proc_fd| is -1 and /proc is not available, this function will return
+ // false.
+ static bool HasOpenDirectory(int proc_fd);
+
+ private:
+ DISALLOW_IMPLICIT_CONSTRUCTORS(ProcUtil);
+};
+
+} // namespace sandbox
+
+#endif // SANDBOX_LINUX_SERVICES_PROC_UTIL_H_
diff --git a/sandbox/linux/services/proc_util_unittest.cc b/sandbox/linux/services/proc_util_unittest.cc
new file mode 100644
index 0000000..ee36c83
--- /dev/null
+++ b/sandbox/linux/services/proc_util_unittest.cc
@@ -0,0 +1,62 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "sandbox/linux/services/proc_util.h"
+
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "base/files/scoped_file.h"
+#include "base/posix/eintr_wrapper.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace sandbox {
+
+TEST(ProcUtil, CountOpenFds) {
+ base::ScopedFD proc_fd(open("/proc", O_RDONLY | O_DIRECTORY));
+ ASSERT_TRUE(proc_fd.is_valid());
+ int fd_count = ProcUtil::CountOpenFds(proc_fd.get());
+ int fd = open("/dev/null", O_RDONLY);
+ ASSERT_LE(0, fd);
+ EXPECT_EQ(fd_count + 1, ProcUtil::CountOpenFds(proc_fd.get()));
+ ASSERT_EQ(0, IGNORE_EINTR(close(fd)));
+ EXPECT_EQ(fd_count, ProcUtil::CountOpenFds(proc_fd.get()));
+}
+
+TEST(ProcUtil, HasOpenDirectory) {
+ // No open directory should exist at startup.
+ EXPECT_FALSE(ProcUtil::HasOpenDirectory(-1));
+ {
+ // Have a "/dev" file descriptor around.
+ int dev_fd = open("/dev", O_RDONLY | O_DIRECTORY);
+ base::ScopedFD dev_fd_closer(dev_fd);
+ EXPECT_TRUE(ProcUtil::HasOpenDirectory(-1));
+ }
+ EXPECT_FALSE(ProcUtil::HasOpenDirectory(-1));
+}
+
+TEST(ProcUtil, HasOpenDirectoryWithFD) {
+ int proc_fd = open("/proc", O_RDONLY | O_DIRECTORY);
+ base::ScopedFD proc_fd_closer(proc_fd);
+ ASSERT_LE(0, proc_fd);
+
+ // Don't pass |proc_fd|, an open directory (proc_fd) should
+ // be detected.
+ EXPECT_TRUE(ProcUtil::HasOpenDirectory(-1));
+ // Pass |proc_fd| and no open directory should be detected.
+ EXPECT_FALSE(ProcUtil::HasOpenDirectory(proc_fd));
+
+ {
+ // Have a "/dev" file descriptor around.
+ int dev_fd = open("/dev", O_RDONLY | O_DIRECTORY);
+ base::ScopedFD dev_fd_closer(dev_fd);
+ EXPECT_TRUE(ProcUtil::HasOpenDirectory(proc_fd));
+ }
+
+ // The "/dev" file descriptor should now be closed, |proc_fd| is the only
+ // directory file descriptor open.
+ EXPECT_FALSE(ProcUtil::HasOpenDirectory(proc_fd));
+}
+
+} // namespace sandbox
diff --git a/sandbox/linux/services/syscall_wrappers.cc b/sandbox/linux/services/syscall_wrappers.cc
index 3938694..ede4964 100644
--- a/sandbox/linux/services/syscall_wrappers.cc
+++ b/sandbox/linux/services/syscall_wrappers.cc
@@ -56,4 +56,10 @@
syscall(__NR_exit_group, status);
}
+int sys_seccomp(unsigned int operation,
+ unsigned int flags,
+ const struct sock_fprog* args) {
+ return syscall(__NR_seccomp, operation, flags, args);
+}
+
} // namespace sandbox
diff --git a/sandbox/linux/services/syscall_wrappers.h b/sandbox/linux/services/syscall_wrappers.h
index 03d5cdf..15ec81b 100644
--- a/sandbox/linux/services/syscall_wrappers.h
+++ b/sandbox/linux/services/syscall_wrappers.h
@@ -9,6 +9,8 @@
#include "sandbox/sandbox_export.h"
+struct sock_fprog;
+
namespace sandbox {
// Provide direct system call wrappers for a few common system calls.
@@ -30,6 +32,12 @@
SANDBOX_EXPORT void sys_exit_group(int status);
+// The official system call takes |args| as void* (in order to be extensible),
+// but add more typing for the cases that are currently used.
+SANDBOX_EXPORT int sys_seccomp(unsigned int operation,
+ unsigned int flags,
+ const struct sock_fprog* args);
+
} // namespace sandbox
#endif // SANDBOX_LINUX_SERVICES_SYSCALL_WRAPPERS_H_
diff --git a/sandbox/linux/services/thread_helpers.cc b/sandbox/linux/services/thread_helpers.cc
index e820449..dbadbd4 100644
--- a/sandbox/linux/services/thread_helpers.cc
+++ b/sandbox/linux/services/thread_helpers.cc
@@ -43,7 +43,8 @@
bool ThreadHelpers::IsSingleThreaded(int proc_self_task) {
DCHECK_LE(-1, proc_self_task);
if (-1 == proc_self_task) {
- const int task_fd = open("/proc/self/task/", O_RDONLY | O_DIRECTORY);
+ const int task_fd =
+ open("/proc/self/task/", O_RDONLY | O_DIRECTORY | O_CLOEXEC);
PCHECK(0 <= task_fd);
const bool result = IsSingleThreadedImpl(task_fd);
PCHECK(0 == IGNORE_EINTR(close(task_fd)));
diff --git a/sandbox/linux/syscall_broker/broker_client.cc b/sandbox/linux/syscall_broker/broker_client.cc
index e63205f..b82ecb3 100644
--- a/sandbox/linux/syscall_broker/broker_client.cc
+++ b/sandbox/linux/syscall_broker/broker_client.cc
@@ -54,7 +54,9 @@
// IPC.
if (fast_check_in_client_) {
if (syscall_type == COMMAND_OPEN &&
- !broker_policy_.GetFileNameIfAllowedToOpen(pathname, flags, NULL)) {
+ !broker_policy_.GetFileNameIfAllowedToOpen(
+ pathname, flags, NULL /* file_to_open */,
+ NULL /* unlink_after_open */)) {
return -broker_policy_.denied_errno();
}
if (syscall_type == COMMAND_ACCESS &&
diff --git a/sandbox/linux/syscall_broker/broker_file_permission.cc b/sandbox/linux/syscall_broker/broker_file_permission.cc
new file mode 100644
index 0000000..beceda9
--- /dev/null
+++ b/sandbox/linux/syscall_broker/broker_file_permission.cc
@@ -0,0 +1,243 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "sandbox/linux/syscall_broker/broker_file_permission.h"
+
+#include <fcntl.h>
+#include <string.h>
+
+#include <string>
+
+#include "base/logging.h"
+#include "sandbox/linux/syscall_broker/broker_common.h"
+
+namespace sandbox {
+
+namespace syscall_broker {
+
+// Async signal safe
+bool BrokerFilePermission::ValidatePath(const char* path) {
+ if (!path)
+ return false;
+
+ const size_t len = strlen(path);
+ // No empty paths
+ if (len == 0)
+ return false;
+ // Paths must be absolute and not relative
+ if (path[0] != '/')
+ return false;
+ // No trailing / (but "/" is valid)
+ if (len > 1 && path[len - 1] == '/')
+ return false;
+ // No trailing /..
+ if (len >= 3 && path[len - 3] == '/' && path[len - 2] == '.' &&
+ path[len - 1] == '.')
+ return false;
+ // No /../ anywhere
+ for (size_t i = 0; i < len; i++) {
+ if (path[i] == '/' && (len - i) > 3) {
+ if (path[i + 1] == '.' && path[i + 2] == '.' && path[i + 3] == '/') {
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+// Async signal safe
+// Calls std::string::c_str(), strncmp and strlen. All these
+// methods are async signal safe in common standard libs.
+// TODO(leecam): remove dependency on std::string
+bool BrokerFilePermission::MatchPath(const char* requested_filename) const {
+ const char* path = path_.c_str();
+ if ((recursive_ && strncmp(requested_filename, path, strlen(path)) == 0)) {
+ // Note: This prefix match will allow any path under the whitelisted
+ // path, for any number of directory levels. E.g. if the whitelisted
+ // path is /good/ then the following will be permitted by the policy.
+ // /good/file1
+ // /good/folder/file2
+ // /good/folder/folder2/file3
+ // If an attacker could make 'folder' a symlink to ../../ they would have
+ // access to the entire filesystem.
+ // Whitelisting with multiple depths is useful, e.g /proc/ but
+ // the system needs to ensure symlinks can not be created!
+ // That said if an attacker can convert any of the absolute paths
+ // to a symlink they can control any file on the system also.
+ return true;
+ } else if (strcmp(requested_filename, path) == 0) {
+ return true;
+ }
+ return false;
+}
+
+// Async signal safe.
+// External call to std::string::c_str() is
+// called in MatchPath.
+// TODO(leecam): remove dependency on std::string
+bool BrokerFilePermission::CheckAccess(const char* requested_filename,
+ int mode,
+ const char** file_to_access) const {
+ // First, check if |mode| is existence, ability to read or ability
+ // to write. We do not support X_OK.
+ if (mode != F_OK && mode & ~(R_OK | W_OK)) {
+ return false;
+ }
+
+ if (!ValidatePath(requested_filename))
+ return false;
+
+ if (!MatchPath(requested_filename)) {
+ return false;
+ }
+ bool allowed = false;
+ switch (mode) {
+ case F_OK:
+ if (allow_read_ || allow_write_)
+ allowed = true;
+ break;
+ case R_OK:
+ if (allow_read_)
+ allowed = true;
+ break;
+ case W_OK:
+ if (allow_write_)
+ allowed = true;
+ break;
+ case R_OK | W_OK:
+ if (allow_read_ && allow_write_)
+ allowed = true;
+ break;
+ default:
+ return false;
+ }
+
+ if (allowed && file_to_access) {
+ if (!recursive_)
+ *file_to_access = path_.c_str();
+ else
+ *file_to_access = requested_filename;
+ }
+ return allowed;
+}
+
+// Async signal safe.
+// External call to std::string::c_str() is
+// called in MatchPath.
+// TODO(leecam): remove dependency on std::string
+bool BrokerFilePermission::CheckOpen(const char* requested_filename,
+ int flags,
+ const char** file_to_open,
+ bool* unlink_after_open) const {
+ if (!ValidatePath(requested_filename))
+ return false;
+
+ if (!MatchPath(requested_filename)) {
+ return false;
+ }
+
+ // First, check the access mode is valid.
+ const int access_mode = flags & O_ACCMODE;
+ if (access_mode != O_RDONLY && access_mode != O_WRONLY &&
+ access_mode != O_RDWR) {
+ return false;
+ }
+
+ // Check if read is allowed
+ if (!allow_read_ && (access_mode == O_RDONLY || access_mode == O_RDWR)) {
+ return false;
+ }
+
+ // Check if write is allowed
+ if (!allow_write_ && (access_mode == O_WRONLY || access_mode == O_RDWR)) {
+ return false;
+ }
+
+ // Check if file creation is allowed.
+ if (!allow_create_ && (flags & O_CREAT)) {
+ return false;
+ }
+
+ // If O_CREAT is present, ensure O_EXCL
+ if ((flags & O_CREAT) && !(flags & O_EXCL)) {
+ return false;
+ }
+
+ // If this file is to be unlinked, ensure it's created.
+ if (unlink_ && !(flags & O_CREAT)) {
+ return false;
+ }
+
+ // Some flags affect the behavior of the current process. We don't support
+ // them and don't allow them for now.
+ if (flags & kCurrentProcessOpenFlagsMask) {
+ return false;
+ }
+
+ // Now check that all the flags are known to us.
+ const int creation_and_status_flags = flags & ~O_ACCMODE;
+
+ const int known_flags = O_APPEND | O_ASYNC | O_CLOEXEC | O_CREAT | O_DIRECT |
+ O_DIRECTORY | O_EXCL | O_LARGEFILE | O_NOATIME |
+ O_NOCTTY | O_NOFOLLOW | O_NONBLOCK | O_NDELAY |
+ O_SYNC | O_TRUNC;
+
+ const int unknown_flags = ~known_flags;
+ const bool has_unknown_flags = creation_and_status_flags & unknown_flags;
+
+ if (has_unknown_flags)
+ return false;
+
+ if (file_to_open) {
+ if (!recursive_)
+ *file_to_open = path_.c_str();
+ else
+ *file_to_open = requested_filename;
+ }
+ if (unlink_after_open)
+ *unlink_after_open = unlink_;
+
+ return true;
+}
+
+const char* BrokerFilePermission::GetErrorMessageForTests() {
+ static char kInvalidBrokerFileString[] = "Invalid BrokerFilePermission";
+ return kInvalidBrokerFileString;
+}
+
+BrokerFilePermission::BrokerFilePermission(const std::string& path,
+ bool recursive,
+ bool unlink,
+ bool allow_read,
+ bool allow_write,
+ bool allow_create)
+ : path_(path),
+ recursive_(recursive),
+ unlink_(unlink),
+ allow_read_(allow_read),
+ allow_write_(allow_write),
+ allow_create_(allow_create) {
+ // Validate this permission and die if invalid!
+
+ // Must have enough length for a '/'
+ CHECK(path_.length() > 0) << GetErrorMessageForTests();
+ // Whitelisted paths must be absolute.
+ CHECK(path_[0] == '/') << GetErrorMessageForTests();
+
+ // Don't allow unlinking on creation without create permission
+ if (unlink_) {
+ CHECK(allow_create) << GetErrorMessageForTests();
+ }
+ const char last_char = *(path_.rbegin());
+ // Recursive paths must have a trailing slash
+ if (recursive_) {
+ CHECK(last_char == '/') << GetErrorMessageForTests();
+ } else {
+ CHECK(last_char != '/') << GetErrorMessageForTests();
+ }
+}
+
+} // namespace syscall_broker
+
+} // namespace sandbox
\ No newline at end of file
diff --git a/sandbox/linux/syscall_broker/broker_file_permission.h b/sandbox/linux/syscall_broker/broker_file_permission.h
new file mode 100644
index 0000000..03300d1
--- /dev/null
+++ b/sandbox/linux/syscall_broker/broker_file_permission.h
@@ -0,0 +1,119 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SANDBOX_LINUX_SYSCALL_BROKER_BROKER_FILE_PERMISSION_H_
+#define SANDBOX_LINUX_SYSCALL_BROKER_BROKER_FILE_PERMISSION_H_
+
+#include <string>
+
+#include "base/macros.h"
+#include "sandbox/sandbox_export.h"
+
+namespace sandbox {
+
+namespace syscall_broker {
+
+// BrokerFilePermission defines a path for whitelisting.
+// Pick the correct static factory method to create a permission.
+// CheckOpen and CheckAccess are async signal safe.
+// Constuction and Destruction are not async signal safe.
+// |path| is the path to be whitelisted.
+class SANDBOX_EXPORT BrokerFilePermission {
+ public:
+ ~BrokerFilePermission() {}
+ BrokerFilePermission(const BrokerFilePermission&) = default;
+ BrokerFilePermission& operator=(const BrokerFilePermission&) = default;
+
+ static BrokerFilePermission ReadOnly(const std::string& path) {
+ return BrokerFilePermission(path, false, false, true, false, false);
+ }
+
+ static BrokerFilePermission ReadOnlyRecursive(const std::string& path) {
+ return BrokerFilePermission(path, true, false, true, false, false);
+ }
+
+ static BrokerFilePermission WriteOnly(const std::string& path) {
+ return BrokerFilePermission(path, false, false, false, true, false);
+ }
+
+ static BrokerFilePermission ReadWrite(const std::string& path) {
+ return BrokerFilePermission(path, false, false, true, true, false);
+ }
+
+ static BrokerFilePermission ReadWriteCreate(const std::string& path) {
+ return BrokerFilePermission(path, false, false, true, true, true);
+ }
+
+ static BrokerFilePermission ReadWriteCreateUnlink(const std::string& path) {
+ return BrokerFilePermission(path, false, true, true, true, true);
+ }
+
+ static BrokerFilePermission ReadWriteCreateUnlinkRecursive(
+ const std::string& path) {
+ return BrokerFilePermission(path, true, true, true, true, true);
+ }
+
+ // Returns true if |requested_filename| is allowed to be opened
+ // by this permission.
+ // If |file_to_open| is not NULL it is set to point to either
+ // the |requested_filename| in the case of a recursive match,
+ // or a pointer the matched path in the whitelist if an absolute
+ // match.
+ // If not NULL |unlink_after_open| is set to point to true if the
+ // caller should unlink the path after openning.
+ // Async signal safe if |file_to_open| is NULL.
+ bool CheckOpen(const char* requested_filename,
+ int flags,
+ const char** file_to_open,
+ bool* unlink_after_open) const;
+ // Returns true if |requested_filename| is allowed to be accessed
+ // by this permission as per access(2).
+ // If |file_to_open| is not NULL it is set to point to either
+ // the |requested_filename| in the case of a recursive match,
+ // or a pointer to the matched path in the whitelist if an absolute
+ // match.
+ // |mode| is per mode argument of access(2).
+ // Async signal safe if |file_to_access| is NULL
+ bool CheckAccess(const char* requested_filename,
+ int mode,
+ const char** file_to_access) const;
+
+ private:
+ friend class BrokerFilePermissionTester;
+ BrokerFilePermission(const std::string& path,
+ bool recursive,
+ bool unlink,
+ bool allow_read,
+ bool allow_write,
+ bool allow_create);
+
+ // ValidatePath checks |path| and returns true if these conditions are met
+ // * Greater than 0 length
+ // * Is an absolute path
+ // * No trailing slash
+ // * No /../ path traversal
+ static bool ValidatePath(const char* path);
+
+ // MatchPath returns true if |requested_filename| is covered by this instance
+ bool MatchPath(const char* requested_filename) const;
+
+ // Used in by BrokerFilePermissionTester for tests.
+ static const char* GetErrorMessageForTests();
+
+ // These are not const as std::vector requires copy-assignment and this class
+ // is stored in vectors. All methods are marked const so
+ // the compiler will still enforce no changes outside of the constructor.
+ std::string path_;
+ bool recursive_; // Allow everything under this path. |path| must be a dir.
+ bool unlink_; // unlink after opening.
+ bool allow_read_;
+ bool allow_write_;
+ bool allow_create_;
+};
+
+} // namespace syscall_broker
+
+} // namespace sandbox
+
+#endif // SANDBOX_LINUX_SYSCALL_BROKER_BROKER_FILE_PERMISSION_H_
\ No newline at end of file
diff --git a/sandbox/linux/syscall_broker/broker_file_permission_unittest.cc b/sandbox/linux/syscall_broker/broker_file_permission_unittest.cc
new file mode 100644
index 0000000..2853021
--- /dev/null
+++ b/sandbox/linux/syscall_broker/broker_file_permission_unittest.cc
@@ -0,0 +1,262 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "sandbox/linux/syscall_broker/broker_file_permission.h"
+
+#include <fcntl.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include "base/logging.h"
+#include "base/macros.h"
+#include "sandbox/linux/tests/test_utils.h"
+#include "sandbox/linux/tests/unit_tests.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace sandbox {
+
+namespace syscall_broker {
+
+class BrokerFilePermissionTester {
+ public:
+ static bool ValidatePath(const char* path) {
+ return BrokerFilePermission::ValidatePath(path);
+ }
+ static const char* GetErrorMessage() {
+ return BrokerFilePermission::GetErrorMessageForTests();
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(BrokerFilePermissionTester);
+};
+
+namespace {
+
+// Creation tests are DEATH tests as a bad permission causes termination.
+SANDBOX_TEST(BrokerFilePermission, CreateGood) {
+ const char kPath[] = "/tmp/good";
+ BrokerFilePermission perm = BrokerFilePermission::ReadOnly(kPath);
+}
+
+SANDBOX_TEST(BrokerFilePermission, CreateGoodRecursive) {
+ const char kPath[] = "/tmp/good/";
+ BrokerFilePermission perm = BrokerFilePermission::ReadOnlyRecursive(kPath);
+}
+
+SANDBOX_DEATH_TEST(
+ BrokerFilePermission,
+ CreateBad,
+ DEATH_MESSAGE(BrokerFilePermissionTester::GetErrorMessage())) {
+ const char kPath[] = "/tmp/bad/";
+ BrokerFilePermission perm = BrokerFilePermission::ReadOnly(kPath);
+}
+
+SANDBOX_DEATH_TEST(
+ BrokerFilePermission,
+ CreateBadRecursive,
+ DEATH_MESSAGE(BrokerFilePermissionTester::GetErrorMessage())) {
+ const char kPath[] = "/tmp/bad";
+ BrokerFilePermission perm = BrokerFilePermission::ReadOnlyRecursive(kPath);
+}
+
+SANDBOX_DEATH_TEST(
+ BrokerFilePermission,
+ CreateBadNotAbs,
+ DEATH_MESSAGE(BrokerFilePermissionTester::GetErrorMessage())) {
+ const char kPath[] = "tmp/bad";
+ BrokerFilePermission perm = BrokerFilePermission::ReadOnly(kPath);
+}
+
+SANDBOX_DEATH_TEST(
+ BrokerFilePermission,
+ CreateBadEmpty,
+ DEATH_MESSAGE(BrokerFilePermissionTester::GetErrorMessage())) {
+ const char kPath[] = "";
+ BrokerFilePermission perm = BrokerFilePermission::ReadOnly(kPath);
+}
+
+// CheckPerm tests |path| against |perm| given |access_flags|.
+// If |create| is true then file creation is tested for success.
+void CheckPerm(const BrokerFilePermission& perm,
+ const char* path,
+ int access_flags,
+ bool create) {
+ const char* file_to_open = NULL;
+
+ ASSERT_FALSE(perm.CheckAccess(path, X_OK, NULL));
+ ASSERT_TRUE(perm.CheckAccess(path, F_OK, NULL));
+ // check bad perms
+ switch (access_flags) {
+ case O_RDONLY:
+ ASSERT_TRUE(perm.CheckOpen(path, O_RDONLY, &file_to_open, NULL));
+ ASSERT_FALSE(perm.CheckOpen(path, O_WRONLY, &file_to_open, NULL));
+ ASSERT_FALSE(perm.CheckOpen(path, O_RDWR, &file_to_open, NULL));
+ ASSERT_TRUE(perm.CheckAccess(path, R_OK, NULL));
+ ASSERT_FALSE(perm.CheckAccess(path, W_OK, NULL));
+ break;
+ case O_WRONLY:
+ ASSERT_FALSE(perm.CheckOpen(path, O_RDONLY, &file_to_open, NULL));
+ ASSERT_TRUE(perm.CheckOpen(path, O_WRONLY, &file_to_open, NULL));
+ ASSERT_FALSE(perm.CheckOpen(path, O_RDWR, &file_to_open, NULL));
+ ASSERT_FALSE(perm.CheckAccess(path, R_OK, NULL));
+ ASSERT_TRUE(perm.CheckAccess(path, W_OK, NULL));
+ break;
+ case O_RDWR:
+ ASSERT_TRUE(perm.CheckOpen(path, O_RDONLY, &file_to_open, NULL));
+ ASSERT_TRUE(perm.CheckOpen(path, O_WRONLY, &file_to_open, NULL));
+ ASSERT_TRUE(perm.CheckOpen(path, O_RDWR, &file_to_open, NULL));
+ ASSERT_TRUE(perm.CheckAccess(path, R_OK, NULL));
+ ASSERT_TRUE(perm.CheckAccess(path, W_OK, NULL));
+ break;
+ default:
+ // Bad test case
+ NOTREACHED();
+ }
+
+// O_SYNC can be defined as (__O_SYNC|O_DSYNC)
+#ifdef O_DSYNC
+ const int kSyncFlag = O_SYNC & ~O_DSYNC;
+#else
+ const int kSyncFlag = O_SYNC;
+#endif
+
+ const int kNumberOfBitsInOAccMode = 2;
+ COMPILE_ASSERT(O_ACCMODE == ((1 << kNumberOfBitsInOAccMode) - 1),
+ number_of_bits);
+ // check every possible flag and act accordingly.
+ // Skipping AccMode bits as they are present in every case.
+ for (int i = kNumberOfBitsInOAccMode; i < 32; i++) {
+ int flag = 1 << i;
+ switch (flag) {
+ case O_APPEND:
+ case O_ASYNC:
+ case O_DIRECT:
+ case O_DIRECTORY:
+#ifdef O_DSYNC
+ case O_DSYNC:
+#endif
+ case O_EXCL:
+ case O_LARGEFILE:
+ case O_NOATIME:
+ case O_NOCTTY:
+ case O_NOFOLLOW:
+ case O_NONBLOCK:
+#if (O_NONBLOCK != O_NDELAY)
+ case O_NDELAY:
+#endif
+ case kSyncFlag:
+ case O_TRUNC:
+ ASSERT_TRUE(
+ perm.CheckOpen(path, access_flags | flag, &file_to_open, NULL));
+ break;
+ case O_CLOEXEC:
+ case O_CREAT:
+ default:
+ ASSERT_FALSE(
+ perm.CheckOpen(path, access_flags | flag, &file_to_open, NULL));
+ }
+ }
+ if (create) {
+ bool unlink;
+ ASSERT_TRUE(perm.CheckOpen(path, O_CREAT | O_EXCL | access_flags,
+ &file_to_open, &unlink));
+ ASSERT_FALSE(unlink);
+ } else {
+ ASSERT_FALSE(perm.CheckOpen(path, O_CREAT | O_EXCL | access_flags,
+ &file_to_open, NULL));
+ }
+}
+
+TEST(BrokerFilePermission, ReadOnly) {
+ const char kPath[] = "/tmp/good";
+ BrokerFilePermission perm = BrokerFilePermission::ReadOnly(kPath);
+ CheckPerm(perm, kPath, O_RDONLY, false);
+ // Don't do anything here, so that ASSERT works in the subfunction as
+ // expected.
+}
+
+TEST(BrokerFilePermission, ReadOnlyRecursive) {
+ const char kPath[] = "/tmp/good/";
+ const char kPathFile[] = "/tmp/good/file";
+ BrokerFilePermission perm = BrokerFilePermission::ReadOnlyRecursive(kPath);
+ CheckPerm(perm, kPathFile, O_RDONLY, false);
+ // Don't do anything here, so that ASSERT works in the subfunction as
+ // expected.
+}
+
+TEST(BrokerFilePermission, WriteOnly) {
+ const char kPath[] = "/tmp/good";
+ BrokerFilePermission perm = BrokerFilePermission::WriteOnly(kPath);
+ CheckPerm(perm, kPath, O_WRONLY, false);
+ // Don't do anything here, so that ASSERT works in the subfunction as
+ // expected.
+}
+
+TEST(BrokerFilePermission, ReadWrite) {
+ const char kPath[] = "/tmp/good";
+ BrokerFilePermission perm = BrokerFilePermission::ReadWrite(kPath);
+ CheckPerm(perm, kPath, O_RDWR, false);
+ // Don't do anything here, so that ASSERT works in the subfunction as
+ // expected.
+}
+
+TEST(BrokerFilePermission, ReadWriteCreate) {
+ const char kPath[] = "/tmp/good";
+ BrokerFilePermission perm = BrokerFilePermission::ReadWriteCreate(kPath);
+ CheckPerm(perm, kPath, O_RDWR, true);
+ // Don't do anything here, so that ASSERT works in the subfunction as
+ // expected.
+}
+
+void CheckUnlink(BrokerFilePermission& perm,
+ const char* path,
+ int access_flags) {
+ bool unlink;
+ ASSERT_FALSE(perm.CheckOpen(path, access_flags, NULL, &unlink));
+ ASSERT_FALSE(perm.CheckOpen(path, access_flags | O_CREAT, NULL, &unlink));
+ ASSERT_TRUE(
+ perm.CheckOpen(path, access_flags | O_CREAT | O_EXCL, NULL, &unlink));
+ ASSERT_TRUE(unlink);
+}
+
+TEST(BrokerFilePermission, ReadWriteCreateUnlink) {
+ const char kPath[] = "/tmp/good";
+ BrokerFilePermission perm =
+ BrokerFilePermission::ReadWriteCreateUnlink(kPath);
+ CheckUnlink(perm, kPath, O_RDWR);
+ // Don't do anything here, so that ASSERT works in the subfunction as
+ // expected.
+}
+
+TEST(BrokerFilePermission, ReadWriteCreateUnlinkRecursive) {
+ const char kPath[] = "/tmp/good/";
+ const char kPathFile[] = "/tmp/good/file";
+ BrokerFilePermission perm =
+ BrokerFilePermission::ReadWriteCreateUnlinkRecursive(kPath);
+ CheckUnlink(perm, kPathFile, O_RDWR);
+ // Don't do anything here, so that ASSERT works in the subfunction as
+ // expected.
+}
+
+TEST(BrokerFilePermission, ValidatePath) {
+ EXPECT_TRUE(BrokerFilePermissionTester::ValidatePath("/path"));
+ EXPECT_TRUE(BrokerFilePermissionTester::ValidatePath("/"));
+ EXPECT_TRUE(BrokerFilePermissionTester::ValidatePath("/..path"));
+
+ EXPECT_FALSE(BrokerFilePermissionTester::ValidatePath(""));
+ EXPECT_FALSE(BrokerFilePermissionTester::ValidatePath("bad"));
+ EXPECT_FALSE(BrokerFilePermissionTester::ValidatePath("/bad/"));
+ EXPECT_FALSE(BrokerFilePermissionTester::ValidatePath("bad/"));
+ EXPECT_FALSE(BrokerFilePermissionTester::ValidatePath("/bad/.."));
+ EXPECT_FALSE(BrokerFilePermissionTester::ValidatePath("/bad/../bad"));
+ EXPECT_FALSE(BrokerFilePermissionTester::ValidatePath("/../bad"));
+}
+
+} // namespace
+
+} // namespace syscall_broker
+
+} // namespace sandbox
diff --git a/sandbox/linux/syscall_broker/broker_host.cc b/sandbox/linux/syscall_broker/broker_host.cc
index 29300f7..7ebc785 100644
--- a/sandbox/linux/syscall_broker/broker_host.cc
+++ b/sandbox/linux/syscall_broker/broker_host.cc
@@ -38,8 +38,13 @@
// make a direct system call since we want to keep in control of the broker
// process' system calls profile to be able to loosely sandbox it.
int sys_open(const char* pathname, int flags) {
- // Always pass a defined |mode| in case flags mistakenly contains O_CREAT.
- const int mode = 0;
+ // Hardcode mode to rw------- when creating files.
+ int mode;
+ if (flags & O_CREAT) {
+ mode = 0600;
+ } else {
+ mode = 0;
+ }
if (IsRunningOnValgrind()) {
// Valgrind does not support AT_FDCWD, just use libc's open() in this case.
return open(pathname, flags, mode);
@@ -59,8 +64,9 @@
DCHECK(write_pickle);
DCHECK(opened_files);
const char* file_to_open = NULL;
+ bool unlink_after_open = false;
const bool safe_to_open_file = policy.GetFileNameIfAllowedToOpen(
- requested_filename.c_str(), flags, &file_to_open);
+ requested_filename.c_str(), flags, &file_to_open, &unlink_after_open);
if (safe_to_open_file) {
CHECK(file_to_open);
@@ -69,6 +75,9 @@
write_pickle->WriteInt(-errno);
} else {
// Success.
+ if (unlink_after_open) {
+ unlink(file_to_open);
+ }
opened_files->push_back(opened_fd);
write_pickle->WriteInt(0);
}
diff --git a/sandbox/linux/syscall_broker/broker_policy.cc b/sandbox/linux/syscall_broker/broker_policy.cc
index ee9a658..d9f69e3 100644
--- a/sandbox/linux/syscall_broker/broker_policy.cc
+++ b/sandbox/linux/syscall_broker/broker_policy.cc
@@ -17,76 +17,19 @@
namespace sandbox {
namespace syscall_broker {
-namespace {
-
-// We maintain a list of flags that have been reviewed for "sanity" and that
-// we're ok to allow in the broker.
-// I.e. here is where we wouldn't add O_RESET_FILE_SYSTEM.
-bool IsAllowedOpenFlags(int flags) {
- // First, check the access mode.
- const int access_mode = flags & O_ACCMODE;
- if (access_mode != O_RDONLY && access_mode != O_WRONLY &&
- access_mode != O_RDWR) {
- return false;
- }
-
- // We only support a 2-parameters open, so we forbid O_CREAT.
- if (flags & O_CREAT) {
- return false;
- }
-
- // Some flags affect the behavior of the current process. We don't support
- // them and don't allow them for now.
- if (flags & kCurrentProcessOpenFlagsMask)
- return false;
-
- // Now check that all the flags are known to us.
- const int creation_and_status_flags = flags & ~O_ACCMODE;
-
- const int known_flags = O_APPEND | O_ASYNC | O_CLOEXEC | O_CREAT | O_DIRECT |
- O_DIRECTORY | O_EXCL | O_LARGEFILE | O_NOATIME |
- O_NOCTTY | O_NOFOLLOW | O_NONBLOCK | O_NDELAY |
- O_SYNC | O_TRUNC;
-
- const int unknown_flags = ~known_flags;
- const bool has_unknown_flags = creation_and_status_flags & unknown_flags;
- return !has_unknown_flags;
-}
-
-// Needs to be async signal safe if |file_to_open| is NULL.
-// TODO(jln): assert signal safety.
-bool GetFileNameInWhitelist(const std::vector<std::string>& allowed_file_names,
- const char* requested_filename,
- const char** file_to_open) {
- if (file_to_open && *file_to_open) {
- // Make sure that callers never pass a non-empty string. In case callers
- // wrongly forget to check the return value and look at the string
- // instead, this could catch bugs.
- RAW_LOG(FATAL, "*file_to_open should be NULL");
- return false;
- }
-
- // Look for |requested_filename| in |allowed_file_names|.
- // We don't use ::find() because it takes a std::string and
- // the conversion allocates memory.
- for (const auto& allowed_file_name : allowed_file_names) {
- if (strcmp(requested_filename, allowed_file_name.c_str()) == 0) {
- if (file_to_open)
- *file_to_open = allowed_file_name.c_str();
- return true;
- }
- }
- return false;
-}
-
-} // namespace
-
BrokerPolicy::BrokerPolicy(int denied_errno,
- const std::vector<std::string>& allowed_r_files,
- const std::vector<std::string>& allowed_w_files)
+ const std::vector<BrokerFilePermission>& permissions)
: denied_errno_(denied_errno),
- allowed_r_files_(allowed_r_files),
- allowed_w_files_(allowed_w_files) {
+ permissions_(permissions),
+ num_of_permissions_(permissions.size()) {
+ // The spec guarantees vectors store their elements contiguously
+ // so set up a pointer to array of element so it can be used
+ // in async signal safe code instead of vector operations.
+ if (num_of_permissions_ > 0) {
+ permissions_array_ = &permissions_[0];
+ } else {
+ permissions_array_ = NULL;
+ }
}
BrokerPolicy::~BrokerPolicy() {
@@ -107,34 +50,20 @@
const char* requested_filename,
int requested_mode,
const char** file_to_access) const {
- // First, check if |requested_mode| is existence, ability to read or ability
- // to write. We do not support X_OK.
- if (requested_mode != F_OK && requested_mode & ~(R_OK | W_OK)) {
+ if (file_to_access && *file_to_access) {
+ // Make sure that callers never pass a non-empty string. In case callers
+ // wrongly forget to check the return value and look at the string
+ // instead, this could catch bugs.
+ RAW_LOG(FATAL, "*file_to_access should be NULL");
return false;
}
- switch (requested_mode) {
- case F_OK:
- // We allow to check for file existence if we can either read or write.
- return GetFileNameInWhitelist(
- allowed_r_files_, requested_filename, file_to_access) ||
- GetFileNameInWhitelist(
- allowed_w_files_, requested_filename, file_to_access);
- case R_OK:
- return GetFileNameInWhitelist(
- allowed_r_files_, requested_filename, file_to_access);
- case W_OK:
- return GetFileNameInWhitelist(
- allowed_w_files_, requested_filename, file_to_access);
- case R_OK | W_OK: {
- bool allowed_for_read_and_write =
- GetFileNameInWhitelist(allowed_r_files_, requested_filename, NULL) &&
- GetFileNameInWhitelist(
- allowed_w_files_, requested_filename, file_to_access);
- return allowed_for_read_and_write;
+ for (size_t i = 0; i < num_of_permissions_; i++) {
+ if (permissions_array_[i].CheckAccess(requested_filename, requested_mode,
+ file_to_access)) {
+ return true;
}
- default:
- return false;
}
+ return false;
}
// Check if |requested_filename| can be opened with flags |requested_flags|.
@@ -147,27 +76,22 @@
// Async signal safe if and only if |file_to_open| is NULL.
bool BrokerPolicy::GetFileNameIfAllowedToOpen(const char* requested_filename,
int requested_flags,
- const char** file_to_open) const {
- if (!IsAllowedOpenFlags(requested_flags)) {
+ const char** file_to_open,
+ bool* unlink_after_open) const {
+ if (file_to_open && *file_to_open) {
+ // Make sure that callers never pass a non-empty string. In case callers
+ // wrongly forget to check the return value and look at the string
+ // instead, this could catch bugs.
+ RAW_LOG(FATAL, "*file_to_open should be NULL");
return false;
}
- switch (requested_flags & O_ACCMODE) {
- case O_RDONLY:
- return GetFileNameInWhitelist(
- allowed_r_files_, requested_filename, file_to_open);
- case O_WRONLY:
- return GetFileNameInWhitelist(
- allowed_w_files_, requested_filename, file_to_open);
- case O_RDWR: {
- bool allowed_for_read_and_write =
- GetFileNameInWhitelist(allowed_r_files_, requested_filename, NULL) &&
- GetFileNameInWhitelist(
- allowed_w_files_, requested_filename, file_to_open);
- return allowed_for_read_and_write;
+ for (size_t i = 0; i < num_of_permissions_; i++) {
+ if (permissions_array_[i].CheckOpen(requested_filename, requested_flags,
+ file_to_open, unlink_after_open)) {
+ return true;
}
- default:
- return false;
}
+ return false;
}
} // namespace syscall_broker
diff --git a/sandbox/linux/syscall_broker/broker_policy.h b/sandbox/linux/syscall_broker/broker_policy.h
index ef5bdfa..d5146ed 100644
--- a/sandbox/linux/syscall_broker/broker_policy.h
+++ b/sandbox/linux/syscall_broker/broker_policy.h
@@ -10,6 +10,8 @@
#include "base/macros.h"
+#include "sandbox/linux/syscall_broker/broker_file_permission.h"
+
namespace sandbox {
namespace syscall_broker {
@@ -23,21 +25,21 @@
// |denied_errno| is the error code returned when IPC requests for system
// calls such as open() or access() are denied because a file is not in the
// whitelist. EACCESS would be a typical value.
- // |allowed_r_files| and |allowed_w_files| are white lists of files that
- // should be allowed for opening, respectively for reading and writing.
- // A file available read-write should be listed in both.
+ // |permissions| is a list of BrokerPermission objects that define
+ // what the broker will allow.
BrokerPolicy(int denied_errno,
- const std::vector<std::string>& allowed_r_files,
- const std::vector<std::string>& allowed_w_files_);
+ const std::vector<BrokerFilePermission>& permissions);
+
~BrokerPolicy();
// Check if calling access() should be allowed on |requested_filename| with
// mode |requested_mode|.
// Note: access() being a system call to check permissions, this can get a bit
// confusing. We're checking if calling access() should even be allowed with
- // the same policy we would use for open().
- // If |file_to_access| is not NULL, we will return the matching pointer from
- // the whitelist. For paranoia a caller should then use |file_to_access|. See
+ // If |file_to_open| is not NULL, a pointer to the path will be returned.
+ // In the case of a recursive match, this will be the requested_filename,
+ // otherwise it will return the matching pointer from the
+ // whitelist. For paranoia a caller should then use |file_to_access|. See
// GetFileNameIfAllowedToOpen() for more explanation.
// return true if calling access() on this file should be allowed, false
// otherwise.
@@ -47,22 +49,34 @@
const char** file_to_access) const;
// Check if |requested_filename| can be opened with flags |requested_flags|.
- // If |file_to_open| is not NULL, we will return the matching pointer from the
+ // If |file_to_open| is not NULL, a pointer to the path will be returned.
+ // In the case of a recursive match, this will be the requested_filename,
+ // otherwise it will return the matching pointer from the
// whitelist. For paranoia, a caller should then use |file_to_open| rather
// than |requested_filename|, so that it never attempts to open an
// attacker-controlled file name, even if an attacker managed to fool the
// string comparison mechanism.
+ // |unlink_after_open| if not NULL will be set to point to true if the
+ // policy requests the caller unlink the path after opening.
// Return true if opening should be allowed, false otherwise.
// Async signal safe if and only if |file_to_open| is NULL.
bool GetFileNameIfAllowedToOpen(const char* requested_filename,
int requested_flags,
- const char** file_to_open) const;
+ const char** file_to_open,
+ bool* unlink_after_open) const;
int denied_errno() const { return denied_errno_; }
private:
const int denied_errno_;
- const std::vector<std::string> allowed_r_files_;
- const std::vector<std::string> allowed_w_files_;
+ // The permissions_ vector is used as storage for the BrokerFilePermission
+ // objects but is not referenced outside of the constructor as
+ // vectors are unfriendly in async signal safe code.
+ const std::vector<BrokerFilePermission> permissions_;
+ // permissions_array_ is set up to point to the backing store of
+ // permissions_ and is used in async signal safe methods.
+ const BrokerFilePermission* permissions_array_;
+ const size_t num_of_permissions_;
+
DISALLOW_COPY_AND_ASSIGN(BrokerPolicy);
};
diff --git a/sandbox/linux/syscall_broker/broker_process.cc b/sandbox/linux/syscall_broker/broker_process.cc
index 9b92c49..81131cc 100644
--- a/sandbox/linux/syscall_broker/broker_process.cc
+++ b/sandbox/linux/syscall_broker/broker_process.cc
@@ -30,16 +30,16 @@
namespace syscall_broker {
-BrokerProcess::BrokerProcess(int denied_errno,
- const std::vector<std::string>& allowed_r_files,
- const std::vector<std::string>& allowed_w_files,
- bool fast_check_in_client,
- bool quiet_failures_for_tests)
+BrokerProcess::BrokerProcess(
+ int denied_errno,
+ const std::vector<syscall_broker::BrokerFilePermission>& permissions,
+ bool fast_check_in_client,
+ bool quiet_failures_for_tests)
: initialized_(false),
fast_check_in_client_(fast_check_in_client),
quiet_failures_for_tests_(quiet_failures_for_tests),
broker_pid_(-1),
- policy_(denied_errno, allowed_r_files, allowed_w_files) {
+ policy_(denied_errno, permissions) {
}
BrokerProcess::~BrokerProcess() {
diff --git a/sandbox/linux/syscall_broker/broker_process.h b/sandbox/linux/syscall_broker/broker_process.h
index 50e7eee..c23ac3c 100644
--- a/sandbox/linux/syscall_broker/broker_process.h
+++ b/sandbox/linux/syscall_broker/broker_process.h
@@ -21,6 +21,7 @@
namespace syscall_broker {
class BrokerClient;
+class BrokerFilePermission;
// Create a new "broker" process to which we can send requests via an IPC
// channel by forking the current process.
@@ -42,11 +43,13 @@
// A file available read-write should be listed in both.
// |fast_check_in_client| and |quiet_failures_for_tests| are reserved for
// unit tests, don't use it.
- BrokerProcess(int denied_errno,
- const std::vector<std::string>& allowed_r_files,
- const std::vector<std::string>& allowed_w_files,
- bool fast_check_in_client = true,
- bool quiet_failures_for_tests = false);
+
+ BrokerProcess(
+ int denied_errno,
+ const std::vector<syscall_broker::BrokerFilePermission>& permissions,
+ bool fast_check_in_client = true,
+ bool quiet_failures_for_tests = false);
+
~BrokerProcess();
// Will initialize the broker process. There should be no threads at this
// point, since we need to fork().
diff --git a/sandbox/linux/syscall_broker/broker_process_unittest.cc b/sandbox/linux/syscall_broker/broker_process_unittest.cc
index 997667c..ee284f2 100644
--- a/sandbox/linux/syscall_broker/broker_process_unittest.cc
+++ b/sandbox/linux/syscall_broker/broker_process_unittest.cc
@@ -54,11 +54,10 @@
} // namespace
TEST(BrokerProcess, CreateAndDestroy) {
- std::vector<std::string> read_whitelist;
- read_whitelist.push_back("/proc/cpuinfo");
+ std::vector<BrokerFilePermission> permissions;
+ permissions.push_back(BrokerFilePermission::ReadOnly("/proc/cpuinfo"));
- scoped_ptr<BrokerProcess> open_broker(
- new BrokerProcess(EPERM, read_whitelist, std::vector<std::string>()));
+ scoped_ptr<BrokerProcess> open_broker(new BrokerProcess(EPERM, permissions));
ASSERT_TRUE(open_broker->Init(base::Bind(&NoOpCallback)));
ASSERT_TRUE(TestUtils::CurrentProcessHasChildren());
@@ -68,8 +67,8 @@
}
TEST(BrokerProcess, TestOpenAccessNull) {
- const std::vector<std::string> empty;
- BrokerProcess open_broker(EPERM, empty, empty);
+ std::vector<BrokerFilePermission> empty;
+ BrokerProcess open_broker(EPERM, empty);
ASSERT_TRUE(open_broker.Init(base::Bind(&NoOpCallback)));
int fd = open_broker.Open(NULL, O_RDONLY);
@@ -88,17 +87,14 @@
const char kRW_WhiteListed[] = "/proc/DOESNOTEXIST3";
const char k_NotWhitelisted[] = "/proc/DOESNOTEXIST4";
- std::vector<std::string> read_whitelist;
- read_whitelist.push_back(kR_WhiteListed);
- read_whitelist.push_back(kR_WhiteListedButDenied);
- read_whitelist.push_back(kRW_WhiteListed);
+ std::vector<BrokerFilePermission> permissions;
+ permissions.push_back(BrokerFilePermission::ReadOnly(kR_WhiteListed));
+ permissions.push_back(
+ BrokerFilePermission::ReadOnly(kR_WhiteListedButDenied));
+ permissions.push_back(BrokerFilePermission::WriteOnly(kW_WhiteListed));
+ permissions.push_back(BrokerFilePermission::ReadWrite(kRW_WhiteListed));
- std::vector<std::string> write_whitelist;
- write_whitelist.push_back(kW_WhiteListed);
- write_whitelist.push_back(kRW_WhiteListed);
-
- BrokerProcess open_broker(
- denied_errno, read_whitelist, write_whitelist, fast_check_in_client);
+ BrokerProcess open_broker(denied_errno, permissions, fast_check_in_client);
ASSERT_TRUE(open_broker.Init(base::Bind(&NoOpCallback)));
int fd = -1;
@@ -243,13 +239,78 @@
// expected.
}
-void TestOpenCpuinfo(bool fast_check_in_client) {
+void TestBadPaths(bool fast_check_in_client) {
const char kFileCpuInfo[] = "/proc/cpuinfo";
- std::vector<std::string> read_whitelist;
- read_whitelist.push_back(kFileCpuInfo);
+ const char kNotAbsPath[] = "proc/cpuinfo";
+ const char kDotDotStart[] = "/../proc/cpuinfo";
+ const char kDotDotMiddle[] = "/proc/self/../cpuinfo";
+ const char kDotDotEnd[] = "/proc/..";
+ const char kTrailingSlash[] = "/proc/";
- scoped_ptr<BrokerProcess> open_broker(new BrokerProcess(
- EPERM, read_whitelist, std::vector<std::string>(), fast_check_in_client));
+ std::vector<BrokerFilePermission> permissions;
+
+ permissions.push_back(BrokerFilePermission::ReadOnlyRecursive("/proc/"));
+ scoped_ptr<BrokerProcess> open_broker(
+ new BrokerProcess(EPERM, permissions, fast_check_in_client));
+ ASSERT_TRUE(open_broker->Init(base::Bind(&NoOpCallback)));
+ // Open cpuinfo via the broker.
+ int cpuinfo_fd = open_broker->Open(kFileCpuInfo, O_RDONLY);
+ base::ScopedFD cpuinfo_fd_closer(cpuinfo_fd);
+ ASSERT_GE(cpuinfo_fd, 0);
+
+ int fd = -1;
+ int can_access;
+
+ can_access = open_broker->Access(kNotAbsPath, R_OK);
+ ASSERT_EQ(can_access, -EPERM);
+ fd = open_broker->Open(kNotAbsPath, O_RDONLY);
+ ASSERT_EQ(fd, -EPERM);
+
+ can_access = open_broker->Access(kDotDotStart, R_OK);
+ ASSERT_EQ(can_access, -EPERM);
+ fd = open_broker->Open(kDotDotStart, O_RDONLY);
+ ASSERT_EQ(fd, -EPERM);
+
+ can_access = open_broker->Access(kDotDotMiddle, R_OK);
+ ASSERT_EQ(can_access, -EPERM);
+ fd = open_broker->Open(kDotDotMiddle, O_RDONLY);
+ ASSERT_EQ(fd, -EPERM);
+
+ can_access = open_broker->Access(kDotDotEnd, R_OK);
+ ASSERT_EQ(can_access, -EPERM);
+ fd = open_broker->Open(kDotDotEnd, O_RDONLY);
+ ASSERT_EQ(fd, -EPERM);
+
+ can_access = open_broker->Access(kTrailingSlash, R_OK);
+ ASSERT_EQ(can_access, -EPERM);
+ fd = open_broker->Open(kTrailingSlash, O_RDONLY);
+ ASSERT_EQ(fd, -EPERM);
+}
+
+TEST(BrokerProcess, BadPathsClientCheck) {
+ TestBadPaths(true /* fast_check_in_client */);
+ // Don't do anything here, so that ASSERT works in the subfunction as
+ // expected.
+}
+
+TEST(BrokerProcess, BadPathsNoClientCheck) {
+ TestBadPaths(false /* fast_check_in_client */);
+ // Don't do anything here, so that ASSERT works in the subfunction as
+ // expected.
+}
+
+void TestOpenCpuinfo(bool fast_check_in_client, bool recursive) {
+ const char kFileCpuInfo[] = "/proc/cpuinfo";
+ const char kDirProc[] = "/proc/";
+
+ std::vector<BrokerFilePermission> permissions;
+ if (recursive)
+ permissions.push_back(BrokerFilePermission::ReadOnlyRecursive(kDirProc));
+ else
+ permissions.push_back(BrokerFilePermission::ReadOnly(kFileCpuInfo));
+
+ scoped_ptr<BrokerProcess> open_broker(
+ new BrokerProcess(EPERM, permissions, fast_check_in_client));
ASSERT_TRUE(open_broker->Init(base::Bind(&NoOpCallback)));
int fd = -1;
@@ -293,16 +354,28 @@
ASSERT_FALSE(TestUtils::CurrentProcessHasChildren());
}
-// Run the same thing twice. The second time, we make sure that no security
-// check is performed on the client.
+// Run this test 4 times. With and without the check in client
+// and using a recursive path.
TEST(BrokerProcess, OpenCpuinfoWithClientCheck) {
- TestOpenCpuinfo(true /* fast_check_in_client */);
+ TestOpenCpuinfo(true /* fast_check_in_client */, false /* not recursive */);
// Don't do anything here, so that ASSERT works in the subfunction as
// expected.
}
TEST(BrokerProcess, OpenCpuinfoNoClientCheck) {
- TestOpenCpuinfo(false /* fast_check_in_client */);
+ TestOpenCpuinfo(false /* fast_check_in_client */, false /* not recursive */);
+ // Don't do anything here, so that ASSERT works in the subfunction as
+ // expected.
+}
+
+TEST(BrokerProcess, OpenCpuinfoWithClientCheckRecursive) {
+ TestOpenCpuinfo(true /* fast_check_in_client */, true /* recursive */);
+ // Don't do anything here, so that ASSERT works in the subfunction as
+ // expected.
+}
+
+TEST(BrokerProcess, OpenCpuinfoNoClientCheckRecursive) {
+ TestOpenCpuinfo(false /* fast_check_in_client */, true /* recursive */);
// Don't do anything here, so that ASSERT works in the subfunction as
// expected.
}
@@ -311,10 +384,10 @@
ScopedTemporaryFile tempfile;
const char* tempfile_name = tempfile.full_file_name();
- std::vector<std::string> whitelist;
- whitelist.push_back(tempfile_name);
+ std::vector<BrokerFilePermission> permissions;
+ permissions.push_back(BrokerFilePermission::ReadWrite(tempfile_name));
- BrokerProcess open_broker(EPERM, whitelist, whitelist);
+ BrokerProcess open_broker(EPERM, permissions);
ASSERT_TRUE(open_broker.Init(base::Bind(&NoOpCallback)));
// Check we can access that file with read or write.
@@ -344,13 +417,11 @@
// SANDBOX_TEST because the process could die with a SIGPIPE
// and we want this to happen in a subprocess.
SANDBOX_TEST(BrokerProcess, BrokerDied) {
- std::vector<std::string> read_whitelist;
- read_whitelist.push_back("/proc/cpuinfo");
+ const char kCpuInfo[] = "/proc/cpuinfo";
+ std::vector<BrokerFilePermission> permissions;
+ permissions.push_back(BrokerFilePermission::ReadOnly(kCpuInfo));
- BrokerProcess open_broker(EPERM,
- read_whitelist,
- std::vector<std::string>(),
- true /* fast_check_in_client */,
+ BrokerProcess open_broker(EPERM, permissions, true /* fast_check_in_client */,
true /* quiet_failures_for_tests */);
SANDBOX_ASSERT(open_broker.Init(base::Bind(&NoOpCallback)));
const pid_t broker_pid = open_broker.broker_pid();
@@ -366,16 +437,16 @@
SANDBOX_ASSERT(SIGKILL == process_info.si_status);
// Check that doing Open with a dead broker won't SIGPIPE us.
- SANDBOX_ASSERT(open_broker.Open("/proc/cpuinfo", O_RDONLY) == -ENOMEM);
- SANDBOX_ASSERT(open_broker.Access("/proc/cpuinfo", O_RDONLY) == -ENOMEM);
+ SANDBOX_ASSERT(open_broker.Open(kCpuInfo, O_RDONLY) == -ENOMEM);
+ SANDBOX_ASSERT(open_broker.Access(kCpuInfo, O_RDONLY) == -ENOMEM);
}
void TestOpenComplexFlags(bool fast_check_in_client) {
const char kCpuInfo[] = "/proc/cpuinfo";
- std::vector<std::string> whitelist;
- whitelist.push_back(kCpuInfo);
+ std::vector<BrokerFilePermission> permissions;
+ permissions.push_back(BrokerFilePermission::ReadOnly(kCpuInfo));
- BrokerProcess open_broker(EPERM, whitelist, whitelist, fast_check_in_client);
+ BrokerProcess open_broker(EPERM, permissions, fast_check_in_client);
ASSERT_TRUE(open_broker.Init(base::Bind(&NoOpCallback)));
// Test that we do the right thing for O_CLOEXEC and O_NONBLOCK.
int fd = -1;
@@ -454,10 +525,10 @@
SANDBOX_ASSERT(0 == setrlimit(RLIMIT_NOFILE, &rlim));
static const char kCpuInfo[] = "/proc/cpuinfo";
- std::vector<std::string> read_whitelist;
- read_whitelist.push_back(kCpuInfo);
+ std::vector<BrokerFilePermission> permissions;
+ permissions.push_back(BrokerFilePermission::ReadOnly(kCpuInfo));
- BrokerProcess open_broker(EPERM, read_whitelist, std::vector<std::string>());
+ BrokerProcess open_broker(EPERM, permissions);
SANDBOX_ASSERT(open_broker.Init(base::Bind(&NoOpCallback)));
const int ipc_fd = BrokerProcessTestHelper::GetIPCDescriptor(&open_broker);
@@ -498,16 +569,15 @@
// Closing the broker client's IPC channel should terminate the broker
// process.
TEST(BrokerProcess, BrokerDiesOnClosedChannel) {
- std::vector<std::string> read_whitelist;
- read_whitelist.push_back("/proc/cpuinfo");
+ std::vector<BrokerFilePermission> permissions;
+ permissions.push_back(BrokerFilePermission::ReadOnly("/proc/cpuinfo"));
// Get the writing end of a pipe into the broker (child) process so
// that we can reliably detect when it dies.
int lifeline_fds[2];
PCHECK(0 == pipe(lifeline_fds));
- BrokerProcess open_broker(EPERM, read_whitelist, std::vector<std::string>(),
- true /* fast_check_in_client */,
+ BrokerProcess open_broker(EPERM, permissions, true /* fast_check_in_client */,
false /* quiet_failures_for_tests */);
ASSERT_TRUE(open_broker.Init(base::Bind(&CloseFD, lifeline_fds[0])));
// Make sure the writing end only exists in the broker process.
@@ -533,6 +603,55 @@
EXPECT_EQ(1, process_info.si_status);
}
+TEST(BrokerProcess, CreateFile) {
+ std::string temp_str;
+ {
+ ScopedTemporaryFile tmp_file;
+ temp_str = tmp_file.full_file_name();
+ }
+ const char* tempfile_name = temp_str.c_str();
+
+ std::vector<BrokerFilePermission> permissions;
+ permissions.push_back(BrokerFilePermission::ReadWriteCreate(tempfile_name));
+
+ BrokerProcess open_broker(EPERM, permissions);
+ ASSERT_TRUE(open_broker.Init(base::Bind(&NoOpCallback)));
+
+ int fd = -1;
+
+ // Try without O_EXCL
+ fd = open_broker.Open(tempfile_name, O_RDWR | O_CREAT);
+ ASSERT_EQ(fd, -EPERM);
+
+ const char kTestText[] = "TESTTESTTEST";
+ // Create a file
+ fd = open_broker.Open(tempfile_name, O_RDWR | O_CREAT | O_EXCL);
+ ASSERT_GE(fd, 0);
+ {
+ base::ScopedFD scoped_fd(fd);
+
+ // Confirm fail if file exists
+ int bad_fd = open_broker.Open(tempfile_name, O_RDWR | O_CREAT | O_EXCL);
+ ASSERT_EQ(bad_fd, -EEXIST);
+
+ // Write to the descriptor opened by the broker.
+
+ ssize_t len = HANDLE_EINTR(write(fd, kTestText, sizeof(kTestText)));
+ ASSERT_EQ(len, static_cast<ssize_t>(sizeof(kTestText)));
+ }
+
+ int fd_check = open(tempfile_name, O_RDONLY);
+ ASSERT_GE(fd_check, 0);
+ {
+ base::ScopedFD scoped_fd(fd_check);
+ char buf[1024];
+ ssize_t len = HANDLE_EINTR(read(fd_check, buf, sizeof(buf)));
+
+ ASSERT_EQ(len, static_cast<ssize_t>(sizeof(kTestText)));
+ ASSERT_EQ(memcmp(kTestText, buf, sizeof(kTestText)), 0);
+ }
+}
+
} // namespace syscall_broker
} // namespace sandbox
diff --git a/sandbox/linux/tests/unit_tests.cc b/sandbox/linux/tests/unit_tests.cc
index b7c3af6..5872e94 100644
--- a/sandbox/linux/tests/unit_tests.cc
+++ b/sandbox/linux/tests/unit_tests.cc
@@ -263,6 +263,16 @@
bool subprocess_exited_without_matching_message =
msg.find(expected_msg) == std::string::npos;
+
+// In official builds CHECK messages are dropped, so look for SIGABRT.
+// See https://code.google.com/p/chromium/issues/detail?id=437312
+#if defined(OFFICIAL_BUILD) && defined(NDEBUG) && !defined(OS_ANDROID)
+ if (subprocess_exited_without_matching_message) {
+ static const char kSigAbortMessage[] = "Received signal 6";
+ subprocess_exited_without_matching_message =
+ msg.find(kSigAbortMessage) == std::string::npos;
+ }
+#endif
EXPECT_FALSE(subprocess_exited_without_matching_message) << details;
}
diff --git a/services/gles2/command_buffer_driver.cc b/services/gles2/command_buffer_driver.cc
index ff6bd5e..c5cfac1 100644
--- a/services/gles2/command_buffer_driver.cc
+++ b/services/gles2/command_buffer_driver.cc
@@ -8,6 +8,7 @@
#include "base/macros.h"
#include "base/memory/shared_memory.h"
#include "gpu/command_buffer/common/constants.h"
+#include "gpu/command_buffer/common/value_state.h"
#include "gpu/command_buffer/service/command_buffer_service.h"
#include "gpu/command_buffer/service/context_group.h"
#include "gpu/command_buffer/service/gles2_cmd_decoder.h"
@@ -119,7 +120,7 @@
scoped_refptr<gpu::gles2::ContextGroup> context_group =
new gpu::gles2::ContextGroup(
mailbox_manager_.get(), new MemoryTrackerStub,
- new gpu::gles2::ShaderTranslatorCache, nullptr, true);
+ new gpu::gles2::ShaderTranslatorCache, nullptr, nullptr, true);
command_buffer_.reset(
new gpu::CommandBufferService(context_group->transfer_buffer_manager()));
diff --git a/services/surfaces/surfaces_impl.cc b/services/surfaces/surfaces_impl.cc
index 9cbe6dd..7387f9c 100644
--- a/services/surfaces/surfaces_impl.cc
+++ b/services/surfaces/surfaces_impl.cc
@@ -44,7 +44,7 @@
NOTREACHED();
return;
}
- factory_.Create(id.To<cc::SurfaceId>(), size.To<gfx::Size>());
+ factory_.Create(id.To<cc::SurfaceId>());
}
void SurfacesImpl::SubmitFrame(SurfaceIdPtr id,
@@ -97,8 +97,9 @@
display_->Initialize(make_scoped_ptr(new DirectOutputSurface(
new ContextProviderMojo(command_buffer_handle_.Pass()))));
}
- factory_.Create(cc_id, size.To<gfx::Size>());
- display_->Resize(cc_id, size.To<gfx::Size>(), 1.f);
+ factory_.Create(cc_id);
+ display_->SetSurfaceId(cc_id, 1.f);
+ display_->Resize(size.To<gfx::Size>());
parameter_listeners_.AddBinding(this, listener_request.Pass());
}
diff --git a/skia/BUILD.gn b/skia/BUILD.gn
index 2751977..9c88863 100644
--- a/skia/BUILD.gn
+++ b/skia/BUILD.gn
@@ -290,7 +290,6 @@
"ext/SkDiscardableMemory_chrome.h",
"ext/SkDiscardableMemory_chrome.cc",
"ext/SkMemory_new_handler.cpp",
- "ext/skia_trace_shim.h",
"ext/skia_utils_base.cc",
"ext/skia_utils_base.h",
"ext/skia_utils_ios.mm",
diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h
index 887d37a..bd039e3 100644
--- a/skia/config/SkUserConfig.h
+++ b/skia/config/SkUserConfig.h
@@ -222,10 +222,6 @@
// assertion.
#define SK_CRASH() SkDebugf_FileLine(__FILE__, __LINE__, true, "SK_CRASH")
-// Uncomment the following line to forward skia trace events to Chrome
-// tracing.
-// #define SK_USER_TRACE_INCLUDE_FILE "skia/ext/skia_trace_shim.h"
-
#ifndef SK_ATOMICS_PLATFORM_H
# if defined(SK_BUILD_FOR_WIN)
# define SK_ATOMICS_PLATFORM_H "third_party/skia/src/ports/SkAtomics_win.h"
diff --git a/skia/ext/analysis_canvas.cc b/skia/ext/analysis_canvas.cc
index ca19170..48a09d1 100644
--- a/skia/ext/analysis_canvas.cc
+++ b/skia/ext/analysis_canvas.cc
@@ -15,6 +15,23 @@
const int kNoLayer = -1;
+bool ActsLikeClear(SkXfermode::Mode mode, unsigned src_alpha) {
+ switch (mode) {
+ case SkXfermode::kClear_Mode:
+ return true;
+ case SkXfermode::kSrc_Mode:
+ case SkXfermode::kSrcIn_Mode:
+ case SkXfermode::kDstIn_Mode:
+ case SkXfermode::kSrcOut_Mode:
+ case SkXfermode::kDstATop_Mode:
+ return src_alpha == 0;
+ case SkXfermode::kDstOut_Mode:
+ return src_alpha == 0xFF;
+ default:
+ return false;
+ }
+}
+
bool IsSolidColorPaint(const SkPaint& paint) {
SkXfermode::Mode xfermode;
@@ -90,14 +107,9 @@
}
void AnalysisCanvas::drawPaint(const SkPaint& paint) {
- // This check is in SkCanvas::drawPaint(), and some of our unittests rely on
- // on this, so we reproduce it here.
- if (isClipEmpty())
- return;
-
- is_solid_color_ = false;
- is_transparent_ = false;
- ++draw_op_count_;
+ SkRect rect;
+ getClipBounds(&rect);
+ drawRect(rect, paint);
}
void AnalysisCanvas::drawPoints(SkCanvas::PointMode mode,
@@ -137,7 +149,7 @@
// In all other cases, we keep the current transparent value
if (does_cover_canvas &&
!is_forced_not_transparent_ &&
- xfermode == SkXfermode::kClear_Mode) {
+ ActsLikeClear(xfermode, paint.getAlpha())) {
is_transparent_ = true;
} else if (paint.getAlpha() != 0 || xfermode != SkXfermode::kSrc_Mode) {
is_transparent_ = false;
diff --git a/skia/ext/analysis_canvas_unittest.cc b/skia/ext/analysis_canvas_unittest.cc
index 378d27d..16a0390 100644
--- a/skia/ext/analysis_canvas_unittest.cc
+++ b/skia/ext/analysis_canvas_unittest.cc
@@ -78,8 +78,7 @@
canvas.drawPaint(paint);
SkColor outputColor;
- //TODO(vmpstr): This should return true. (crbug.com/180597)
- EXPECT_FALSE(canvas.GetColorIfSolid(&outputColor));
+ EXPECT_TRUE(canvas.GetColorIfSolid(&outputColor));
// Draw points test.
SkPoint points[4] = {
diff --git a/skia/ext/image_operations.cc b/skia/ext/image_operations.cc
index bf063d7..17c9997 100644
--- a/skia/ext/image_operations.cc
+++ b/skia/ext/image_operations.cc
@@ -342,134 +342,9 @@
int dest_width, int dest_height,
const SkIRect& dest_subset,
SkBitmap::Allocator* allocator) {
- if (method == ImageOperations::RESIZE_SUBPIXEL) {
- return ResizeSubpixel(source, dest_width, dest_height,
- dest_subset, allocator);
- } else {
- return ResizeBasic(source, method, dest_width, dest_height, dest_subset,
- allocator);
- }
-}
-
-// static
-SkBitmap ImageOperations::ResizeSubpixel(const SkBitmap& source,
- int dest_width, int dest_height,
- const SkIRect& dest_subset,
- SkBitmap::Allocator* allocator) {
- TRACE_EVENT2("skia", "ImageOperations::ResizeSubpixel",
- "src_pixels", source.width()*source.height(),
- "dst_pixels", dest_width*dest_height);
- // Currently only works on Linux/BSD because these are the only platforms
- // where SkFontHost::GetSubpixelOrder is defined.
-#if defined(OS_LINUX) && !defined(GTV)
- // Understand the display.
- const SkFontHost::LCDOrder order = SkFontHost::GetSubpixelOrder();
- const SkFontHost::LCDOrientation orientation =
- SkFontHost::GetSubpixelOrientation();
-
- // Decide on which dimension, if any, to deploy subpixel rendering.
- int w = 1;
- int h = 1;
- switch (orientation) {
- case SkFontHost::kHorizontal_LCDOrientation:
- w = dest_width < source.width() ? 3 : 1;
- break;
- case SkFontHost::kVertical_LCDOrientation:
- h = dest_height < source.height() ? 3 : 1;
- break;
- }
-
- // Resize the image.
- const int width = dest_width * w;
- const int height = dest_height * h;
- SkIRect subset = { dest_subset.fLeft, dest_subset.fTop,
- dest_subset.fLeft + dest_subset.width() * w,
- dest_subset.fTop + dest_subset.height() * h };
- SkBitmap img = ResizeBasic(source, ImageOperations::RESIZE_LANCZOS3, width,
- height, subset, allocator);
- const int row_words = img.rowBytes() / 4;
- if (w == 1 && h == 1)
- return img;
-
- // Render into subpixels.
- SkBitmap result;
- result.setInfo(SkImageInfo::MakeN32(dest_subset.width(), dest_subset.height(),
- img.alphaType()));
- result.allocPixels(allocator, NULL);
- if (!result.readyToDraw())
- return img;
-
- SkAutoLockPixels locker(img);
- if (!img.readyToDraw())
- return img;
-
- uint32* src_row = img.getAddr32(0, 0);
- uint32* dst_row = result.getAddr32(0, 0);
- for (int y = 0; y < dest_subset.height(); y++) {
- uint32* src = src_row;
- uint32* dst = dst_row;
- for (int x = 0; x < dest_subset.width(); x++, src += w, dst++) {
- uint8 r = 0, g = 0, b = 0, a = 0;
- switch (order) {
- case SkFontHost::kRGB_LCDOrder:
- switch (orientation) {
- case SkFontHost::kHorizontal_LCDOrientation:
- r = SkGetPackedR32(src[0]);
- g = SkGetPackedG32(src[1]);
- b = SkGetPackedB32(src[2]);
- a = SkGetPackedA32(src[1]);
- break;
- case SkFontHost::kVertical_LCDOrientation:
- r = SkGetPackedR32(src[0 * row_words]);
- g = SkGetPackedG32(src[1 * row_words]);
- b = SkGetPackedB32(src[2 * row_words]);
- a = SkGetPackedA32(src[1 * row_words]);
- break;
- }
- break;
- case SkFontHost::kBGR_LCDOrder:
- switch (orientation) {
- case SkFontHost::kHorizontal_LCDOrientation:
- b = SkGetPackedB32(src[0]);
- g = SkGetPackedG32(src[1]);
- r = SkGetPackedR32(src[2]);
- a = SkGetPackedA32(src[1]);
- break;
- case SkFontHost::kVertical_LCDOrientation:
- b = SkGetPackedB32(src[0 * row_words]);
- g = SkGetPackedG32(src[1 * row_words]);
- r = SkGetPackedR32(src[2 * row_words]);
- a = SkGetPackedA32(src[1 * row_words]);
- break;
- }
- break;
- case SkFontHost::kNONE_LCDOrder:
- NOTREACHED();
- }
- // Premultiplied alpha is very fragile.
- a = a > r ? a : r;
- a = a > g ? a : g;
- a = a > b ? a : b;
- *dst = SkPackARGB32(a, r, g, b);
- }
- src_row += h * row_words;
- dst_row += result.rowBytes() / 4;
- }
- return result;
-#else
- return SkBitmap();
-#endif // OS_POSIX && !OS_MACOSX && !defined(OS_ANDROID)
-}
-
-// static
-SkBitmap ImageOperations::ResizeBasic(const SkBitmap& source,
- ResizeMethod method,
- int dest_width, int dest_height,
- const SkIRect& dest_subset,
- SkBitmap::Allocator* allocator) {
- TRACE_EVENT2("skia", "ImageOperations::ResizeBasic",
- "src_pixels", source.width()*source.height(),
- "dst_pixels", dest_width*dest_height);
+ TRACE_EVENT2("disabled-by-default-skia", "ImageOperations::Resize",
+ "src_pixels", source.width() * source.height(), "dst_pixels",
+ dest_width * dest_height);
// Ensure that the ResizeMethod enumeration is sound.
SkASSERT(((RESIZE_FIRST_QUALITY_METHOD <= method) &&
(method <= RESIZE_LAST_QUALITY_METHOD)) ||
diff --git a/skia/ext/image_operations.h b/skia/ext/image_operations.h
index eff8912..9e0b073 100644
--- a/skia/ext/image_operations.h
+++ b/skia/ext/image_operations.h
@@ -79,15 +79,11 @@
// each side, then oscillates 2 more times. It gives nice sharp edges.
RESIZE_LANCZOS3,
- // Lanczos filter + subpixel interpolation. If subpixel rendering is not
- // appropriate we automatically fall back to Lanczos.
- RESIZE_SUBPIXEL,
-
// enum aliases for first and last methods by algorithm or by quality.
RESIZE_FIRST_QUALITY_METHOD = RESIZE_GOOD,
RESIZE_LAST_QUALITY_METHOD = RESIZE_BEST,
RESIZE_FIRST_ALGORITHM_METHOD = RESIZE_BOX,
- RESIZE_LAST_ALGORITHM_METHOD = RESIZE_SUBPIXEL,
+ RESIZE_LAST_ALGORITHM_METHOD = RESIZE_LANCZOS3,
};
// Resizes the given source bitmap using the specified resize method, so that
@@ -113,19 +109,6 @@
private:
ImageOperations(); // Class for scoping only.
-
- // Supports all methods except RESIZE_SUBPIXEL.
- static SkBitmap ResizeBasic(const SkBitmap& source,
- ResizeMethod method,
- int dest_width, int dest_height,
- const SkIRect& dest_subset,
- SkBitmap::Allocator* allocator = NULL);
-
- // Subpixel renderer.
- static SkBitmap ResizeSubpixel(const SkBitmap& source,
- int dest_width, int dest_height,
- const SkIRect& dest_subset,
- SkBitmap::Allocator* allocator = NULL);
};
} // namespace skia
diff --git a/skia/ext/image_operations_bench.cc b/skia/ext/image_operations_bench.cc
index c4146d2..4fd81bc 100644
--- a/skia/ext/image_operations_bench.cc
+++ b/skia/ext/image_operations_bench.cc
@@ -43,7 +43,6 @@
ADD_METHOD(HAMMING1),
ADD_METHOD(LANCZOS2),
ADD_METHOD(LANCZOS3),
- ADD_METHOD(SUBPIXEL)
};
// converts a string into one of the image operation method to resize.
diff --git a/skia/ext/image_operations_unittest.cc b/skia/ext/image_operations_unittest.cc
index 6152731..6f88d73 100644
--- a/skia/ext/image_operations_unittest.cc
+++ b/skia/ext/image_operations_unittest.cc
@@ -495,7 +495,6 @@
const SkColor colors[] = { checker_color1, checker_color2 };
const SkColor average_color = AveragePixel(colors, arraysize(colors));
- // RESIZE_SUBPIXEL is only supported on Linux/non-GTV platforms.
static const TestedResizeMethod tested_methods[] = {
{ skia::ImageOperations::RESIZE_GOOD, "GOOD", 0.0f },
{ skia::ImageOperations::RESIZE_BETTER, "BETTER", 0.0f },
@@ -504,26 +503,6 @@
{ skia::ImageOperations::RESIZE_HAMMING1, "HAMMING1", 0.0f },
{ skia::ImageOperations::RESIZE_LANCZOS2, "LANCZOS2", 0.0f },
{ skia::ImageOperations::RESIZE_LANCZOS3, "LANCZOS3", 0.0f },
-#if defined(OS_LINUX) && !defined(GTV)
- // SUBPIXEL has slightly worse performance than the other filters:
- // 6.324 Bottom left/right corners
- // 5.099 Top left/right corners
- // 2.828 Bottom middle
- // 1.414 Top/Left/Right middle, center
- //
- // This is expected since, in order to judge RESIZE_SUBPIXEL accurately,
- // we'd need to compute distances for each sub-pixel, and potentially
- // tweak the test parameters so that expectations were realistic when
- // looking at sub-pixels in isolation.
- //
- // Rather than going to these lengths, we added the "max_distance_override"
- // field in TestedResizeMethod, intended for RESIZE_SUBPIXEL. It allows
- // us to to enable its testing without having to lower the success criteria
- // for the other methods. This procedure is distateful but defining
- // a distance limit for each tested pixel for each method was judged to add
- // unneeded complexity.
- { skia::ImageOperations::RESIZE_SUBPIXEL, "SUBPIXEL", 6.4f },
-#endif
};
// Create our source bitmap.
diff --git a/skia/ext/pixel_ref_utils_unittest.cc b/skia/ext/pixel_ref_utils_unittest.cc
index 656ef5c..08e5d3e 100644
--- a/skia/ext/pixel_ref_utils_unittest.cc
+++ b/skia/ext/pixel_ref_utils_unittest.cc
@@ -53,11 +53,9 @@
SkBitmap bitmap_;
};
-#ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
SkFlattenable* TestDiscardableShader::CreateProc(SkReadBuffer&) {
return new TestDiscardableShader;
}
-#endif
void CreateBitmap(gfx::Size size, const char* uri, SkBitmap* bitmap) {
bitmap->allocN32Pixels(size.width(), size.height());
diff --git a/skia/ext/platform_canvas_unittest.cc b/skia/ext/platform_canvas_unittest.cc
index 3d8ef00..3b39b44 100644
--- a/skia/ext/platform_canvas_unittest.cc
+++ b/skia/ext/platform_canvas_unittest.cc
@@ -414,7 +414,7 @@
platform_bitmap->GetBitmap().colorType());
EXPECT_TRUE(platform_bitmap->GetBitmap().lockPixelsAreWritable());
EXPECT_TRUE(platform_bitmap->GetBitmap().pixelRef()->isLocked());
- EXPECT_EQ(1, platform_bitmap->GetBitmap().pixelRef()->getRefCnt());
+ EXPECT_TRUE(platform_bitmap->GetBitmap().pixelRef()->unique());
*(platform_bitmap->GetBitmap().getAddr32(10, 20)) = 0xDEED1020;
*(platform_bitmap->GetBitmap().getAddr32(20, 30)) = 0xDEED2030;
@@ -422,8 +422,8 @@
SkBitmap sk_bitmap = platform_bitmap->GetBitmap();
sk_bitmap.lockPixels();
- EXPECT_EQ(2, platform_bitmap->GetBitmap().pixelRef()->getRefCnt());
- EXPECT_EQ(2, sk_bitmap.pixelRef()->getRefCnt());
+ EXPECT_FALSE(platform_bitmap->GetBitmap().pixelRef()->unique());
+ EXPECT_FALSE(sk_bitmap.pixelRef()->unique());
EXPECT_EQ(0xDEED1020, *sk_bitmap.getAddr32(10, 20));
EXPECT_EQ(0xDEED2030, *sk_bitmap.getAddr32(20, 30));
@@ -434,7 +434,7 @@
// the PlatformBitmap.
platform_bitmap.reset();
- EXPECT_EQ(1, sk_bitmap.pixelRef()->getRefCnt());
+ EXPECT_TRUE(sk_bitmap.pixelRef()->unique());
EXPECT_EQ(0xDEED1020, *sk_bitmap.getAddr32(10, 20));
EXPECT_EQ(0xDEED2030, *sk_bitmap.getAddr32(20, 30));
diff --git a/skia/ext/refptr_unittest.cc b/skia/ext/refptr_unittest.cc
index 1d63ed1..bf54b03 100644
--- a/skia/ext/refptr_unittest.cc
+++ b/skia/ext/refptr_unittest.cc
@@ -11,13 +11,13 @@
TEST(RefPtrTest, ReferenceCounting) {
SkRefCnt* ref = new SkRefCnt();
- EXPECT_EQ(1, ref->getRefCnt());
+ EXPECT_TRUE(ref->unique());
{
// Adopt the reference from the caller on creation.
RefPtr<SkRefCnt> refptr1 = AdoptRef(ref);
- EXPECT_EQ(1, ref->getRefCnt());
- EXPECT_EQ(1, refptr1->getRefCnt());
+ EXPECT_TRUE(ref->unique());
+ EXPECT_TRUE(refptr1->unique());
EXPECT_EQ(ref, &*refptr1);
EXPECT_EQ(ref, refptr1.get());
@@ -25,100 +25,100 @@
{
// Take a second reference for the second instance.
RefPtr<SkRefCnt> refptr2(refptr1);
- EXPECT_EQ(2, ref->getRefCnt());
+ EXPECT_FALSE(ref->unique());
RefPtr<SkRefCnt> refptr3;
EXPECT_FALSE(refptr3);
// Take a third reference for the third instance.
refptr3 = refptr1;
- EXPECT_EQ(3, ref->getRefCnt());
+ EXPECT_FALSE(ref->unique());
// Same object, so should have the same refcount.
refptr2 = refptr3;
- EXPECT_EQ(3, ref->getRefCnt());
+ EXPECT_FALSE(ref->unique());
// Drop the object from refptr2, so it should lose its reference.
EXPECT_TRUE(refptr2);
refptr2.clear();
- EXPECT_EQ(2, ref->getRefCnt());
+ EXPECT_FALSE(ref->unique());
EXPECT_FALSE(refptr2);
EXPECT_EQ(NULL, refptr2.get());
EXPECT_TRUE(refptr3);
- EXPECT_EQ(2, refptr3->getRefCnt());
+ EXPECT_FALSE(refptr3->unique());
EXPECT_EQ(ref, &*refptr3);
EXPECT_EQ(ref, refptr3.get());
}
// Drop a reference when the third object is destroyed.
- EXPECT_EQ(1, ref->getRefCnt());
+ EXPECT_TRUE(ref->unique());
}
}
TEST(RefPtrTest, Construct) {
SkRefCnt* ref = new SkRefCnt();
- EXPECT_EQ(1, ref->getRefCnt());
+ EXPECT_TRUE(ref->unique());
// Adopt the reference from the caller on creation.
RefPtr<SkRefCnt> refptr1(AdoptRef(ref));
- EXPECT_EQ(1, ref->getRefCnt());
- EXPECT_EQ(1, refptr1->getRefCnt());
+ EXPECT_TRUE(ref->unique());
+ EXPECT_TRUE(refptr1->unique());
EXPECT_EQ(ref, &*refptr1);
EXPECT_EQ(ref, refptr1.get());
RefPtr<SkRefCnt> refptr2(refptr1);
- EXPECT_EQ(2, ref->getRefCnt());
+ EXPECT_FALSE(ref->unique());
}
TEST(RefPtrTest, DeclareAndAssign) {
SkRefCnt* ref = new SkRefCnt();
- EXPECT_EQ(1, ref->getRefCnt());
+ EXPECT_TRUE(ref->unique());
// Adopt the reference from the caller on creation.
RefPtr<SkRefCnt> refptr1 = AdoptRef(ref);
- EXPECT_EQ(1, ref->getRefCnt());
- EXPECT_EQ(1, refptr1->getRefCnt());
+ EXPECT_TRUE(ref->unique());
+ EXPECT_TRUE(refptr1->unique());
EXPECT_EQ(ref, &*refptr1);
EXPECT_EQ(ref, refptr1.get());
RefPtr<SkRefCnt> refptr2 = refptr1;
- EXPECT_EQ(2, ref->getRefCnt());
+ EXPECT_FALSE(ref->unique());
}
TEST(RefPtrTest, Assign) {
SkRefCnt* ref = new SkRefCnt();
- EXPECT_EQ(1, ref->getRefCnt());
+ EXPECT_TRUE(ref->unique());
// Adopt the reference from the caller on creation.
RefPtr<SkRefCnt> refptr1;
refptr1 = AdoptRef(ref);
- EXPECT_EQ(1, ref->getRefCnt());
- EXPECT_EQ(1, refptr1->getRefCnt());
+ EXPECT_TRUE(ref->unique());
+ EXPECT_TRUE(refptr1->unique());
EXPECT_EQ(ref, &*refptr1);
EXPECT_EQ(ref, refptr1.get());
RefPtr<SkRefCnt> refptr2;
refptr2 = refptr1;
- EXPECT_EQ(2, ref->getRefCnt());
+ EXPECT_FALSE(ref->unique());
}
class Subclass : public SkRefCnt {};
TEST(RefPtrTest, Upcast) {
RefPtr<Subclass> child = AdoptRef(new Subclass());
- EXPECT_EQ(1, child->getRefCnt());
+ EXPECT_TRUE(child->unique());
RefPtr<SkRefCnt> parent = child;
EXPECT_TRUE(child);
EXPECT_TRUE(parent);
- EXPECT_EQ(2, child->getRefCnt());
- EXPECT_EQ(2, parent->getRefCnt());
+ EXPECT_FALSE(child->unique());
+ EXPECT_FALSE(parent->unique());
}
} // namespace
diff --git a/skia/ext/skia_trace_shim.h b/skia/ext/skia_trace_shim.h
deleted file mode 100644
index 62bdecc..0000000
--- a/skia/ext/skia_trace_shim.h
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SKIA_EXT_SKIA_TRACE_SHIM_H_
-#define SKIA_EXT_SKIA_TRACE_SHIM_H_
-
-#include "base/debug/trace_event.h"
-
-#define SK_TRACE_EVENT0(name) \
- TRACE_EVENT0("skia", name)
-#define SK_TRACE_EVENT1(name, arg1_name, arg1_val) \
- TRACE_EVENT1("skia", name, arg1_name, arg1_val)
-#define SK_TRACE_EVENT2(name, arg1_name, arg1_val, arg2_name, arg2_val) \
- TRACE_EVENT1("skia", name, arg1_name, arg1_val, arg2_name, arg2_val)
-
-#endif
diff --git a/skia/skia_chrome.gypi b/skia/skia_chrome.gypi
index 7db9009..cff4e3c 100644
--- a/skia/skia_chrome.gypi
+++ b/skia/skia_chrome.gypi
@@ -71,7 +71,6 @@
'ext/SkDiscardableMemory_chrome.h',
'ext/SkDiscardableMemory_chrome.cc',
'ext/SkMemory_new_handler.cpp',
- 'ext/skia_trace_shim.h',
'ext/skia_utils_base.cc',
'ext/skia_utils_base.h',
'ext/skia_utils_ios.mm',
diff --git a/sky/engine/platform/graphics/GraphicsContextTest.cpp b/sky/engine/platform/graphics/GraphicsContextTest.cpp
index fa5e713..f8f6c25 100644
--- a/sky/engine/platform/graphics/GraphicsContextTest.cpp
+++ b/sky/engine/platform/graphics/GraphicsContextTest.cpp
@@ -1179,7 +1179,7 @@
EXPECT_TRUE(canvas2);
EXPECT_NE(canvas1, canvas2);
- EXPECT_EQ(1, canvas1->getRefCnt());
+ EXPECT_TRUE(canvas1->unique());
canvas1->unref();
EXPECT_TRUE(dl->isRecording());
@@ -1192,7 +1192,7 @@
dl->endRecording();
pic = dl->picture();
EXPECT_TRUE(pic);
- EXPECT_EQ(1, pic->getRefCnt());
+ EXPECT_TRUE(pic->unique());
}
} // namespace
diff --git a/sky_viewer.trace b/sky_viewer.trace
new file mode 100644
index 0000000..62ec65b
--- /dev/null
+++ b/sky_viewer.trace
@@ -0,0 +1 @@
+{"traceEvents":[{"cat":"__metadata","pid":25863,"tid":0,"ts":0,"ph":"M","name":"num_cpus","args":{"number":32}},{"cat":"toplevel","pid":25863,"tid":25865,"ts":531358152433,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":65,"tdur":44,"tts":2488},{"cat":"trace_event_overhead","pid":25863,"tid":25865,"ts":531358152433,"ph":"X","name":"overhead","args":{},"dur":57,"tdur":35,"tts":2488},{"cat":"__metadata","pid":25863,"tid":25865,"ts":0,"ph":"M","name":"overhead","args":{"average_overhead":0.057}},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358199769,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":21,"tdur":20,"tts":568268},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358201740,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":13,"tdur":12,"tts":569794},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358203446,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":14,"tdur":13,"tts":571219},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358204957,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":13,"tdur":12,"tts":572493},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358290436,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":62,"tdur":42,"tts":577712},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358292236,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":11,"tdur":10,"tts":579115},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358293651,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":11,"tdur":11,"tts":580338},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358295878,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":11,"tdur":11,"tts":582351},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358355949,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":26,"tdur":25,"tts":584829},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358357739,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":13,"tdur":12,"tts":586231},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358359433,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":12,"tdur":12,"tts":587655},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358361126,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":13,"tdur":12,"tts":589120},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358421634,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":26,"tdur":24,"tts":591404},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358423543,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":13,"tdur":13,"tts":592923},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358426570,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":13,"tdur":13,"tts":595677},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358428238,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":14,"tdur":13,"tts":597004},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358489211,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":27,"tdur":25,"tts":599178},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358490938,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":12,"tdur":11,"tts":600564},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358492514,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":11,"tdur":11,"tts":601836},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358493911,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":11,"tdur":11,"tts":603078},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358554642,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":13,"tdur":12,"tts":604476},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358556457,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":13,"tdur":12,"tts":605927},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358558045,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":13,"tdur":12,"tts":607253},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358559573,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":13,"tdur":13,"tts":608561},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358609909,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":59,"tdur":58,"tts":610964},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358612166,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":12,"tdur":11,"tts":612806},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358613764,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":12,"tdur":12,"tts":614061},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358616318,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":17,"tdur":15,"tts":616236},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358671902,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":28,"tdur":27,"tts":618461},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358674475,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":14,"tdur":14,"tts":620620},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358676282,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":14,"tdur":13,"tts":622098},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358677929,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":14,"tdur":13,"tts":623537},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358737491,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":36,"tdur":34,"tts":625692},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358739145,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":12,"tdur":11,"tts":626959},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358740693,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":12,"tdur":12,"tts":628233},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358742154,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":12,"tdur":11,"tts":629477},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358822851,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":29,"tdur":27,"tts":632368},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358824525,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":11,"tdur":10,"tts":633671},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358826582,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":11,"tdur":10,"tts":635441},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358827982,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":11,"tdur":10,"tts":636610},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358903414,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":19,"tdur":19,"tts":638234},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358905015,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":11,"tdur":10,"tts":639447},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358906400,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":11,"tdur":10,"tts":640581},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358907735,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":11,"tdur":10,"tts":641719},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358973794,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":36,"tdur":34,"tts":644895},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358975629,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":12,"tdur":11,"tts":646337},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358977247,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":11,"tdur":11,"tts":647635},{"cat":"gpu","pid":25863,"tid":25913,"ts":531358978769,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":12,"tdur":11,"tts":648888},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359107759,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":33,"tdur":31,"tts":651356},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359111101,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":28,"tdur":26,"tts":654069},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359114311,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":27,"tdur":25,"tts":656794},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359117181,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":13,"tdur":12,"tts":659155},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359188850,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":28,"tdur":26,"tts":661682},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359193360,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":27,"tdur":26,"tts":665694},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359196623,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":26,"tdur":25,"tts":668453},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359199757,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":28,"tdur":26,"tts":671165},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359254350,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":27,"tdur":27,"tts":672740},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359256070,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":12,"tdur":11,"tts":674032},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359257523,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":12,"tdur":11,"tts":675239},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359258934,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":11,"tdur":11,"tts":676454},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359339144,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":27,"tdur":26,"tts":678727},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359340873,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":12,"tdur":11,"tts":680075},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359342333,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":11,"tdur":10,"tts":681228},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359343715,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":11,"tdur":10,"tts":682364},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359405091,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":61,"tdur":60,"tts":684432},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359408456,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":26,"tdur":25,"tts":687233},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359412345,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":27,"tdur":25,"tts":690631},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359415313,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":25,"tdur":25,"tts":693109},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359472824,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":27,"tdur":25,"tts":696435},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359474463,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":11,"tdur":10,"tts":697679},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359475858,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":11,"tdur":11,"tts":698901},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359477353,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":12,"tdur":11,"tts":700116},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359554728,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":13,"tdur":12,"tts":701509},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359556256,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":11,"tdur":11,"tts":702797},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359557622,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":11,"tdur":11,"tts":703997},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359558921,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":12,"tdur":10,"tts":705182},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359622513,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":27,"tdur":25,"tts":707512},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359625838,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":27,"tdur":25,"tts":710278},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359629067,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":27,"tdur":25,"tts":713004},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359632150,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":12,"tdur":11,"tts":715734},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359671969,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":14,"tdur":13,"tts":717191},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359676048,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":25,"tdur":24,"tts":720696},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359679192,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":26,"tdur":25,"tts":723325},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359681508,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":13,"tdur":12,"tts":725435},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359753850,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":26,"tdur":24,"tts":727951},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359756039,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":16,"tdur":15,"tts":729904},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359758106,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":14,"tdur":13,"tts":731725},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359760046,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":14,"tdur":13,"tts":733528},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359833873,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":36,"tdur":34,"tts":736508},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359836678,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":13,"tdur":12,"tts":738677},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359838567,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":13,"tdur":12,"tts":740105},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359840372,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":13,"tdur":12,"tts":741565},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359904543,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":27,"tdur":25,"tts":743547},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359906229,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":12,"tdur":11,"tts":744868},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359907697,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":12,"tdur":12,"tts":746072},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359909153,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":12,"tdur":11,"tts":747282},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359971798,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":38,"tdur":36,"tts":749659},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359975153,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":27,"tdur":26,"tts":752399},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359979399,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":26,"tdur":25,"tts":756105},{"cat":"gpu","pid":25863,"tid":25913,"ts":531359982428,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":27,"tdur":25,"tts":758799},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360064242,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":17,"tdur":17,"tts":760719},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360065950,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":27,"tdur":25,"tts":762091},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360067777,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":12,"tdur":10,"tts":763462},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360068970,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":10,"tdur":10,"tts":764522},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360070079,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":10,"tdur":9,"tts":765520},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360154085,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":12,"tdur":11,"tts":766834},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360155705,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":11,"tdur":11,"tts":768090},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360157434,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":14,"tdur":14,"tts":769553},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360159112,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":14,"tdur":13,"tts":770964},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360222844,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":27,"tdur":26,"tts":773442},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360226960,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":26,"tdur":25,"tts":777007},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360230945,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":27,"tdur":25,"tts":780455},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360234074,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":27,"tdur":27,"tts":783113},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360291661,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":33,"tdur":28,"tts":787635},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360293453,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":12,"tdur":11,"tts":789018},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360294988,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":11,"tdur":11,"tts":790273},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360296435,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":12,"tdur":11,"tts":791553},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360354708,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":11,"tdur":11,"tts":792846},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360356260,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":14,"tdur":13,"tts":794161},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360358003,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":14,"tdur":13,"tts":795629},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360359691,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":14,"tdur":13,"tts":797077},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360422417,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":26,"tdur":26,"tts":799171},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360424849,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":12,"tdur":12,"tts":801170},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360426438,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":13,"tdur":12,"tts":802501},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360427937,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":13,"tdur":12,"tts":803778},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360489079,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":14,"tdur":13,"tts":806004},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360491044,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":13,"tdur":12,"tts":807634},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360492727,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":12,"tdur":12,"tts":808992},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360494255,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":18,"tdur":18,"tts":810316},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360555644,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":29,"tdur":28,"tts":812531},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360558821,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":27,"tdur":26,"tts":815218},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360562003,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":27,"tdur":25,"tts":817951},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360565170,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":27,"tdur":26,"tts":820588},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360623088,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":12,"tdur":12,"tts":822799},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360624641,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":11,"tdur":11,"tts":824030},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360626044,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":11,"tdur":11,"tts":825253},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360627367,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":11,"tdur":10,"tts":826388},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360690421,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":27,"tdur":26,"tts":829628},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360693676,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":27,"tdur":25,"tts":832394},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360696992,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":27,"tdur":25,"tts":835199},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360700117,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":13,"tdur":12,"tts":837810},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360773512,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":27,"tdur":26,"tts":840241},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360776838,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":28,"tdur":26,"tts":843015},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360780118,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":27,"tdur":25,"tts":845767},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360783252,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":27,"tdur":26,"tts":848449},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360840060,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":12,"tdur":12,"tts":851059},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360841558,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":10,"tdur":10,"tts":852201},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360842909,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":11,"tdur":10,"tts":853346},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360844299,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":11,"tdur":10,"tts":854479},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360904932,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":27,"tdur":26,"tts":856610},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360908197,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":27,"tdur":25,"tts":859356},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360911417,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":26,"tdur":26,"tts":862088},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360915813,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":27,"tdur":26,"tts":865984},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360972661,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":27,"tdur":26,"tts":867850},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360975813,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":27,"tdur":25,"tts":870506},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360978942,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":26,"tdur":25,"tts":873078},{"cat":"gpu","pid":25863,"tid":25913,"ts":531360981344,"ph":"X","name":"GLES2::GenMailboxCHROMIUM","args":{},"dur":13,"tdur":13,"tts":874976},{"cat":"__metadata","pid":25863,"tid":0,"ts":0,"ph":"M","name":"num_cpus","args":{"number":32}},{"cat":"__metadata","pid":25863,"tid":25865,"ts":0,"ph":"M","name":"thread_name","args":{"name":"handle-watcher-thread"}},{"cat":"__metadata","pid":25863,"tid":25913,"ts":0,"ph":"M","name":"thread_name","args":{"name":"app_thread/25913"}},{"cat":"toplevel","pid":25863,"tid":25863,"ts":531361002103,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"tdur":0,"tts":10390},{"cat":"__metadata","pid":25863,"tid":25863,"ts":0,"ph":"M","name":"overhead","args":{"average_overhead":0.032}},{"cat":"sky","pid":25863,"tid":25913,"ts":531358198686,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1402,"tdur":1223,"tts":567190},{"cat":"blink","pid":25863,"tid":25913,"ts":531358198720,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":127,"tdur":126,"tts":567218},{"cat":"blink","pid":25863,"tid":25913,"ts":531358198724,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":2,"tts":567222},{"cat":"blink","pid":25863,"tid":25913,"ts":531358198729,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":44,"tdur":44,"tts":567227},{"cat":"blink","pid":25863,"tid":25913,"ts":531358198735,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":38,"tdur":36,"tts":567234},{"cat":"v8","pid":25863,"tid":25913,"ts":531358198755,"ph":"X","name":"v8.callFunction","args":{},"dur":14,"tdur":14,"tts":567253},{"cat":"v8","pid":25863,"tid":25913,"ts":531358198757,"ph":"B","name":"V8.Execute","args":{},"tts":567255},{"cat":"v8","pid":25863,"tid":25913,"ts":531358198767,"ph":"E","name":"V8.Execute","args":{},"tts":567265},{"cat":"v8","pid":25863,"tid":25913,"ts":531358198775,"ph":"X","name":"v8.callFunction","args":{},"dur":69,"tdur":68,"tts":567274},{"cat":"v8","pid":25863,"tid":25913,"ts":531358198777,"ph":"B","name":"V8.Execute","args":{},"tts":567275},{"cat":"blink","pid":25863,"tid":25913,"ts":531358198781,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":12,"tdur":12,"tts":567279},{"cat":"v8","pid":25863,"tid":25913,"ts":531358198841,"ph":"E","name":"V8.Execute","args":{},"tts":567340},{"cat":"blink","pid":25863,"tid":25913,"ts":531358198847,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":45,"tdur":45,"tts":567345},{"cat":"blink","pid":25863,"tid":25913,"ts":531358198849,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":567347},{"cat":"blink","pid":25863,"tid":25913,"ts":531358198850,"ph":"X","name":"Document::updateStyle","args":{},"dur":26,"tdur":25,"tts":567349},{"cat":"blink","pid":25863,"tid":25913,"ts":531358198876,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":567375},{"cat":"blink","pid":25863,"tid":25913,"ts":531358198887,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":5,"tdur":5,"tts":567385},{"cat":"sky","pid":25863,"tid":25913,"ts":531358198893,"ph":"X","name":"Layer::Display","args":{},"dur":868,"tdur":866,"tts":567392},{"cat":"sky","pid":25863,"tid":25913,"ts":531358199762,"ph":"X","name":"LayerHost::Upload","args":{},"dur":325,"tdur":152,"tts":568260},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358200107,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":97,"tdur":97,"tts":568432},{"cat":"blink","pid":25863,"tid":25913,"ts":531358200129,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":70,"tdur":69,"tts":568455},{"cat":"v8","pid":25863,"tid":25913,"ts":531358200135,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":62,"tdur":61,"tts":568461},{"cat":"v8","pid":25863,"tid":25913,"ts":531358200141,"ph":"X","name":"v8.callFunction","args":{},"dur":55,"tdur":54,"tts":568467},{"cat":"v8","pid":25863,"tid":25913,"ts":531358200145,"ph":"B","name":"V8.Execute","args":{},"tts":568470},{"cat":"blink","pid":25863,"tid":25913,"ts":531358200166,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":27,"tdur":26,"tts":568492},{"cat":"blink","pid":25863,"tid":25913,"ts":531358200189,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":568514},{"cat":"v8","pid":25863,"tid":25913,"ts":531358200194,"ph":"E","name":"V8.Execute","args":{},"tts":568519},{"cat":"sky","pid":25863,"tid":25913,"ts":531358200677,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1236,"tdur":1157,"tts":568731},{"cat":"blink","pid":25863,"tid":25913,"ts":531358200681,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":109,"tdur":108,"tts":568735},{"cat":"blink","pid":25863,"tid":25913,"ts":531358200685,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":2,"tts":568738},{"cat":"blink","pid":25863,"tid":25913,"ts":531358200688,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":38,"tdur":37,"tts":568742},{"cat":"blink","pid":25863,"tid":25913,"ts":531358200696,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":30,"tdur":29,"tts":568750},{"cat":"v8","pid":25863,"tid":25913,"ts":531358200711,"ph":"X","name":"v8.callFunction","args":{},"dur":11,"tdur":11,"tts":568764},{"cat":"v8","pid":25863,"tid":25913,"ts":531358200713,"ph":"B","name":"V8.Execute","args":{},"tts":568766},{"cat":"v8","pid":25863,"tid":25913,"ts":531358200720,"ph":"E","name":"V8.Execute","args":{},"tts":568774},{"cat":"v8","pid":25863,"tid":25913,"ts":531358200729,"ph":"X","name":"v8.callFunction","args":{},"dur":59,"tdur":59,"tts":568782},{"cat":"v8","pid":25863,"tid":25913,"ts":531358200731,"ph":"B","name":"V8.Execute","args":{},"tts":568784},{"cat":"blink","pid":25863,"tid":25913,"ts":531358200735,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":10,"tdur":10,"tts":568788},{"cat":"v8","pid":25863,"tid":25913,"ts":531358200784,"ph":"E","name":"V8.Execute","args":{},"tts":568838},{"cat":"blink","pid":25863,"tid":25913,"ts":531358200790,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":33,"tdur":32,"tts":568844},{"cat":"blink","pid":25863,"tid":25913,"ts":531358200793,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":568846},{"cat":"blink","pid":25863,"tid":25913,"ts":531358200794,"ph":"X","name":"Document::updateStyle","args":{},"dur":20,"tdur":19,"tts":568848},{"cat":"blink","pid":25863,"tid":25913,"ts":531358200814,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":568868},{"cat":"blink","pid":25863,"tid":25913,"ts":531358200819,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":4,"tts":568872},{"cat":"sky","pid":25863,"tid":25913,"ts":531358200824,"ph":"X","name":"Layer::Display","args":{},"dur":908,"tdur":907,"tts":568878},{"cat":"sky","pid":25863,"tid":25913,"ts":531358201733,"ph":"X","name":"LayerHost::Upload","args":{},"dur":179,"tdur":99,"tts":569787},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358201926,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":43,"tdur":43,"tts":569901},{"cat":"blink","pid":25863,"tid":25913,"ts":531358201932,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":32,"tdur":33,"tts":569906},{"cat":"v8","pid":25863,"tid":25913,"ts":531358201934,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":29,"tdur":28,"tts":569909},{"cat":"v8","pid":25863,"tid":25913,"ts":531358201937,"ph":"X","name":"v8.callFunction","args":{},"dur":25,"tdur":24,"tts":569912},{"cat":"v8","pid":25863,"tid":25913,"ts":531358201939,"ph":"B","name":"V8.Execute","args":{},"tts":569914},{"cat":"blink","pid":25863,"tid":25913,"ts":531358201948,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":11,"tdur":10,"tts":569923},{"cat":"blink","pid":25863,"tid":25913,"ts":531358201955,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":569930},{"cat":"v8","pid":25863,"tid":25913,"ts":531358201960,"ph":"E","name":"V8.Execute","args":{},"tts":569935},{"cat":"sky","pid":25863,"tid":25913,"ts":531358202363,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1212,"tdur":1154,"tts":570136},{"cat":"blink","pid":25863,"tid":25913,"ts":531358202368,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":122,"tdur":122,"tts":570140},{"cat":"blink","pid":25863,"tid":25913,"ts":531358202371,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":570144},{"cat":"blink","pid":25863,"tid":25913,"ts":531358202375,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":46,"tdur":46,"tts":570147},{"cat":"blink","pid":25863,"tid":25913,"ts":531358202391,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":30,"tdur":29,"tts":570164},{"cat":"v8","pid":25863,"tid":25913,"ts":531358202406,"ph":"X","name":"v8.callFunction","args":{},"dur":11,"tdur":11,"tts":570178},{"cat":"v8","pid":25863,"tid":25913,"ts":531358202408,"ph":"B","name":"V8.Execute","args":{},"tts":570180},{"cat":"v8","pid":25863,"tid":25913,"ts":531358202415,"ph":"E","name":"V8.Execute","args":{},"tts":570188},{"cat":"v8","pid":25863,"tid":25913,"ts":531358202424,"ph":"X","name":"v8.callFunction","args":{},"dur":63,"tdur":64,"tts":570196},{"cat":"v8","pid":25863,"tid":25913,"ts":531358202425,"ph":"B","name":"V8.Execute","args":{},"tts":570198},{"cat":"blink","pid":25863,"tid":25913,"ts":531358202430,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":15,"tdur":15,"tts":570202},{"cat":"v8","pid":25863,"tid":25913,"ts":531358202484,"ph":"E","name":"V8.Execute","args":{},"tts":570257},{"cat":"blink","pid":25863,"tid":25913,"ts":531358202491,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":33,"tdur":33,"tts":570263},{"cat":"blink","pid":25863,"tid":25913,"ts":531358202493,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":570265},{"cat":"blink","pid":25863,"tid":25913,"ts":531358202494,"ph":"X","name":"Document::updateStyle","args":{},"dur":20,"tdur":19,"tts":570267},{"cat":"blink","pid":25863,"tid":25913,"ts":531358202515,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":570287},{"cat":"blink","pid":25863,"tid":25913,"ts":531358202519,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":3,"tts":570292},{"cat":"sky","pid":25863,"tid":25913,"ts":531358202524,"ph":"X","name":"Layer::Display","args":{},"dur":915,"tdur":913,"tts":570297},{"cat":"sky","pid":25863,"tid":25913,"ts":531358203440,"ph":"X","name":"LayerHost::Upload","args":{},"dur":134,"tdur":76,"tts":571213},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358203587,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":41,"tdur":40,"tts":571303},{"cat":"blink","pid":25863,"tid":25913,"ts":531358203592,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":31,"tdur":31,"tts":571307},{"cat":"v8","pid":25863,"tid":25913,"ts":531358203595,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":27,"tdur":27,"tts":571310},{"cat":"v8","pid":25863,"tid":25913,"ts":531358203598,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":23,"tts":571313},{"cat":"v8","pid":25863,"tid":25913,"ts":531358203599,"ph":"B","name":"V8.Execute","args":{},"tts":571315},{"cat":"blink","pid":25863,"tid":25913,"ts":531358203608,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":10,"tdur":10,"tts":571323},{"cat":"blink","pid":25863,"tid":25913,"ts":531358203615,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":2,"tdur":2,"tts":571330},{"cat":"v8","pid":25863,"tid":25913,"ts":531358203619,"ph":"E","name":"V8.Execute","args":{},"tts":571334},{"cat":"sky","pid":25863,"tid":25913,"ts":531358203908,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1160,"tdur":1088,"tts":571458},{"cat":"blink","pid":25863,"tid":25913,"ts":531358203911,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":125,"tdur":111,"tts":571460},{"cat":"blink","pid":25863,"tid":25913,"ts":531358203913,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":571463},{"cat":"blink","pid":25863,"tid":25913,"ts":531358203916,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":32,"tdur":31,"tts":571466},{"cat":"blink","pid":25863,"tid":25913,"ts":531358203923,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":25,"tdur":24,"tts":571473},{"cat":"v8","pid":25863,"tid":25913,"ts":531358203934,"ph":"X","name":"v8.callFunction","args":{},"dur":11,"tdur":10,"tts":571484},{"cat":"v8","pid":25863,"tid":25913,"ts":531358203936,"ph":"B","name":"V8.Execute","args":{},"tts":571486},{"cat":"v8","pid":25863,"tid":25913,"ts":531358203943,"ph":"E","name":"V8.Execute","args":{},"tts":571492},{"cat":"v8","pid":25863,"tid":25913,"ts":531358203950,"ph":"X","name":"v8.callFunction","args":{},"dur":84,"tdur":69,"tts":571500},{"cat":"v8","pid":25863,"tid":25913,"ts":531358203952,"ph":"B","name":"V8.Execute","args":{},"tts":571502},{"cat":"blink","pid":25863,"tid":25913,"ts":531358203956,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":10,"tdur":9,"tts":571506},{"cat":"v8","pid":25863,"tid":25913,"ts":531358204030,"ph":"E","name":"V8.Execute","args":{},"tts":571566},{"cat":"blink","pid":25863,"tid":25913,"ts":531358204037,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":30,"tdur":31,"tts":571572},{"cat":"blink","pid":25863,"tid":25913,"ts":531358204039,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":571575},{"cat":"blink","pid":25863,"tid":25913,"ts":531358204040,"ph":"X","name":"Document::updateStyle","args":{},"dur":19,"tdur":18,"tts":571576},{"cat":"blink","pid":25863,"tid":25913,"ts":531358204059,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":571595},{"cat":"blink","pid":25863,"tid":25913,"ts":531358204063,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":3,"tts":571599},{"cat":"sky","pid":25863,"tid":25913,"ts":531358204068,"ph":"X","name":"Layer::Display","args":{},"dur":882,"tdur":880,"tts":571604},{"cat":"sky","pid":25863,"tid":25913,"ts":531358204951,"ph":"X","name":"LayerHost::Upload","args":{},"dur":116,"tdur":58,"tts":572487},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358206073,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":54,"tdur":54,"tts":572749},{"cat":"blink","pid":25863,"tid":25913,"ts":531358206086,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":36,"tdur":35,"tts":572762},{"cat":"v8","pid":25863,"tid":25913,"ts":531358206089,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":32,"tdur":31,"tts":572765},{"cat":"v8","pid":25863,"tid":25913,"ts":531358206092,"ph":"X","name":"v8.callFunction","args":{},"dur":27,"tdur":27,"tts":572768},{"cat":"v8","pid":25863,"tid":25913,"ts":531358206095,"ph":"B","name":"V8.Execute","args":{},"tts":572770},{"cat":"blink","pid":25863,"tid":25913,"ts":531358206104,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":12,"tdur":12,"tts":572780},{"cat":"blink","pid":25863,"tid":25913,"ts":531358206112,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":4,"tdur":3,"tts":572788},{"cat":"v8","pid":25863,"tid":25913,"ts":531358206117,"ph":"E","name":"V8.Execute","args":{},"tts":572793},{"cat":"sky","pid":25863,"tid":25913,"ts":531358285846,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":4979,"tdur":4787,"tts":573135},{"cat":"blink","pid":25863,"tid":25913,"ts":531358285894,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":1281,"tdur":1279,"tts":573178},{"cat":"blink","pid":25863,"tid":25913,"ts":531358285942,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":6,"tdur":5,"tts":573225},{"cat":"blink","pid":25863,"tid":25913,"ts":531358285976,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":402,"tdur":401,"tts":573260},{"cat":"blink","pid":25863,"tid":25913,"ts":531358286028,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":349,"tdur":349,"tts":573311},{"cat":"v8","pid":25863,"tid":25913,"ts":531358286174,"ph":"X","name":"v8.callFunction","args":{},"dur":193,"tdur":192,"tts":573457},{"cat":"v8","pid":25863,"tid":25913,"ts":531358286180,"ph":"B","name":"V8.Execute","args":{},"tts":573464},{"cat":"v8","pid":25863,"tid":25913,"ts":531358286361,"ph":"E","name":"V8.Execute","args":{},"tts":573644},{"cat":"v8","pid":25863,"tid":25913,"ts":531358286403,"ph":"X","name":"v8.callFunction","args":{},"dur":766,"tdur":766,"tts":573686},{"cat":"v8","pid":25863,"tid":25913,"ts":531358286407,"ph":"B","name":"V8.Execute","args":{},"tts":573690},{"cat":"blink","pid":25863,"tid":25913,"ts":531358286435,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":108,"tdur":107,"tts":573718},{"cat":"v8","pid":25863,"tid":25913,"ts":531358287162,"ph":"E","name":"V8.Execute","args":{},"tts":574446},{"cat":"blink","pid":25863,"tid":25913,"ts":531358287176,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":173,"tdur":172,"tts":574459},{"cat":"blink","pid":25863,"tid":25913,"ts":531358287181,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":574464},{"cat":"blink","pid":25863,"tid":25913,"ts":531358287184,"ph":"X","name":"Document::updateStyle","args":{},"dur":141,"tdur":139,"tts":574467},{"cat":"blink","pid":25863,"tid":25913,"ts":531358287326,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":574609},{"cat":"blink","pid":25863,"tid":25913,"ts":531358287337,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":11,"tdur":10,"tts":574620},{"cat":"sky","pid":25863,"tid":25913,"ts":531358287355,"ph":"X","name":"Layer::Display","args":{},"dur":3072,"tdur":3045,"tts":574638},{"cat":"sky","pid":25863,"tid":25913,"ts":531358290428,"ph":"X","name":"LayerHost::Upload","args":{},"dur":397,"tdur":235,"tts":577685},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358290871,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":82,"tdur":81,"tts":577968},{"cat":"blink","pid":25863,"tid":25913,"ts":531358290878,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":69,"tdur":69,"tts":577974},{"cat":"v8","pid":25863,"tid":25913,"ts":531358290899,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":47,"tdur":46,"tts":577996},{"cat":"v8","pid":25863,"tid":25913,"ts":531358290902,"ph":"X","name":"v8.callFunction","args":{},"dur":43,"tdur":43,"tts":577998},{"cat":"v8","pid":25863,"tid":25913,"ts":531358290903,"ph":"B","name":"V8.Execute","args":{},"tts":578000},{"cat":"blink","pid":25863,"tid":25913,"ts":531358290934,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":8,"tdur":7,"tts":578031},{"cat":"blink","pid":25863,"tid":25913,"ts":531358290939,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":578036},{"cat":"v8","pid":25863,"tid":25913,"ts":531358290943,"ph":"E","name":"V8.Execute","args":{},"tts":578040},{"cat":"sky","pid":25863,"tid":25913,"ts":531358291321,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1047,"tdur":989,"tts":578206},{"cat":"blink","pid":25863,"tid":25913,"ts":531358291325,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":101,"tdur":100,"tts":578209},{"cat":"blink","pid":25863,"tid":25913,"ts":531358291328,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":1,"tdur":2,"tts":578211},{"cat":"blink","pid":25863,"tid":25913,"ts":531358291331,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":41,"tdur":41,"tts":578214},{"cat":"blink","pid":25863,"tid":25913,"ts":531358291346,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":25,"tdur":25,"tts":578230},{"cat":"v8","pid":25863,"tid":25913,"ts":531358291359,"ph":"X","name":"v8.callFunction","args":{},"dur":9,"tdur":9,"tts":578243},{"cat":"v8","pid":25863,"tid":25913,"ts":531358291360,"ph":"B","name":"V8.Execute","args":{},"tts":578244},{"cat":"v8","pid":25863,"tid":25913,"ts":531358291367,"ph":"E","name":"V8.Execute","args":{},"tts":578251},{"cat":"v8","pid":25863,"tid":25913,"ts":531358291374,"ph":"X","name":"v8.callFunction","args":{},"dur":50,"tdur":49,"tts":578258},{"cat":"v8","pid":25863,"tid":25913,"ts":531358291375,"ph":"B","name":"V8.Execute","args":{},"tts":578259},{"cat":"blink","pid":25863,"tid":25913,"ts":531358291379,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":9,"tdur":8,"tts":578263},{"cat":"v8","pid":25863,"tid":25913,"ts":531358291421,"ph":"E","name":"V8.Execute","args":{},"tts":578305},{"cat":"blink","pid":25863,"tid":25913,"ts":531358291426,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":28,"tdur":27,"tts":578310},{"cat":"blink","pid":25863,"tid":25913,"ts":531358291428,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":578312},{"cat":"blink","pid":25863,"tid":25913,"ts":531358291429,"ph":"X","name":"Document::updateStyle","args":{},"dur":17,"tdur":16,"tts":578313},{"cat":"blink","pid":25863,"tid":25913,"ts":531358291446,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":578330},{"cat":"blink","pid":25863,"tid":25913,"ts":531358291450,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":3,"tdur":3,"tts":578334},{"cat":"sky","pid":25863,"tid":25913,"ts":531358291454,"ph":"X","name":"Layer::Display","args":{},"dur":776,"tdur":769,"tts":578338},{"cat":"sky","pid":25863,"tid":25913,"ts":531358292230,"ph":"X","name":"LayerHost::Upload","args":{},"dur":137,"tdur":85,"tts":579109},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358292445,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":36,"tdur":36,"tts":579250},{"cat":"blink","pid":25863,"tid":25913,"ts":531358292450,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":27,"tdur":26,"tts":579255},{"cat":"v8","pid":25863,"tid":25913,"ts":531358292452,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":24,"tdur":23,"tts":579257},{"cat":"v8","pid":25863,"tid":25913,"ts":531358292455,"ph":"X","name":"v8.callFunction","args":{},"dur":20,"tdur":20,"tts":579259},{"cat":"v8","pid":25863,"tid":25913,"ts":531358292456,"ph":"B","name":"V8.Execute","args":{},"tts":579261},{"cat":"blink","pid":25863,"tid":25913,"ts":531358292464,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":8,"tdur":9,"tts":579268},{"cat":"blink","pid":25863,"tid":25913,"ts":531358292469,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":579274},{"cat":"v8","pid":25863,"tid":25913,"ts":531358292473,"ph":"E","name":"V8.Execute","args":{},"tts":579278},{"cat":"sky","pid":25863,"tid":25913,"ts":531358292745,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1018,"tdur":983,"tts":579432},{"cat":"blink","pid":25863,"tid":25913,"ts":531358292749,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":113,"tdur":113,"tts":579435},{"cat":"blink","pid":25863,"tid":25913,"ts":531358292751,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":579438},{"cat":"blink","pid":25863,"tid":25913,"ts":531358292754,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":31,"tdur":30,"tts":579441},{"cat":"blink","pid":25863,"tid":25913,"ts":531358292760,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":24,"tdur":24,"tts":579447},{"cat":"v8","pid":25863,"tid":25913,"ts":531358292772,"ph":"X","name":"v8.callFunction","args":{},"dur":9,"tdur":9,"tts":579459},{"cat":"v8","pid":25863,"tid":25913,"ts":531358292774,"ph":"B","name":"V8.Execute","args":{},"tts":579460},{"cat":"v8","pid":25863,"tid":25913,"ts":531358292780,"ph":"E","name":"V8.Execute","args":{},"tts":579466},{"cat":"v8","pid":25863,"tid":25913,"ts":531358292787,"ph":"X","name":"v8.callFunction","args":{},"dur":73,"tdur":73,"tts":579473},{"cat":"v8","pid":25863,"tid":25913,"ts":531358292788,"ph":"B","name":"V8.Execute","args":{},"tts":579475},{"cat":"blink","pid":25863,"tid":25913,"ts":531358292792,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":8,"tdur":9,"tts":579478},{"cat":"v8","pid":25863,"tid":25913,"ts":531358292857,"ph":"E","name":"V8.Execute","args":{},"tts":579544},{"cat":"blink","pid":25863,"tid":25913,"ts":531358292862,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":28,"tdur":27,"tts":579549},{"cat":"blink","pid":25863,"tid":25913,"ts":531358292864,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":579551},{"cat":"blink","pid":25863,"tid":25913,"ts":531358292865,"ph":"X","name":"Document::updateStyle","args":{},"dur":17,"tdur":16,"tts":579552},{"cat":"blink","pid":25863,"tid":25913,"ts":531358292882,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":579569},{"cat":"blink","pid":25863,"tid":25913,"ts":531358292886,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":3,"tdur":3,"tts":579573},{"cat":"sky","pid":25863,"tid":25913,"ts":531358292891,"ph":"X","name":"Layer::Display","args":{},"dur":754,"tdur":753,"tts":579577},{"cat":"sky","pid":25863,"tid":25913,"ts":531358293646,"ph":"X","name":"LayerHost::Upload","args":{},"dur":117,"tdur":82,"tts":580332},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358293913,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":37,"tdur":36,"tts":580493},{"cat":"blink","pid":25863,"tid":25913,"ts":531358293917,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":28,"tdur":28,"tts":580497},{"cat":"v8","pid":25863,"tid":25913,"ts":531358293920,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":24,"tdur":24,"tts":580500},{"cat":"v8","pid":25863,"tid":25913,"ts":531358293922,"ph":"X","name":"v8.callFunction","args":{},"dur":21,"tdur":21,"tts":580502},{"cat":"v8","pid":25863,"tid":25913,"ts":531358293924,"ph":"B","name":"V8.Execute","args":{},"tts":580504},{"cat":"blink","pid":25863,"tid":25913,"ts":531358293932,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":8,"tts":580512},{"cat":"blink","pid":25863,"tid":25913,"ts":531358293938,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":2,"tdur":2,"tts":580518},{"cat":"v8","pid":25863,"tid":25913,"ts":531358293942,"ph":"E","name":"V8.Execute","args":{},"tts":580521},{"cat":"sky","pid":25863,"tid":25913,"ts":531358294138,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1857,"tdur":1785,"tts":580612},{"cat":"blink","pid":25863,"tid":25913,"ts":531358294142,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":967,"tdur":966,"tts":580615},{"cat":"blink","pid":25863,"tid":25913,"ts":531358294145,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":1,"tdur":1,"tts":580618},{"cat":"blink","pid":25863,"tid":25913,"ts":531358294148,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":51,"tdur":52,"tts":580620},{"cat":"blink","pid":25863,"tid":25913,"ts":531358294174,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":25,"tdur":24,"tts":580647},{"cat":"v8","pid":25863,"tid":25913,"ts":531358294186,"ph":"X","name":"v8.callFunction","args":{},"dur":10,"tdur":9,"tts":580659},{"cat":"v8","pid":25863,"tid":25913,"ts":531358294188,"ph":"B","name":"V8.Execute","args":{},"tts":580661},{"cat":"v8","pid":25863,"tid":25913,"ts":531358294194,"ph":"E","name":"V8.Execute","args":{},"tts":580667},{"cat":"v8","pid":25863,"tid":25913,"ts":531358294201,"ph":"X","name":"v8.callFunction","args":{},"dur":906,"tdur":905,"tts":580674},{"cat":"v8","pid":25863,"tid":25913,"ts":531358294202,"ph":"B","name":"V8.Execute","args":{},"tts":580675},{"cat":"blink","pid":25863,"tid":25913,"ts":531358294206,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":9,"tdur":8,"tts":580679},{"cat":"v8","pid":25863,"tid":25913,"ts":531358294245,"ph":"B","name":"V8.ParseLazy","args":{},"tts":580718},{"cat":"v8","pid":25863,"tid":25913,"ts":531358294447,"ph":"E","name":"V8.ParseLazy","args":{},"tts":580920},{"cat":"v8","pid":25863,"tid":25913,"ts":531358294470,"ph":"B","name":"V8.RecompileSynchronous","args":{},"tts":580942},{"cat":"v8","pid":25863,"tid":25913,"ts":531358294472,"ph":"B","name":"V8.CompileFullCode","args":{},"tts":580945},{"cat":"v8","pid":25863,"tid":25913,"ts":531358294618,"ph":"E","name":"V8.CompileFullCode","args":{},"tts":581092},{"cat":"v8","pid":25863,"tid":25913,"ts":531358295076,"ph":"E","name":"V8.RecompileSynchronous","args":{},"tts":581550},{"cat":"v8","pid":25863,"tid":25913,"ts":531358295104,"ph":"E","name":"V8.Execute","args":{},"tts":581577},{"cat":"blink","pid":25863,"tid":25913,"ts":531358295109,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":28,"tdur":28,"tts":581582},{"cat":"blink","pid":25863,"tid":25913,"ts":531358295111,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":581584},{"cat":"blink","pid":25863,"tid":25913,"ts":531358295112,"ph":"X","name":"Document::updateStyle","args":{},"dur":17,"tdur":16,"tts":581585},{"cat":"blink","pid":25863,"tid":25913,"ts":531358295129,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":581602},{"cat":"blink","pid":25863,"tid":25913,"ts":531358295133,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":3,"tdur":3,"tts":581606},{"cat":"sky","pid":25863,"tid":25913,"ts":531358295138,"ph":"X","name":"Layer::Display","args":{},"dur":733,"tdur":732,"tts":581611},{"cat":"sky","pid":25863,"tid":25913,"ts":531358295872,"ph":"X","name":"LayerHost::Upload","args":{},"dur":123,"tdur":51,"tts":582345},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358297167,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":344,"tdur":344,"tts":582529},{"cat":"blink","pid":25863,"tid":25913,"ts":531358297171,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":335,"tdur":335,"tts":582533},{"cat":"v8","pid":25863,"tid":25913,"ts":531358297174,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":331,"tdur":330,"tts":582536},{"cat":"v8","pid":25863,"tid":25913,"ts":531358297176,"ph":"X","name":"v8.callFunction","args":{},"dur":327,"tdur":327,"tts":582538},{"cat":"v8","pid":25863,"tid":25913,"ts":531358297178,"ph":"B","name":"V8.Execute","args":{},"tts":582540},{"cat":"v8","pid":25863,"tid":25913,"ts":531358297183,"ph":"B","name":"V8.RecompileSynchronous","args":{},"tts":582545},{"cat":"v8","pid":25863,"tid":25913,"ts":531358297440,"ph":"E","name":"V8.RecompileSynchronous","args":{},"tts":582803},{"cat":"blink","pid":25863,"tid":25913,"ts":531358297492,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":8,"tts":582854},{"cat":"blink","pid":25863,"tid":25913,"ts":531358297498,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":2,"tdur":2,"tts":582860},{"cat":"v8","pid":25863,"tid":25913,"ts":531358297502,"ph":"E","name":"V8.Execute","args":{},"tts":582864},{"cat":"sky","pid":25863,"tid":25913,"ts":531358354084,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2165,"tdur":1989,"tts":582965},{"cat":"blink","pid":25863,"tid":25913,"ts":531358354094,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":171,"tdur":171,"tts":582973},{"cat":"blink","pid":25863,"tid":25913,"ts":531358354100,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":4,"tdur":2,"tts":582980},{"cat":"blink","pid":25863,"tid":25913,"ts":531358354107,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":76,"tdur":75,"tts":582987},{"cat":"blink","pid":25863,"tid":25913,"ts":531358354123,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":59,"tdur":59,"tts":583002},{"cat":"v8","pid":25863,"tid":25913,"ts":531358354151,"ph":"X","name":"v8.callFunction","args":{},"dur":24,"tdur":22,"tts":583031},{"cat":"v8","pid":25863,"tid":25913,"ts":531358354156,"ph":"B","name":"V8.Execute","args":{},"tts":583035},{"cat":"v8","pid":25863,"tid":25913,"ts":531358354170,"ph":"E","name":"V8.Execute","args":{},"tts":583050},{"cat":"v8","pid":25863,"tid":25913,"ts":531358354188,"ph":"X","name":"v8.callFunction","args":{},"dur":74,"tdur":74,"tts":583067},{"cat":"v8","pid":25863,"tid":25913,"ts":531358354191,"ph":"B","name":"V8.Execute","args":{},"tts":583070},{"cat":"blink","pid":25863,"tid":25913,"ts":531358354211,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":11,"tdur":10,"tts":583090},{"cat":"v8","pid":25863,"tid":25913,"ts":531358354259,"ph":"E","name":"V8.Execute","args":{},"tts":583139},{"cat":"blink","pid":25863,"tid":25913,"ts":531358354265,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":66,"tdur":66,"tts":583144},{"cat":"blink","pid":25863,"tid":25913,"ts":531358354267,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":583146},{"cat":"blink","pid":25863,"tid":25913,"ts":531358354269,"ph":"X","name":"Document::updateStyle","args":{},"dur":42,"tdur":41,"tts":583148},{"cat":"blink","pid":25863,"tid":25913,"ts":531358354312,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":583192},{"cat":"blink","pid":25863,"tid":25913,"ts":531358354322,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":8,"tdur":7,"tts":583201},{"cat":"sky","pid":25863,"tid":25913,"ts":531358354333,"ph":"X","name":"Layer::Display","args":{},"dur":1600,"tdur":1598,"tts":583212},{"cat":"sky","pid":25863,"tid":25913,"ts":531358355935,"ph":"X","name":"LayerHost::Upload","args":{},"dur":313,"tdur":136,"tts":584815},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358356276,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":79,"tdur":77,"tts":584982},{"cat":"blink","pid":25863,"tid":25913,"ts":531358356287,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":62,"tdur":62,"tts":584992},{"cat":"v8","pid":25863,"tid":25913,"ts":531358356293,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":55,"tdur":55,"tts":584998},{"cat":"v8","pid":25863,"tid":25913,"ts":531358356299,"ph":"X","name":"v8.callFunction","args":{},"dur":48,"tdur":48,"tts":585004},{"cat":"v8","pid":25863,"tid":25913,"ts":531358356302,"ph":"B","name":"V8.Execute","args":{},"tts":585008},{"cat":"blink","pid":25863,"tid":25913,"ts":531358356333,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":11,"tdur":11,"tts":585038},{"cat":"blink","pid":25863,"tid":25913,"ts":531358356340,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":585046},{"cat":"v8","pid":25863,"tid":25913,"ts":531358356345,"ph":"E","name":"V8.Execute","args":{},"tts":585050},{"cat":"sky","pid":25863,"tid":25913,"ts":531358356752,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1133,"tdur":1073,"tts":585244},{"cat":"blink","pid":25863,"tid":25913,"ts":531358356757,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":104,"tdur":104,"tts":585248},{"cat":"blink","pid":25863,"tid":25913,"ts":531358356760,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":1,"tdur":1,"tts":585251},{"cat":"blink","pid":25863,"tid":25913,"ts":531358356763,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":38,"tdur":38,"tts":585255},{"cat":"blink","pid":25863,"tid":25913,"ts":531358356770,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":31,"tdur":30,"tts":585262},{"cat":"v8","pid":25863,"tid":25915,"ts":531358295202,"ph":"B","name":"V8.RecompileConcurrent","args":{},"tts":13642},{"cat":"v8","pid":25863,"tid":25915,"ts":531358297035,"ph":"E","name":"V8.RecompileConcurrent","args":{},"tts":15452},{"cat":"v8","pid":25863,"tid":25915,"ts":531360913097,"ph":"B","name":"V8.RecompileConcurrent","args":{},"tts":15515},{"cat":"v8","pid":25863,"tid":25915,"ts":531360913323,"ph":"E","name":"V8.RecompileConcurrent","args":{},"tts":15735},{"cat":"__metadata","pid":25863,"tid":0,"ts":0,"ph":"M","name":"num_cpus","args":{"number":32}},{"cat":"v8","pid":25863,"tid":25913,"ts":531358356784,"ph":"X","name":"v8.callFunction","args":{},"dur":13,"tdur":12,"tts":585276},{"cat":"v8","pid":25863,"tid":25913,"ts":531358356788,"ph":"B","name":"V8.Execute","args":{},"tts":585280},{"cat":"v8","pid":25863,"tid":25913,"ts":531358356795,"ph":"E","name":"V8.Execute","args":{},"tts":585287},{"cat":"v8","pid":25863,"tid":25913,"ts":531358356804,"ph":"X","name":"v8.callFunction","args":{},"dur":54,"tdur":55,"tts":585295},{"cat":"v8","pid":25863,"tid":25913,"ts":531358356805,"ph":"B","name":"V8.Execute","args":{},"tts":585297},{"cat":"blink","pid":25863,"tid":25913,"ts":531358356809,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":11,"tdur":10,"tts":585301},{"cat":"v8","pid":25863,"tid":25913,"ts":531358356855,"ph":"E","name":"V8.Execute","args":{},"tts":585347},{"cat":"blink","pid":25863,"tid":25913,"ts":531358356861,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":32,"tdur":31,"tts":585353},{"cat":"blink","pid":25863,"tid":25913,"ts":531358356864,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":585355},{"cat":"blink","pid":25863,"tid":25913,"ts":531358356865,"ph":"X","name":"Document::updateStyle","args":{},"dur":19,"tdur":18,"tts":585357},{"cat":"blink","pid":25863,"tid":25913,"ts":531358356884,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":585376},{"cat":"blink","pid":25863,"tid":25913,"ts":531358356889,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":3,"tdur":4,"tts":585380},{"cat":"sky","pid":25863,"tid":25913,"ts":531358356894,"ph":"X","name":"Layer::Display","args":{},"dur":838,"tdur":837,"tts":585385},{"cat":"sky","pid":25863,"tid":25913,"ts":531358357733,"ph":"X","name":"LayerHost::Upload","args":{},"dur":151,"tdur":92,"tts":586224},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358357897,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":42,"tdur":41,"tts":586330},{"cat":"blink","pid":25863,"tid":25913,"ts":531358357902,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":32,"tdur":31,"tts":586335},{"cat":"v8","pid":25863,"tid":25913,"ts":531358357905,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":27,"tdur":27,"tts":586338},{"cat":"v8","pid":25863,"tid":25913,"ts":531358357908,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":23,"tts":586341},{"cat":"v8","pid":25863,"tid":25913,"ts":531358357910,"ph":"B","name":"V8.Execute","args":{},"tts":586343},{"cat":"blink","pid":25863,"tid":25913,"ts":531358357918,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":10,"tdur":10,"tts":586351},{"cat":"blink","pid":25863,"tid":25913,"ts":531358357925,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":586358},{"cat":"v8","pid":25863,"tid":25913,"ts":531358357929,"ph":"E","name":"V8.Execute","args":{},"tts":586362},{"cat":"sky","pid":25863,"tid":25913,"ts":531358358336,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1258,"tdur":1184,"tts":586558},{"cat":"blink","pid":25863,"tid":25913,"ts":531358358340,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":103,"tdur":102,"tts":586562},{"cat":"blink","pid":25863,"tid":25913,"ts":531358358343,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":586565},{"cat":"blink","pid":25863,"tid":25913,"ts":531358358347,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":36,"tdur":36,"tts":586568},{"cat":"blink","pid":25863,"tid":25913,"ts":531358358354,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":29,"tdur":28,"tts":586576},{"cat":"v8","pid":25863,"tid":25913,"ts":531358358368,"ph":"X","name":"v8.callFunction","args":{},"dur":11,"tdur":10,"tts":586590},{"cat":"v8","pid":25863,"tid":25913,"ts":531358358370,"ph":"B","name":"V8.Execute","args":{},"tts":586592},{"cat":"v8","pid":25863,"tid":25913,"ts":531358358377,"ph":"E","name":"V8.Execute","args":{},"tts":586599},{"cat":"v8","pid":25863,"tid":25913,"ts":531358358385,"ph":"X","name":"v8.callFunction","args":{},"dur":55,"tdur":55,"tts":586607},{"cat":"v8","pid":25863,"tid":25913,"ts":531358358387,"ph":"B","name":"V8.Execute","args":{},"tts":586609},{"cat":"blink","pid":25863,"tid":25913,"ts":531358358391,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":10,"tdur":9,"tts":586613},{"cat":"v8","pid":25863,"tid":25913,"ts":531358358437,"ph":"E","name":"V8.Execute","args":{},"tts":586659},{"cat":"blink","pid":25863,"tid":25913,"ts":531358358443,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":32,"tdur":31,"tts":586665},{"cat":"blink","pid":25863,"tid":25913,"ts":531358358445,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":586667},{"cat":"blink","pid":25863,"tid":25913,"ts":531358358447,"ph":"X","name":"Document::updateStyle","args":{},"dur":19,"tdur":18,"tts":586669},{"cat":"blink","pid":25863,"tid":25913,"ts":531358358466,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":586688},{"cat":"blink","pid":25863,"tid":25913,"ts":531358358470,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":4,"tts":586692},{"cat":"sky","pid":25863,"tid":25913,"ts":531358358476,"ph":"X","name":"Layer::Display","args":{},"dur":949,"tdur":949,"tts":586697},{"cat":"sky","pid":25863,"tid":25913,"ts":531358359426,"ph":"X","name":"LayerHost::Upload","args":{},"dur":168,"tdur":92,"tts":587648},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358359607,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":41,"tdur":40,"tts":587755},{"cat":"blink","pid":25863,"tid":25913,"ts":531358359612,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":31,"tdur":31,"tts":587760},{"cat":"v8","pid":25863,"tid":25913,"ts":531358359615,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":27,"tdur":26,"tts":587763},{"cat":"v8","pid":25863,"tid":25913,"ts":531358359618,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":23,"tts":587765},{"cat":"v8","pid":25863,"tid":25913,"ts":531358359619,"ph":"B","name":"V8.Execute","args":{},"tts":587767},{"cat":"blink","pid":25863,"tid":25913,"ts":531358359628,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":10,"tdur":9,"tts":587776},{"cat":"blink","pid":25863,"tid":25913,"ts":531358359634,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":587782},{"cat":"v8","pid":25863,"tid":25913,"ts":531358359639,"ph":"E","name":"V8.Execute","args":{},"tts":587787},{"cat":"sky","pid":25863,"tid":25913,"ts":531358359978,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1242,"tdur":1192,"tts":587981},{"cat":"blink","pid":25863,"tid":25913,"ts":531358359983,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":136,"tdur":127,"tts":587985},{"cat":"blink","pid":25863,"tid":25913,"ts":531358359986,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":1,"tdur":1,"tts":587988},{"cat":"blink","pid":25863,"tid":25913,"ts":531358359989,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":69,"tdur":60,"tts":587991},{"cat":"blink","pid":25863,"tid":25913,"ts":531358359996,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":62,"tdur":51,"tts":587999},{"cat":"v8","pid":25863,"tid":25913,"ts":531358360027,"ph":"X","name":"v8.callFunction","args":{},"dur":27,"tdur":26,"tts":588021},{"cat":"v8","pid":25863,"tid":25913,"ts":531358360030,"ph":"B","name":"V8.Execute","args":{},"tts":588023},{"cat":"v8","pid":25863,"tid":25913,"ts":531358360051,"ph":"E","name":"V8.Execute","args":{},"tts":588045},{"cat":"v8","pid":25863,"tid":25913,"ts":531358360061,"ph":"X","name":"v8.callFunction","args":{},"dur":56,"tdur":56,"tts":588054},{"cat":"v8","pid":25863,"tid":25913,"ts":531358360062,"ph":"B","name":"V8.Execute","args":{},"tts":588056},{"cat":"blink","pid":25863,"tid":25913,"ts":531358360066,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":11,"tdur":9,"tts":588060},{"cat":"v8","pid":25863,"tid":25913,"ts":531358360114,"ph":"E","name":"V8.Execute","args":{},"tts":588108},{"cat":"blink","pid":25863,"tid":25913,"ts":531358360120,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":34,"tdur":34,"tts":588113},{"cat":"blink","pid":25863,"tid":25913,"ts":531358360122,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":588115},{"cat":"blink","pid":25863,"tid":25913,"ts":531358360123,"ph":"X","name":"Document::updateStyle","args":{},"dur":20,"tdur":18,"tts":588117},{"cat":"blink","pid":25863,"tid":25913,"ts":531358360143,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":588136},{"cat":"blink","pid":25863,"tid":25913,"ts":531358360149,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":3,"tts":588143},{"cat":"sky","pid":25863,"tid":25913,"ts":531358360155,"ph":"X","name":"Layer::Display","args":{},"dur":963,"tdur":962,"tts":588148},{"cat":"sky","pid":25863,"tid":25913,"ts":531358361119,"ph":"X","name":"LayerHost::Upload","args":{},"dur":100,"tdur":59,"tts":589113},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358361242,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":40,"tdur":39,"tts":589196},{"cat":"blink","pid":25863,"tid":25913,"ts":531358361247,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":30,"tdur":30,"tts":589200},{"cat":"v8","pid":25863,"tid":25913,"ts":531358361249,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":26,"tdur":25,"tts":589203},{"cat":"v8","pid":25863,"tid":25913,"ts":531358361252,"ph":"X","name":"v8.callFunction","args":{},"dur":22,"tdur":22,"tts":589205},{"cat":"v8","pid":25863,"tid":25913,"ts":531358361254,"ph":"B","name":"V8.Execute","args":{},"tts":589207},{"cat":"blink","pid":25863,"tid":25913,"ts":531358361262,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":10,"tts":589215},{"cat":"blink","pid":25863,"tid":25913,"ts":531358361268,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":589222},{"cat":"v8","pid":25863,"tid":25913,"ts":531358361273,"ph":"E","name":"V8.Execute","args":{},"tts":589226},{"cat":"sky","pid":25863,"tid":25913,"ts":531358419666,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2286,"tdur":2111,"tts":589451},{"cat":"blink","pid":25863,"tid":25913,"ts":531358419673,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":140,"tdur":139,"tts":589457},{"cat":"blink","pid":25863,"tid":25913,"ts":531358419677,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":3,"tdur":2,"tts":589461},{"cat":"blink","pid":25863,"tid":25913,"ts":531358419682,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":50,"tdur":49,"tts":589466},{"cat":"blink","pid":25863,"tid":25913,"ts":531358419692,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":40,"tdur":39,"tts":589476},{"cat":"v8","pid":25863,"tid":25913,"ts":531358419711,"ph":"X","name":"v8.callFunction","args":{},"dur":16,"tdur":15,"tts":589495},{"cat":"v8","pid":25863,"tid":25913,"ts":531358419714,"ph":"B","name":"V8.Execute","args":{},"tts":589498},{"cat":"v8","pid":25863,"tid":25913,"ts":531358419724,"ph":"E","name":"V8.Execute","args":{},"tts":589508},{"cat":"v8","pid":25863,"tid":25913,"ts":531358419735,"ph":"X","name":"v8.callFunction","args":{},"dur":76,"tdur":75,"tts":589519},{"cat":"v8","pid":25863,"tid":25913,"ts":531358419738,"ph":"B","name":"V8.Execute","args":{},"tts":589521},{"cat":"blink","pid":25863,"tid":25913,"ts":531358419743,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":26,"tdur":26,"tts":589527},{"cat":"v8","pid":25863,"tid":25913,"ts":531358419808,"ph":"E","name":"V8.Execute","args":{},"tts":589592},{"cat":"blink","pid":25863,"tid":25913,"ts":531358419814,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":55,"tdur":56,"tts":589597},{"cat":"blink","pid":25863,"tid":25913,"ts":531358419816,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":589600},{"cat":"blink","pid":25863,"tid":25913,"ts":531358419829,"ph":"X","name":"Document::updateStyle","args":{},"dur":27,"tdur":26,"tts":589613},{"cat":"blink","pid":25863,"tid":25913,"ts":531358419857,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":589641},{"cat":"blink","pid":25863,"tid":25913,"ts":531358419863,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":5,"tdur":5,"tts":589647},{"cat":"sky","pid":25863,"tid":25913,"ts":531358419871,"ph":"X","name":"Layer::Display","args":{},"dur":1747,"tdur":1731,"tts":589654},{"cat":"sky","pid":25863,"tid":25913,"ts":531358421620,"ph":"X","name":"LayerHost::Upload","args":{},"dur":330,"tdur":169,"tts":591390},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358421978,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":62,"tdur":61,"tts":591589},{"cat":"blink","pid":25863,"tid":25913,"ts":531358421989,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":45,"tdur":33,"tts":591611},{"cat":"v8","pid":25863,"tid":25913,"ts":531358422004,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":29,"tdur":28,"tts":591615},{"cat":"v8","pid":25863,"tid":25913,"ts":531358422007,"ph":"X","name":"v8.callFunction","args":{},"dur":25,"tdur":24,"tts":591618},{"cat":"v8","pid":25863,"tid":25913,"ts":531358422009,"ph":"B","name":"V8.Execute","args":{},"tts":591619},{"cat":"blink","pid":25863,"tid":25913,"ts":531358422019,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":10,"tdur":10,"tts":591629},{"cat":"blink","pid":25863,"tid":25913,"ts":531358422025,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":4,"tdur":2,"tts":591636},{"cat":"v8","pid":25863,"tid":25913,"ts":531358422030,"ph":"E","name":"V8.Execute","args":{},"tts":591640},{"cat":"sky","pid":25863,"tid":25913,"ts":531358422480,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1227,"tdur":1153,"tts":591860},{"cat":"blink","pid":25863,"tid":25913,"ts":531358422484,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":107,"tdur":107,"tts":591864},{"cat":"blink","pid":25863,"tid":25913,"ts":531358422487,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":591868},{"cat":"blink","pid":25863,"tid":25913,"ts":531358422491,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":38,"tdur":38,"tts":591871},{"cat":"blink","pid":25863,"tid":25913,"ts":531358422499,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":29,"tdur":29,"tts":591879},{"cat":"v8","pid":25863,"tid":25913,"ts":531358422513,"ph":"X","name":"v8.callFunction","args":{},"dur":12,"tdur":12,"tts":591893},{"cat":"v8","pid":25863,"tid":25913,"ts":531358422515,"ph":"B","name":"V8.Execute","args":{},"tts":591896},{"cat":"v8","pid":25863,"tid":25913,"ts":531358422523,"ph":"E","name":"V8.Execute","args":{},"tts":591903},{"cat":"v8","pid":25863,"tid":25913,"ts":531358422531,"ph":"X","name":"v8.callFunction","args":{},"dur":58,"tdur":58,"tts":591911},{"cat":"v8","pid":25863,"tid":25913,"ts":531358422533,"ph":"B","name":"V8.Execute","args":{},"tts":591913},{"cat":"blink","pid":25863,"tid":25913,"ts":531358422537,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":11,"tdur":10,"tts":591917},{"cat":"v8","pid":25863,"tid":25913,"ts":531358422586,"ph":"E","name":"V8.Execute","args":{},"tts":591966},{"cat":"blink","pid":25863,"tid":25913,"ts":531358422592,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":33,"tdur":33,"tts":591972},{"cat":"blink","pid":25863,"tid":25913,"ts":531358422594,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":591974},{"cat":"blink","pid":25863,"tid":25913,"ts":531358422596,"ph":"X","name":"Document::updateStyle","args":{},"dur":20,"tdur":19,"tts":591976},{"cat":"blink","pid":25863,"tid":25913,"ts":531358422616,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":591996},{"cat":"blink","pid":25863,"tid":25913,"ts":531358422620,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":5,"tdur":3,"tts":592001},{"cat":"sky","pid":25863,"tid":25913,"ts":531358422626,"ph":"X","name":"Layer::Display","args":{},"dur":909,"tdur":908,"tts":592006},{"cat":"sky","pid":25863,"tid":25913,"ts":531358423536,"ph":"X","name":"LayerHost::Upload","args":{},"dur":170,"tdur":95,"tts":592916},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358423720,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":57,"tdur":57,"tts":593026},{"cat":"blink","pid":25863,"tid":25913,"ts":531358423725,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":46,"tdur":46,"tts":593031},{"cat":"v8","pid":25863,"tid":25913,"ts":531358423728,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":42,"tdur":42,"tts":593034},{"cat":"v8","pid":25863,"tid":25913,"ts":531358423731,"ph":"X","name":"v8.callFunction","args":{},"dur":38,"tdur":38,"tts":593037},{"cat":"v8","pid":25863,"tid":25913,"ts":531358423733,"ph":"B","name":"V8.Execute","args":{},"tts":593039},{"cat":"blink","pid":25863,"tid":25913,"ts":531358423742,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":23,"tdur":23,"tts":593048},{"cat":"blink","pid":25863,"tid":25913,"ts":531358423760,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":5,"tdur":5,"tts":593066},{"cat":"v8","pid":25863,"tid":25913,"ts":531358423767,"ph":"E","name":"V8.Execute","args":{},"tts":593073},{"cat":"sky","pid":25863,"tid":25913,"ts":531358424183,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2574,"tdur":2479,"tts":593290},{"cat":"blink","pid":25863,"tid":25913,"ts":531358424187,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":773,"tdur":772,"tts":593294},{"cat":"blink","pid":25863,"tid":25913,"ts":531358424191,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":1,"tdur":1,"tts":593297},{"cat":"blink","pid":25863,"tid":25913,"ts":531358424194,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":38,"tdur":37,"tts":593301},{"cat":"blink","pid":25863,"tid":25913,"ts":531358424202,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":29,"tdur":28,"tts":593309},{"cat":"v8","pid":25863,"tid":25913,"ts":531358424216,"ph":"X","name":"v8.callFunction","args":{},"dur":12,"tdur":11,"tts":593323},{"cat":"v8","pid":25863,"tid":25913,"ts":531358424218,"ph":"B","name":"V8.Execute","args":{},"tts":593325},{"cat":"v8","pid":25863,"tid":25913,"ts":531358424226,"ph":"E","name":"V8.Execute","args":{},"tts":593332},{"cat":"v8","pid":25863,"tid":25913,"ts":531358424234,"ph":"X","name":"v8.callFunction","args":{},"dur":722,"tdur":720,"tts":593341},{"cat":"v8","pid":25863,"tid":25913,"ts":531358424236,"ph":"B","name":"V8.Execute","args":{},"tts":593342},{"cat":"blink","pid":25863,"tid":25913,"ts":531358424240,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":11,"tdur":10,"tts":593347},{"cat":"blink","pid":25863,"tid":25913,"ts":531358424296,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":8,"tdur":7,"tts":593403},{"cat":"v8","pid":25863,"tid":25913,"ts":531358424693,"ph":"E","name":"V8.Execute","args":{},"tts":593800},{"cat":"blink","pid":25863,"tid":25913,"ts":531358424960,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":708,"tdur":708,"tts":594067},{"cat":"blink","pid":25863,"tid":25913,"ts":531358424963,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":594070},{"cat":"blink","pid":25863,"tid":25913,"ts":531358424965,"ph":"X","name":"Document::updateStyle","args":{},"dur":123,"tdur":122,"tts":594072},{"cat":"blink","pid":25863,"tid":25913,"ts":531358425089,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":2},"tts":594196},{"cat":"blink","pid":25863,"tid":25913,"ts":531358425092,"ph":"X","name":"FrameView::layout","args":{},"dur":230,"tdur":230,"tts":594198},{"cat":"blink","pid":25863,"tid":25913,"ts":531358425094,"ph":"X","name":"FrameView::performPreLayoutTasks","args":{},"dur":2,"tdur":2,"tts":594200},{"cat":"blink","pid":25863,"tid":25913,"ts":531358425097,"ph":"X","name":"FrameView::performLayout","args":{},"dur":208,"tdur":207,"tts":594203},{"cat":"blink","pid":25863,"tid":25913,"ts":531358425306,"ph":"X","name":"RenderLayer::updateLayerPositionsAfterLayout","args":{},"dur":3,"tdur":3,"tts":594412},{"cat":"blink","pid":25863,"tid":25913,"ts":531358425309,"ph":"X","name":"FrameView::performPostLayoutTasks","args":{},"dur":11,"tdur":10,"tts":594416},{"cat":"blink","pid":25863,"tid":25913,"ts":531358425325,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":343,"tdur":341,"tts":594432},{"cat":"sky","pid":25863,"tid":25913,"ts":531358425670,"ph":"X","name":"Layer::Display","args":{},"dur":893,"tdur":892,"tts":594776},{"cat":"sky","pid":25863,"tid":25913,"ts":531358426564,"ph":"X","name":"LayerHost::Upload","args":{},"dur":192,"tdur":97,"tts":595671},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358426770,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":43,"tdur":42,"tts":595783},{"cat":"blink","pid":25863,"tid":25913,"ts":531358426776,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":32,"tdur":32,"tts":595788},{"cat":"v8","pid":25863,"tid":25913,"ts":531358426779,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":28,"tdur":28,"tts":595791},{"cat":"v8","pid":25863,"tid":25913,"ts":531358426782,"ph":"X","name":"v8.callFunction","args":{},"dur":24,"tdur":24,"tts":595794},{"cat":"v8","pid":25863,"tid":25913,"ts":531358426783,"ph":"B","name":"V8.Execute","args":{},"tts":595796},{"cat":"blink","pid":25863,"tid":25913,"ts":531358426793,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":10,"tdur":10,"tts":595805},{"cat":"blink","pid":25863,"tid":25913,"ts":531358426799,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":595812},{"cat":"v8","pid":25863,"tid":25913,"ts":531358426804,"ph":"E","name":"V8.Execute","args":{},"tts":595816},{"cat":"sky","pid":25863,"tid":25913,"ts":531358427175,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1177,"tdur":1119,"tts":595940},{"cat":"blink","pid":25863,"tid":25913,"ts":531358427177,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":101,"tdur":100,"tts":595943},{"cat":"blink","pid":25863,"tid":25913,"ts":531358427181,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":1,"tdur":1,"tts":595946},{"cat":"blink","pid":25863,"tid":25913,"ts":531358427184,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":33,"tdur":33,"tts":595949},{"cat":"blink","pid":25863,"tid":25913,"ts":531358427190,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":27,"tdur":27,"tts":595955},{"cat":"v8","pid":25863,"tid":25913,"ts":531358427203,"ph":"X","name":"v8.callFunction","args":{},"dur":11,"tdur":11,"tts":595968},{"cat":"v8","pid":25863,"tid":25913,"ts":531358427205,"ph":"B","name":"V8.Execute","args":{},"tts":595970},{"cat":"v8","pid":25863,"tid":25913,"ts":531358427212,"ph":"E","name":"V8.Execute","args":{},"tts":595977},{"cat":"v8","pid":25863,"tid":25913,"ts":531358427219,"ph":"X","name":"v8.callFunction","args":{},"dur":56,"tdur":55,"tts":595985},{"cat":"v8","pid":25863,"tid":25913,"ts":531358427221,"ph":"B","name":"V8.Execute","args":{},"tts":595986},{"cat":"blink","pid":25863,"tid":25913,"ts":531358427225,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":11,"tdur":10,"tts":595991},{"cat":"v8","pid":25863,"tid":25913,"ts":531358427272,"ph":"E","name":"V8.Execute","args":{},"tts":596038},{"cat":"blink","pid":25863,"tid":25913,"ts":531358427278,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":33,"tdur":33,"tts":596043},{"cat":"blink","pid":25863,"tid":25913,"ts":531358427280,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":596046},{"cat":"blink","pid":25863,"tid":25913,"ts":531358427282,"ph":"X","name":"Document::updateStyle","args":{},"dur":20,"tdur":19,"tts":596047},{"cat":"blink","pid":25863,"tid":25913,"ts":531358427302,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":596067},{"cat":"blink","pid":25863,"tid":25913,"ts":531358427306,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":3,"tts":596072},{"cat":"sky","pid":25863,"tid":25913,"ts":531358427312,"ph":"X","name":"Layer::Display","args":{},"dur":918,"tdur":918,"tts":596077},{"cat":"sky","pid":25863,"tid":25913,"ts":531358428231,"ph":"X","name":"LayerHost::Upload","args":{},"dur":120,"tdur":61,"tts":596997},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358428363,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":39,"tdur":38,"tts":597071},{"cat":"blink","pid":25863,"tid":25913,"ts":531358428367,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":30,"tdur":30,"tts":597075},{"cat":"v8","pid":25863,"tid":25913,"ts":531358428370,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":26,"tdur":26,"tts":597078},{"cat":"v8","pid":25863,"tid":25913,"ts":531358428373,"ph":"X","name":"v8.callFunction","args":{},"dur":22,"tdur":22,"tts":597080},{"cat":"v8","pid":25863,"tid":25913,"ts":531358428375,"ph":"B","name":"V8.Execute","args":{},"tts":597082},{"cat":"blink","pid":25863,"tid":25913,"ts":531358428383,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":10,"tts":597090},{"cat":"blink","pid":25863,"tid":25913,"ts":531358428389,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":597097},{"cat":"v8","pid":25863,"tid":25913,"ts":531358428393,"ph":"E","name":"V8.Execute","args":{},"tts":597101},{"cat":"sky","pid":25863,"tid":25913,"ts":531358487275,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2261,"tdur":2084,"tts":597258},{"cat":"blink","pid":25863,"tid":25913,"ts":531358487279,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":171,"tdur":171,"tts":597261},{"cat":"blink","pid":25863,"tid":25913,"ts":531358487282,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":5,"tdur":5,"tts":597264},{"cat":"blink","pid":25863,"tid":25913,"ts":531358487289,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":69,"tdur":68,"tts":597271},{"cat":"blink","pid":25863,"tid":25913,"ts":531358487294,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":63,"tdur":62,"tts":597276},{"cat":"v8","pid":25863,"tid":25913,"ts":531358487326,"ph":"X","name":"v8.callFunction","args":{},"dur":24,"tdur":22,"tts":597309},{"cat":"v8","pid":25863,"tid":25913,"ts":531358487331,"ph":"B","name":"V8.Execute","args":{},"tts":597313},{"cat":"v8","pid":25863,"tid":25913,"ts":531358487346,"ph":"E","name":"V8.Execute","args":{},"tts":597328},{"cat":"v8","pid":25863,"tid":25913,"ts":531358487363,"ph":"X","name":"v8.callFunction","args":{},"dur":85,"tdur":85,"tts":597345},{"cat":"v8","pid":25863,"tid":25913,"ts":531358487366,"ph":"B","name":"V8.Execute","args":{},"tts":597348},{"cat":"blink","pid":25863,"tid":25913,"ts":531358487375,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":21,"tdur":20,"tts":597357},{"cat":"v8","pid":25863,"tid":25913,"ts":531358487445,"ph":"E","name":"V8.Execute","args":{},"tts":597428},{"cat":"blink","pid":25863,"tid":25913,"ts":531358487451,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":63,"tdur":62,"tts":597433},{"cat":"blink","pid":25863,"tid":25913,"ts":531358487453,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":597435},{"cat":"blink","pid":25863,"tid":25913,"ts":531358487454,"ph":"X","name":"Document::updateStyle","args":{},"dur":40,"tdur":39,"tts":597436},{"cat":"blink","pid":25863,"tid":25913,"ts":531358487495,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":597478},{"cat":"blink","pid":25863,"tid":25913,"ts":531358487505,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":8,"tdur":7,"tts":597487},{"cat":"sky","pid":25863,"tid":25913,"ts":531358487516,"ph":"X","name":"Layer::Display","args":{},"dur":1680,"tdur":1662,"tts":597498},{"cat":"sky","pid":25863,"tid":25913,"ts":531358489198,"ph":"X","name":"LayerHost::Upload","args":{},"dur":337,"tdur":175,"tts":599164},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358489563,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":72,"tdur":71,"tts":599370},{"cat":"blink","pid":25863,"tid":25913,"ts":531358489574,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":56,"tdur":55,"tts":599381},{"cat":"v8","pid":25863,"tid":25913,"ts":531358489580,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":49,"tdur":49,"tts":599386},{"cat":"v8","pid":25863,"tid":25913,"ts":531358489586,"ph":"X","name":"v8.callFunction","args":{},"dur":42,"tdur":42,"tts":599392},{"cat":"v8","pid":25863,"tid":25913,"ts":531358489589,"ph":"B","name":"V8.Execute","args":{},"tts":599396},{"cat":"blink","pid":25863,"tid":25913,"ts":531358489615,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":10,"tdur":9,"tts":599422},{"cat":"blink","pid":25863,"tid":25913,"ts":531358489622,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":599428},{"cat":"v8","pid":25863,"tid":25913,"ts":531358489626,"ph":"E","name":"V8.Execute","args":{},"tts":599432},{"cat":"sky","pid":25863,"tid":25913,"ts":531358489999,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1127,"tdur":1022,"tts":599625},{"cat":"blink","pid":25863,"tid":25913,"ts":531358490004,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":94,"tdur":94,"tts":599629},{"cat":"blink","pid":25863,"tid":25913,"ts":531358490006,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":599632},{"cat":"blink","pid":25863,"tid":25913,"ts":531358490010,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":33,"tdur":33,"tts":599635},{"cat":"blink","pid":25863,"tid":25913,"ts":531358490017,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":26,"tdur":25,"tts":599642},{"cat":"v8","pid":25863,"tid":25913,"ts":531358490029,"ph":"X","name":"v8.callFunction","args":{},"dur":10,"tdur":10,"tts":599654},{"cat":"v8","pid":25863,"tid":25913,"ts":531358490031,"ph":"B","name":"V8.Execute","args":{},"tts":599656},{"cat":"v8","pid":25863,"tid":25913,"ts":531358490037,"ph":"E","name":"V8.Execute","args":{},"tts":599663},{"cat":"v8","pid":25863,"tid":25913,"ts":531358490045,"ph":"X","name":"v8.callFunction","args":{},"dur":51,"tdur":51,"tts":599670},{"cat":"v8","pid":25863,"tid":25913,"ts":531358490047,"ph":"B","name":"V8.Execute","args":{},"tts":599672},{"cat":"blink","pid":25863,"tid":25913,"ts":531358490050,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":10,"tdur":9,"tts":599676},{"cat":"v8","pid":25863,"tid":25913,"ts":531358490093,"ph":"E","name":"V8.Execute","args":{},"tts":599718},{"cat":"blink","pid":25863,"tid":25913,"ts":531358490098,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":30,"tdur":30,"tts":599723},{"cat":"blink","pid":25863,"tid":25913,"ts":531358490100,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":599725},{"cat":"blink","pid":25863,"tid":25913,"ts":531358490101,"ph":"X","name":"Document::updateStyle","args":{},"dur":18,"tdur":17,"tts":599727},{"cat":"blink","pid":25863,"tid":25913,"ts":531358490120,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":599745},{"cat":"blink","pid":25863,"tid":25913,"ts":531358490124,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":3,"tdur":3,"tts":599749},{"cat":"sky","pid":25863,"tid":25913,"ts":531358490128,"ph":"X","name":"Layer::Display","args":{},"dur":803,"tdur":802,"tts":599754},{"cat":"sky","pid":25863,"tid":25913,"ts":531358490932,"ph":"X","name":"LayerHost::Upload","args":{},"dur":193,"tdur":89,"tts":600557},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358491138,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":38,"tdur":38,"tts":600659},{"cat":"blink","pid":25863,"tid":25913,"ts":531358491142,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":29,"tdur":28,"tts":600664},{"cat":"v8","pid":25863,"tid":25913,"ts":531358491145,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":25,"tdur":25,"tts":600666},{"cat":"v8","pid":25863,"tid":25913,"ts":531358491148,"ph":"X","name":"v8.callFunction","args":{},"dur":21,"tdur":21,"tts":600669},{"cat":"v8","pid":25863,"tid":25913,"ts":531358491149,"ph":"B","name":"V8.Execute","args":{},"tts":600671},{"cat":"blink","pid":25863,"tid":25913,"ts":531358491157,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":8,"tts":600679},{"cat":"blink","pid":25863,"tid":25913,"ts":531358491163,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":600685},{"cat":"v8","pid":25863,"tid":25913,"ts":531358491167,"ph":"E","name":"V8.Execute","args":{},"tts":600689},{"cat":"sky","pid":25863,"tid":25913,"ts":531358491541,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1107,"tdur":1044,"tts":600873},{"cat":"blink","pid":25863,"tid":25913,"ts":531358491546,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":100,"tdur":100,"tts":600876},{"cat":"blink","pid":25863,"tid":25913,"ts":531358491548,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":600879},{"cat":"blink","pid":25863,"tid":25913,"ts":531358491552,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":40,"tdur":40,"tts":600882},{"cat":"blink","pid":25863,"tid":25913,"ts":531358491565,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":26,"tdur":25,"tts":600896},{"cat":"v8","pid":25863,"tid":25913,"ts":531358491578,"ph":"X","name":"v8.callFunction","args":{},"dur":10,"tdur":10,"tts":600908},{"cat":"v8","pid":25863,"tid":25913,"ts":531358491580,"ph":"B","name":"V8.Execute","args":{},"tts":600910},{"cat":"v8","pid":25863,"tid":25913,"ts":531358491586,"ph":"E","name":"V8.Execute","args":{},"tts":600917},{"cat":"v8","pid":25863,"tid":25913,"ts":531358491594,"ph":"X","name":"v8.callFunction","args":{},"dur":50,"tdur":50,"tts":600924},{"cat":"v8","pid":25863,"tid":25913,"ts":531358491595,"ph":"B","name":"V8.Execute","args":{},"tts":600926},{"cat":"blink","pid":25863,"tid":25913,"ts":531358491599,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":9,"tdur":9,"tts":600929},{"cat":"v8","pid":25863,"tid":25913,"ts":531358491641,"ph":"E","name":"V8.Execute","args":{},"tts":600972},{"cat":"blink","pid":25863,"tid":25913,"ts":531358491646,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":34,"tdur":33,"tts":600977},{"cat":"blink","pid":25863,"tid":25913,"ts":531358491653,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":600983},{"cat":"blink","pid":25863,"tid":25913,"ts":531358491654,"ph":"X","name":"Document::updateStyle","args":{},"dur":18,"tdur":17,"tts":600985},{"cat":"blink","pid":25863,"tid":25913,"ts":531358491672,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":601003},{"cat":"blink","pid":25863,"tid":25913,"ts":531358491676,"ph":"X","name":"FrameView::invalidateTree","args":{"root":"X�ף&+"},"dur":4,"tdur":3,"tts":601007},{"cat":"sky","pid":25863,"tid":25913,"ts":531358491681,"ph":"X","name":"Layer::Display","args":{},"dur":826,"tdur":815,"tts":601012},{"cat":"sky","pid":25863,"tid":25913,"ts":531358492507,"ph":"X","name":"LayerHost::Upload","args":{},"dur":140,"tdur":86,"tts":601829},{"cat":"sky","pid":25863,"tid":25913,"ts":531358492982,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1032,"tdur":979,"tts":602150},{"cat":"blink","pid":25863,"tid":25913,"ts":531358492986,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":90,"tdur":89,"tts":602154},{"cat":"blink","pid":25863,"tid":25913,"ts":531358492989,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":602157},{"cat":"blink","pid":25863,"tid":25913,"ts":531358492993,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":33,"tdur":33,"tts":602160},{"cat":"blink","pid":25863,"tid":25913,"ts":531358493000,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":26,"tdur":25,"tts":602167},{"cat":"v8","pid":25863,"tid":25913,"ts":531358493012,"ph":"X","name":"v8.callFunction","args":{},"dur":10,"tdur":10,"tts":602179},{"cat":"v8","pid":25863,"tid":25913,"ts":531358493014,"ph":"B","name":"V8.Execute","args":{},"tts":602181},{"cat":"v8","pid":25863,"tid":25913,"ts":531358493021,"ph":"E","name":"V8.Execute","args":{},"tts":602188},{"cat":"v8","pid":25863,"tid":25913,"ts":531358493028,"ph":"X","name":"v8.callFunction","args":{},"dur":46,"tdur":46,"tts":602195},{"cat":"v8","pid":25863,"tid":25913,"ts":531358493030,"ph":"B","name":"V8.Execute","args":{},"tts":602197},{"cat":"blink","pid":25863,"tid":25913,"ts":531358493033,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":10,"tdur":10,"tts":602200},{"cat":"v8","pid":25863,"tid":25913,"ts":531358493071,"ph":"E","name":"V8.Execute","args":{},"tts":602239},{"cat":"blink","pid":25863,"tid":25913,"ts":531358493077,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":29,"tdur":29,"tts":602244},{"cat":"blink","pid":25863,"tid":25913,"ts":531358493079,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":602246},{"cat":"blink","pid":25863,"tid":25913,"ts":531358493080,"ph":"X","name":"Document::updateStyle","args":{},"dur":18,"tdur":17,"tts":602247},{"cat":"blink","pid":25863,"tid":25913,"ts":531358493098,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":602265},{"cat":"blink","pid":25863,"tid":25913,"ts":531358493102,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":4,"tts":602269},{"cat":"sky","pid":25863,"tid":25913,"ts":531358493107,"ph":"X","name":"Layer::Display","args":{},"dur":797,"tdur":796,"tts":602274},{"cat":"sky","pid":25863,"tid":25913,"ts":531358493905,"ph":"X","name":"LayerHost::Upload","args":{},"dur":108,"tdur":56,"tts":603072},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358494024,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":36,"tdur":35,"tts":603139},{"cat":"blink","pid":25863,"tid":25913,"ts":531358494028,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":27,"tdur":27,"tts":603143},{"cat":"v8","pid":25863,"tid":25913,"ts":531358494030,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":24,"tdur":24,"tts":603145},{"cat":"v8","pid":25863,"tid":25913,"ts":531358494033,"ph":"X","name":"v8.callFunction","args":{},"dur":20,"tdur":20,"tts":603148},{"cat":"v8","pid":25863,"tid":25913,"ts":531358494034,"ph":"B","name":"V8.Execute","args":{},"tts":603149},{"cat":"blink","pid":25863,"tid":25913,"ts":531358494042,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":8,"tdur":8,"tts":603157},{"cat":"blink","pid":25863,"tid":25913,"ts":531358494047,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":603162},{"cat":"v8","pid":25863,"tid":25913,"ts":531358494051,"ph":"E","name":"V8.Execute","args":{},"tts":603166},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358495124,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":39,"tdur":39,"tts":603269},{"cat":"blink","pid":25863,"tid":25913,"ts":531358495127,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":32,"tdur":32,"tts":603272},{"cat":"v8","pid":25863,"tid":25913,"ts":531358495130,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":28,"tdur":28,"tts":603275},{"cat":"v8","pid":25863,"tid":25913,"ts":531358495132,"ph":"X","name":"v8.callFunction","args":{},"dur":25,"tdur":25,"tts":603277},{"cat":"v8","pid":25863,"tid":25913,"ts":531358495134,"ph":"B","name":"V8.Execute","args":{},"tts":603278},{"cat":"blink","pid":25863,"tid":25913,"ts":531358495140,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":15,"tdur":14,"tts":603285},{"cat":"blink","pid":25863,"tid":25913,"ts":531358495152,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":603297},{"cat":"v8","pid":25863,"tid":25913,"ts":531358495156,"ph":"E","name":"V8.Execute","args":{},"tts":603300},{"cat":"sky","pid":25863,"tid":25913,"ts":531358553540,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1393,"tdur":1227,"tts":603375},{"cat":"blink","pid":25863,"tid":25913,"ts":531358553547,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":129,"tdur":129,"tts":603380},{"cat":"blink","pid":25863,"tid":25913,"ts":531358553552,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":4,"tdur":3,"tts":603386},{"cat":"blink","pid":25863,"tid":25913,"ts":531358553558,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":50,"tdur":49,"tts":603392},{"cat":"blink","pid":25863,"tid":25913,"ts":531358553581,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":26,"tdur":25,"tts":603415},{"cat":"v8","pid":25863,"tid":25913,"ts":531358553593,"ph":"X","name":"v8.callFunction","args":{},"dur":11,"tdur":10,"tts":603427},{"cat":"v8","pid":25863,"tid":25913,"ts":531358553595,"ph":"B","name":"V8.Execute","args":{},"tts":603429},{"cat":"v8","pid":25863,"tid":25913,"ts":531358553602,"ph":"E","name":"V8.Execute","args":{},"tts":603436},{"cat":"v8","pid":25863,"tid":25913,"ts":531358553610,"ph":"X","name":"v8.callFunction","args":{},"dur":64,"tdur":64,"tts":603443},{"cat":"v8","pid":25863,"tid":25913,"ts":531358553612,"ph":"B","name":"V8.Execute","args":{},"tts":603445},{"cat":"blink","pid":25863,"tid":25913,"ts":531358553616,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":9,"tdur":9,"tts":603449},{"cat":"v8","pid":25863,"tid":25913,"ts":531358553671,"ph":"E","name":"V8.Execute","args":{},"tts":603504},{"cat":"blink","pid":25863,"tid":25913,"ts":531358553676,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":55,"tdur":54,"tts":603510},{"cat":"blink","pid":25863,"tid":25913,"ts":531358553678,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":603512},{"cat":"blink","pid":25863,"tid":25913,"ts":531358553680,"ph":"X","name":"Document::updateStyle","args":{},"dur":30,"tdur":30,"tts":603513},{"cat":"blink","pid":25863,"tid":25913,"ts":531358553711,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":603544},{"cat":"blink","pid":25863,"tid":25913,"ts":531358553715,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":15,"tdur":15,"tts":603548},{"cat":"sky","pid":25863,"tid":25913,"ts":531358553732,"ph":"X","name":"Layer::Display","args":{},"dur":903,"tdur":902,"tts":603565},{"cat":"sky","pid":25863,"tid":25913,"ts":531358554636,"ph":"X","name":"LayerHost::Upload","args":{},"dur":296,"tdur":131,"tts":604469},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358554962,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":83,"tdur":72,"tts":604632},{"cat":"blink","pid":25863,"tid":25913,"ts":531358554968,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":71,"tdur":61,"tts":604637},{"cat":"v8","pid":25863,"tid":25913,"ts":531358554988,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":49,"tdur":39,"tts":604657},{"cat":"v8","pid":25863,"tid":25913,"ts":531358554991,"ph":"X","name":"v8.callFunction","args":{},"dur":45,"tdur":35,"tts":604660},{"cat":"v8","pid":25863,"tid":25913,"ts":531358555014,"ph":"B","name":"V8.Execute","args":{},"tts":604674},{"cat":"blink","pid":25863,"tid":25913,"ts":531358555024,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":8,"tts":604684},{"cat":"blink","pid":25863,"tid":25913,"ts":531358555029,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":604689},{"cat":"v8","pid":25863,"tid":25913,"ts":531358555034,"ph":"E","name":"V8.Execute","args":{},"tts":604694},{"cat":"sky","pid":25863,"tid":25913,"ts":531358555414,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1201,"tdur":1119,"tts":604895},{"cat":"blink","pid":25863,"tid":25913,"ts":531358555419,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":112,"tdur":112,"tts":604899},{"cat":"blink","pid":25863,"tid":25913,"ts":531358555422,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":1,"tdur":2,"tts":604902},{"cat":"blink","pid":25863,"tid":25913,"ts":531358555425,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":36,"tdur":36,"tts":604906},{"cat":"blink","pid":25863,"tid":25913,"ts":531358555433,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":28,"tdur":28,"tts":604913},{"cat":"v8","pid":25863,"tid":25913,"ts":531358555446,"ph":"X","name":"v8.callFunction","args":{},"dur":11,"tdur":11,"tts":604927},{"cat":"v8","pid":25863,"tid":25913,"ts":531358555448,"ph":"B","name":"V8.Execute","args":{},"tts":604929},{"cat":"v8","pid":25863,"tid":25913,"ts":531358555455,"ph":"E","name":"V8.Execute","args":{},"tts":604936},{"cat":"v8","pid":25863,"tid":25913,"ts":531358555464,"ph":"X","name":"v8.callFunction","args":{},"dur":65,"tdur":65,"tts":604944},{"cat":"v8","pid":25863,"tid":25913,"ts":531358555465,"ph":"B","name":"V8.Execute","args":{},"tts":604946},{"cat":"blink","pid":25863,"tid":25913,"ts":531358555469,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":16,"tdur":15,"tts":604950},{"cat":"v8","pid":25863,"tid":25913,"ts":531358555525,"ph":"E","name":"V8.Execute","args":{},"tts":605006},{"cat":"blink","pid":25863,"tid":25913,"ts":531358555532,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":32,"tdur":32,"tts":605012},{"cat":"blink","pid":25863,"tid":25913,"ts":531358555534,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":605014},{"cat":"blink","pid":25863,"tid":25913,"ts":531358555535,"ph":"X","name":"Document::updateStyle","args":{},"dur":19,"tdur":18,"tts":605016},{"cat":"blink","pid":25863,"tid":25913,"ts":531358555555,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":605035},{"cat":"blink","pid":25863,"tid":25913,"ts":531358555559,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":3,"tts":605040},{"cat":"sky","pid":25863,"tid":25913,"ts":531358555564,"ph":"X","name":"Layer::Display","args":{},"dur":886,"tdur":873,"tts":605045},{"cat":"sky","pid":25863,"tid":25913,"ts":531358556451,"ph":"X","name":"LayerHost::Upload","args":{},"dur":163,"tdur":92,"tts":605920},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358556628,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":56,"tdur":56,"tts":606027},{"cat":"blink","pid":25863,"tid":25913,"ts":531358556633,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":46,"tdur":46,"tts":606032},{"cat":"v8","pid":25863,"tid":25913,"ts":531358556636,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":42,"tdur":41,"tts":606035},{"cat":"v8","pid":25863,"tid":25913,"ts":531358556639,"ph":"X","name":"v8.callFunction","args":{},"dur":37,"tdur":37,"tts":606038},{"cat":"v8","pid":25863,"tid":25913,"ts":531358556640,"ph":"B","name":"V8.Execute","args":{},"tts":606039},{"cat":"blink","pid":25863,"tid":25913,"ts":531358556663,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":10,"tdur":10,"tts":606062},{"cat":"blink","pid":25863,"tid":25913,"ts":531358556670,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":606069},{"cat":"v8","pid":25863,"tid":25913,"ts":531358556674,"ph":"E","name":"V8.Execute","args":{},"tts":606074},{"cat":"sky","pid":25863,"tid":25913,"ts":531358557073,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1113,"tdur":1058,"tts":606281},{"cat":"blink","pid":25863,"tid":25913,"ts":531358557078,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":101,"tdur":101,"tts":606285},{"cat":"blink","pid":25863,"tid":25913,"ts":531358557081,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":2,"tts":606288},{"cat":"blink","pid":25863,"tid":25913,"ts":531358557084,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":36,"tdur":35,"tts":606292},{"cat":"blink","pid":25863,"tid":25913,"ts":531358557091,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":29,"tdur":27,"tts":606299},{"cat":"v8","pid":25863,"tid":25913,"ts":531358557105,"ph":"X","name":"v8.callFunction","args":{},"dur":11,"tdur":11,"tts":606312},{"cat":"v8","pid":25863,"tid":25913,"ts":531358557107,"ph":"B","name":"V8.Execute","args":{},"tts":606314},{"cat":"v8","pid":25863,"tid":25913,"ts":531358557114,"ph":"E","name":"V8.Execute","args":{},"tts":606321},{"cat":"v8","pid":25863,"tid":25913,"ts":531358557122,"ph":"X","name":"v8.callFunction","args":{},"dur":54,"tdur":53,"tts":606330},{"cat":"v8","pid":25863,"tid":25913,"ts":531358557124,"ph":"B","name":"V8.Execute","args":{},"tts":606331},{"cat":"blink","pid":25863,"tid":25913,"ts":531358557128,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":10,"tdur":10,"tts":606335},{"cat":"v8","pid":25863,"tid":25913,"ts":531358557173,"ph":"E","name":"V8.Execute","args":{},"tts":606381},{"cat":"blink","pid":25863,"tid":25913,"ts":531358557179,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":32,"tdur":32,"tts":606386},{"cat":"blink","pid":25863,"tid":25913,"ts":531358557181,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":606388},{"cat":"blink","pid":25863,"tid":25913,"ts":531358557183,"ph":"X","name":"Document::updateStyle","args":{},"dur":18,"tdur":18,"tts":606390},{"cat":"blink","pid":25863,"tid":25913,"ts":531358557202,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":606409},{"cat":"blink","pid":25863,"tid":25913,"ts":531358557206,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":4,"tts":606413},{"cat":"sky","pid":25863,"tid":25913,"ts":531358557211,"ph":"X","name":"Layer::Display","args":{},"dur":827,"tdur":825,"tts":606419},{"cat":"sky","pid":25863,"tid":25913,"ts":531358558039,"ph":"X","name":"LayerHost::Upload","args":{},"dur":146,"tdur":91,"tts":607246},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358558199,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":41,"tdur":41,"tts":607352},{"cat":"blink","pid":25863,"tid":25913,"ts":531358558204,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":31,"tdur":31,"tts":607357},{"cat":"v8","pid":25863,"tid":25913,"ts":531358558207,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":27,"tdur":27,"tts":607360},{"cat":"v8","pid":25863,"tid":25913,"ts":531358558209,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":22,"tts":607363},{"cat":"v8","pid":25863,"tid":25913,"ts":531358558211,"ph":"B","name":"V8.Execute","args":{},"tts":607365},{"cat":"blink","pid":25863,"tid":25913,"ts":531358558220,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":10,"tdur":10,"tts":607373},{"cat":"blink","pid":25863,"tid":25913,"ts":531358558226,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":607380},{"cat":"v8","pid":25863,"tid":25913,"ts":531358558231,"ph":"E","name":"V8.Execute","args":{},"tts":607384},{"cat":"sky","pid":25863,"tid":25913,"ts":531358558592,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1069,"tdur":1034,"tts":607581},{"cat":"blink","pid":25863,"tid":25913,"ts":531358558596,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":106,"tdur":105,"tts":607584},{"cat":"blink","pid":25863,"tid":25913,"ts":531358558599,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":607588},{"cat":"blink","pid":25863,"tid":25913,"ts":531358558603,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":39,"tdur":39,"tts":607591},{"cat":"blink","pid":25863,"tid":25913,"ts":531358558610,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":32,"tdur":31,"tts":607598},{"cat":"v8","pid":25863,"tid":25913,"ts":531358558624,"ph":"X","name":"v8.callFunction","args":{},"dur":14,"tdur":14,"tts":607612},{"cat":"v8","pid":25863,"tid":25913,"ts":531358558629,"ph":"B","name":"V8.Execute","args":{},"tts":607617},{"cat":"v8","pid":25863,"tid":25913,"ts":531358558636,"ph":"E","name":"V8.Execute","args":{},"tts":607624},{"cat":"v8","pid":25863,"tid":25913,"ts":531358558645,"ph":"X","name":"v8.callFunction","args":{},"dur":54,"tdur":54,"tts":607633},{"cat":"v8","pid":25863,"tid":25913,"ts":531358558646,"ph":"B","name":"V8.Execute","args":{},"tts":607634},{"cat":"blink","pid":25863,"tid":25913,"ts":531358558650,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":11,"tdur":10,"tts":607638},{"cat":"v8","pid":25863,"tid":25913,"ts":531358558696,"ph":"E","name":"V8.Execute","args":{},"tts":607685},{"cat":"blink","pid":25863,"tid":25913,"ts":531358558702,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":32,"tdur":32,"tts":607690},{"cat":"blink","pid":25863,"tid":25913,"ts":531358558704,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":607692},{"cat":"blink","pid":25863,"tid":25913,"ts":531358558706,"ph":"X","name":"Document::updateStyle","args":{},"dur":19,"tdur":18,"tts":607694},{"cat":"blink","pid":25863,"tid":25913,"ts":531358558725,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":607713},{"cat":"blink","pid":25863,"tid":25913,"ts":531358558729,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":3,"tts":607718},{"cat":"sky","pid":25863,"tid":25913,"ts":531358558735,"ph":"X","name":"Layer::Display","args":{},"dur":831,"tdur":830,"tts":607723},{"cat":"sky","pid":25863,"tid":25913,"ts":531358559567,"ph":"X","name":"LayerHost::Upload","args":{},"dur":93,"tdur":59,"tts":608555},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358560770,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":44,"tdur":43,"tts":608784},{"cat":"blink","pid":25863,"tid":25913,"ts":531358560776,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":33,"tdur":33,"tts":608789},{"cat":"v8","pid":25863,"tid":25913,"ts":531358560779,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":28,"tdur":29,"tts":608792},{"cat":"v8","pid":25863,"tid":25913,"ts":531358560782,"ph":"X","name":"v8.callFunction","args":{},"dur":24,"tdur":25,"tts":608795},{"cat":"v8","pid":25863,"tid":25913,"ts":531358560783,"ph":"B","name":"V8.Execute","args":{},"tts":608797},{"cat":"blink","pid":25863,"tid":25913,"ts":531358560792,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":11,"tdur":11,"tts":608806},{"cat":"blink","pid":25863,"tid":25913,"ts":531358560799,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":4,"tdur":3,"tts":608813},{"cat":"v8","pid":25863,"tid":25913,"ts":531358560804,"ph":"E","name":"V8.Execute","args":{},"tts":608818},{"cat":"sky","pid":25863,"tid":25913,"ts":531358607863,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2402,"tdur":2225,"tts":608936},{"cat":"blink","pid":25863,"tid":25913,"ts":531358607882,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":273,"tdur":255,"tts":608954},{"cat":"blink","pid":25863,"tid":25913,"ts":531358607891,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":4,"tdur":3,"tts":608963},{"cat":"blink","pid":25863,"tid":25913,"ts":531358607899,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":82,"tdur":81,"tts":608971},{"cat":"blink","pid":25863,"tid":25913,"ts":531358607916,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":64,"tdur":63,"tts":608988},{"cat":"v8","pid":25863,"tid":25913,"ts":531358607947,"ph":"X","name":"v8.callFunction","args":{},"dur":25,"tdur":24,"tts":609019},{"cat":"v8","pid":25863,"tid":25913,"ts":531358607951,"ph":"B","name":"V8.Execute","args":{},"tts":609023},{"cat":"v8","pid":25863,"tid":25913,"ts":531358607968,"ph":"E","name":"V8.Execute","args":{},"tts":609040},{"cat":"v8","pid":25863,"tid":25913,"ts":531358607985,"ph":"X","name":"v8.callFunction","args":{},"dur":165,"tdur":147,"tts":609057},{"cat":"v8","pid":25863,"tid":25913,"ts":531358607989,"ph":"B","name":"V8.Execute","args":{},"tts":609061},{"cat":"blink","pid":25863,"tid":25913,"ts":531358607998,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":61,"tdur":42,"tts":609070},{"cat":"v8","pid":25863,"tid":25913,"ts":531358608143,"ph":"E","name":"V8.Execute","args":{},"tts":609198},{"cat":"blink","pid":25863,"tid":25913,"ts":531358608156,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":59,"tdur":58,"tts":609210},{"cat":"blink","pid":25863,"tid":25913,"ts":531358608172,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":609226},{"cat":"blink","pid":25863,"tid":25913,"ts":531358608174,"ph":"X","name":"Document::updateStyle","args":{},"dur":27,"tdur":27,"tts":609228},{"cat":"blink","pid":25863,"tid":25913,"ts":531358608202,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":609256},{"cat":"blink","pid":25863,"tid":25913,"ts":531358608209,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":5,"tdur":4,"tts":609263},{"cat":"sky","pid":25863,"tid":25913,"ts":531358608216,"ph":"X","name":"Layer::Display","args":{},"dur":1677,"tdur":1675,"tts":609270},{"cat":"sky","pid":25863,"tid":25913,"ts":531358609895,"ph":"X","name":"LayerHost::Upload","args":{},"dur":369,"tdur":209,"tts":610949},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358610298,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":75,"tdur":75,"tts":611194},{"cat":"blink","pid":25863,"tid":25913,"ts":531358610309,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":58,"tdur":57,"tts":611205},{"cat":"v8","pid":25863,"tid":25913,"ts":531358610315,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":50,"tdur":50,"tts":611211},{"cat":"v8","pid":25863,"tid":25913,"ts":531358610332,"ph":"X","name":"v8.callFunction","args":{},"dur":32,"tdur":31,"tts":611228},{"cat":"v8","pid":25863,"tid":25913,"ts":531358610335,"ph":"B","name":"V8.Execute","args":{},"tts":611230},{"cat":"blink","pid":25863,"tid":25913,"ts":531358610348,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":12,"tdur":12,"tts":611244},{"cat":"blink","pid":25863,"tid":25913,"ts":531358610356,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":4,"tdur":3,"tts":611252},{"cat":"v8","pid":25863,"tid":25913,"ts":531358610362,"ph":"E","name":"V8.Execute","args":{},"tts":611257},{"cat":"sky","pid":25863,"tid":25913,"ts":531358610855,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1487,"tdur":1407,"tts":611508},{"cat":"blink","pid":25863,"tid":25913,"ts":531358610861,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":145,"tdur":145,"tts":611512},{"cat":"blink","pid":25863,"tid":25913,"ts":531358610865,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":2,"tts":611516},{"cat":"blink","pid":25863,"tid":25913,"ts":531358610869,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":45,"tdur":45,"tts":611520},{"cat":"blink","pid":25863,"tid":25913,"ts":531358610878,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":35,"tdur":35,"tts":611529},{"cat":"v8","pid":25863,"tid":25913,"ts":531358610895,"ph":"X","name":"v8.callFunction","args":{},"dur":14,"tdur":13,"tts":611547},{"cat":"v8","pid":25863,"tid":25913,"ts":531358610898,"ph":"B","name":"V8.Execute","args":{},"tts":611549},{"cat":"v8","pid":25863,"tid":25913,"ts":531358610906,"ph":"E","name":"V8.Execute","args":{},"tts":611558},{"cat":"v8","pid":25863,"tid":25913,"ts":531358610916,"ph":"X","name":"v8.callFunction","args":{},"dur":87,"tdur":86,"tts":611568},{"cat":"v8","pid":25863,"tid":25913,"ts":531358610919,"ph":"B","name":"V8.Execute","args":{},"tts":611570},{"cat":"blink","pid":25863,"tid":25913,"ts":531358610924,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":12,"tdur":12,"tts":611575},{"cat":"v8","pid":25863,"tid":25913,"ts":531358610999,"ph":"E","name":"V8.Execute","args":{},"tts":611651},{"cat":"blink","pid":25863,"tid":25913,"ts":531358611007,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":45,"tdur":44,"tts":611659},{"cat":"blink","pid":25863,"tid":25913,"ts":531358611010,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":611661},{"cat":"blink","pid":25863,"tid":25913,"ts":531358611012,"ph":"X","name":"Document::updateStyle","args":{},"dur":24,"tdur":23,"tts":611663},{"cat":"blink","pid":25863,"tid":25913,"ts":531358611036,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":611688},{"cat":"blink","pid":25863,"tid":25913,"ts":531358611046,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":5,"tdur":4,"tts":611698},{"cat":"sky","pid":25863,"tid":25913,"ts":531358611053,"ph":"X","name":"Layer::Display","args":{},"dur":1106,"tdur":1093,"tts":611705},{"cat":"sky","pid":25863,"tid":25913,"ts":531358612160,"ph":"X","name":"LayerHost::Upload","args":{},"dur":181,"tdur":113,"tts":612800},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358612354,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":55,"tdur":46,"tts":612927},{"cat":"blink","pid":25863,"tid":25913,"ts":531358612359,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":46,"tdur":36,"tts":612932},{"cat":"v8","pid":25863,"tid":25913,"ts":531358612361,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":42,"tdur":33,"tts":612934},{"cat":"v8","pid":25863,"tid":25913,"ts":531358612364,"ph":"X","name":"v8.callFunction","args":{},"dur":38,"tdur":29,"tts":612937},{"cat":"v8","pid":25863,"tid":25913,"ts":531358612366,"ph":"B","name":"V8.Execute","args":{},"tts":612938},{"cat":"blink","pid":25863,"tid":25913,"ts":531358612374,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":25,"tdur":16,"tts":612947},{"cat":"blink","pid":25863,"tid":25913,"ts":531358612396,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":612960},{"cat":"v8","pid":25863,"tid":25913,"ts":531358612400,"ph":"E","name":"V8.Execute","args":{},"tts":612964},{"cat":"sky","pid":25863,"tid":25913,"ts":531358612853,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1068,"tdur":987,"tts":613150},{"cat":"blink","pid":25863,"tid":25913,"ts":531358612856,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":91,"tdur":91,"tts":613153},{"cat":"blink","pid":25863,"tid":25913,"ts":531358612859,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":1,"tdur":1,"tts":613156},{"cat":"blink","pid":25863,"tid":25913,"ts":531358612862,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":31,"tdur":31,"tts":613159},{"cat":"blink","pid":25863,"tid":25913,"ts":531358612868,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":25,"tdur":25,"tts":613165},{"cat":"v8","pid":25863,"tid":25913,"ts":531358612880,"ph":"X","name":"v8.callFunction","args":{},"dur":10,"tdur":10,"tts":613177},{"cat":"v8","pid":25863,"tid":25913,"ts":531358612882,"ph":"B","name":"V8.Execute","args":{},"tts":613179},{"cat":"v8","pid":25863,"tid":25913,"ts":531358612888,"ph":"E","name":"V8.Execute","args":{},"tts":613185},{"cat":"v8","pid":25863,"tid":25913,"ts":531358612895,"ph":"X","name":"v8.callFunction","args":{},"dur":50,"tdur":49,"tts":613192},{"cat":"v8","pid":25863,"tid":25913,"ts":531358612896,"ph":"B","name":"V8.Execute","args":{},"tts":613194},{"cat":"blink","pid":25863,"tid":25913,"ts":531358612900,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":9,"tdur":9,"tts":613197},{"cat":"v8","pid":25863,"tid":25913,"ts":531358612942,"ph":"E","name":"V8.Execute","args":{},"tts":613239},{"cat":"blink","pid":25863,"tid":25913,"ts":531358612947,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":29,"tdur":29,"tts":613244},{"cat":"blink","pid":25863,"tid":25913,"ts":531358612949,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":613246},{"cat":"blink","pid":25863,"tid":25913,"ts":531358612950,"ph":"X","name":"Document::updateStyle","args":{},"dur":18,"tdur":17,"tts":613248},{"cat":"blink","pid":25863,"tid":25913,"ts":531358612968,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":613265},{"cat":"blink","pid":25863,"tid":25913,"ts":531358612972,"ph":"X","name":"FrameView::invalidateTree","args":{"root":"\u0018�ף&+"},"dur":4,"tdur":4,"tts":613269},{"cat":"sky","pid":25863,"tid":25913,"ts":531358612977,"ph":"X","name":"Layer::Display","args":{},"dur":780,"tdur":780,"tts":613274},{"cat":"sky","pid":25863,"tid":25913,"ts":531358613758,"ph":"X","name":"LayerHost::Upload","args":{},"dur":162,"tdur":79,"tts":614056},{"cat":"sky","pid":25863,"tid":25913,"ts":531358614492,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2008,"tdur":1942,"tts":614409},{"cat":"blink","pid":25863,"tid":25913,"ts":531358614497,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":240,"tdur":240,"tts":614414},{"cat":"blink","pid":25863,"tid":25913,"ts":531358614501,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":2,"tts":614418},{"cat":"blink","pid":25863,"tid":25913,"ts":531358614506,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":44,"tdur":44,"tts":614422},{"cat":"blink","pid":25863,"tid":25913,"ts":531358614514,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":35,"tdur":34,"tts":614431},{"cat":"v8","pid":25863,"tid":25913,"ts":531358614531,"ph":"X","name":"v8.callFunction","args":{},"dur":14,"tdur":13,"tts":614448},{"cat":"v8","pid":25863,"tid":25913,"ts":531358614534,"ph":"B","name":"V8.Execute","args":{},"tts":614450},{"cat":"v8","pid":25863,"tid":25913,"ts":531358614542,"ph":"E","name":"V8.Execute","args":{},"tts":614459},{"cat":"v8","pid":25863,"tid":25913,"ts":531358614553,"ph":"X","name":"v8.callFunction","args":{},"dur":181,"tdur":182,"tts":614469},{"cat":"v8","pid":25863,"tid":25913,"ts":531358614555,"ph":"B","name":"V8.Execute","args":{},"tts":614471},{"cat":"blink","pid":25863,"tid":25913,"ts":531358614560,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":12,"tdur":12,"tts":614476},{"cat":"v8","pid":25863,"tid":25913,"ts":531358614730,"ph":"E","name":"V8.Execute","args":{},"tts":614647},{"cat":"blink","pid":25863,"tid":25913,"ts":531358614738,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":457,"tdur":456,"tts":614655},{"cat":"blink","pid":25863,"tid":25913,"ts":531358614741,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":614657},{"cat":"blink","pid":25863,"tid":25913,"ts":531358614743,"ph":"X","name":"Document::updateStyle","args":{},"dur":113,"tdur":113,"tts":614659},{"cat":"blink","pid":25863,"tid":25913,"ts":531358614857,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":2},"tts":614774},{"cat":"blink","pid":25863,"tid":25913,"ts":531358614860,"ph":"X","name":"FrameView::layout","args":{},"dur":41,"tdur":41,"tts":614777},{"cat":"blink","pid":25863,"tid":25913,"ts":531358614862,"ph":"X","name":"FrameView::performPreLayoutTasks","args":{},"dur":2,"tdur":2,"tts":614779},{"cat":"blink","pid":25863,"tid":25913,"ts":531358614865,"ph":"X","name":"FrameView::performLayout","args":{},"dur":23,"tdur":21,"tts":614782},{"cat":"blink","pid":25863,"tid":25913,"ts":531358614888,"ph":"X","name":"RenderLayer::updateLayerPositionsAfterLayout","args":{},"dur":3,"tdur":2,"tts":614805},{"cat":"blink","pid":25863,"tid":25913,"ts":531358614892,"ph":"X","name":"FrameView::performPostLayoutTasks","args":{},"dur":8,"tdur":8,"tts":614808},{"cat":"blink","pid":25863,"tid":25913,"ts":531358614905,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":289,"tdur":288,"tts":614822},{"cat":"sky","pid":25863,"tid":25913,"ts":531358615196,"ph":"X","name":"Layer::Display","args":{},"dur":1113,"tdur":1111,"tts":615113},{"cat":"sky","pid":25863,"tid":25913,"ts":531358616310,"ph":"X","name":"LayerHost::Upload","args":{},"dur":189,"tdur":123,"tts":616227},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358616521,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":116,"tdur":116,"tts":616370},{"cat":"blink","pid":25863,"tid":25913,"ts":531358616526,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":64,"tdur":63,"tts":616375},{"cat":"v8","pid":25863,"tid":25913,"ts":531358616529,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":58,"tdur":58,"tts":616378},{"cat":"v8","pid":25863,"tid":25913,"ts":531358616532,"ph":"X","name":"v8.callFunction","args":{},"dur":53,"tdur":53,"tts":616381},{"cat":"v8","pid":25863,"tid":25913,"ts":531358616534,"ph":"B","name":"V8.Execute","args":{},"tts":616383},{"cat":"blink","pid":25863,"tid":25913,"ts":531358616562,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":18,"tdur":17,"tts":616412},{"cat":"blink","pid":25863,"tid":25913,"ts":531358616574,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":5,"tdur":5,"tts":616423},{"cat":"v8","pid":25863,"tid":25913,"ts":531358616582,"ph":"E","name":"V8.Execute","args":{},"tts":616431},{"cat":"blink","pid":25863,"tid":25913,"ts":531358616591,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":40,"tdur":40,"tts":616440},{"cat":"v8","pid":25863,"tid":25913,"ts":531358616594,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":36,"tdur":35,"tts":616444},{"cat":"v8","pid":25863,"tid":25913,"ts":531358616615,"ph":"X","name":"v8.callFunction","args":{},"dur":14,"tdur":14,"tts":616464},{"cat":"v8","pid":25863,"tid":25913,"ts":531358616617,"ph":"B","name":"V8.Execute","args":{},"tts":616466},{"cat":"blink","pid":25863,"tid":25913,"ts":531358616621,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":6,"tdur":6,"tts":616470},{"cat":"blink","pid":25863,"tid":25913,"ts":531358616624,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":2,"tdur":1,"tts":616474},{"cat":"v8","pid":25863,"tid":25913,"ts":531358616627,"ph":"E","name":"V8.Execute","args":{},"tts":616477},{"cat":"sky","pid":25863,"tid":25913,"ts":531358670127,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2112,"tdur":1926,"tts":616686},{"cat":"blink","pid":25863,"tid":25913,"ts":531358670131,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":158,"tdur":157,"tts":616690},{"cat":"blink","pid":25863,"tid":25913,"ts":531358670134,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":2,"tts":616692},{"cat":"blink","pid":25863,"tid":25913,"ts":531358670137,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":50,"tdur":49,"tts":616696},{"cat":"blink","pid":25863,"tid":25913,"ts":531358670144,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":42,"tdur":41,"tts":616703},{"cat":"v8","pid":25863,"tid":25913,"ts":531358670158,"ph":"X","name":"v8.callFunction","args":{},"dur":24,"tdur":23,"tts":616717},{"cat":"v8","pid":25863,"tid":25913,"ts":531358670160,"ph":"B","name":"V8.Execute","args":{},"tts":616719},{"cat":"v8","pid":25863,"tid":25913,"ts":531358670180,"ph":"E","name":"V8.Execute","args":{},"tts":616738},{"cat":"v8","pid":25863,"tid":25913,"ts":531358670189,"ph":"X","name":"v8.callFunction","args":{},"dur":95,"tdur":94,"tts":616748},{"cat":"v8","pid":25863,"tid":25913,"ts":531358670191,"ph":"B","name":"V8.Execute","args":{},"tts":616749},{"cat":"blink","pid":25863,"tid":25913,"ts":531358670195,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":12,"tdur":11,"tts":616754},{"cat":"v8","pid":25863,"tid":25913,"ts":531358670278,"ph":"E","name":"V8.Execute","args":{},"tts":616837},{"cat":"blink","pid":25863,"tid":25913,"ts":531358670290,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":69,"tdur":68,"tts":616849},{"cat":"blink","pid":25863,"tid":25913,"ts":531358670294,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":616853},{"cat":"blink","pid":25863,"tid":25913,"ts":531358670297,"ph":"X","name":"Document::updateStyle","args":{},"dur":51,"tdur":50,"tts":616856},{"cat":"blink","pid":25863,"tid":25913,"ts":531358670348,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":616907},{"cat":"blink","pid":25863,"tid":25913,"ts":531358670353,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":5,"tdur":4,"tts":616912},{"cat":"sky","pid":25863,"tid":25913,"ts":531358670360,"ph":"X","name":"Layer::Display","args":{},"dur":1527,"tdur":1526,"tts":616918},{"cat":"sky","pid":25863,"tid":25913,"ts":531358671889,"ph":"X","name":"LayerHost::Upload","args":{},"dur":349,"tdur":162,"tts":618448},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358672262,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":68,"tdur":67,"tts":618636},{"cat":"blink","pid":25863,"tid":25913,"ts":531358672271,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":54,"tdur":53,"tts":618644},{"cat":"v8","pid":25863,"tid":25913,"ts":531358672276,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":47,"tdur":47,"tts":618649},{"cat":"v8","pid":25863,"tid":25913,"ts":531358672281,"ph":"X","name":"v8.callFunction","args":{},"dur":41,"tdur":41,"tts":618654},{"cat":"v8","pid":25863,"tid":25913,"ts":531358672284,"ph":"B","name":"V8.Execute","args":{},"tts":618657},{"cat":"blink","pid":25863,"tid":25913,"ts":531358672308,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":11,"tdur":10,"tts":618682},{"cat":"blink","pid":25863,"tid":25913,"ts":531358672315,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":618688},{"cat":"v8","pid":25863,"tid":25913,"ts":531358672320,"ph":"E","name":"V8.Execute","args":{},"tts":618693},{"cat":"sky","pid":25863,"tid":25913,"ts":531358672756,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1907,"tdur":1810,"tts":618902},{"cat":"blink","pid":25863,"tid":25913,"ts":531358672761,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":330,"tdur":330,"tts":618906},{"cat":"blink","pid":25863,"tid":25913,"ts":531358672764,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":618910},{"cat":"blink","pid":25863,"tid":25913,"ts":531358672768,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":39,"tdur":39,"tts":618913},{"cat":"blink","pid":25863,"tid":25913,"ts":531358672776,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":31,"tdur":30,"tts":618921},{"cat":"v8","pid":25863,"tid":25913,"ts":531358672791,"ph":"X","name":"v8.callFunction","args":{},"dur":12,"tdur":12,"tts":618936},{"cat":"v8","pid":25863,"tid":25913,"ts":531358672793,"ph":"B","name":"V8.Execute","args":{},"tts":618938},{"cat":"v8","pid":25863,"tid":25913,"ts":531358672801,"ph":"E","name":"V8.Execute","args":{},"tts":618946},{"cat":"v8","pid":25863,"tid":25913,"ts":531358672809,"ph":"X","name":"v8.callFunction","args":{},"dur":278,"tdur":277,"tts":618955},{"cat":"v8","pid":25863,"tid":25913,"ts":531358672811,"ph":"B","name":"V8.Execute","args":{},"tts":618956},{"cat":"blink","pid":25863,"tid":25913,"ts":531358672816,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":11,"tdur":10,"tts":618961},{"cat":"v8","pid":25863,"tid":25913,"ts":531358672999,"ph":"E","name":"V8.Execute","args":{},"tts":619145},{"cat":"blink","pid":25863,"tid":25913,"ts":531358673092,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":454,"tdur":454,"tts":619237},{"cat":"blink","pid":25863,"tid":25913,"ts":531358673095,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":619240},{"cat":"blink","pid":25863,"tid":25913,"ts":531358673097,"ph":"X","name":"Document::updateStyle","args":{},"dur":83,"tdur":82,"tts":619242},{"cat":"blink","pid":25863,"tid":25913,"ts":531358673180,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":4},"tts":619326},{"cat":"blink","pid":25863,"tid":25913,"ts":531358673183,"ph":"X","name":"FrameView::layout","args":{},"dur":112,"tdur":110,"tts":619329},{"cat":"blink","pid":25863,"tid":25913,"ts":531358673185,"ph":"X","name":"FrameView::performPreLayoutTasks","args":{},"dur":2,"tdur":2,"tts":619330},{"cat":"blink","pid":25863,"tid":25913,"ts":531358673188,"ph":"X","name":"FrameView::performLayout","args":{},"dur":96,"tdur":95,"tts":619333},{"cat":"blink","pid":25863,"tid":25913,"ts":531358673284,"ph":"X","name":"RenderLayer::updateLayerPositionsAfterLayout","args":{},"dur":3,"tdur":3,"tts":619429},{"cat":"blink","pid":25863,"tid":25913,"ts":531358673288,"ph":"X","name":"FrameView::performPostLayoutTasks","args":{},"dur":5,"tdur":5,"tts":619433},{"cat":"blink","pid":25863,"tid":25913,"ts":531358673298,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":247,"tdur":246,"tts":619443},{"cat":"sky","pid":25863,"tid":25913,"ts":531358673547,"ph":"X","name":"Layer::Display","args":{},"dur":920,"tdur":919,"tts":619692},{"cat":"sky","pid":25863,"tid":25913,"ts":531358674468,"ph":"X","name":"LayerHost::Upload","args":{},"dur":194,"tdur":98,"tts":620613},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358674691,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":49,"tdur":48,"tts":620740},{"cat":"blink","pid":25863,"tid":25913,"ts":531358674697,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":37,"tdur":37,"tts":620746},{"cat":"v8","pid":25863,"tid":25913,"ts":531358674700,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":33,"tdur":33,"tts":620749},{"cat":"v8","pid":25863,"tid":25913,"ts":531358674703,"ph":"X","name":"v8.callFunction","args":{},"dur":29,"tdur":28,"tts":620752},{"cat":"v8","pid":25863,"tid":25913,"ts":531358674705,"ph":"B","name":"V8.Execute","args":{},"tts":620754},{"cat":"blink","pid":25863,"tid":25913,"ts":531358674714,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":10,"tdur":10,"tts":620763},{"cat":"blink","pid":25863,"tid":25913,"ts":531358674721,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":620770},{"cat":"v8","pid":25863,"tid":25913,"ts":531358674726,"ph":"E","name":"V8.Execute","args":{},"tts":620775},{"cat":"sky","pid":25863,"tid":25913,"ts":531358675162,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1266,"tdur":1203,"tts":620989},{"cat":"blink","pid":25863,"tid":25913,"ts":531358675167,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":109,"tdur":109,"tts":620993},{"cat":"blink","pid":25863,"tid":25913,"ts":531358675170,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":2,"tts":620996},{"cat":"blink","pid":25863,"tid":25913,"ts":531358675174,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":39,"tdur":38,"tts":621000},{"cat":"blink","pid":25863,"tid":25913,"ts":531358675182,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":31,"tdur":30,"tts":621008},{"cat":"v8","pid":25863,"tid":25913,"ts":531358675197,"ph":"X","name":"v8.callFunction","args":{},"dur":12,"tdur":11,"tts":621023},{"cat":"v8","pid":25863,"tid":25913,"ts":531358675199,"ph":"B","name":"V8.Execute","args":{},"tts":621025},{"cat":"v8","pid":25863,"tid":25913,"ts":531358675207,"ph":"E","name":"V8.Execute","args":{},"tts":621032},{"cat":"v8","pid":25863,"tid":25913,"ts":531358675215,"ph":"X","name":"v8.callFunction","args":{},"dur":59,"tdur":58,"tts":621041},{"cat":"v8","pid":25863,"tid":25913,"ts":531358675217,"ph":"B","name":"V8.Execute","args":{},"tts":621043},{"cat":"blink","pid":25863,"tid":25913,"ts":531358675222,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":11,"tdur":11,"tts":621047},{"cat":"v8","pid":25863,"tid":25913,"ts":531358675270,"ph":"E","name":"V8.Execute","args":{},"tts":621097},{"cat":"blink","pid":25863,"tid":25913,"ts":531358675277,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":47,"tdur":47,"tts":621103},{"cat":"blink","pid":25863,"tid":25913,"ts":531358675279,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":621105},{"cat":"blink","pid":25863,"tid":25913,"ts":531358675281,"ph":"X","name":"Document::updateStyle","args":{},"dur":33,"tdur":33,"tts":621106},{"cat":"blink","pid":25863,"tid":25913,"ts":531358675314,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":621140},{"cat":"blink","pid":25863,"tid":25913,"ts":531358675319,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":5,"tdur":4,"tts":621145},{"cat":"sky","pid":25863,"tid":25913,"ts":531358675325,"ph":"X","name":"Layer::Display","args":{},"dur":949,"tdur":937,"tts":621151},{"cat":"sky","pid":25863,"tid":25913,"ts":531358676276,"ph":"X","name":"LayerHost::Upload","args":{},"dur":152,"tdur":100,"tts":622090},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358676442,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":45,"tdur":45,"tts":622206},{"cat":"blink","pid":25863,"tid":25913,"ts":531358676448,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":34,"tdur":33,"tts":622212},{"cat":"v8","pid":25863,"tid":25913,"ts":531358676451,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":29,"tdur":30,"tts":622214},{"cat":"v8","pid":25863,"tid":25913,"ts":531358676454,"ph":"X","name":"v8.callFunction","args":{},"dur":25,"tdur":24,"tts":622218},{"cat":"v8","pid":25863,"tid":25913,"ts":531358676456,"ph":"B","name":"V8.Execute","args":{},"tts":622220},{"cat":"blink","pid":25863,"tid":25913,"ts":531358676465,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":11,"tdur":10,"tts":622229},{"cat":"blink","pid":25863,"tid":25913,"ts":531358676472,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":622236},{"cat":"v8","pid":25863,"tid":25913,"ts":531358676477,"ph":"E","name":"V8.Execute","args":{},"tts":622241},{"cat":"sky","pid":25863,"tid":25913,"ts":531358676815,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1210,"tdur":1170,"tts":622424},{"cat":"blink","pid":25863,"tid":25913,"ts":531358676820,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":110,"tdur":110,"tts":622428},{"cat":"blink","pid":25863,"tid":25913,"ts":531358676823,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":2,"tts":622431},{"cat":"blink","pid":25863,"tid":25913,"ts":531358676827,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":39,"tdur":38,"tts":622435},{"cat":"blink","pid":25863,"tid":25913,"ts":531358676835,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":30,"tdur":30,"tts":622443},{"cat":"v8","pid":25863,"tid":25913,"ts":531358676850,"ph":"X","name":"v8.callFunction","args":{},"dur":12,"tdur":11,"tts":622458},{"cat":"v8","pid":25863,"tid":25913,"ts":531358676852,"ph":"B","name":"V8.Execute","args":{},"tts":622460},{"cat":"v8","pid":25863,"tid":25913,"ts":531358676860,"ph":"E","name":"V8.Execute","args":{},"tts":622468},{"cat":"v8","pid":25863,"tid":25913,"ts":531358676868,"ph":"X","name":"v8.callFunction","args":{},"dur":60,"tdur":59,"tts":622476},{"cat":"v8","pid":25863,"tid":25913,"ts":531358676870,"ph":"B","name":"V8.Execute","args":{},"tts":622478},{"cat":"blink","pid":25863,"tid":25913,"ts":531358676874,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":12,"tdur":11,"tts":622482},{"cat":"v8","pid":25863,"tid":25913,"ts":531358676924,"ph":"E","name":"V8.Execute","args":{},"tts":622533},{"cat":"blink","pid":25863,"tid":25913,"ts":531358676931,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":34,"tdur":34,"tts":622538},{"cat":"blink","pid":25863,"tid":25913,"ts":531358676933,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":622541},{"cat":"blink","pid":25863,"tid":25913,"ts":531358676934,"ph":"X","name":"Document::updateStyle","args":{},"dur":21,"tdur":20,"tts":622542},{"cat":"blink","pid":25863,"tid":25913,"ts":531358676955,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":622563},{"cat":"blink","pid":25863,"tid":25913,"ts":531358676960,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":4,"tts":622568},{"cat":"sky","pid":25863,"tid":25913,"ts":531358676966,"ph":"X","name":"Layer::Display","args":{},"dur":955,"tdur":954,"tts":622574},{"cat":"sky","pid":25863,"tid":25913,"ts":531358677922,"ph":"X","name":"LayerHost::Upload","args":{},"dur":102,"tdur":63,"tts":623530},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358678038,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":41,"tdur":41,"tts":623607},{"cat":"blink","pid":25863,"tid":25913,"ts":531358678042,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":32,"tdur":32,"tts":623611},{"cat":"v8","pid":25863,"tid":25913,"ts":531358678045,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":28,"tdur":28,"tts":623614},{"cat":"v8","pid":25863,"tid":25913,"ts":531358678048,"ph":"X","name":"v8.callFunction","args":{},"dur":24,"tdur":23,"tts":623617},{"cat":"v8","pid":25863,"tid":25913,"ts":531358678050,"ph":"B","name":"V8.Execute","args":{},"tts":623619},{"cat":"blink","pid":25863,"tid":25913,"ts":531358678058,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":11,"tdur":9,"tts":623628},{"cat":"blink","pid":25863,"tid":25913,"ts":531358678065,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":623634},{"cat":"v8","pid":25863,"tid":25913,"ts":531358678070,"ph":"E","name":"V8.Execute","args":{},"tts":623639},{"cat":"sky","pid":25863,"tid":25913,"ts":531358735602,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2183,"tdur":2002,"tts":623802},{"cat":"blink","pid":25863,"tid":25913,"ts":531358735606,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":108,"tdur":108,"tts":623806},{"cat":"blink","pid":25863,"tid":25913,"ts":531358735609,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":623809},{"cat":"blink","pid":25863,"tid":25913,"ts":531358735613,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":38,"tdur":37,"tts":623813},{"cat":"blink","pid":25863,"tid":25913,"ts":531358735621,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":30,"tdur":29,"tts":623821},{"cat":"v8","pid":25863,"tid":25913,"ts":531358735637,"ph":"X","name":"v8.callFunction","args":{},"dur":10,"tdur":10,"tts":623836},{"cat":"v8","pid":25863,"tid":25913,"ts":531358735639,"ph":"B","name":"V8.Execute","args":{},"tts":623838},{"cat":"v8","pid":25863,"tid":25913,"ts":531358735645,"ph":"E","name":"V8.Execute","args":{},"tts":623845},{"cat":"v8","pid":25863,"tid":25913,"ts":531358735653,"ph":"X","name":"v8.callFunction","args":{},"dur":59,"tdur":58,"tts":623853},{"cat":"v8","pid":25863,"tid":25913,"ts":531358735655,"ph":"B","name":"V8.Execute","args":{},"tts":623855},{"cat":"blink","pid":25863,"tid":25913,"ts":531358735663,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":11,"tdur":11,"tts":623862},{"cat":"v8","pid":25863,"tid":25913,"ts":531358735709,"ph":"E","name":"V8.Execute","args":{},"tts":623909},{"cat":"blink","pid":25863,"tid":25913,"ts":531358735715,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":31,"tdur":31,"tts":623914},{"cat":"blink","pid":25863,"tid":25913,"ts":531358735717,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":623916},{"cat":"blink","pid":25863,"tid":25913,"ts":531358735718,"ph":"X","name":"Document::updateStyle","args":{},"dur":20,"tdur":18,"tts":623918},{"cat":"blink","pid":25863,"tid":25913,"ts":531358735738,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":623938},{"cat":"blink","pid":25863,"tid":25913,"ts":531358735742,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":3,"tdur":4,"tts":623941},{"cat":"sky","pid":25863,"tid":25913,"ts":531358735747,"ph":"X","name":"Layer::Display","args":{},"dur":1728,"tdur":1727,"tts":623946},{"cat":"sky","pid":25863,"tid":25913,"ts":531358737477,"ph":"X","name":"LayerHost::Upload","args":{},"dur":308,"tdur":126,"tts":625677},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358737798,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":40,"tdur":39,"tts":625818},{"cat":"blink","pid":25863,"tid":25913,"ts":531358737803,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":30,"tdur":29,"tts":625823},{"cat":"v8","pid":25863,"tid":25913,"ts":531358737806,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":26,"tdur":26,"tts":625825},{"cat":"v8","pid":25863,"tid":25913,"ts":531358737808,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":22,"tts":625828},{"cat":"v8","pid":25863,"tid":25913,"ts":531358737810,"ph":"B","name":"V8.Execute","args":{},"tts":625829},{"cat":"blink","pid":25863,"tid":25913,"ts":531358737819,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":8,"tts":625839},{"cat":"blink","pid":25863,"tid":25913,"ts":531358737825,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":625844},{"cat":"v8","pid":25863,"tid":25913,"ts":531358737829,"ph":"E","name":"V8.Execute","args":{},"tts":625849},{"cat":"sky","pid":25863,"tid":25913,"ts":531358738217,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1091,"tdur":1015,"tts":626031},{"cat":"blink","pid":25863,"tid":25913,"ts":531358738221,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":96,"tdur":95,"tts":626035},{"cat":"blink","pid":25863,"tid":25913,"ts":531358738224,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":626038},{"cat":"blink","pid":25863,"tid":25913,"ts":531358738228,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":34,"tdur":34,"tts":626041},{"cat":"blink","pid":25863,"tid":25913,"ts":531358738234,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":27,"tdur":27,"tts":626048},{"cat":"v8","pid":25863,"tid":25913,"ts":531358738248,"ph":"X","name":"v8.callFunction","args":{},"dur":10,"tdur":9,"tts":626062},{"cat":"v8","pid":25863,"tid":25913,"ts":531358738250,"ph":"B","name":"V8.Execute","args":{},"tts":626063},{"cat":"v8","pid":25863,"tid":25913,"ts":531358738256,"ph":"E","name":"V8.Execute","args":{},"tts":626070},{"cat":"v8","pid":25863,"tid":25913,"ts":531358738264,"ph":"X","name":"v8.callFunction","args":{},"dur":51,"tdur":50,"tts":626078},{"cat":"v8","pid":25863,"tid":25913,"ts":531358738265,"ph":"B","name":"V8.Execute","args":{},"tts":626079},{"cat":"blink","pid":25863,"tid":25913,"ts":531358738269,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":10,"tdur":9,"tts":626083},{"cat":"v8","pid":25863,"tid":25913,"ts":531358738312,"ph":"E","name":"V8.Execute","args":{},"tts":626126},{"cat":"blink","pid":25863,"tid":25913,"ts":531358738317,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":30,"tdur":29,"tts":626131},{"cat":"blink","pid":25863,"tid":25913,"ts":531358738319,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":626133},{"cat":"blink","pid":25863,"tid":25913,"ts":531358738320,"ph":"X","name":"Document::updateStyle","args":{},"dur":18,"tdur":17,"tts":626134},{"cat":"blink","pid":25863,"tid":25913,"ts":531358738339,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":626152},{"cat":"blink","pid":25863,"tid":25913,"ts":531358738343,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":3,"tdur":3,"tts":626156},{"cat":"sky","pid":25863,"tid":25913,"ts":531358738347,"ph":"X","name":"Layer::Display","args":{},"dur":791,"tdur":790,"tts":626161},{"cat":"sky","pid":25863,"tid":25913,"ts":531358739139,"ph":"X","name":"LayerHost::Upload","args":{},"dur":168,"tdur":92,"tts":626953},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358739319,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":41,"tdur":41,"tts":627058},{"cat":"blink","pid":25863,"tid":25913,"ts":531358739324,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":32,"tdur":31,"tts":627063},{"cat":"v8","pid":25863,"tid":25913,"ts":531358739327,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":27,"tdur":28,"tts":627065},{"cat":"v8","pid":25863,"tid":25913,"ts":531358739329,"ph":"X","name":"v8.callFunction","args":{},"dur":24,"tdur":24,"tts":627068},{"cat":"v8","pid":25863,"tid":25913,"ts":531358739331,"ph":"B","name":"V8.Execute","args":{},"tts":627070},{"cat":"blink","pid":25863,"tid":25913,"ts":531358739340,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":11,"tdur":10,"tts":627079},{"cat":"blink","pid":25863,"tid":25913,"ts":531358739347,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":627086},{"cat":"v8","pid":25863,"tid":25913,"ts":531358739352,"ph":"E","name":"V8.Execute","args":{},"tts":627090},{"cat":"sky","pid":25863,"tid":25913,"ts":531358739724,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1110,"tdur":1052,"tts":627273},{"cat":"blink","pid":25863,"tid":25913,"ts":531358739728,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":111,"tdur":110,"tts":627277},{"cat":"blink","pid":25863,"tid":25913,"ts":531358739731,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":627280},{"cat":"blink","pid":25863,"tid":25913,"ts":531358739734,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":49,"tdur":48,"tts":627283},{"cat":"blink","pid":25863,"tid":25913,"ts":531358739741,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":42,"tdur":41,"tts":627290},{"cat":"v8","pid":25863,"tid":25913,"ts":531358739754,"ph":"X","name":"v8.callFunction","args":{},"dur":25,"tdur":24,"tts":627303},{"cat":"v8","pid":25863,"tid":25913,"ts":531358739756,"ph":"B","name":"V8.Execute","args":{},"tts":627305},{"cat":"v8","pid":25863,"tid":25913,"ts":531358739777,"ph":"E","name":"V8.Execute","args":{},"tts":627325},{"cat":"v8","pid":25863,"tid":25913,"ts":531358739785,"ph":"X","name":"v8.callFunction","args":{},"dur":52,"tdur":51,"tts":627334},{"cat":"v8","pid":25863,"tid":25913,"ts":531358739787,"ph":"B","name":"V8.Execute","args":{},"tts":627335},{"cat":"blink","pid":25863,"tid":25913,"ts":531358739791,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":10,"tdur":9,"tts":627339},{"cat":"v8","pid":25863,"tid":25913,"ts":531358739834,"ph":"E","name":"V8.Execute","args":{},"tts":627382},{"cat":"blink","pid":25863,"tid":25913,"ts":531358739839,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":30,"tdur":29,"tts":627388},{"cat":"blink","pid":25863,"tid":25913,"ts":531358739841,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":627389},{"cat":"blink","pid":25863,"tid":25913,"ts":531358739842,"ph":"X","name":"Document::updateStyle","args":{},"dur":18,"tdur":17,"tts":627391},{"cat":"blink","pid":25863,"tid":25913,"ts":531358739861,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":627409},{"cat":"blink","pid":25863,"tid":25913,"ts":531358739864,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":3,"tts":627413},{"cat":"sky","pid":25863,"tid":25913,"ts":531358739869,"ph":"X","name":"Layer::Display","args":{},"dur":817,"tdur":807,"tts":627418},{"cat":"sky","pid":25863,"tid":25913,"ts":531358740687,"ph":"X","name":"LayerHost::Upload","args":{},"dur":146,"tdur":96,"tts":628227},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358740846,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":42,"tdur":41,"tts":628337},{"cat":"blink","pid":25863,"tid":25913,"ts":531358740855,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":29,"tdur":28,"tts":628346},{"cat":"v8","pid":25863,"tid":25913,"ts":531358740857,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":25,"tdur":25,"tts":628348},{"cat":"v8","pid":25863,"tid":25913,"ts":531358740860,"ph":"X","name":"v8.callFunction","args":{},"dur":21,"tdur":21,"tts":628351},{"cat":"v8","pid":25863,"tid":25913,"ts":531358740862,"ph":"B","name":"V8.Execute","args":{},"tts":628353},{"cat":"blink","pid":25863,"tid":25913,"ts":531358740870,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":8,"tts":628361},{"cat":"blink","pid":25863,"tid":25913,"ts":531358740875,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":628366},{"cat":"v8","pid":25863,"tid":25913,"ts":531358740880,"ph":"E","name":"V8.Execute","args":{},"tts":628370},{"cat":"sky","pid":25863,"tid":25913,"ts":531358741225,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1046,"tdur":1011,"tts":628548},{"cat":"blink","pid":25863,"tid":25913,"ts":531358741229,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":95,"tdur":94,"tts":628551},{"cat":"blink","pid":25863,"tid":25913,"ts":531358741232,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":2,"tts":628554},{"cat":"blink","pid":25863,"tid":25913,"ts":531358741235,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":34,"tdur":34,"tts":628557},{"cat":"blink","pid":25863,"tid":25913,"ts":531358741242,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":27,"tdur":26,"tts":628564},{"cat":"v8","pid":25863,"tid":25913,"ts":531358741255,"ph":"X","name":"v8.callFunction","args":{},"dur":10,"tdur":10,"tts":628577},{"cat":"v8","pid":25863,"tid":25913,"ts":531358741257,"ph":"B","name":"V8.Execute","args":{},"tts":628579},{"cat":"v8","pid":25863,"tid":25913,"ts":531358741263,"ph":"E","name":"V8.Execute","args":{},"tts":628586},{"cat":"v8","pid":25863,"tid":25913,"ts":531358741271,"ph":"X","name":"v8.callFunction","args":{},"dur":50,"tdur":50,"tts":628593},{"cat":"v8","pid":25863,"tid":25913,"ts":531358741272,"ph":"B","name":"V8.Execute","args":{},"tts":628595},{"cat":"blink","pid":25863,"tid":25913,"ts":531358741276,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":10,"tdur":9,"tts":628598},{"cat":"v8","pid":25863,"tid":25913,"ts":531358741319,"ph":"E","name":"V8.Execute","args":{},"tts":628641},{"cat":"blink","pid":25863,"tid":25913,"ts":531358741324,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":29,"tdur":29,"tts":628646},{"cat":"blink","pid":25863,"tid":25913,"ts":531358741326,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":628648},{"cat":"blink","pid":25863,"tid":25913,"ts":531358741327,"ph":"X","name":"Document::updateStyle","args":{},"dur":18,"tdur":17,"tts":628649},{"cat":"blink","pid":25863,"tid":25913,"ts":531358741345,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":628667},{"cat":"blink","pid":25863,"tid":25913,"ts":531358741349,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":4,"tts":628671},{"cat":"sky","pid":25863,"tid":25913,"ts":531358741354,"ph":"X","name":"Layer::Display","args":{},"dur":793,"tdur":792,"tts":628676},{"cat":"sky","pid":25863,"tid":25913,"ts":531358742148,"ph":"X","name":"LayerHost::Upload","args":{},"dur":122,"tdur":87,"tts":629471},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358742317,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":40,"tdur":39,"tts":629607},{"cat":"blink","pid":25863,"tid":25913,"ts":531358742322,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":30,"tdur":29,"tts":629612},{"cat":"v8","pid":25863,"tid":25913,"ts":531358742325,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":26,"tdur":26,"tts":629614},{"cat":"v8","pid":25863,"tid":25913,"ts":531358742327,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":22,"tts":629617},{"cat":"v8","pid":25863,"tid":25913,"ts":531358742329,"ph":"B","name":"V8.Execute","args":{},"tts":629618},{"cat":"blink","pid":25863,"tid":25913,"ts":531358742337,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":10,"tdur":9,"tts":629627},{"cat":"blink","pid":25863,"tid":25913,"ts":531358742344,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":629633},{"cat":"v8","pid":25863,"tid":25913,"ts":531358742348,"ph":"E","name":"V8.Execute","args":{},"tts":629637},{"cat":"sky","pid":25863,"tid":25913,"ts":531358820252,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2930,"tdur":2772,"tts":629769},{"cat":"blink","pid":25863,"tid":25913,"ts":531358820257,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":258,"tdur":258,"tts":629772},{"cat":"blink","pid":25863,"tid":25913,"ts":531358820260,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":1,"tdur":1,"tts":629775},{"cat":"blink","pid":25863,"tid":25913,"ts":531358820263,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":82,"tdur":82,"tts":629778},{"cat":"blink","pid":25863,"tid":25913,"ts":531358820270,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":74,"tdur":74,"tts":629785},{"cat":"v8","pid":25863,"tid":25913,"ts":531358820311,"ph":"X","name":"v8.callFunction","args":{},"dur":26,"tdur":25,"tts":629827},{"cat":"v8","pid":25863,"tid":25913,"ts":531358820316,"ph":"B","name":"V8.Execute","args":{},"tts":629831},{"cat":"v8","pid":25863,"tid":25913,"ts":531358820333,"ph":"E","name":"V8.Execute","args":{},"tts":629848},{"cat":"v8","pid":25863,"tid":25913,"ts":531358820350,"ph":"X","name":"v8.callFunction","args":{},"dur":162,"tdur":162,"tts":629866},{"cat":"v8","pid":25863,"tid":25913,"ts":531358820353,"ph":"B","name":"V8.Execute","args":{},"tts":629869},{"cat":"blink","pid":25863,"tid":25913,"ts":531358820362,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":23,"tdur":22,"tts":629878},{"cat":"v8","pid":25863,"tid":25913,"ts":531358820509,"ph":"E","name":"V8.Execute","args":{},"tts":630025},{"cat":"blink","pid":25863,"tid":25913,"ts":531358820515,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":652,"tdur":652,"tts":630030},{"cat":"blink","pid":25863,"tid":25913,"ts":531358820517,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":630032},{"cat":"blink","pid":25863,"tid":25913,"ts":531358820518,"ph":"X","name":"Document::updateStyle","args":{},"dur":111,"tdur":109,"tts":630034},{"cat":"blink","pid":25863,"tid":25913,"ts":531358820631,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":2},"tts":630147},{"cat":"blink","pid":25863,"tid":25913,"ts":531358820636,"ph":"X","name":"FrameView::layout","args":{},"dur":56,"tdur":55,"tts":630152},{"cat":"blink","pid":25863,"tid":25913,"ts":531358820639,"ph":"X","name":"FrameView::performPreLayoutTasks","args":{},"dur":4,"tdur":3,"tts":630155},{"cat":"blink","pid":25863,"tid":25913,"ts":531358820645,"ph":"X","name":"FrameView::performLayout","args":{},"dur":35,"tdur":35,"tts":630160},{"cat":"blink","pid":25863,"tid":25913,"ts":531358820680,"ph":"X","name":"RenderLayer::updateLayerPositionsAfterLayout","args":{},"dur":3,"tdur":2,"tts":630196},{"cat":"blink","pid":25863,"tid":25913,"ts":531358820683,"ph":"X","name":"FrameView::performPostLayoutTasks","args":{},"dur":7,"tdur":7,"tts":630198},{"cat":"blink","pid":25863,"tid":25913,"ts":531358820695,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":470,"tdur":469,"tts":630210},{"cat":"sky","pid":25863,"tid":25913,"ts":531358821169,"ph":"X","name":"Layer::Display","args":{},"dur":1666,"tdur":1663,"tts":630685},{"cat":"sky","pid":25863,"tid":25913,"ts":531358822837,"ph":"X","name":"LayerHost::Upload","args":{},"dur":343,"tdur":185,"tts":632353},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358823209,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":73,"tdur":72,"tts":632569},{"cat":"blink","pid":25863,"tid":25913,"ts":531358823220,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":57,"tdur":56,"tts":632580},{"cat":"v8","pid":25863,"tid":25913,"ts":531358823226,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":50,"tdur":49,"tts":632586},{"cat":"v8","pid":25863,"tid":25913,"ts":531358823232,"ph":"X","name":"v8.callFunction","args":{},"dur":43,"tdur":42,"tts":632592},{"cat":"v8","pid":25863,"tid":25913,"ts":531358823236,"ph":"B","name":"V8.Execute","args":{},"tts":632595},{"cat":"blink","pid":25863,"tid":25913,"ts":531358823260,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":12,"tdur":11,"tts":632620},{"cat":"blink","pid":25863,"tid":25913,"ts":531358823269,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":632628},{"cat":"v8","pid":25863,"tid":25913,"ts":531358823273,"ph":"E","name":"V8.Execute","args":{},"tts":632633},{"cat":"sky","pid":25863,"tid":25913,"ts":531358823650,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1043,"tdur":953,"tts":632803},{"cat":"blink","pid":25863,"tid":25913,"ts":531358823654,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":88,"tdur":88,"tts":632806},{"cat":"blink","pid":25863,"tid":25913,"ts":531358823657,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":1,"tdur":1,"tts":632809},{"cat":"blink","pid":25863,"tid":25913,"ts":531358823660,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":31,"tdur":31,"tts":632812},{"cat":"blink","pid":25863,"tid":25913,"ts":531358823666,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":25,"tdur":23,"tts":632819},{"cat":"v8","pid":25863,"tid":25913,"ts":531358823678,"ph":"X","name":"v8.callFunction","args":{},"dur":10,"tdur":10,"tts":632830},{"cat":"v8","pid":25863,"tid":25913,"ts":531358823680,"ph":"B","name":"V8.Execute","args":{},"tts":632832},{"cat":"v8","pid":25863,"tid":25913,"ts":531358823686,"ph":"E","name":"V8.Execute","args":{},"tts":632838},{"cat":"v8","pid":25863,"tid":25913,"ts":531358823693,"ph":"X","name":"v8.callFunction","args":{},"dur":47,"tdur":47,"tts":632845},{"cat":"v8","pid":25863,"tid":25913,"ts":531358823694,"ph":"B","name":"V8.Execute","args":{},"tts":632847},{"cat":"blink","pid":25863,"tid":25913,"ts":531358823698,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":8,"tdur":8,"tts":632850},{"cat":"v8","pid":25863,"tid":25913,"ts":531358823738,"ph":"E","name":"V8.Execute","args":{},"tts":632890},{"cat":"blink","pid":25863,"tid":25913,"ts":531358823743,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":27,"tdur":27,"tts":632895},{"cat":"blink","pid":25863,"tid":25913,"ts":531358823744,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":632897},{"cat":"blink","pid":25863,"tid":25913,"ts":531358823746,"ph":"X","name":"Document::updateStyle","args":{},"dur":16,"tdur":16,"tts":632898},{"cat":"blink","pid":25863,"tid":25913,"ts":531358823762,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":632915},{"cat":"blink","pid":25863,"tid":25913,"ts":531358823766,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":3,"tdur":2,"tts":632919},{"cat":"sky","pid":25863,"tid":25913,"ts":531358823771,"ph":"X","name":"Layer::Display","args":{},"dur":748,"tdur":740,"tts":632923},{"cat":"sky","pid":25863,"tid":25913,"ts":531358824520,"ph":"X","name":"LayerHost::Upload","args":{},"dur":172,"tdur":90,"tts":633665},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358824767,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":37,"tdur":36,"tts":633809},{"cat":"blink","pid":25863,"tid":25913,"ts":531358824772,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":28,"tdur":27,"tts":633814},{"cat":"v8","pid":25863,"tid":25913,"ts":531358824774,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":25,"tdur":24,"tts":633816},{"cat":"v8","pid":25863,"tid":25913,"ts":531358824777,"ph":"X","name":"v8.callFunction","args":{},"dur":21,"tdur":21,"tts":633818},{"cat":"v8","pid":25863,"tid":25913,"ts":531358824778,"ph":"B","name":"V8.Execute","args":{},"tts":633820},{"cat":"blink","pid":25863,"tid":25913,"ts":531358824786,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":8,"tts":633828},{"cat":"blink","pid":25863,"tid":25913,"ts":531358824792,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":633834},{"cat":"v8","pid":25863,"tid":25913,"ts":531358824796,"ph":"E","name":"V8.Execute","args":{},"tts":633838},{"cat":"sky","pid":25863,"tid":25913,"ts":531358825133,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1598,"tdur":1532,"tts":633993},{"cat":"blink","pid":25863,"tid":25913,"ts":531358825137,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":280,"tdur":279,"tts":633996},{"cat":"blink","pid":25863,"tid":25913,"ts":531358825140,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":1,"tdur":2,"tts":633998},{"cat":"blink","pid":25863,"tid":25913,"ts":531358825143,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":31,"tdur":31,"tts":634001},{"cat":"blink","pid":25863,"tid":25913,"ts":531358825149,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":25,"tdur":24,"tts":634008},{"cat":"v8","pid":25863,"tid":25913,"ts":531358825161,"ph":"X","name":"v8.callFunction","args":{},"dur":9,"tdur":9,"tts":634020},{"cat":"v8","pid":25863,"tid":25913,"ts":531358825163,"ph":"B","name":"V8.Execute","args":{},"tts":634021},{"cat":"v8","pid":25863,"tid":25913,"ts":531358825169,"ph":"E","name":"V8.Execute","args":{},"tts":634027},{"cat":"v8","pid":25863,"tid":25913,"ts":531358825176,"ph":"X","name":"v8.callFunction","args":{},"dur":238,"tdur":237,"tts":634034},{"cat":"v8","pid":25863,"tid":25913,"ts":531358825177,"ph":"B","name":"V8.Execute","args":{},"tts":634036},{"cat":"blink","pid":25863,"tid":25913,"ts":531358825181,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":9,"tdur":9,"tts":634039},{"cat":"v8","pid":25863,"tid":25913,"ts":531358825329,"ph":"E","name":"V8.Execute","args":{},"tts":634188},{"cat":"blink","pid":25863,"tid":25913,"ts":531358825417,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":420,"tdur":419,"tts":634276},{"cat":"blink","pid":25863,"tid":25913,"ts":531358825420,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":634278},{"cat":"blink","pid":25863,"tid":25913,"ts":531358825421,"ph":"X","name":"Document::updateStyle","args":{},"dur":83,"tdur":82,"tts":634280},{"cat":"blink","pid":25863,"tid":25913,"ts":531358825505,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":6},"tts":634364},{"cat":"blink","pid":25863,"tid":25913,"ts":531358825507,"ph":"X","name":"FrameView::layout","args":{},"dur":130,"tdur":129,"tts":634366},{"cat":"blink","pid":25863,"tid":25913,"ts":531358825509,"ph":"X","name":"FrameView::performPreLayoutTasks","args":{},"dur":1,"tdur":1,"tts":634367},{"cat":"blink","pid":25863,"tid":25913,"ts":531358825511,"ph":"X","name":"FrameView::performLayout","args":{},"dur":117,"tdur":117,"tts":634369},{"cat":"blink","pid":25863,"tid":25913,"ts":531358825629,"ph":"X","name":"RenderLayer::updateLayerPositionsAfterLayout","args":{},"dur":3,"tdur":2,"tts":634488},{"cat":"blink","pid":25863,"tid":25913,"ts":531358825632,"ph":"X","name":"FrameView::performPostLayoutTasks","args":{},"dur":4,"tdur":3,"tts":634491},{"cat":"blink","pid":25863,"tid":25913,"ts":531358825639,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":197,"tdur":196,"tts":634498},{"cat":"sky","pid":25863,"tid":25913,"ts":531358825838,"ph":"X","name":"Layer::Display","args":{},"dur":737,"tdur":737,"tts":634696},{"cat":"sky","pid":25863,"tid":25913,"ts":531358826576,"ph":"X","name":"LayerHost::Upload","args":{},"dur":154,"tdur":88,"tts":635435},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358826742,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":36,"tdur":35,"tts":635536},{"cat":"blink","pid":25863,"tid":25913,"ts":531358826746,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":27,"tdur":27,"tts":635540},{"cat":"v8","pid":25863,"tid":25913,"ts":531358826749,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":23,"tdur":23,"tts":635543},{"cat":"v8","pid":25863,"tid":25913,"ts":531358826751,"ph":"X","name":"v8.callFunction","args":{},"dur":20,"tdur":20,"tts":635545},{"cat":"v8","pid":25863,"tid":25913,"ts":531358826753,"ph":"B","name":"V8.Execute","args":{},"tts":635547},{"cat":"blink","pid":25863,"tid":25913,"ts":531358826760,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":8,"tts":635554},{"cat":"blink","pid":25863,"tid":25913,"ts":531358826766,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":2,"tdur":2,"tts":635560},{"cat":"v8","pid":25863,"tid":25913,"ts":531358826770,"ph":"E","name":"V8.Execute","args":{},"tts":635564},{"cat":"sky","pid":25863,"tid":25913,"ts":531358827111,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1015,"tdur":958,"tts":635740},{"cat":"blink","pid":25863,"tid":25913,"ts":531358827115,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":95,"tdur":94,"tts":635743},{"cat":"blink","pid":25863,"tid":25913,"ts":531358827117,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":11,"tdur":10,"tts":635745},{"cat":"blink","pid":25863,"tid":25913,"ts":531358827129,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":30,"tdur":29,"tts":635757},{"cat":"blink","pid":25863,"tid":25913,"ts":531358827134,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":24,"tdur":24,"tts":635762},{"cat":"v8","pid":25863,"tid":25913,"ts":531358827146,"ph":"X","name":"v8.callFunction","args":{},"dur":9,"tdur":9,"tts":635774},{"cat":"v8","pid":25863,"tid":25913,"ts":531358827147,"ph":"B","name":"V8.Execute","args":{},"tts":635775},{"cat":"v8","pid":25863,"tid":25913,"ts":531358827153,"ph":"E","name":"V8.Execute","args":{},"tts":635782},{"cat":"v8","pid":25863,"tid":25913,"ts":531358827160,"ph":"X","name":"v8.callFunction","args":{},"dur":48,"tdur":47,"tts":635788},{"cat":"v8","pid":25863,"tid":25913,"ts":531358827162,"ph":"B","name":"V8.Execute","args":{},"tts":635790},{"cat":"blink","pid":25863,"tid":25913,"ts":531358827165,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":9,"tdur":9,"tts":635793},{"cat":"v8","pid":25863,"tid":25913,"ts":531358827205,"ph":"E","name":"V8.Execute","args":{},"tts":635833},{"cat":"blink","pid":25863,"tid":25913,"ts":531358827210,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":32,"tdur":32,"tts":635838},{"cat":"blink","pid":25863,"tid":25913,"ts":531358827212,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":635840},{"cat":"blink","pid":25863,"tid":25913,"ts":531358827213,"ph":"X","name":"Document::updateStyle","args":{},"dur":21,"tdur":20,"tts":635841},{"cat":"blink","pid":25863,"tid":25913,"ts":531358827234,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":635862},{"cat":"blink","pid":25863,"tid":25913,"ts":531358827238,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":3,"tdur":3,"tts":635866},{"cat":"sky","pid":25863,"tid":25913,"ts":531358827243,"ph":"X","name":"Layer::Display","args":{},"dur":732,"tdur":731,"tts":635871},{"cat":"sky","pid":25863,"tid":25913,"ts":531358827976,"ph":"X","name":"LayerHost::Upload","args":{},"dur":149,"tdur":93,"tts":636604},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358828263,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":37,"tdur":36,"tts":636761},{"cat":"blink","pid":25863,"tid":25913,"ts":531358828268,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":27,"tdur":28,"tts":636765},{"cat":"v8","pid":25863,"tid":25913,"ts":531358828270,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":24,"tdur":24,"tts":636767},{"cat":"v8","pid":25863,"tid":25913,"ts":531358828273,"ph":"X","name":"v8.callFunction","args":{},"dur":20,"tdur":20,"tts":636770},{"cat":"v8","pid":25863,"tid":25913,"ts":531358828274,"ph":"B","name":"V8.Execute","args":{},"tts":636772},{"cat":"blink","pid":25863,"tid":25913,"ts":531358828282,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":9,"tts":636779},{"cat":"blink","pid":25863,"tid":25913,"ts":531358828288,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":2,"tdur":3,"tts":636785},{"cat":"v8","pid":25863,"tid":25913,"ts":531358828292,"ph":"E","name":"V8.Execute","args":{},"tts":636789},{"cat":"sky","pid":25863,"tid":25913,"ts":531358902089,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1531,"tdur":1443,"tts":636910},{"cat":"blink","pid":25863,"tid":25913,"ts":531358902099,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":245,"tdur":244,"tts":636919},{"cat":"blink","pid":25863,"tid":25913,"ts":531358902107,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":3,"tdur":3,"tts":636927},{"cat":"blink","pid":25863,"tid":25913,"ts":531358902116,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":91,"tdur":92,"tts":636935},{"cat":"blink","pid":25863,"tid":25913,"ts":531358902134,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":73,"tdur":72,"tts":636954},{"cat":"v8","pid":25863,"tid":25913,"ts":531358902176,"ph":"X","name":"v8.callFunction","args":{},"dur":27,"tdur":26,"tts":636996},{"cat":"v8","pid":25863,"tid":25913,"ts":531358902179,"ph":"B","name":"V8.Execute","args":{},"tts":636999},{"cat":"v8","pid":25863,"tid":25913,"ts":531358902200,"ph":"E","name":"V8.Execute","args":{},"tts":637019},{"cat":"v8","pid":25863,"tid":25913,"ts":531358902211,"ph":"X","name":"v8.callFunction","args":{},"dur":130,"tdur":130,"tts":637031},{"cat":"v8","pid":25863,"tid":25913,"ts":531358902213,"ph":"B","name":"V8.Execute","args":{},"tts":637033},{"cat":"blink","pid":25863,"tid":25913,"ts":531358902223,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":28,"tdur":29,"tts":637042},{"cat":"v8","pid":25863,"tid":25913,"ts":531358902338,"ph":"E","name":"V8.Execute","args":{},"tts":637159},{"cat":"blink","pid":25863,"tid":25913,"ts":531358902344,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":73,"tdur":73,"tts":637164},{"cat":"blink","pid":25863,"tid":25913,"ts":531358902347,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":637167},{"cat":"blink","pid":25863,"tid":25913,"ts":531358902348,"ph":"X","name":"Document::updateStyle","args":{},"dur":53,"tdur":52,"tts":637168},{"cat":"blink","pid":25863,"tid":25913,"ts":531358902402,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":637221},{"cat":"blink","pid":25863,"tid":25913,"ts":531358902410,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":7,"tdur":6,"tts":637230},{"cat":"sky","pid":25863,"tid":25913,"ts":531358902419,"ph":"X","name":"Layer::Display","args":{},"dur":983,"tdur":982,"tts":637239},{"cat":"sky","pid":25863,"tid":25913,"ts":531358903403,"ph":"X","name":"LayerHost::Upload","args":{},"dur":216,"tdur":129,"tts":638223},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358903638,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":47,"tdur":46,"tts":638372},{"cat":"blink","pid":25863,"tid":25913,"ts":531358903644,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":36,"tdur":36,"tts":638377},{"cat":"v8","pid":25863,"tid":25913,"ts":531358903647,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":32,"tdur":32,"tts":638380},{"cat":"v8","pid":25863,"tid":25913,"ts":531358903650,"ph":"X","name":"v8.callFunction","args":{},"dur":28,"tdur":28,"tts":638383},{"cat":"v8","pid":25863,"tid":25913,"ts":531358903651,"ph":"B","name":"V8.Execute","args":{},"tts":638385},{"cat":"blink","pid":25863,"tid":25913,"ts":531358903666,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":8,"tts":638400},{"cat":"blink","pid":25863,"tid":25913,"ts":531358903672,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":638405},{"cat":"v8","pid":25863,"tid":25913,"ts":531358903676,"ph":"E","name":"V8.Execute","args":{},"tts":638409},{"cat":"sky","pid":25863,"tid":25913,"ts":531358904153,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1016,"tdur":947,"tts":638586},{"cat":"blink","pid":25863,"tid":25913,"ts":531358904157,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":89,"tdur":88,"tts":638589},{"cat":"blink","pid":25863,"tid":25913,"ts":531358904160,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":1,"tdur":1,"tts":638592},{"cat":"blink","pid":25863,"tid":25913,"ts":531358904163,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":31,"tdur":31,"tts":638595},{"cat":"blink","pid":25863,"tid":25913,"ts":531358904169,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":25,"tdur":25,"tts":638601},{"cat":"v8","pid":25863,"tid":25913,"ts":531358904181,"ph":"X","name":"v8.callFunction","args":{},"dur":10,"tdur":10,"tts":638613},{"cat":"v8","pid":25863,"tid":25913,"ts":531358904183,"ph":"B","name":"V8.Execute","args":{},"tts":638615},{"cat":"v8","pid":25863,"tid":25913,"ts":531358904189,"ph":"E","name":"V8.Execute","args":{},"tts":638621},{"cat":"v8","pid":25863,"tid":25913,"ts":531358904196,"ph":"X","name":"v8.callFunction","args":{},"dur":48,"tdur":48,"tts":638628},{"cat":"v8","pid":25863,"tid":25913,"ts":531358904198,"ph":"B","name":"V8.Execute","args":{},"tts":638630},{"cat":"blink","pid":25863,"tid":25913,"ts":531358904201,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":9,"tdur":9,"tts":638633},{"cat":"v8","pid":25863,"tid":25913,"ts":531358904241,"ph":"E","name":"V8.Execute","args":{},"tts":638674},{"cat":"blink","pid":25863,"tid":25913,"ts":531358904246,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":36,"tdur":36,"tts":638678},{"cat":"blink","pid":25863,"tid":25913,"ts":531358904256,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":638688},{"cat":"blink","pid":25863,"tid":25913,"ts":531358904257,"ph":"X","name":"Document::updateStyle","args":{},"dur":17,"tdur":17,"tts":638689},{"cat":"blink","pid":25863,"tid":25913,"ts":531358904274,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":638706},{"cat":"blink","pid":25863,"tid":25913,"ts":531358904278,"ph":"X","name":"FrameView::invalidateTree","args":{"root":"��ף&+"},"dur":4,"tdur":3,"tts":638710},{"cat":"sky","pid":25863,"tid":25913,"ts":531358904283,"ph":"X","name":"Layer::Display","args":{},"dur":725,"tdur":724,"tts":638715},{"cat":"sky","pid":25863,"tid":25913,"ts":531358905009,"ph":"X","name":"LayerHost::Upload","args":{},"dur":159,"tdur":91,"tts":639441},{"cat":"sky","pid":25863,"tid":25913,"ts":531358905550,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":977,"tdur":927,"tts":639731},{"cat":"blink","pid":25863,"tid":25913,"ts":531358905554,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":84,"tdur":83,"tts":639734},{"cat":"blink","pid":25863,"tid":25913,"ts":531358905556,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":639737},{"cat":"blink","pid":25863,"tid":25913,"ts":531358905559,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":31,"tdur":31,"tts":639739},{"cat":"blink","pid":25863,"tid":25913,"ts":531358905565,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":25,"tdur":24,"tts":639746},{"cat":"v8","pid":25863,"tid":25913,"ts":531358905577,"ph":"X","name":"v8.callFunction","args":{},"dur":10,"tdur":9,"tts":639758},{"cat":"v8","pid":25863,"tid":25913,"ts":531358905579,"ph":"B","name":"V8.Execute","args":{},"tts":639759},{"cat":"v8","pid":25863,"tid":25913,"ts":531358905585,"ph":"E","name":"V8.Execute","args":{},"tts":639765},{"cat":"v8","pid":25863,"tid":25913,"ts":531358905592,"ph":"X","name":"v8.callFunction","args":{},"dur":44,"tdur":43,"tts":639772},{"cat":"v8","pid":25863,"tid":25913,"ts":531358905594,"ph":"B","name":"V8.Execute","args":{},"tts":639774},{"cat":"blink","pid":25863,"tid":25913,"ts":531358905597,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":9,"tdur":9,"tts":639777},{"cat":"v8","pid":25863,"tid":25913,"ts":531358905633,"ph":"E","name":"V8.Execute","args":{},"tts":639813},{"cat":"blink","pid":25863,"tid":25913,"ts":531358905638,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":27,"tdur":27,"tts":639818},{"cat":"blink","pid":25863,"tid":25913,"ts":531358905640,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":639820},{"cat":"blink","pid":25863,"tid":25913,"ts":531358905641,"ph":"X","name":"Document::updateStyle","args":{},"dur":16,"tdur":16,"tts":639821},{"cat":"blink","pid":25863,"tid":25913,"ts":531358905658,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":639838},{"cat":"blink","pid":25863,"tid":25913,"ts":531358905661,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":3,"tts":639842},{"cat":"sky","pid":25863,"tid":25913,"ts":531358905666,"ph":"X","name":"Layer::Display","args":{},"dur":728,"tdur":727,"tts":639846},{"cat":"sky","pid":25863,"tid":25913,"ts":531358906395,"ph":"X","name":"LayerHost::Upload","args":{},"dur":131,"tdur":82,"tts":640575},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358906537,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":35,"tdur":35,"tts":640669},{"cat":"blink","pid":25863,"tid":25913,"ts":531358906541,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":27,"tdur":27,"tts":640673},{"cat":"v8","pid":25863,"tid":25913,"ts":531358906544,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":23,"tdur":23,"tts":640676},{"cat":"v8","pid":25863,"tid":25913,"ts":531358906546,"ph":"X","name":"v8.callFunction","args":{},"dur":20,"tdur":20,"tts":640678},{"cat":"v8","pid":25863,"tid":25913,"ts":531358906548,"ph":"B","name":"V8.Execute","args":{},"tts":640680},{"cat":"blink","pid":25863,"tid":25913,"ts":531358906555,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":8,"tdur":8,"tts":640687},{"cat":"blink","pid":25863,"tid":25913,"ts":531358906560,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":640693},{"cat":"v8","pid":25863,"tid":25913,"ts":531358906564,"ph":"E","name":"V8.Execute","args":{},"tts":640696},{"cat":"sky","pid":25863,"tid":25913,"ts":531358906884,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":979,"tdur":927,"tts":640868},{"cat":"blink","pid":25863,"tid":25913,"ts":531358906888,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":89,"tdur":89,"tts":640871},{"cat":"blink","pid":25863,"tid":25913,"ts":531358906890,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":2,"tts":640873},{"cat":"blink","pid":25863,"tid":25913,"ts":531358906893,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":32,"tdur":31,"tts":640876},{"cat":"blink","pid":25863,"tid":25913,"ts":531358906900,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":24,"tdur":24,"tts":640883},{"cat":"v8","pid":25863,"tid":25913,"ts":531358906912,"ph":"X","name":"v8.callFunction","args":{},"dur":9,"tdur":9,"tts":640895},{"cat":"v8","pid":25863,"tid":25913,"ts":531358906913,"ph":"B","name":"V8.Execute","args":{},"tts":640896},{"cat":"v8","pid":25863,"tid":25913,"ts":531358906919,"ph":"E","name":"V8.Execute","args":{},"tts":640902},{"cat":"v8","pid":25863,"tid":25913,"ts":531358906926,"ph":"X","name":"v8.callFunction","args":{},"dur":49,"tdur":48,"tts":640910},{"cat":"v8","pid":25863,"tid":25913,"ts":531358906928,"ph":"B","name":"V8.Execute","args":{},"tts":640911},{"cat":"blink","pid":25863,"tid":25913,"ts":531358906931,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":14,"tdur":14,"tts":640914},{"cat":"v8","pid":25863,"tid":25913,"ts":531358906972,"ph":"E","name":"V8.Execute","args":{},"tts":640955},{"cat":"blink","pid":25863,"tid":25913,"ts":531358906977,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":28,"tdur":27,"tts":640960},{"cat":"blink","pid":25863,"tid":25913,"ts":531358906979,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":640962},{"cat":"blink","pid":25863,"tid":25913,"ts":531358906980,"ph":"X","name":"Document::updateStyle","args":{},"dur":17,"tdur":16,"tts":640963},{"cat":"blink","pid":25863,"tid":25913,"ts":531358906997,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":640980},{"cat":"blink","pid":25863,"tid":25913,"ts":531358907001,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":3,"tdur":3,"tts":640984},{"cat":"sky","pid":25863,"tid":25913,"ts":531358907005,"ph":"X","name":"Layer::Display","args":{},"dur":724,"tdur":723,"tts":640988},{"cat":"sky","pid":25863,"tid":25913,"ts":531358907730,"ph":"X","name":"LayerHost::Upload","args":{},"dur":132,"tdur":81,"tts":641713},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358907873,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":36,"tdur":36,"tts":641806},{"cat":"blink","pid":25863,"tid":25913,"ts":531358907877,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":27,"tdur":27,"tts":641810},{"cat":"v8","pid":25863,"tid":25913,"ts":531358907880,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":23,"tdur":23,"tts":641813},{"cat":"v8","pid":25863,"tid":25913,"ts":531358907882,"ph":"X","name":"v8.callFunction","args":{},"dur":20,"tdur":20,"tts":641815},{"cat":"v8","pid":25863,"tid":25913,"ts":531358907884,"ph":"B","name":"V8.Execute","args":{},"tts":641817},{"cat":"blink","pid":25863,"tid":25913,"ts":531358907892,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":8,"tdur":8,"tts":641825},{"cat":"blink","pid":25863,"tid":25913,"ts":531358907897,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":2,"tdur":2,"tts":641830},{"cat":"v8","pid":25863,"tid":25913,"ts":531358907901,"ph":"E","name":"V8.Execute","args":{},"tts":641834},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358908986,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":46,"tdur":46,"tts":641983},{"cat":"blink","pid":25863,"tid":25913,"ts":531358908991,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":36,"tdur":35,"tts":641988},{"cat":"v8","pid":25863,"tid":25913,"ts":531358908994,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":31,"tdur":31,"tts":641991},{"cat":"v8","pid":25863,"tid":25913,"ts":531358908996,"ph":"X","name":"v8.callFunction","args":{},"dur":28,"tdur":28,"tts":641993},{"cat":"v8","pid":25863,"tid":25913,"ts":531358909007,"ph":"B","name":"V8.Execute","args":{},"tts":642004},{"cat":"blink","pid":25863,"tid":25913,"ts":531358909014,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":8,"tdur":8,"tts":642011},{"cat":"blink","pid":25863,"tid":25913,"ts":531358909019,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":2,"tdur":2,"tts":642016},{"cat":"v8","pid":25863,"tid":25913,"ts":531358909023,"ph":"E","name":"V8.Execute","args":{},"tts":642020},{"cat":"sky","pid":25863,"tid":25913,"ts":531358971040,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":3082,"tdur":2904,"tts":642158},{"cat":"blink","pid":25863,"tid":25913,"ts":531358971051,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":387,"tdur":387,"tts":642167},{"cat":"blink","pid":25863,"tid":25913,"ts":531358971060,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":3,"tdur":2,"tts":642177},{"cat":"blink","pid":25863,"tid":25913,"ts":531358971069,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":146,"tdur":147,"tts":642185},{"cat":"blink","pid":25863,"tid":25913,"ts":531358971099,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":116,"tdur":115,"tts":642216},{"cat":"v8","pid":25863,"tid":25913,"ts":531358971163,"ph":"X","name":"v8.callFunction","args":{},"dur":42,"tdur":42,"tts":642280},{"cat":"v8","pid":25863,"tid":25913,"ts":531358971168,"ph":"B","name":"V8.Execute","args":{},"tts":642285},{"cat":"v8","pid":25863,"tid":25913,"ts":531358971200,"ph":"E","name":"V8.Execute","args":{},"tts":642317},{"cat":"v8","pid":25863,"tid":25913,"ts":531358971223,"ph":"X","name":"v8.callFunction","args":{},"dur":209,"tdur":208,"tts":642340},{"cat":"v8","pid":25863,"tid":25913,"ts":531358971227,"ph":"B","name":"V8.Execute","args":{},"tts":642343},{"cat":"blink","pid":25863,"tid":25913,"ts":531358971242,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":44,"tdur":43,"tts":642359},{"cat":"v8","pid":25863,"tid":25913,"ts":531358971426,"ph":"E","name":"V8.Execute","args":{},"tts":642543},{"cat":"blink","pid":25863,"tid":25913,"ts":531358971439,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":117,"tdur":116,"tts":642556},{"cat":"blink","pid":25863,"tid":25913,"ts":531358971444,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":642561},{"cat":"blink","pid":25863,"tid":25913,"ts":531358971447,"ph":"X","name":"Document::updateStyle","args":{},"dur":80,"tdur":79,"tts":642564},{"cat":"blink","pid":25863,"tid":25913,"ts":531358971528,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":642645},{"cat":"blink","pid":25863,"tid":25913,"ts":531358971542,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":12,"tdur":12,"tts":642659},{"cat":"sky","pid":25863,"tid":25913,"ts":531358971559,"ph":"X","name":"Layer::Display","args":{},"dur":2213,"tdur":2194,"tts":642676},{"cat":"sky","pid":25863,"tid":25913,"ts":531358973775,"ph":"X","name":"LayerHost::Upload","args":{},"dur":345,"tdur":185,"tts":644875},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358974149,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":70,"tdur":68,"tts":645091},{"cat":"blink","pid":25863,"tid":25913,"ts":531358974159,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":54,"tdur":55,"tts":645099},{"cat":"v8","pid":25863,"tid":25913,"ts":531358974164,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":48,"tdur":47,"tts":645105},{"cat":"v8","pid":25863,"tid":25913,"ts":531358974181,"ph":"X","name":"v8.callFunction","args":{},"dur":30,"tdur":29,"tts":645122},{"cat":"v8","pid":25863,"tid":25913,"ts":531358974183,"ph":"B","name":"V8.Execute","args":{},"tts":645124},{"cat":"blink","pid":25863,"tid":25913,"ts":531358974199,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":9,"tts":645139},{"cat":"blink","pid":25863,"tid":25913,"ts":531358974205,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":645145},{"cat":"v8","pid":25863,"tid":25913,"ts":531358974209,"ph":"E","name":"V8.Execute","args":{},"tts":645150},{"cat":"sky","pid":25863,"tid":25913,"ts":531358974685,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1110,"tdur":1025,"tts":645394},{"cat":"blink","pid":25863,"tid":25913,"ts":531358974689,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":118,"tdur":118,"tts":645397},{"cat":"blink","pid":25863,"tid":25913,"ts":531358974692,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":2,"tts":645400},{"cat":"blink","pid":25863,"tid":25913,"ts":531358974695,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":35,"tdur":34,"tts":645403},{"cat":"blink","pid":25863,"tid":25913,"ts":531358974702,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":27,"tdur":26,"tts":645411},{"cat":"v8","pid":25863,"tid":25913,"ts":531358974715,"ph":"X","name":"v8.callFunction","args":{},"dur":11,"tdur":10,"tts":645424},{"cat":"v8","pid":25863,"tid":25913,"ts":531358974718,"ph":"B","name":"V8.Execute","args":{},"tts":645426},{"cat":"v8","pid":25863,"tid":25913,"ts":531358974724,"ph":"E","name":"V8.Execute","args":{},"tts":645432},{"cat":"v8","pid":25863,"tid":25913,"ts":531358974732,"ph":"X","name":"v8.callFunction","args":{},"dur":73,"tdur":73,"tts":645440},{"cat":"v8","pid":25863,"tid":25913,"ts":531358974733,"ph":"B","name":"V8.Execute","args":{},"tts":645441},{"cat":"blink","pid":25863,"tid":25913,"ts":531358974737,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":9,"tdur":9,"tts":645445},{"cat":"v8","pid":25863,"tid":25913,"ts":531358974801,"ph":"E","name":"V8.Execute","args":{},"tts":645510},{"cat":"blink","pid":25863,"tid":25913,"ts":531358974807,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":31,"tdur":30,"tts":645516},{"cat":"blink","pid":25863,"tid":25913,"ts":531358974810,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":645518},{"cat":"blink","pid":25863,"tid":25913,"ts":531358974811,"ph":"X","name":"Document::updateStyle","args":{},"dur":18,"tdur":18,"tts":645519},{"cat":"blink","pid":25863,"tid":25913,"ts":531358974829,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":645538},{"cat":"blink","pid":25863,"tid":25913,"ts":531358974833,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":5,"tdur":3,"tts":645542},{"cat":"sky","pid":25863,"tid":25913,"ts":531358974839,"ph":"X","name":"Layer::Display","args":{},"dur":783,"tdur":782,"tts":645547},{"cat":"sky","pid":25863,"tid":25913,"ts":531358975623,"ph":"X","name":"LayerHost::Upload","args":{},"dur":171,"tdur":87,"tts":646331},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358975807,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":44,"tdur":43,"tts":646431},{"cat":"blink","pid":25863,"tid":25913,"ts":531358975812,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":34,"tdur":34,"tts":646436},{"cat":"v8","pid":25863,"tid":25913,"ts":531358975814,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":31,"tdur":31,"tts":646438},{"cat":"v8","pid":25863,"tid":25913,"ts":531358975817,"ph":"X","name":"v8.callFunction","args":{},"dur":27,"tdur":26,"tts":646441},{"cat":"v8","pid":25863,"tid":25913,"ts":531358975819,"ph":"B","name":"V8.Execute","args":{},"tts":646443},{"cat":"blink","pid":25863,"tid":25913,"ts":531358975827,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":14,"tdur":14,"tts":646451},{"cat":"blink","pid":25863,"tid":25913,"ts":531358975837,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":646462},{"cat":"v8","pid":25863,"tid":25913,"ts":531358975842,"ph":"E","name":"V8.Execute","args":{},"tts":646466},{"cat":"sky","pid":25863,"tid":25913,"ts":531358976244,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1155,"tdur":1081,"tts":646633},{"cat":"blink","pid":25863,"tid":25913,"ts":531358976248,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":105,"tdur":104,"tts":646636},{"cat":"blink","pid":25863,"tid":25913,"ts":531358976251,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":2,"tts":646639},{"cat":"blink","pid":25863,"tid":25913,"ts":531358976255,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":43,"tdur":43,"tts":646642},{"cat":"blink","pid":25863,"tid":25913,"ts":531358976262,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":35,"tdur":35,"tts":646649},{"cat":"v8","pid":25863,"tid":25913,"ts":531358976274,"ph":"X","name":"v8.callFunction","args":{},"dur":19,"tdur":19,"tts":646662},{"cat":"v8","pid":25863,"tid":25913,"ts":531358976285,"ph":"B","name":"V8.Execute","args":{},"tts":646672},{"cat":"v8","pid":25863,"tid":25913,"ts":531358976291,"ph":"E","name":"V8.Execute","args":{},"tts":646679},{"cat":"v8","pid":25863,"tid":25913,"ts":531358976300,"ph":"X","name":"v8.callFunction","args":{},"dur":50,"tdur":51,"tts":646687},{"cat":"v8","pid":25863,"tid":25913,"ts":531358976301,"ph":"B","name":"V8.Execute","args":{},"tts":646689},{"cat":"blink","pid":25863,"tid":25913,"ts":531358976305,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":9,"tdur":9,"tts":646693},{"cat":"v8","pid":25863,"tid":25913,"ts":531358976347,"ph":"E","name":"V8.Execute","args":{},"tts":646736},{"cat":"blink","pid":25863,"tid":25913,"ts":531358976353,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":29,"tdur":29,"tts":646741},{"cat":"blink","pid":25863,"tid":25913,"ts":531358976355,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":646743},{"cat":"blink","pid":25863,"tid":25913,"ts":531358976356,"ph":"X","name":"Document::updateStyle","args":{},"dur":18,"tdur":17,"tts":646744},{"cat":"blink","pid":25863,"tid":25913,"ts":531358976374,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":646762},{"cat":"blink","pid":25863,"tid":25913,"ts":531358976378,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":3,"tts":646766},{"cat":"sky","pid":25863,"tid":25913,"ts":531358976383,"ph":"X","name":"Layer::Display","args":{},"dur":857,"tdur":856,"tts":646771},{"cat":"sky","pid":25863,"tid":25913,"ts":531358977241,"ph":"X","name":"LayerHost::Upload","args":{},"dur":157,"tdur":84,"tts":647629},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358977421,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":39,"tdur":38,"tts":647737},{"cat":"blink","pid":25863,"tid":25913,"ts":531358977426,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":29,"tdur":29,"tts":647742},{"cat":"v8","pid":25863,"tid":25913,"ts":531358977428,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":26,"tdur":26,"tts":647744},{"cat":"v8","pid":25863,"tid":25913,"ts":531358977431,"ph":"X","name":"v8.callFunction","args":{},"dur":22,"tdur":22,"tts":647747},{"cat":"v8","pid":25863,"tid":25913,"ts":531358977433,"ph":"B","name":"V8.Execute","args":{},"tts":647749},{"cat":"blink","pid":25863,"tid":25913,"ts":531358977441,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":9,"tts":647757},{"cat":"blink","pid":25863,"tid":25913,"ts":531358977447,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":647763},{"cat":"v8","pid":25863,"tid":25913,"ts":531358977451,"ph":"E","name":"V8.Execute","args":{},"tts":647767},{"cat":"sky","pid":25863,"tid":25913,"ts":531358977779,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1091,"tdur":1037,"tts":647898},{"cat":"blink","pid":25863,"tid":25913,"ts":531358977782,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":93,"tdur":93,"tts":647900},{"cat":"blink","pid":25863,"tid":25913,"ts":531358977785,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":1,"tdur":1,"tts":647903},{"cat":"blink","pid":25863,"tid":25913,"ts":531358977787,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":35,"tdur":34,"tts":647906},{"cat":"blink","pid":25863,"tid":25913,"ts":531358977797,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":25,"tdur":25,"tts":647915},{"cat":"v8","pid":25863,"tid":25913,"ts":531358977809,"ph":"X","name":"v8.callFunction","args":{},"dur":10,"tdur":9,"tts":647928},{"cat":"v8","pid":25863,"tid":25913,"ts":531358977811,"ph":"B","name":"V8.Execute","args":{},"tts":647929},{"cat":"v8","pid":25863,"tid":25913,"ts":531358977817,"ph":"E","name":"V8.Execute","args":{},"tts":647936},{"cat":"v8","pid":25863,"tid":25913,"ts":531358977824,"ph":"X","name":"v8.callFunction","args":{},"dur":49,"tdur":49,"tts":647942},{"cat":"v8","pid":25863,"tid":25913,"ts":531358977826,"ph":"B","name":"V8.Execute","args":{},"tts":647944},{"cat":"blink","pid":25863,"tid":25913,"ts":531358977829,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":10,"tdur":9,"tts":647948},{"cat":"v8","pid":25863,"tid":25913,"ts":531358977870,"ph":"E","name":"V8.Execute","args":{},"tts":647989},{"cat":"blink","pid":25863,"tid":25913,"ts":531358977876,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":29,"tdur":29,"tts":647994},{"cat":"blink","pid":25863,"tid":25913,"ts":531358977878,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":647996},{"cat":"blink","pid":25863,"tid":25913,"ts":531358977879,"ph":"X","name":"Document::updateStyle","args":{},"dur":18,"tdur":17,"tts":647997},{"cat":"blink","pid":25863,"tid":25913,"ts":531358977897,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":648015},{"cat":"blink","pid":25863,"tid":25913,"ts":531358977901,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":4,"tts":648019},{"cat":"sky","pid":25863,"tid":25913,"ts":531358977906,"ph":"X","name":"Layer::Display","args":{},"dur":856,"tdur":855,"tts":648024},{"cat":"sky","pid":25863,"tid":25913,"ts":531358978763,"ph":"X","name":"LayerHost::Upload","args":{},"dur":106,"tdur":52,"tts":648882},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531358978880,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":34,"tdur":34,"tts":648946},{"cat":"blink","pid":25863,"tid":25913,"ts":531358978883,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":27,"tdur":26,"tts":648949},{"cat":"v8","pid":25863,"tid":25913,"ts":531358978886,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":23,"tdur":22,"tts":648952},{"cat":"v8","pid":25863,"tid":25913,"ts":531358978888,"ph":"X","name":"v8.callFunction","args":{},"dur":20,"tdur":19,"tts":648954},{"cat":"v8","pid":25863,"tid":25913,"ts":531358978890,"ph":"B","name":"V8.Execute","args":{},"tts":648956},{"cat":"blink","pid":25863,"tid":25913,"ts":531358978897,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":8,"tdur":8,"tts":648963},{"cat":"blink","pid":25863,"tid":25913,"ts":531358978902,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":648968},{"cat":"v8","pid":25863,"tid":25913,"ts":531358978906,"ph":"E","name":"V8.Execute","args":{},"tts":648972},{"cat":"sky","pid":25863,"tid":25913,"ts":531359105541,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2531,"tdur":2388,"tts":649138},{"cat":"blink","pid":25863,"tid":25913,"ts":531359105550,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":337,"tdur":324,"tts":649158},{"cat":"blink","pid":25863,"tid":25913,"ts":531359105574,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":4,"tdur":4,"tts":649169},{"cat":"blink","pid":25863,"tid":25913,"ts":531359105585,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":117,"tdur":116,"tts":649181},{"cat":"blink","pid":25863,"tid":25913,"ts":531359105607,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":94,"tdur":92,"tts":649203},{"cat":"v8","pid":25863,"tid":25913,"ts":531359105656,"ph":"X","name":"v8.callFunction","args":{},"dur":36,"tdur":35,"tts":649252},{"cat":"v8","pid":25863,"tid":25913,"ts":531359105661,"ph":"B","name":"V8.Execute","args":{},"tts":649257},{"cat":"v8","pid":25863,"tid":25913,"ts":531359105687,"ph":"E","name":"V8.Execute","args":{},"tts":649283},{"cat":"v8","pid":25863,"tid":25913,"ts":531359105708,"ph":"X","name":"v8.callFunction","args":{},"dur":174,"tdur":173,"tts":649304},{"cat":"v8","pid":25863,"tid":25913,"ts":531359105712,"ph":"B","name":"V8.Execute","args":{},"tts":649307},{"cat":"blink","pid":25863,"tid":25913,"ts":531359105724,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":38,"tdur":36,"tts":649320},{"cat":"v8","pid":25863,"tid":25913,"ts":531359105875,"ph":"E","name":"V8.Execute","args":{},"tts":649472},{"cat":"blink","pid":25863,"tid":25913,"ts":531359105888,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":116,"tdur":115,"tts":649484},{"cat":"blink","pid":25863,"tid":25913,"ts":531359105893,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":649489},{"cat":"blink","pid":25863,"tid":25913,"ts":531359105896,"ph":"X","name":"Document::updateStyle","args":{},"dur":63,"tdur":61,"tts":649492},{"cat":"blink","pid":25863,"tid":25913,"ts":531359105960,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":649556},{"cat":"blink","pid":25863,"tid":25913,"ts":531359105991,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":11,"tdur":10,"tts":649587},{"cat":"sky","pid":25863,"tid":25913,"ts":531359106006,"ph":"X","name":"Layer::Display","args":{},"dur":1730,"tdur":1729,"tts":649602},{"cat":"sky","pid":25863,"tid":25913,"ts":531359107737,"ph":"X","name":"LayerHost::Upload","args":{},"dur":334,"tdur":192,"tts":651333},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359108088,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":88,"tdur":86,"tts":651544},{"cat":"blink","pid":25863,"tid":25913,"ts":531359108093,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":71,"tdur":71,"tts":651548},{"cat":"v8","pid":25863,"tid":25913,"ts":531359108096,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":66,"tdur":65,"tts":651551},{"cat":"v8","pid":25863,"tid":25913,"ts":531359108099,"ph":"X","name":"v8.callFunction","args":{},"dur":60,"tdur":60,"tts":651554},{"cat":"v8","pid":25863,"tid":25913,"ts":531359108100,"ph":"B","name":"V8.Execute","args":{},"tts":651556},{"cat":"blink","pid":25863,"tid":25913,"ts":531359108132,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":21,"tdur":21,"tts":651587},{"cat":"blink","pid":25863,"tid":25913,"ts":531359108145,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":7,"tdur":6,"tts":651601},{"cat":"v8","pid":25863,"tid":25913,"ts":531359108155,"ph":"E","name":"V8.Execute","args":{},"tts":651611},{"cat":"sky","pid":25863,"tid":25913,"ts":531359109045,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2366,"tdur":2219,"tts":652014},{"cat":"blink","pid":25863,"tid":25913,"ts":531359109054,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":211,"tdur":210,"tts":652021},{"cat":"blink","pid":25863,"tid":25913,"ts":531359109061,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":3,"tdur":3,"tts":652028},{"cat":"blink","pid":25863,"tid":25913,"ts":531359109068,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":75,"tdur":74,"tts":652035},{"cat":"blink","pid":25863,"tid":25913,"ts":531359109083,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":59,"tdur":58,"tts":652050},{"cat":"v8","pid":25863,"tid":25913,"ts":531359109111,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":22,"tts":652078},{"cat":"v8","pid":25863,"tid":25913,"ts":531359109115,"ph":"B","name":"V8.Execute","args":{},"tts":652082},{"cat":"v8","pid":25863,"tid":25913,"ts":531359109130,"ph":"E","name":"V8.Execute","args":{},"tts":652097},{"cat":"v8","pid":25863,"tid":25913,"ts":531359109147,"ph":"X","name":"v8.callFunction","args":{},"dur":113,"tdur":113,"tts":652114},{"cat":"v8","pid":25863,"tid":25913,"ts":531359109151,"ph":"B","name":"V8.Execute","args":{},"tts":652118},{"cat":"blink","pid":25863,"tid":25913,"ts":531359109159,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":21,"tdur":20,"tts":652126},{"cat":"v8","pid":25863,"tid":25913,"ts":531359109254,"ph":"E","name":"V8.Execute","args":{},"tts":652222},{"cat":"blink","pid":25863,"tid":25913,"ts":531359109266,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":66,"tdur":65,"tts":652233},{"cat":"blink","pid":25863,"tid":25913,"ts":531359109270,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":652237},{"cat":"blink","pid":25863,"tid":25913,"ts":531359109273,"ph":"X","name":"Document::updateStyle","args":{},"dur":40,"tdur":38,"tts":652240},{"cat":"blink","pid":25863,"tid":25913,"ts":531359109314,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":652281},{"cat":"blink","pid":25863,"tid":25913,"ts":531359109322,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":9,"tdur":7,"tts":652290},{"cat":"sky","pid":25863,"tid":25913,"ts":531359109333,"ph":"X","name":"Layer::Display","args":{},"dur":1753,"tdur":1750,"tts":652301},{"cat":"sky","pid":25863,"tid":25913,"ts":531359111088,"ph":"X","name":"LayerHost::Upload","args":{},"dur":321,"tdur":175,"tts":654055},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359111437,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":87,"tdur":87,"tts":654260},{"cat":"blink","pid":25863,"tid":25913,"ts":531359111447,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":65,"tdur":64,"tts":654270},{"cat":"v8","pid":25863,"tid":25913,"ts":531359111453,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":57,"tdur":56,"tts":654276},{"cat":"v8","pid":25863,"tid":25913,"ts":531359111459,"ph":"X","name":"v8.callFunction","args":{},"dur":48,"tdur":47,"tts":654282},{"cat":"v8","pid":25863,"tid":25913,"ts":531359111463,"ph":"B","name":"V8.Execute","args":{},"tts":654286},{"cat":"blink","pid":25863,"tid":25913,"ts":531359111481,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":20,"tdur":19,"tts":654304},{"cat":"blink","pid":25863,"tid":25913,"ts":531359111494,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":6,"tdur":5,"tts":654317},{"cat":"v8","pid":25863,"tid":25913,"ts":531359111503,"ph":"E","name":"V8.Execute","args":{},"tts":654326},{"cat":"sky","pid":25863,"tid":25913,"ts":531359112235,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2351,"tdur":2233,"tts":654719},{"cat":"blink","pid":25863,"tid":25913,"ts":531359112245,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":221,"tdur":222,"tts":654726},{"cat":"blink","pid":25863,"tid":25913,"ts":531359112251,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":4,"tdur":3,"tts":654733},{"cat":"blink","pid":25863,"tid":25913,"ts":531359112258,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":85,"tdur":84,"tts":654740},{"cat":"blink","pid":25863,"tid":25913,"ts":531359112284,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":58,"tdur":57,"tts":654766},{"cat":"v8","pid":25863,"tid":25913,"ts":531359112312,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":21,"tts":654795},{"cat":"v8","pid":25863,"tid":25913,"ts":531359112317,"ph":"B","name":"V8.Execute","args":{},"tts":654798},{"cat":"v8","pid":25863,"tid":25913,"ts":531359112331,"ph":"E","name":"V8.Execute","args":{},"tts":654813},{"cat":"v8","pid":25863,"tid":25913,"ts":531359112348,"ph":"X","name":"v8.callFunction","args":{},"dur":114,"tdur":113,"tts":654830},{"cat":"v8","pid":25863,"tid":25913,"ts":531359112351,"ph":"B","name":"V8.Execute","args":{},"tts":654833},{"cat":"blink","pid":25863,"tid":25913,"ts":531359112360,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":21,"tdur":21,"tts":654841},{"cat":"v8","pid":25863,"tid":25913,"ts":531359112455,"ph":"E","name":"V8.Execute","args":{},"tts":654938},{"cat":"blink","pid":25863,"tid":25913,"ts":531359112468,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":65,"tdur":66,"tts":654949},{"cat":"blink","pid":25863,"tid":25913,"ts":531359112472,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":654954},{"cat":"blink","pid":25863,"tid":25913,"ts":531359112475,"ph":"X","name":"Document::updateStyle","args":{},"dur":39,"tdur":38,"tts":654957},{"cat":"blink","pid":25863,"tid":25913,"ts":531359112515,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":654997},{"cat":"blink","pid":25863,"tid":25913,"ts":531359112524,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":8,"tdur":7,"tts":655006},{"cat":"sky","pid":25863,"tid":25913,"ts":531359112535,"ph":"X","name":"Layer::Display","args":{},"dur":1761,"tdur":1758,"tts":655017},{"cat":"sky","pid":25863,"tid":25913,"ts":531359114298,"ph":"X","name":"LayerHost::Upload","args":{},"dur":287,"tdur":169,"tts":656780},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359114613,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":111,"tdur":110,"tts":656979},{"cat":"blink","pid":25863,"tid":25913,"ts":531359114623,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":90,"tdur":89,"tts":656989},{"cat":"v8","pid":25863,"tid":25913,"ts":531359114629,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":81,"tdur":80,"tts":656995},{"cat":"v8","pid":25863,"tid":25913,"ts":531359114635,"ph":"X","name":"v8.callFunction","args":{},"dur":72,"tdur":71,"tts":657001},{"cat":"v8","pid":25863,"tid":25913,"ts":531359114639,"ph":"B","name":"V8.Execute","args":{},"tts":657005},{"cat":"blink","pid":25863,"tid":25913,"ts":531359114657,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":43,"tdur":43,"tts":657023},{"cat":"blink","pid":25863,"tid":25913,"ts":531359114670,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":29,"tdur":29,"tts":657036},{"cat":"v8","pid":25863,"tid":25913,"ts":531359114703,"ph":"E","name":"V8.Execute","args":{},"tts":657069},{"cat":"sky","pid":25863,"tid":25913,"ts":531359115365,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2061,"tdur":1921,"tts":657363},{"cat":"blink","pid":25863,"tid":25913,"ts":531359115372,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":237,"tdur":237,"tts":657369},{"cat":"blink","pid":25863,"tid":25913,"ts":531359115378,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":3,"tdur":3,"tts":657375},{"cat":"blink","pid":25863,"tid":25913,"ts":531359115384,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":70,"tdur":69,"tts":657382},{"cat":"blink","pid":25863,"tid":25913,"ts":531359115397,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":56,"tdur":55,"tts":657395},{"cat":"v8","pid":25863,"tid":25913,"ts":531359115424,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":22,"tts":657422},{"cat":"v8","pid":25863,"tid":25913,"ts":531359115429,"ph":"B","name":"V8.Execute","args":{},"tts":657426},{"cat":"v8","pid":25863,"tid":25913,"ts":531359115443,"ph":"E","name":"V8.Execute","args":{},"tts":657441},{"cat":"v8","pid":25863,"tid":25913,"ts":531359115459,"ph":"X","name":"v8.callFunction","args":{},"dur":145,"tdur":145,"tts":657456},{"cat":"v8","pid":25863,"tid":25913,"ts":531359115462,"ph":"B","name":"V8.Execute","args":{},"tts":657460},{"cat":"blink","pid":25863,"tid":25913,"ts":531359115470,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":21,"tdur":20,"tts":657468},{"cat":"v8","pid":25863,"tid":25913,"ts":531359115597,"ph":"E","name":"V8.Execute","args":{},"tts":657596},{"cat":"blink","pid":25863,"tid":25913,"ts":531359115610,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":660,"tdur":636,"tts":657607},{"cat":"blink","pid":25863,"tid":25913,"ts":531359115614,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":657612},{"cat":"blink","pid":25863,"tid":25913,"ts":531359115617,"ph":"X","name":"Document::updateStyle","args":{},"dur":197,"tdur":194,"tts":657615},{"cat":"blink","pid":25863,"tid":25913,"ts":531359115815,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":2},"tts":657813},{"cat":"blink","pid":25863,"tid":25913,"ts":531359115820,"ph":"X","name":"FrameView::layout","args":{},"dur":75,"tdur":74,"tts":657818},{"cat":"blink","pid":25863,"tid":25913,"ts":531359115824,"ph":"X","name":"FrameView::performPreLayoutTasks","args":{},"dur":4,"tdur":3,"tts":657822},{"cat":"blink","pid":25863,"tid":25913,"ts":531359115830,"ph":"X","name":"FrameView::performLayout","args":{},"dur":40,"tdur":40,"tts":657827},{"cat":"blink","pid":25863,"tid":25913,"ts":531359115871,"ph":"X","name":"RenderLayer::updateLayerPositionsAfterLayout","args":{},"dur":5,"tdur":4,"tts":657869},{"cat":"blink","pid":25863,"tid":25913,"ts":531359115877,"ph":"X","name":"FrameView::performPostLayoutTasks","args":{},"dur":15,"tdur":15,"tts":657874},{"cat":"blink","pid":25863,"tid":25913,"ts":531359115901,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":368,"tdur":342,"tts":657899},{"cat":"sky","pid":25863,"tid":25913,"ts":531359116271,"ph":"X","name":"Layer::Display","args":{},"dur":902,"tdur":902,"tts":658244},{"cat":"sky","pid":25863,"tid":25913,"ts":531359117174,"ph":"X","name":"LayerHost::Upload","args":{},"dur":251,"tdur":135,"tts":659148},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359117439,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":46,"tdur":46,"tts":659298},{"cat":"blink","pid":25863,"tid":25913,"ts":531359117444,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":36,"tdur":36,"tts":659303},{"cat":"v8","pid":25863,"tid":25913,"ts":531359117447,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":31,"tdur":31,"tts":659306},{"cat":"v8","pid":25863,"tid":25913,"ts":531359117450,"ph":"X","name":"v8.callFunction","args":{},"dur":27,"tdur":27,"tts":659309},{"cat":"v8","pid":25863,"tid":25913,"ts":531359117452,"ph":"B","name":"V8.Execute","args":{},"tts":659311},{"cat":"blink","pid":25863,"tid":25913,"ts":531359117461,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":13,"tdur":13,"tts":659320},{"cat":"blink","pid":25863,"tid":25913,"ts":531359117471,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":659330},{"cat":"v8","pid":25863,"tid":25913,"ts":531359117475,"ph":"E","name":"V8.Execute","args":{},"tts":659334},{"cat":"sky","pid":25863,"tid":25913,"ts":531359186777,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2405,"tdur":2218,"tts":659625},{"cat":"blink","pid":25863,"tid":25913,"ts":531359186786,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":200,"tdur":199,"tts":659633},{"cat":"blink","pid":25863,"tid":25913,"ts":531359186793,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":4,"tdur":3,"tts":659640},{"cat":"blink","pid":25863,"tid":25913,"ts":531359186800,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":89,"tdur":76,"tts":659647},{"cat":"blink","pid":25863,"tid":25913,"ts":531359186815,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":61,"tdur":60,"tts":659662},{"cat":"v8","pid":25863,"tid":25913,"ts":531359186845,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":22,"tts":659692},{"cat":"v8","pid":25863,"tid":25913,"ts":531359186849,"ph":"B","name":"V8.Execute","args":{},"tts":659696},{"cat":"v8","pid":25863,"tid":25913,"ts":531359186864,"ph":"E","name":"V8.Execute","args":{},"tts":659711},{"cat":"v8","pid":25863,"tid":25913,"ts":531359186892,"ph":"X","name":"v8.callFunction","args":{},"dur":89,"tdur":90,"tts":659738},{"cat":"v8","pid":25863,"tid":25913,"ts":531359186894,"ph":"B","name":"V8.Execute","args":{},"tts":659740},{"cat":"blink","pid":25863,"tid":25913,"ts":531359186899,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":11,"tdur":12,"tts":659745},{"cat":"v8","pid":25863,"tid":25913,"ts":531359186975,"ph":"E","name":"V8.Execute","args":{},"tts":659823},{"cat":"blink","pid":25863,"tid":25913,"ts":531359186987,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":67,"tdur":66,"tts":659834},{"cat":"blink","pid":25863,"tid":25913,"ts":531359186992,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":659839},{"cat":"blink","pid":25863,"tid":25913,"ts":531359186995,"ph":"X","name":"Document::updateStyle","args":{},"dur":40,"tdur":40,"tts":659841},{"cat":"blink","pid":25863,"tid":25913,"ts":531359187036,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":659883},{"cat":"blink","pid":25863,"tid":25913,"ts":531359187045,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":8,"tdur":7,"tts":659892},{"cat":"sky","pid":25863,"tid":25913,"ts":531359187056,"ph":"X","name":"Layer::Display","args":{},"dur":1779,"tdur":1760,"tts":659903},{"cat":"sky","pid":25863,"tid":25913,"ts":531359188837,"ph":"X","name":"LayerHost::Upload","args":{},"dur":343,"tdur":172,"tts":661668},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359189208,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":86,"tdur":85,"tts":661870},{"cat":"blink","pid":25863,"tid":25913,"ts":531359189219,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":65,"tdur":65,"tts":661880},{"cat":"v8","pid":25863,"tid":25913,"ts":531359189224,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":58,"tdur":57,"tts":661886},{"cat":"v8","pid":25863,"tid":25913,"ts":531359189230,"ph":"X","name":"v8.callFunction","args":{},"dur":49,"tdur":48,"tts":661892},{"cat":"v8","pid":25863,"tid":25913,"ts":531359189234,"ph":"B","name":"V8.Execute","args":{},"tts":661896},{"cat":"blink","pid":25863,"tid":25913,"ts":531359189252,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":21,"tdur":20,"tts":661914},{"cat":"blink","pid":25863,"tid":25913,"ts":531359189266,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":6,"tdur":5,"tts":661928},{"cat":"v8","pid":25863,"tid":25913,"ts":531359189275,"ph":"E","name":"V8.Execute","args":{},"tts":661937},{"cat":"sky","pid":25863,"tid":25913,"ts":531359189997,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":3675,"tdur":3528,"tts":662332},{"cat":"blink","pid":25863,"tid":25913,"ts":531359190006,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":616,"tdur":615,"tts":662339},{"cat":"blink","pid":25863,"tid":25913,"ts":531359190013,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":4,"tdur":3,"tts":662346},{"cat":"blink","pid":25863,"tid":25913,"ts":531359190020,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":91,"tdur":91,"tts":662353},{"cat":"blink","pid":25863,"tid":25913,"ts":531359190051,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":59,"tdur":59,"tts":662384},{"cat":"v8","pid":25863,"tid":25913,"ts":531359190080,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":23,"tts":662413},{"cat":"v8","pid":25863,"tid":25913,"ts":531359190084,"ph":"B","name":"V8.Execute","args":{},"tts":662417},{"cat":"v8","pid":25863,"tid":25913,"ts":531359190099,"ph":"E","name":"V8.Execute","args":{},"tts":662432},{"cat":"v8","pid":25863,"tid":25913,"ts":531359190116,"ph":"X","name":"v8.callFunction","args":{},"dur":499,"tdur":497,"tts":662449},{"cat":"v8","pid":25863,"tid":25913,"ts":531359190120,"ph":"B","name":"V8.Execute","args":{},"tts":662453},{"cat":"blink","pid":25863,"tid":25913,"ts":531359190128,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":21,"tdur":20,"tts":662461},{"cat":"v8","pid":25863,"tid":25913,"ts":531359190443,"ph":"E","name":"V8.Execute","args":{},"tts":662777},{"cat":"blink","pid":25863,"tid":25913,"ts":531359190624,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":912,"tdur":910,"tts":662958},{"cat":"blink","pid":25863,"tid":25913,"ts":531359190630,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":662963},{"cat":"blink","pid":25863,"tid":25913,"ts":531359190634,"ph":"X","name":"Document::updateStyle","args":{},"dur":145,"tdur":143,"tts":662967},{"cat":"blink","pid":25863,"tid":25913,"ts":531359190780,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":6},"tts":663114},{"cat":"blink","pid":25863,"tid":25913,"ts":531359190786,"ph":"X","name":"FrameView::layout","args":{},"dur":267,"tdur":267,"tts":663119},{"cat":"blink","pid":25863,"tid":25913,"ts":531359190789,"ph":"X","name":"FrameView::performPreLayoutTasks","args":{},"dur":3,"tdur":3,"tts":663122},{"cat":"blink","pid":25863,"tid":25913,"ts":531359190793,"ph":"X","name":"FrameView::performLayout","args":{},"dur":240,"tdur":237,"tts":663127},{"cat":"blink","pid":25863,"tid":25913,"ts":531359191034,"ph":"X","name":"RenderLayer::updateLayerPositionsAfterLayout","args":{},"dur":6,"tdur":6,"tts":663367},{"cat":"blink","pid":25863,"tid":25913,"ts":531359191041,"ph":"X","name":"FrameView::performPostLayoutTasks","args":{},"dur":9,"tdur":8,"tts":663375},{"cat":"blink","pid":25863,"tid":25913,"ts":531359191059,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":475,"tdur":473,"tts":663393},{"cat":"sky","pid":25863,"tid":25913,"ts":531359191538,"ph":"X","name":"Layer::Display","args":{},"dur":1807,"tdur":1805,"tts":663871},{"cat":"sky","pid":25863,"tid":25913,"ts":531359193347,"ph":"X","name":"LayerHost::Upload","args":{},"dur":323,"tdur":178,"tts":665680},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359193698,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":86,"tdur":84,"tts":665888},{"cat":"blink","pid":25863,"tid":25913,"ts":531359193709,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":65,"tdur":65,"tts":665898},{"cat":"v8","pid":25863,"tid":25913,"ts":531359193714,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":57,"tdur":56,"tts":665904},{"cat":"v8","pid":25863,"tid":25913,"ts":531359193720,"ph":"X","name":"v8.callFunction","args":{},"dur":49,"tdur":48,"tts":665910},{"cat":"v8","pid":25863,"tid":25913,"ts":531359193724,"ph":"B","name":"V8.Execute","args":{},"tts":665914},{"cat":"blink","pid":25863,"tid":25913,"ts":531359193742,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":21,"tdur":20,"tts":665932},{"cat":"blink","pid":25863,"tid":25913,"ts":531359193756,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":6,"tdur":6,"tts":665945},{"cat":"v8","pid":25863,"tid":25913,"ts":531359193765,"ph":"E","name":"V8.Execute","args":{},"tts":665955},{"cat":"sky","pid":25863,"tid":25913,"ts":531359194507,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2423,"tdur":2274,"tts":666338},{"cat":"blink","pid":25863,"tid":25913,"ts":531359194517,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":222,"tdur":222,"tts":666346},{"cat":"blink","pid":25863,"tid":25913,"ts":531359194524,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":3,"tdur":3,"tts":666353},{"cat":"blink","pid":25863,"tid":25913,"ts":531359194531,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":85,"tdur":85,"tts":666360},{"cat":"blink","pid":25863,"tid":25913,"ts":531359194556,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":59,"tdur":58,"tts":666386},{"cat":"v8","pid":25863,"tid":25913,"ts":531359194585,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":22,"tts":666415},{"cat":"v8","pid":25863,"tid":25913,"ts":531359194590,"ph":"B","name":"V8.Execute","args":{},"tts":666419},{"cat":"v8","pid":25863,"tid":25913,"ts":531359194604,"ph":"E","name":"V8.Execute","args":{},"tts":666434},{"cat":"v8","pid":25863,"tid":25913,"ts":531359194621,"ph":"X","name":"v8.callFunction","args":{},"dur":114,"tdur":114,"tts":666450},{"cat":"v8","pid":25863,"tid":25913,"ts":531359194624,"ph":"B","name":"V8.Execute","args":{},"tts":666454},{"cat":"blink","pid":25863,"tid":25913,"ts":531359194633,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":21,"tdur":20,"tts":666462},{"cat":"v8","pid":25863,"tid":25913,"ts":531359194728,"ph":"E","name":"V8.Execute","args":{},"tts":666559},{"cat":"blink","pid":25863,"tid":25913,"ts":531359194740,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":66,"tdur":65,"tts":666570},{"cat":"blink","pid":25863,"tid":25913,"ts":531359194745,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":666574},{"cat":"blink","pid":25863,"tid":25913,"ts":531359194748,"ph":"X","name":"Document::updateStyle","args":{},"dur":39,"tdur":38,"tts":666577},{"cat":"blink","pid":25863,"tid":25913,"ts":531359194788,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":666618},{"cat":"blink","pid":25863,"tid":25913,"ts":531359194797,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":8,"tdur":7,"tts":666627},{"cat":"sky","pid":25863,"tid":25913,"ts":531359194808,"ph":"X","name":"Layer::Display","args":{},"dur":1799,"tdur":1797,"tts":666638},{"cat":"sky","pid":25863,"tid":25913,"ts":531359196609,"ph":"X","name":"LayerHost::Upload","args":{},"dur":319,"tdur":171,"tts":668439},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359196956,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":85,"tdur":84,"tts":668640},{"cat":"blink","pid":25863,"tid":25913,"ts":531359196967,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":65,"tdur":64,"tts":668650},{"cat":"v8","pid":25863,"tid":25913,"ts":531359196972,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":57,"tdur":57,"tts":668655},{"cat":"v8","pid":25863,"tid":25913,"ts":531359196978,"ph":"X","name":"v8.callFunction","args":{},"dur":49,"tdur":47,"tts":668662},{"cat":"v8","pid":25863,"tid":25913,"ts":531359196982,"ph":"B","name":"V8.Execute","args":{},"tts":668665},{"cat":"blink","pid":25863,"tid":25913,"ts":531359197000,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":21,"tdur":19,"tts":668684},{"cat":"blink","pid":25863,"tid":25913,"ts":531359197014,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":6,"tdur":5,"tts":668697},{"cat":"v8","pid":25863,"tid":25913,"ts":531359197023,"ph":"E","name":"V8.Execute","args":{},"tts":668706},{"cat":"sky","pid":25863,"tid":25913,"ts":531359197633,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2456,"tdur":2284,"tts":669041},{"cat":"blink","pid":25863,"tid":25913,"ts":531359197641,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":250,"tdur":249,"tts":669049},{"cat":"blink","pid":25863,"tid":25913,"ts":531359197648,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":3,"tdur":3,"tts":669055},{"cat":"blink","pid":25863,"tid":25913,"ts":531359197655,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":98,"tdur":98,"tts":669062},{"cat":"blink","pid":25863,"tid":25913,"ts":531359197669,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":83,"tdur":82,"tts":669077},{"cat":"v8","pid":25863,"tid":25913,"ts":531359197697,"ph":"X","name":"v8.callFunction","args":{},"dur":47,"tdur":45,"tts":669105},{"cat":"v8","pid":25863,"tid":25913,"ts":531359197702,"ph":"B","name":"V8.Execute","args":{},"tts":669109},{"cat":"v8","pid":25863,"tid":25913,"ts":531359197739,"ph":"E","name":"V8.Execute","args":{},"tts":669147},{"cat":"v8","pid":25863,"tid":25913,"ts":531359197758,"ph":"X","name":"v8.callFunction","args":{},"dur":128,"tdur":127,"tts":669166},{"cat":"v8","pid":25863,"tid":25913,"ts":531359197775,"ph":"B","name":"V8.Execute","args":{},"tts":669182},{"cat":"blink","pid":25863,"tid":25913,"ts":531359197784,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":22,"tdur":21,"tts":669191},{"cat":"v8","pid":25863,"tid":25913,"ts":531359197880,"ph":"E","name":"V8.Execute","args":{},"tts":669288},{"cat":"blink","pid":25863,"tid":25913,"ts":531359197893,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":66,"tdur":65,"tts":669300},{"cat":"blink","pid":25863,"tid":25913,"ts":531359197897,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":669304},{"cat":"blink","pid":25863,"tid":25913,"ts":531359197900,"ph":"X","name":"Document::updateStyle","args":{},"dur":40,"tdur":39,"tts":669307},{"cat":"blink","pid":25863,"tid":25913,"ts":531359197941,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":669348},{"cat":"blink","pid":25863,"tid":25913,"ts":531359197949,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":8,"tdur":7,"tts":669357},{"cat":"sky","pid":25863,"tid":25913,"ts":531359197960,"ph":"X","name":"Layer::Display","args":{},"dur":1782,"tdur":1781,"tts":669367},{"cat":"sky","pid":25863,"tid":25913,"ts":531359199744,"ph":"X","name":"LayerHost::Upload","args":{},"dur":344,"tdur":171,"tts":671152},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359200101,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":42,"tdur":41,"tts":671338},{"cat":"blink","pid":25863,"tid":25913,"ts":531359200107,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":31,"tdur":31,"tts":671343},{"cat":"v8","pid":25863,"tid":25913,"ts":531359200109,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":27,"tdur":26,"tts":671346},{"cat":"v8","pid":25863,"tid":25913,"ts":531359200112,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":22,"tts":671349},{"cat":"v8","pid":25863,"tid":25913,"ts":531359200114,"ph":"B","name":"V8.Execute","args":{},"tts":671351},{"cat":"blink","pid":25863,"tid":25913,"ts":531359200123,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":10,"tts":671359},{"cat":"blink","pid":25863,"tid":25913,"ts":531359200129,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":671365},{"cat":"v8","pid":25863,"tid":25913,"ts":531359200133,"ph":"E","name":"V8.Execute","args":{},"tts":671370},{"cat":"sky","pid":25863,"tid":25913,"ts":531359253297,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1354,"tdur":1195,"tts":671688},{"cat":"blink","pid":25863,"tid":25913,"ts":531359253301,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":114,"tdur":114,"tts":671691},{"cat":"blink","pid":25863,"tid":25913,"ts":531359253304,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":1,"tdur":1,"tts":671694},{"cat":"blink","pid":25863,"tid":25913,"ts":531359253307,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":48,"tdur":48,"tts":671697},{"cat":"blink","pid":25863,"tid":25913,"ts":531359253314,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":40,"tdur":40,"tts":671704},{"cat":"v8","pid":25863,"tid":25913,"ts":531359253339,"ph":"X","name":"v8.callFunction","args":{},"dur":12,"tdur":10,"tts":671730},{"cat":"v8","pid":25863,"tid":25913,"ts":531359253342,"ph":"B","name":"V8.Execute","args":{},"tts":671732},{"cat":"v8","pid":25863,"tid":25913,"ts":531359253349,"ph":"E","name":"V8.Execute","args":{},"tts":671739},{"cat":"v8","pid":25863,"tid":25913,"ts":531359253357,"ph":"X","name":"v8.callFunction","args":{},"dur":56,"tdur":55,"tts":671747},{"cat":"v8","pid":25863,"tid":25913,"ts":531359253359,"ph":"B","name":"V8.Execute","args":{},"tts":671749},{"cat":"blink","pid":25863,"tid":25913,"ts":531359253363,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":10,"tdur":10,"tts":671753},{"cat":"v8","pid":25863,"tid":25913,"ts":531359253409,"ph":"E","name":"V8.Execute","args":{},"tts":671800},{"cat":"blink","pid":25863,"tid":25913,"ts":531359253415,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":32,"tdur":31,"tts":671806},{"cat":"blink","pid":25863,"tid":25913,"ts":531359253417,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":671808},{"cat":"blink","pid":25863,"tid":25913,"ts":531359253419,"ph":"X","name":"Document::updateStyle","args":{},"dur":19,"tdur":19,"tts":671809},{"cat":"blink","pid":25863,"tid":25913,"ts":531359253438,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":671829},{"cat":"blink","pid":25863,"tid":25913,"ts":531359253443,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":3,"tts":671833},{"cat":"sky","pid":25863,"tid":25913,"ts":531359253448,"ph":"X","name":"Layer::Display","args":{},"dur":894,"tdur":893,"tts":671838},{"cat":"sky","pid":25863,"tid":25913,"ts":531359254343,"ph":"X","name":"LayerHost::Upload","args":{},"dur":307,"tdur":149,"tts":672733},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359254664,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":43,"tdur":42,"tts":672897},{"cat":"blink","pid":25863,"tid":25913,"ts":531359254669,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":33,"tdur":32,"tts":672902},{"cat":"v8","pid":25863,"tid":25913,"ts":531359254672,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":28,"tdur":29,"tts":672904},{"cat":"v8","pid":25863,"tid":25913,"ts":531359254675,"ph":"X","name":"v8.callFunction","args":{},"dur":24,"tdur":25,"tts":672907},{"cat":"v8","pid":25863,"tid":25913,"ts":531359254676,"ph":"B","name":"V8.Execute","args":{},"tts":672909},{"cat":"blink","pid":25863,"tid":25913,"ts":531359254685,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":10,"tdur":9,"tts":672918},{"cat":"blink","pid":25863,"tid":25913,"ts":531359254691,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":672924},{"cat":"v8","pid":25863,"tid":25913,"ts":531359254697,"ph":"E","name":"V8.Execute","args":{},"tts":672930},{"cat":"sky","pid":25863,"tid":25913,"ts":531359255147,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1074,"tdur":997,"tts":673118},{"cat":"blink","pid":25863,"tid":25913,"ts":531359255151,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":91,"tdur":90,"tts":673122},{"cat":"blink","pid":25863,"tid":25913,"ts":531359255154,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":1,"tdur":2,"tts":673124},{"cat":"blink","pid":25863,"tid":25913,"ts":531359255157,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":32,"tdur":32,"tts":673127},{"cat":"blink","pid":25863,"tid":25913,"ts":531359255163,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":25,"tdur":25,"tts":673134},{"cat":"v8","pid":25863,"tid":25913,"ts":531359255175,"ph":"X","name":"v8.callFunction","args":{},"dur":10,"tdur":10,"tts":673146},{"cat":"v8","pid":25863,"tid":25913,"ts":531359255177,"ph":"B","name":"V8.Execute","args":{},"tts":673148},{"cat":"v8","pid":25863,"tid":25913,"ts":531359255183,"ph":"E","name":"V8.Execute","args":{},"tts":673154},{"cat":"v8","pid":25863,"tid":25913,"ts":531359255191,"ph":"X","name":"v8.callFunction","args":{},"dur":49,"tdur":48,"tts":673162},{"cat":"v8","pid":25863,"tid":25913,"ts":531359255192,"ph":"B","name":"V8.Execute","args":{},"tts":673163},{"cat":"blink","pid":25863,"tid":25913,"ts":531359255196,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":9,"tdur":8,"tts":673167},{"cat":"v8","pid":25863,"tid":25913,"ts":531359255237,"ph":"E","name":"V8.Execute","args":{},"tts":673208},{"cat":"blink","pid":25863,"tid":25913,"ts":531359255242,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":28,"tdur":28,"tts":673213},{"cat":"blink","pid":25863,"tid":25913,"ts":531359255244,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":673215},{"cat":"blink","pid":25863,"tid":25913,"ts":531359255245,"ph":"X","name":"Document::updateStyle","args":{},"dur":17,"tdur":16,"tts":673216},{"cat":"blink","pid":25863,"tid":25913,"ts":531359255263,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":673233},{"cat":"blink","pid":25863,"tid":25913,"ts":531359255266,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":3,"tts":673237},{"cat":"sky","pid":25863,"tid":25913,"ts":531359255271,"ph":"X","name":"Layer::Display","args":{},"dur":785,"tdur":774,"tts":673242},{"cat":"sky","pid":25863,"tid":25913,"ts":531359256057,"ph":"X","name":"LayerHost::Upload","args":{},"dur":164,"tdur":96,"tts":674018},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359256233,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":42,"tdur":42,"tts":674127},{"cat":"blink","pid":25863,"tid":25913,"ts":531359256238,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":32,"tdur":32,"tts":674132},{"cat":"v8","pid":25863,"tid":25913,"ts":531359256240,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":29,"tdur":29,"tts":674134},{"cat":"v8","pid":25863,"tid":25913,"ts":531359256242,"ph":"X","name":"v8.callFunction","args":{},"dur":26,"tdur":25,"tts":674137},{"cat":"v8","pid":25863,"tid":25913,"ts":531359256244,"ph":"B","name":"V8.Execute","args":{},"tts":674138},{"cat":"blink","pid":25863,"tid":25913,"ts":531359256252,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":13,"tdur":13,"tts":674146},{"cat":"blink","pid":25863,"tid":25913,"ts":531359256262,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":674156},{"cat":"v8","pid":25863,"tid":25913,"ts":531359256266,"ph":"E","name":"V8.Execute","args":{},"tts":674161},{"cat":"sky","pid":25863,"tid":25913,"ts":531359256625,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1027,"tdur":975,"tts":674341},{"cat":"blink","pid":25863,"tid":25913,"ts":531359256629,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":91,"tdur":90,"tts":674345},{"cat":"blink","pid":25863,"tid":25913,"ts":531359256632,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":2,"tts":674347},{"cat":"blink","pid":25863,"tid":25913,"ts":531359256635,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":32,"tdur":32,"tts":674350},{"cat":"blink","pid":25863,"tid":25913,"ts":531359256642,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":25,"tdur":25,"tts":674357},{"cat":"v8","pid":25863,"tid":25913,"ts":531359256654,"ph":"X","name":"v8.callFunction","args":{},"dur":10,"tdur":10,"tts":674369},{"cat":"v8","pid":25863,"tid":25913,"ts":531359256656,"ph":"B","name":"V8.Execute","args":{},"tts":674371},{"cat":"v8","pid":25863,"tid":25913,"ts":531359256662,"ph":"E","name":"V8.Execute","args":{},"tts":674377},{"cat":"v8","pid":25863,"tid":25913,"ts":531359256669,"ph":"X","name":"v8.callFunction","args":{},"dur":49,"tdur":49,"tts":674384},{"cat":"v8","pid":25863,"tid":25913,"ts":531359256671,"ph":"B","name":"V8.Execute","args":{},"tts":674386},{"cat":"blink","pid":25863,"tid":25913,"ts":531359256674,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":9,"tdur":9,"tts":674389},{"cat":"v8","pid":25863,"tid":25913,"ts":531359256715,"ph":"E","name":"V8.Execute","args":{},"tts":674431},{"cat":"blink","pid":25863,"tid":25913,"ts":531359256720,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":34,"tdur":33,"tts":674436},{"cat":"blink","pid":25863,"tid":25913,"ts":531359256722,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":674438},{"cat":"blink","pid":25863,"tid":25913,"ts":531359256724,"ph":"X","name":"Document::updateStyle","args":{},"dur":22,"tdur":21,"tts":674439},{"cat":"blink","pid":25863,"tid":25913,"ts":531359256746,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":674461},{"cat":"blink","pid":25863,"tid":25913,"ts":531359256750,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":3,"tdur":3,"tts":674465},{"cat":"sky","pid":25863,"tid":25913,"ts":531359256755,"ph":"X","name":"Layer::Display","args":{},"dur":762,"tdur":761,"tts":674470},{"cat":"sky","pid":25863,"tid":25913,"ts":531359257518,"ph":"X","name":"LayerHost::Upload","args":{},"dur":133,"tdur":82,"tts":675233},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359257725,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":38,"tdur":38,"tts":675370},{"cat":"blink","pid":25863,"tid":25913,"ts":531359257730,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":29,"tdur":28,"tts":675375},{"cat":"v8","pid":25863,"tid":25913,"ts":531359257732,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":25,"tdur":25,"tts":675377},{"cat":"v8","pid":25863,"tid":25913,"ts":531359257735,"ph":"X","name":"v8.callFunction","args":{},"dur":22,"tdur":21,"tts":675380},{"cat":"v8","pid":25863,"tid":25913,"ts":531359257737,"ph":"B","name":"V8.Execute","args":{},"tts":675382},{"cat":"blink","pid":25863,"tid":25913,"ts":531359257745,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":8,"tts":675390},{"cat":"blink","pid":25863,"tid":25913,"ts":531359257751,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":2,"tdur":2,"tts":675396},{"cat":"v8","pid":25863,"tid":25913,"ts":531359257755,"ph":"E","name":"V8.Execute","args":{},"tts":675400},{"cat":"sky","pid":25863,"tid":25913,"ts":531359258037,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1025,"tdur":974,"tts":675558},{"cat":"blink","pid":25863,"tid":25913,"ts":531359258041,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":96,"tdur":96,"tts":675561},{"cat":"blink","pid":25863,"tid":25913,"ts":531359258044,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":675564},{"cat":"blink","pid":25863,"tid":25913,"ts":531359258047,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":38,"tdur":37,"tts":675567},{"cat":"blink","pid":25863,"tid":25913,"ts":531359258059,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":25,"tdur":25,"tts":675579},{"cat":"v8","pid":25863,"tid":25913,"ts":531359258071,"ph":"X","name":"v8.callFunction","args":{},"dur":10,"tdur":9,"tts":675592},{"cat":"v8","pid":25863,"tid":25913,"ts":531359258073,"ph":"B","name":"V8.Execute","args":{},"tts":675593},{"cat":"v8","pid":25863,"tid":25913,"ts":531359258079,"ph":"E","name":"V8.Execute","args":{},"tts":675600},{"cat":"v8","pid":25863,"tid":25913,"ts":531359258087,"ph":"X","name":"v8.callFunction","args":{},"dur":48,"tdur":48,"tts":675607},{"cat":"v8","pid":25863,"tid":25913,"ts":531359258088,"ph":"B","name":"V8.Execute","args":{},"tts":675608},{"cat":"blink","pid":25863,"tid":25913,"ts":531359258092,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":9,"tdur":8,"tts":675612},{"cat":"v8","pid":25863,"tid":25913,"ts":531359258132,"ph":"E","name":"V8.Execute","args":{},"tts":675653},{"cat":"blink","pid":25863,"tid":25913,"ts":531359258137,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":28,"tdur":28,"tts":675657},{"cat":"blink","pid":25863,"tid":25913,"ts":531359258139,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":675659},{"cat":"blink","pid":25863,"tid":25913,"ts":531359258140,"ph":"X","name":"Document::updateStyle","args":{},"dur":17,"tdur":16,"tts":675661},{"cat":"blink","pid":25863,"tid":25913,"ts":531359258158,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":675678},{"cat":"blink","pid":25863,"tid":25913,"ts":531359258161,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":3,"tts":675682},{"cat":"sky","pid":25863,"tid":25913,"ts":531359258166,"ph":"X","name":"Layer::Display","args":{},"dur":762,"tdur":761,"tts":675686},{"cat":"sky","pid":25863,"tid":25913,"ts":531359258928,"ph":"X","name":"LayerHost::Upload","args":{},"dur":134,"tdur":81,"tts":676449},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359259190,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":38,"tdur":37,"tts":676604},{"cat":"blink","pid":25863,"tid":25913,"ts":531359259195,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":28,"tdur":29,"tts":676608},{"cat":"v8","pid":25863,"tid":25913,"ts":531359259197,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":25,"tdur":24,"tts":676611},{"cat":"v8","pid":25863,"tid":25913,"ts":531359259200,"ph":"X","name":"v8.callFunction","args":{},"dur":21,"tdur":21,"tts":676613},{"cat":"v8","pid":25863,"tid":25913,"ts":531359259201,"ph":"B","name":"V8.Execute","args":{},"tts":676615},{"cat":"blink","pid":25863,"tid":25913,"ts":531359259209,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":10,"tdur":9,"tts":676623},{"cat":"blink","pid":25863,"tid":25913,"ts":531359259215,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":676629},{"cat":"v8","pid":25863,"tid":25913,"ts":531359259220,"ph":"E","name":"V8.Execute","args":{},"tts":676633},{"cat":"sky","pid":25863,"tid":25913,"ts":531359337181,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2290,"tdur":2129,"tts":676766},{"cat":"blink","pid":25863,"tid":25913,"ts":531359337191,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":197,"tdur":196,"tts":676774},{"cat":"blink","pid":25863,"tid":25913,"ts":531359337219,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":4,"tdur":3,"tts":676802},{"cat":"blink","pid":25863,"tid":25913,"ts":531359337227,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":73,"tdur":72,"tts":676810},{"cat":"blink","pid":25863,"tid":25913,"ts":531359337238,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":61,"tdur":60,"tts":676821},{"cat":"v8","pid":25863,"tid":25913,"ts":531359337268,"ph":"X","name":"v8.callFunction","args":{},"dur":24,"tdur":23,"tts":676851},{"cat":"v8","pid":25863,"tid":25913,"ts":531359337273,"ph":"B","name":"V8.Execute","args":{},"tts":676855},{"cat":"v8","pid":25863,"tid":25913,"ts":531359337288,"ph":"E","name":"V8.Execute","args":{},"tts":676871},{"cat":"v8","pid":25863,"tid":25913,"ts":531359337305,"ph":"X","name":"v8.callFunction","args":{},"dur":81,"tdur":80,"tts":676888},{"cat":"v8","pid":25863,"tid":25913,"ts":531359337308,"ph":"B","name":"V8.Execute","args":{},"tts":676891},{"cat":"blink","pid":25863,"tid":25913,"ts":531359337317,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":31,"tdur":30,"tts":676900},{"cat":"v8","pid":25863,"tid":25913,"ts":531359337383,"ph":"E","name":"V8.Execute","args":{},"tts":676966},{"cat":"blink","pid":25863,"tid":25913,"ts":531359337388,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":75,"tdur":74,"tts":676971},{"cat":"blink","pid":25863,"tid":25913,"ts":531359337390,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":676973},{"cat":"blink","pid":25863,"tid":25913,"ts":531359337391,"ph":"X","name":"Document::updateStyle","args":{},"dur":52,"tdur":50,"tts":676974},{"cat":"blink","pid":25863,"tid":25913,"ts":531359337444,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":677027},{"cat":"blink","pid":25863,"tid":25913,"ts":531359337453,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":8,"tdur":7,"tts":677036},{"cat":"sky","pid":25863,"tid":25913,"ts":531359337465,"ph":"X","name":"Layer::Display","args":{},"dur":1663,"tdur":1662,"tts":677047},{"cat":"sky","pid":25863,"tid":25913,"ts":531359339130,"ph":"X","name":"LayerHost::Upload","args":{},"dur":339,"tdur":180,"tts":678713},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359339498,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":56,"tdur":56,"tts":678924},{"cat":"blink","pid":25863,"tid":25913,"ts":531359339509,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":41,"tdur":41,"tts":678934},{"cat":"v8","pid":25863,"tid":25913,"ts":531359339524,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":25,"tdur":24,"tts":678950},{"cat":"v8","pid":25863,"tid":25913,"ts":531359339527,"ph":"X","name":"v8.callFunction","args":{},"dur":21,"tdur":21,"tts":678952},{"cat":"v8","pid":25863,"tid":25913,"ts":531359339529,"ph":"B","name":"V8.Execute","args":{},"tts":678954},{"cat":"blink","pid":25863,"tid":25913,"ts":531359339537,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":8,"tts":678963},{"cat":"blink","pid":25863,"tid":25913,"ts":531359339543,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":2,"tdur":2,"tts":678968},{"cat":"v8","pid":25863,"tid":25913,"ts":531359339546,"ph":"E","name":"V8.Execute","args":{},"tts":678972},{"cat":"sky","pid":25863,"tid":25913,"ts":531359339939,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1098,"tdur":1011,"tts":679148},{"cat":"blink","pid":25863,"tid":25913,"ts":531359339942,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":104,"tdur":96,"tts":679151},{"cat":"blink","pid":25863,"tid":25913,"ts":531359339945,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":679154},{"cat":"blink","pid":25863,"tid":25913,"ts":531359339948,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":31,"tdur":31,"tts":679157},{"cat":"blink","pid":25863,"tid":25913,"ts":531359339954,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":25,"tdur":24,"tts":679163},{"cat":"v8","pid":25863,"tid":25913,"ts":531359339966,"ph":"X","name":"v8.callFunction","args":{},"dur":10,"tdur":9,"tts":679175},{"cat":"v8","pid":25863,"tid":25913,"ts":531359339968,"ph":"B","name":"V8.Execute","args":{},"tts":679177},{"cat":"v8","pid":25863,"tid":25913,"ts":531359339974,"ph":"E","name":"V8.Execute","args":{},"tts":679183},{"cat":"v8","pid":25863,"tid":25913,"ts":531359339981,"ph":"X","name":"v8.callFunction","args":{},"dur":63,"tdur":55,"tts":679190},{"cat":"v8","pid":25863,"tid":25913,"ts":531359339982,"ph":"B","name":"V8.Execute","args":{},"tts":679191},{"cat":"blink","pid":25863,"tid":25913,"ts":531359339986,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":9,"tdur":8,"tts":679195},{"cat":"v8","pid":25863,"tid":25913,"ts":531359340041,"ph":"E","name":"V8.Execute","args":{},"tts":679243},{"cat":"blink","pid":25863,"tid":25913,"ts":531359340046,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":28,"tdur":27,"tts":679248},{"cat":"blink","pid":25863,"tid":25913,"ts":531359340048,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":679250},{"cat":"blink","pid":25863,"tid":25913,"ts":531359340049,"ph":"X","name":"Document::updateStyle","args":{},"dur":17,"tdur":16,"tts":679251},{"cat":"blink","pid":25863,"tid":25913,"ts":531359340066,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":679268},{"cat":"blink","pid":25863,"tid":25913,"ts":531359340070,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":3,"tdur":3,"tts":679272},{"cat":"sky","pid":25863,"tid":25913,"ts":531359340074,"ph":"X","name":"Layer::Display","args":{},"dur":793,"tdur":791,"tts":679276},{"cat":"sky","pid":25863,"tid":25913,"ts":531359340868,"ph":"X","name":"LayerHost::Upload","args":{},"dur":168,"tdur":88,"tts":680070},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359341048,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":35,"tdur":35,"tts":680170},{"cat":"blink","pid":25863,"tid":25913,"ts":531359341052,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":27,"tdur":27,"tts":680174},{"cat":"v8","pid":25863,"tid":25913,"ts":531359341054,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":24,"tdur":23,"tts":680177},{"cat":"v8","pid":25863,"tid":25913,"ts":531359341057,"ph":"X","name":"v8.callFunction","args":{},"dur":20,"tdur":20,"tts":680179},{"cat":"v8","pid":25863,"tid":25913,"ts":531359341058,"ph":"B","name":"V8.Execute","args":{},"tts":680181},{"cat":"blink","pid":25863,"tid":25913,"ts":531359341066,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":8,"tdur":8,"tts":680188},{"cat":"blink","pid":25863,"tid":25913,"ts":531359341071,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":680194},{"cat":"v8","pid":25863,"tid":25913,"ts":531359341075,"ph":"E","name":"V8.Execute","args":{},"tts":680198},{"cat":"sky","pid":25863,"tid":25913,"ts":531359341472,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1004,"tdur":935,"tts":680368},{"cat":"blink","pid":25863,"tid":25913,"ts":531359341476,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":96,"tdur":95,"tts":680371},{"cat":"blink","pid":25863,"tid":25913,"ts":531359341479,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":680374},{"cat":"blink","pid":25863,"tid":25913,"ts":531359341482,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":31,"tdur":30,"tts":680377},{"cat":"blink","pid":25863,"tid":25913,"ts":531359341488,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":25,"tdur":24,"tts":680383},{"cat":"v8","pid":25863,"tid":25913,"ts":531359341500,"ph":"X","name":"v8.callFunction","args":{},"dur":10,"tdur":9,"tts":680395},{"cat":"v8","pid":25863,"tid":25913,"ts":531359341502,"ph":"B","name":"V8.Execute","args":{},"tts":680396},{"cat":"v8","pid":25863,"tid":25913,"ts":531359341508,"ph":"E","name":"V8.Execute","args":{},"tts":680402},{"cat":"v8","pid":25863,"tid":25913,"ts":531359341515,"ph":"X","name":"v8.callFunction","args":{},"dur":54,"tdur":54,"tts":680410},{"cat":"v8","pid":25863,"tid":25913,"ts":531359341516,"ph":"B","name":"V8.Execute","args":{},"tts":680411},{"cat":"blink","pid":25863,"tid":25913,"ts":531359341520,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":9,"tdur":9,"tts":680414},{"cat":"v8","pid":25863,"tid":25913,"ts":531359341560,"ph":"E","name":"V8.Execute","args":{},"tts":680454},{"cat":"blink","pid":25863,"tid":25913,"ts":531359341572,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":27,"tdur":27,"tts":680467},{"cat":"blink","pid":25863,"tid":25913,"ts":531359341574,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":680468},{"cat":"blink","pid":25863,"tid":25913,"ts":531359341575,"ph":"X","name":"Document::updateStyle","args":{},"dur":17,"tdur":16,"tts":680470},{"cat":"blink","pid":25863,"tid":25913,"ts":531359341592,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":680486},{"cat":"blink","pid":25863,"tid":25913,"ts":531359341596,"ph":"X","name":"FrameView::invalidateTree","args":{"root":"x�ף&+"},"dur":3,"tdur":3,"tts":680490},{"cat":"sky","pid":25863,"tid":25913,"ts":531359341600,"ph":"X","name":"Layer::Display","args":{},"dur":727,"tdur":725,"tts":680495},{"cat":"sky","pid":25863,"tid":25913,"ts":531359342327,"ph":"X","name":"LayerHost::Upload","args":{},"dur":148,"tdur":80,"tts":681222},{"cat":"sky","pid":25863,"tid":25913,"ts":531359342846,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":994,"tdur":945,"tts":681495},{"cat":"blink","pid":25863,"tid":25913,"ts":531359342850,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":97,"tdur":96,"tts":681498},{"cat":"blink","pid":25863,"tid":25913,"ts":531359342853,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":1,"tdur":2,"tts":681500},{"cat":"blink","pid":25863,"tid":25913,"ts":531359342855,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":31,"tdur":31,"tts":681503},{"cat":"blink","pid":25863,"tid":25913,"ts":531359342862,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":24,"tdur":24,"tts":681509},{"cat":"v8","pid":25863,"tid":25913,"ts":531359342873,"ph":"X","name":"v8.callFunction","args":{},"dur":10,"tdur":9,"tts":681521},{"cat":"v8","pid":25863,"tid":25913,"ts":531359342875,"ph":"B","name":"V8.Execute","args":{},"tts":681523},{"cat":"v8","pid":25863,"tid":25913,"ts":531359342881,"ph":"E","name":"V8.Execute","args":{},"tts":681529},{"cat":"v8","pid":25863,"tid":25913,"ts":531359342888,"ph":"X","name":"v8.callFunction","args":{},"dur":57,"tdur":56,"tts":681536},{"cat":"v8","pid":25863,"tid":25913,"ts":531359342889,"ph":"B","name":"V8.Execute","args":{},"tts":681537},{"cat":"blink","pid":25863,"tid":25913,"ts":531359342893,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":9,"tdur":8,"tts":681541},{"cat":"v8","pid":25863,"tid":25913,"ts":531359342942,"ph":"E","name":"V8.Execute","args":{},"tts":681590},{"cat":"blink","pid":25863,"tid":25913,"ts":531359342947,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":27,"tdur":27,"tts":681595},{"cat":"blink","pid":25863,"tid":25913,"ts":531359342949,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":681597},{"cat":"blink","pid":25863,"tid":25913,"ts":531359342950,"ph":"X","name":"Document::updateStyle","args":{},"dur":17,"tdur":16,"tts":681598},{"cat":"blink","pid":25863,"tid":25913,"ts":531359342967,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":681615},{"cat":"blink","pid":25863,"tid":25913,"ts":531359342971,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":3,"tdur":3,"tts":681618},{"cat":"sky","pid":25863,"tid":25913,"ts":531359342975,"ph":"X","name":"Layer::Display","args":{},"dur":734,"tdur":733,"tts":681623},{"cat":"sky","pid":25863,"tid":25913,"ts":531359343710,"ph":"X","name":"LayerHost::Upload","args":{},"dur":130,"tdur":81,"tts":682358},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359343851,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":35,"tdur":35,"tts":682451},{"cat":"blink","pid":25863,"tid":25913,"ts":531359343855,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":27,"tdur":27,"tts":682455},{"cat":"v8","pid":25863,"tid":25913,"ts":531359343857,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":24,"tdur":23,"tts":682458},{"cat":"v8","pid":25863,"tid":25913,"ts":531359343860,"ph":"X","name":"v8.callFunction","args":{},"dur":20,"tdur":20,"tts":682460},{"cat":"v8","pid":25863,"tid":25913,"ts":531359343862,"ph":"B","name":"V8.Execute","args":{},"tts":682462},{"cat":"blink","pid":25863,"tid":25913,"ts":531359343869,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":8,"tdur":8,"tts":682469},{"cat":"blink","pid":25863,"tid":25913,"ts":531359343874,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":682475},{"cat":"v8","pid":25863,"tid":25913,"ts":531359343878,"ph":"E","name":"V8.Execute","args":{},"tts":682478},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359344968,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":39,"tdur":37,"tts":682608},{"cat":"blink","pid":25863,"tid":25913,"ts":531359344974,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":28,"tdur":29,"tts":682612},{"cat":"v8","pid":25863,"tid":25913,"ts":531359344976,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":25,"tdur":24,"tts":682615},{"cat":"v8","pid":25863,"tid":25913,"ts":531359344979,"ph":"X","name":"v8.callFunction","args":{},"dur":21,"tdur":20,"tts":682618},{"cat":"v8","pid":25863,"tid":25913,"ts":531359344981,"ph":"B","name":"V8.Execute","args":{},"tts":682620},{"cat":"blink","pid":25863,"tid":25913,"ts":531359344988,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":9,"tts":682627},{"cat":"blink","pid":25863,"tid":25913,"ts":531359344994,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":682633},{"cat":"v8","pid":25863,"tid":25913,"ts":531359344998,"ph":"E","name":"V8.Execute","args":{},"tts":682637},{"cat":"sky","pid":25863,"tid":25913,"ts":531359403401,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2057,"tdur":1862,"tts":682762},{"cat":"blink","pid":25863,"tid":25913,"ts":531359403410,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":156,"tdur":156,"tts":682769},{"cat":"blink","pid":25863,"tid":25913,"ts":531359403426,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":2,"tts":682785},{"cat":"blink","pid":25863,"tid":25913,"ts":531359403430,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":45,"tdur":45,"tts":682789},{"cat":"blink","pid":25863,"tid":25913,"ts":531359403444,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":30,"tdur":29,"tts":682804},{"cat":"v8","pid":25863,"tid":25913,"ts":531359403459,"ph":"X","name":"v8.callFunction","args":{},"dur":12,"tdur":12,"tts":682818},{"cat":"v8","pid":25863,"tid":25913,"ts":531359403461,"ph":"B","name":"V8.Execute","args":{},"tts":682820},{"cat":"v8","pid":25863,"tid":25913,"ts":531359403469,"ph":"E","name":"V8.Execute","args":{},"tts":682828},{"cat":"v8","pid":25863,"tid":25913,"ts":531359403477,"ph":"X","name":"v8.callFunction","args":{},"dur":87,"tdur":86,"tts":682837},{"cat":"v8","pid":25863,"tid":25913,"ts":531359403479,"ph":"B","name":"V8.Execute","args":{},"tts":682838},{"cat":"blink","pid":25863,"tid":25913,"ts":531359403495,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":16,"tdur":16,"tts":682854},{"cat":"v8","pid":25863,"tid":25913,"ts":531359403561,"ph":"E","name":"V8.Execute","args":{},"tts":682920},{"cat":"blink","pid":25863,"tid":25913,"ts":531359403567,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":33,"tdur":33,"tts":682926},{"cat":"blink","pid":25863,"tid":25913,"ts":531359403569,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":682928},{"cat":"blink","pid":25863,"tid":25913,"ts":531359403571,"ph":"X","name":"Document::updateStyle","args":{},"dur":19,"tdur":19,"tts":682930},{"cat":"blink","pid":25863,"tid":25913,"ts":531359403591,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":682950},{"cat":"blink","pid":25863,"tid":25913,"ts":531359403595,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":3,"tts":682955},{"cat":"sky","pid":25863,"tid":25913,"ts":531359403601,"ph":"X","name":"Layer::Display","args":{},"dur":1475,"tdur":1454,"tts":682960},{"cat":"sky","pid":25863,"tid":25913,"ts":531359405078,"ph":"X","name":"LayerHost::Upload","args":{},"dur":379,"tdur":203,"tts":684418},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359405484,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":129,"tdur":127,"tts":684652},{"cat":"blink","pid":25863,"tid":25913,"ts":531359405495,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":107,"tdur":106,"tts":684662},{"cat":"v8","pid":25863,"tid":25913,"ts":531359405501,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":98,"tdur":98,"tts":684667},{"cat":"v8","pid":25863,"tid":25913,"ts":531359405525,"ph":"X","name":"v8.callFunction","args":{},"dur":72,"tdur":72,"tts":684691},{"cat":"v8","pid":25863,"tid":25913,"ts":531359405529,"ph":"B","name":"V8.Execute","args":{},"tts":684695},{"cat":"blink","pid":25863,"tid":25913,"ts":531359405548,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":42,"tdur":41,"tts":684715},{"cat":"blink","pid":25863,"tid":25913,"ts":531359405583,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":6,"tdur":5,"tts":684750},{"cat":"v8","pid":25863,"tid":25913,"ts":531359405593,"ph":"E","name":"V8.Execute","args":{},"tts":684759},{"cat":"sky","pid":25863,"tid":25913,"ts":531359406378,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2407,"tdur":2244,"tts":685157},{"cat":"blink","pid":25863,"tid":25913,"ts":531359406388,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":210,"tdur":210,"tts":685164},{"cat":"blink","pid":25863,"tid":25913,"ts":531359406394,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":4,"tdur":3,"tts":685171},{"cat":"blink","pid":25863,"tid":25913,"ts":531359406401,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":75,"tdur":74,"tts":685178},{"cat":"blink","pid":25863,"tid":25913,"ts":531359406416,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":59,"tdur":58,"tts":685193},{"cat":"v8","pid":25863,"tid":25913,"ts":531359406444,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":22,"tts":685221},{"cat":"v8","pid":25863,"tid":25913,"ts":531359406449,"ph":"B","name":"V8.Execute","args":{},"tts":685225},{"cat":"v8","pid":25863,"tid":25913,"ts":531359406463,"ph":"E","name":"V8.Execute","args":{},"tts":685240},{"cat":"v8","pid":25863,"tid":25913,"ts":531359406480,"ph":"X","name":"v8.callFunction","args":{},"dur":113,"tdur":112,"tts":685257},{"cat":"v8","pid":25863,"tid":25913,"ts":531359406484,"ph":"B","name":"V8.Execute","args":{},"tts":685261},{"cat":"blink","pid":25863,"tid":25913,"ts":531359406492,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":21,"tdur":20,"tts":685269},{"cat":"v8","pid":25863,"tid":25913,"ts":531359406587,"ph":"E","name":"V8.Execute","args":{},"tts":685364},{"cat":"blink","pid":25863,"tid":25913,"ts":531359406599,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":65,"tdur":64,"tts":685376},{"cat":"blink","pid":25863,"tid":25913,"ts":531359406603,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":685380},{"cat":"blink","pid":25863,"tid":25913,"ts":531359406606,"ph":"X","name":"Document::updateStyle","args":{},"dur":39,"tdur":38,"tts":685383},{"cat":"blink","pid":25863,"tid":25913,"ts":531359406646,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":685423},{"cat":"blink","pid":25863,"tid":25913,"ts":531359406655,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":8,"tdur":7,"tts":685432},{"cat":"sky","pid":25863,"tid":25913,"ts":531359406666,"ph":"X","name":"Layer::Display","args":{},"dur":1775,"tdur":1772,"tts":685443},{"cat":"sky","pid":25863,"tid":25913,"ts":531359408443,"ph":"X","name":"LayerHost::Upload","args":{},"dur":340,"tdur":178,"tts":687220},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359408811,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":86,"tdur":85,"tts":687428},{"cat":"blink","pid":25863,"tid":25913,"ts":531359408822,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":65,"tdur":65,"tts":687438},{"cat":"v8","pid":25863,"tid":25913,"ts":531359408827,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":58,"tdur":56,"tts":687444},{"cat":"v8","pid":25863,"tid":25913,"ts":531359408833,"ph":"X","name":"v8.callFunction","args":{},"dur":49,"tdur":48,"tts":687450},{"cat":"v8","pid":25863,"tid":25913,"ts":531359408837,"ph":"B","name":"V8.Execute","args":{},"tts":687454},{"cat":"blink","pid":25863,"tid":25913,"ts":531359408855,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":21,"tdur":20,"tts":687472},{"cat":"blink","pid":25863,"tid":25913,"ts":531359408869,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":6,"tdur":5,"tts":687486},{"cat":"v8","pid":25863,"tid":25913,"ts":531359408879,"ph":"E","name":"V8.Execute","args":{},"tts":687495},{"cat":"sky","pid":25863,"tid":25913,"ts":531359409601,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":3021,"tdur":2855,"tts":687888},{"cat":"blink","pid":25863,"tid":25913,"ts":531359409610,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":248,"tdur":247,"tts":687895},{"cat":"blink","pid":25863,"tid":25913,"ts":531359409617,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":3,"tdur":2,"tts":687902},{"cat":"blink","pid":25863,"tid":25913,"ts":531359409624,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":86,"tdur":85,"tts":687909},{"cat":"blink","pid":25863,"tid":25913,"ts":531359409649,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":60,"tdur":58,"tts":687935},{"cat":"v8","pid":25863,"tid":25913,"ts":531359409678,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":22,"tts":687964},{"cat":"v8","pid":25863,"tid":25913,"ts":531359409683,"ph":"B","name":"V8.Execute","args":{},"tts":687968},{"cat":"v8","pid":25863,"tid":25913,"ts":531359409697,"ph":"E","name":"V8.Execute","args":{},"tts":687982},{"cat":"v8","pid":25863,"tid":25913,"ts":531359409714,"ph":"X","name":"v8.callFunction","args":{},"dur":139,"tdur":138,"tts":687999},{"cat":"v8","pid":25863,"tid":25913,"ts":531359409718,"ph":"B","name":"V8.Execute","args":{},"tts":688003},{"cat":"blink","pid":25863,"tid":25913,"ts":531359409726,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":21,"tdur":20,"tts":688011},{"cat":"v8","pid":25863,"tid":25913,"ts":531359409846,"ph":"E","name":"V8.Execute","args":{},"tts":688132},{"cat":"blink","pid":25863,"tid":25913,"ts":531359409859,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":670,"tdur":670,"tts":688144},{"cat":"blink","pid":25863,"tid":25913,"ts":531359409863,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":688148},{"cat":"blink","pid":25863,"tid":25913,"ts":531359409866,"ph":"X","name":"Document::updateStyle","args":{},"dur":120,"tdur":118,"tts":688151},{"cat":"blink","pid":25863,"tid":25913,"ts":531359409988,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":2},"tts":688273},{"cat":"blink","pid":25863,"tid":25913,"ts":531359409993,"ph":"X","name":"FrameView::layout","args":{},"dur":61,"tdur":60,"tts":688278},{"cat":"blink","pid":25863,"tid":25913,"ts":531359409996,"ph":"X","name":"FrameView::performPreLayoutTasks","args":{},"dur":4,"tdur":3,"tts":688281},{"cat":"blink","pid":25863,"tid":25913,"ts":531359410001,"ph":"X","name":"FrameView::performLayout","args":{},"dur":34,"tdur":33,"tts":688286},{"cat":"blink","pid":25863,"tid":25913,"ts":531359410036,"ph":"X","name":"RenderLayer::updateLayerPositionsAfterLayout","args":{},"dur":5,"tdur":4,"tts":688321},{"cat":"blink","pid":25863,"tid":25913,"ts":531359410041,"ph":"X","name":"FrameView::performPostLayoutTasks","args":{},"dur":10,"tdur":8,"tts":688327},{"cat":"blink","pid":25863,"tid":25913,"ts":531359410060,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":468,"tdur":467,"tts":688345},{"cat":"sky","pid":25863,"tid":25913,"ts":531359410531,"ph":"X","name":"Layer::Display","args":{},"dur":1799,"tdur":1796,"tts":688817},{"cat":"sky","pid":25863,"tid":25913,"ts":531359412332,"ph":"X","name":"LayerHost::Upload","args":{},"dur":288,"tdur":124,"tts":690617},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359412646,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":95,"tdur":94,"tts":690768},{"cat":"blink","pid":25863,"tid":25913,"ts":531359412655,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":76,"tdur":75,"tts":690777},{"cat":"v8","pid":25863,"tid":25913,"ts":531359412660,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":68,"tdur":67,"tts":690782},{"cat":"v8","pid":25863,"tid":25913,"ts":531359412666,"ph":"X","name":"v8.callFunction","args":{},"dur":60,"tdur":59,"tts":690788},{"cat":"v8","pid":25863,"tid":25913,"ts":531359412670,"ph":"B","name":"V8.Execute","args":{},"tts":690791},{"cat":"blink","pid":25863,"tid":25913,"ts":531359412686,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":20,"tdur":19,"tts":690808},{"cat":"blink","pid":25863,"tid":25913,"ts":531359412699,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":6,"tdur":5,"tts":690821},{"cat":"v8","pid":25863,"tid":25913,"ts":531359412708,"ph":"E","name":"V8.Execute","args":{},"tts":690830},{"cat":"sky","pid":25863,"tid":25913,"ts":531359413299,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2274,"tdur":2120,"tts":691096},{"cat":"blink","pid":25863,"tid":25913,"ts":531359413305,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":188,"tdur":187,"tts":691101},{"cat":"blink","pid":25863,"tid":25913,"ts":531359413310,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":4,"tdur":3,"tts":691106},{"cat":"blink","pid":25863,"tid":25913,"ts":531359413316,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":65,"tdur":64,"tts":691112},{"cat":"blink","pid":25863,"tid":25913,"ts":531359413329,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":51,"tdur":50,"tts":691125},{"cat":"v8","pid":25863,"tid":25913,"ts":531359413352,"ph":"X","name":"v8.callFunction","args":{},"dur":21,"tdur":21,"tts":691148},{"cat":"v8","pid":25863,"tid":25913,"ts":531359413356,"ph":"B","name":"V8.Execute","args":{},"tts":691152},{"cat":"v8","pid":25863,"tid":25913,"ts":531359413369,"ph":"E","name":"V8.Execute","args":{},"tts":691165},{"cat":"v8","pid":25863,"tid":25913,"ts":531359413385,"ph":"X","name":"v8.callFunction","args":{},"dur":103,"tdur":102,"tts":691181},{"cat":"v8","pid":25863,"tid":25913,"ts":531359413388,"ph":"B","name":"V8.Execute","args":{},"tts":691184},{"cat":"blink","pid":25863,"tid":25913,"ts":531359413396,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":19,"tdur":18,"tts":691192},{"cat":"v8","pid":25863,"tid":25913,"ts":531359413482,"ph":"E","name":"V8.Execute","args":{},"tts":691278},{"cat":"blink","pid":25863,"tid":25913,"ts":531359413494,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":60,"tdur":59,"tts":691290},{"cat":"blink","pid":25863,"tid":25913,"ts":531359413498,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":691294},{"cat":"blink","pid":25863,"tid":25913,"ts":531359413501,"ph":"X","name":"Document::updateStyle","args":{},"dur":36,"tdur":34,"tts":691297},{"cat":"blink","pid":25863,"tid":25913,"ts":531359413537,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":691333},{"cat":"blink","pid":25863,"tid":25913,"ts":531359413545,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":8,"tdur":7,"tts":691341},{"cat":"sky","pid":25863,"tid":25913,"ts":531359413556,"ph":"X","name":"Layer::Display","args":{},"dur":1742,"tdur":1740,"tts":691351},{"cat":"sky","pid":25863,"tid":25913,"ts":531359415300,"ph":"X","name":"LayerHost::Upload","args":{},"dur":272,"tdur":119,"tts":693096},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359415595,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":78,"tdur":77,"tts":693239},{"cat":"blink","pid":25863,"tid":25913,"ts":531359415604,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":60,"tdur":59,"tts":693248},{"cat":"v8","pid":25863,"tid":25913,"ts":531359415609,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":52,"tdur":52,"tts":693253},{"cat":"v8","pid":25863,"tid":25913,"ts":531359415615,"ph":"X","name":"v8.callFunction","args":{},"dur":44,"tdur":44,"tts":693259},{"cat":"v8","pid":25863,"tid":25913,"ts":531359415618,"ph":"B","name":"V8.Execute","args":{},"tts":693262},{"cat":"blink","pid":25863,"tid":25913,"ts":531359415634,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":20,"tdur":18,"tts":693279},{"cat":"blink","pid":25863,"tid":25913,"ts":531359415647,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":5,"tdur":5,"tts":693291},{"cat":"v8","pid":25863,"tid":25913,"ts":531359415656,"ph":"E","name":"V8.Execute","args":{},"tts":693300},{"cat":"sky","pid":25863,"tid":25913,"ts":531359469894,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":3207,"tdur":3022,"tts":693519},{"cat":"blink","pid":25863,"tid":25913,"ts":531359469897,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":392,"tdur":392,"tts":693521},{"cat":"blink","pid":25863,"tid":25913,"ts":531359469899,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":693524},{"cat":"blink","pid":25863,"tid":25913,"ts":531359469902,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":63,"tdur":63,"tts":693526},{"cat":"blink","pid":25863,"tid":25913,"ts":531359469907,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":57,"tdur":56,"tts":693532},{"cat":"v8","pid":25863,"tid":25913,"ts":531359469935,"ph":"X","name":"v8.callFunction","args":{},"dur":22,"tdur":20,"tts":693561},{"cat":"v8","pid":25863,"tid":25913,"ts":531359469940,"ph":"B","name":"V8.Execute","args":{},"tts":693565},{"cat":"v8","pid":25863,"tid":25913,"ts":531359469953,"ph":"E","name":"V8.Execute","args":{},"tts":693578},{"cat":"v8","pid":25863,"tid":25913,"ts":531359469969,"ph":"X","name":"v8.callFunction","args":{},"dur":313,"tdur":311,"tts":693594},{"cat":"v8","pid":25863,"tid":25913,"ts":531359469972,"ph":"B","name":"V8.Execute","args":{},"tts":693597},{"cat":"blink","pid":25863,"tid":25913,"ts":531359469980,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":19,"tdur":18,"tts":693605},{"cat":"v8","pid":25863,"tid":25913,"ts":531359470193,"ph":"E","name":"V8.Execute","args":{},"tts":693818},{"cat":"blink","pid":25863,"tid":25913,"ts":531359470290,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":741,"tdur":740,"tts":693915},{"cat":"blink","pid":25863,"tid":25913,"ts":531359470296,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":693921},{"cat":"blink","pid":25863,"tid":25913,"ts":531359470299,"ph":"X","name":"Document::updateStyle","args":{},"dur":122,"tdur":120,"tts":693924},{"cat":"blink","pid":25863,"tid":25913,"ts":531359470423,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":6},"tts":694048},{"cat":"blink","pid":25863,"tid":25913,"ts":531359470428,"ph":"X","name":"FrameView::layout","args":{},"dur":210,"tdur":209,"tts":694053},{"cat":"blink","pid":25863,"tid":25913,"ts":531359470431,"ph":"X","name":"FrameView::performPreLayoutTasks","args":{},"dur":3,"tdur":3,"tts":694055},{"cat":"blink","pid":25863,"tid":25913,"ts":531359470435,"ph":"X","name":"FrameView::performLayout","args":{},"dur":182,"tdur":180,"tts":694060},{"cat":"blink","pid":25863,"tid":25913,"ts":531359470619,"ph":"X","name":"RenderLayer::updateLayerPositionsAfterLayout","args":{},"dur":6,"tdur":5,"tts":694244},{"cat":"blink","pid":25863,"tid":25913,"ts":531359470626,"ph":"X","name":"FrameView::performPostLayoutTasks","args":{},"dur":9,"tdur":8,"tts":694251},{"cat":"blink","pid":25863,"tid":25913,"ts":531359470643,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":386,"tdur":385,"tts":694268},{"cat":"sky","pid":25863,"tid":25913,"ts":531359471034,"ph":"X","name":"Layer::Display","args":{},"dur":1775,"tdur":1758,"tts":694659},{"cat":"sky","pid":25863,"tid":25913,"ts":531359472811,"ph":"X","name":"LayerHost::Upload","args":{},"dur":289,"tdur":119,"tts":696421},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359473125,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":80,"tdur":79,"tts":696566},{"cat":"blink","pid":25863,"tid":25913,"ts":531359473134,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":61,"tdur":60,"tts":696575},{"cat":"v8","pid":25863,"tid":25913,"ts":531359473139,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":54,"tdur":53,"tts":696580},{"cat":"v8","pid":25863,"tid":25913,"ts":531359473145,"ph":"X","name":"v8.callFunction","args":{},"dur":46,"tdur":45,"tts":696586},{"cat":"v8","pid":25863,"tid":25913,"ts":531359473148,"ph":"B","name":"V8.Execute","args":{},"tts":696589},{"cat":"blink","pid":25863,"tid":25913,"ts":531359473165,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":20,"tdur":19,"tts":696606},{"cat":"blink","pid":25863,"tid":25913,"ts":531359473178,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":6,"tdur":5,"tts":696619},{"cat":"v8","pid":25863,"tid":25913,"ts":531359473187,"ph":"E","name":"V8.Execute","args":{},"tts":696628},{"cat":"sky","pid":25863,"tid":25913,"ts":531359473566,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":997,"tdur":944,"tts":696782},{"cat":"blink","pid":25863,"tid":25913,"ts":531359473569,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":91,"tdur":91,"tts":696784},{"cat":"blink","pid":25863,"tid":25913,"ts":531359473571,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":696787},{"cat":"blink","pid":25863,"tid":25913,"ts":531359473574,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":35,"tdur":36,"tts":696789},{"cat":"blink","pid":25863,"tid":25913,"ts":531359473579,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":30,"tdur":29,"tts":696795},{"cat":"v8","pid":25863,"tid":25913,"ts":531359473597,"ph":"X","name":"v8.callFunction","args":{},"dur":9,"tdur":10,"tts":696812},{"cat":"v8","pid":25863,"tid":25913,"ts":531359473599,"ph":"B","name":"V8.Execute","args":{},"tts":696814},{"cat":"v8","pid":25863,"tid":25913,"ts":531359473605,"ph":"E","name":"V8.Execute","args":{},"tts":696820},{"cat":"v8","pid":25863,"tid":25913,"ts":531359473612,"ph":"X","name":"v8.callFunction","args":{},"dur":46,"tdur":46,"tts":696827},{"cat":"v8","pid":25863,"tid":25913,"ts":531359473613,"ph":"B","name":"V8.Execute","args":{},"tts":696829},{"cat":"blink","pid":25863,"tid":25913,"ts":531359473617,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":8,"tdur":8,"tts":696832},{"cat":"v8","pid":25863,"tid":25913,"ts":531359473655,"ph":"E","name":"V8.Execute","args":{},"tts":696871},{"cat":"blink","pid":25863,"tid":25913,"ts":531359473660,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":27,"tdur":27,"tts":696876},{"cat":"blink","pid":25863,"tid":25913,"ts":531359473662,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":696878},{"cat":"blink","pid":25863,"tid":25913,"ts":531359473664,"ph":"X","name":"Document::updateStyle","args":{},"dur":15,"tdur":16,"tts":696879},{"cat":"blink","pid":25863,"tid":25913,"ts":531359473680,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":696896},{"cat":"blink","pid":25863,"tid":25913,"ts":531359473683,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":3,"tts":696899},{"cat":"sky","pid":25863,"tid":25913,"ts":531359473688,"ph":"X","name":"Layer::Display","args":{},"dur":768,"tdur":767,"tts":696904},{"cat":"sky","pid":25863,"tid":25913,"ts":531359474457,"ph":"X","name":"LayerHost::Upload","args":{},"dur":106,"tdur":52,"tts":697673},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359474649,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":37,"tdur":36,"tts":697789},{"cat":"blink","pid":25863,"tid":25913,"ts":531359474654,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":26,"tdur":26,"tts":697793},{"cat":"v8","pid":25863,"tid":25913,"ts":531359474656,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":23,"tdur":23,"tts":697795},{"cat":"v8","pid":25863,"tid":25913,"ts":531359474658,"ph":"X","name":"v8.callFunction","args":{},"dur":20,"tdur":19,"tts":697798},{"cat":"v8","pid":25863,"tid":25913,"ts":531359474660,"ph":"B","name":"V8.Execute","args":{},"tts":697799},{"cat":"blink","pid":25863,"tid":25913,"ts":531359474667,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":9,"tts":697806},{"cat":"blink","pid":25863,"tid":25913,"ts":531359474673,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":2,"tdur":2,"tts":697812},{"cat":"v8","pid":25863,"tid":25913,"ts":531359474677,"ph":"E","name":"V8.Execute","args":{},"tts":697816},{"cat":"sky","pid":25863,"tid":25913,"ts":531359474928,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1068,"tdur":1012,"tts":697973},{"cat":"blink","pid":25863,"tid":25913,"ts":531359474933,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":98,"tdur":98,"tts":697976},{"cat":"blink","pid":25863,"tid":25913,"ts":531359474936,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":697980},{"cat":"blink","pid":25863,"tid":25913,"ts":531359474939,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":38,"tdur":37,"tts":697983},{"cat":"blink","pid":25863,"tid":25913,"ts":531359474951,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":26,"tdur":25,"tts":697995},{"cat":"v8","pid":25863,"tid":25913,"ts":531359474964,"ph":"X","name":"v8.callFunction","args":{},"dur":10,"tdur":10,"tts":698007},{"cat":"v8","pid":25863,"tid":25913,"ts":531359474965,"ph":"B","name":"V8.Execute","args":{},"tts":698009},{"cat":"v8","pid":25863,"tid":25913,"ts":531359474972,"ph":"E","name":"V8.Execute","args":{},"tts":698015},{"cat":"v8","pid":25863,"tid":25913,"ts":531359474979,"ph":"X","name":"v8.callFunction","args":{},"dur":50,"tdur":50,"tts":698022},{"cat":"v8","pid":25863,"tid":25913,"ts":531359474981,"ph":"B","name":"V8.Execute","args":{},"tts":698024},{"cat":"blink","pid":25863,"tid":25913,"ts":531359474984,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":10,"tdur":9,"tts":698028},{"cat":"v8","pid":25863,"tid":25913,"ts":531359475026,"ph":"E","name":"V8.Execute","args":{},"tts":698070},{"cat":"blink","pid":25863,"tid":25913,"ts":531359475032,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":29,"tdur":29,"tts":698075},{"cat":"blink","pid":25863,"tid":25913,"ts":531359475034,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":698077},{"cat":"blink","pid":25863,"tid":25913,"ts":531359475035,"ph":"X","name":"Document::updateStyle","args":{},"dur":17,"tdur":17,"tts":698078},{"cat":"blink","pid":25863,"tid":25913,"ts":531359475053,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":698096},{"cat":"blink","pid":25863,"tid":25913,"ts":531359475057,"ph":"X","name":"FrameView::invalidateTree","args":{"root":"8�ף&+"},"dur":3,"tdur":3,"tts":698100},{"cat":"sky","pid":25863,"tid":25913,"ts":531359475061,"ph":"X","name":"Layer::Display","args":{},"dur":790,"tdur":788,"tts":698105},{"cat":"sky","pid":25863,"tid":25913,"ts":531359475851,"ph":"X","name":"LayerHost::Upload","args":{},"dur":144,"tdur":88,"tts":698895},{"cat":"sky","pid":25863,"tid":25913,"ts":531359476427,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1076,"tdur":1006,"tts":699190},{"cat":"blink","pid":25863,"tid":25913,"ts":531359476431,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":89,"tdur":88,"tts":699194},{"cat":"blink","pid":25863,"tid":25913,"ts":531359476434,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":2,"tts":699196},{"cat":"blink","pid":25863,"tid":25913,"ts":531359476437,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":33,"tdur":33,"tts":699199},{"cat":"blink","pid":25863,"tid":25913,"ts":531359476444,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":26,"tdur":26,"tts":699206},{"cat":"v8","pid":25863,"tid":25913,"ts":531359476456,"ph":"X","name":"v8.callFunction","args":{},"dur":11,"tdur":10,"tts":699219},{"cat":"v8","pid":25863,"tid":25913,"ts":531359476458,"ph":"B","name":"V8.Execute","args":{},"tts":699221},{"cat":"v8","pid":25863,"tid":25913,"ts":531359476465,"ph":"E","name":"V8.Execute","args":{},"tts":699227},{"cat":"v8","pid":25863,"tid":25913,"ts":531359476472,"ph":"X","name":"v8.callFunction","args":{},"dur":46,"tdur":45,"tts":699235},{"cat":"v8","pid":25863,"tid":25913,"ts":531359476474,"ph":"B","name":"V8.Execute","args":{},"tts":699236},{"cat":"blink","pid":25863,"tid":25913,"ts":531359476477,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":10,"tdur":9,"tts":699240},{"cat":"v8","pid":25863,"tid":25913,"ts":531359476515,"ph":"E","name":"V8.Execute","args":{},"tts":699278},{"cat":"blink","pid":25863,"tid":25913,"ts":531359476520,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":29,"tdur":28,"tts":699283},{"cat":"blink","pid":25863,"tid":25913,"ts":531359476522,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":699285},{"cat":"blink","pid":25863,"tid":25913,"ts":531359476523,"ph":"X","name":"Document::updateStyle","args":{},"dur":18,"tdur":17,"tts":699286},{"cat":"blink","pid":25863,"tid":25913,"ts":531359476541,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":699304},{"cat":"blink","pid":25863,"tid":25913,"ts":531359476545,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":3,"tts":699308},{"cat":"sky","pid":25863,"tid":25913,"ts":531359476550,"ph":"X","name":"Layer::Display","args":{},"dur":796,"tdur":795,"tts":699312},{"cat":"sky","pid":25863,"tid":25913,"ts":531359477347,"ph":"X","name":"LayerHost::Upload","args":{},"dur":155,"tdur":86,"tts":700109},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359477514,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":68,"tdur":68,"tts":700207},{"cat":"blink","pid":25863,"tid":25913,"ts":531359477519,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":41,"tdur":41,"tts":700212},{"cat":"v8","pid":25863,"tid":25913,"ts":531359477521,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":37,"tdur":37,"tts":700214},{"cat":"v8","pid":25863,"tid":25913,"ts":531359477524,"ph":"X","name":"v8.callFunction","args":{},"dur":33,"tdur":33,"tts":700217},{"cat":"v8","pid":25863,"tid":25913,"ts":531359477532,"ph":"B","name":"V8.Execute","args":{},"tts":700226},{"cat":"blink","pid":25863,"tid":25913,"ts":531359477541,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":13,"tdur":13,"tts":700234},{"cat":"blink","pid":25863,"tid":25913,"ts":531359477551,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":700244},{"cat":"v8","pid":25863,"tid":25913,"ts":531359477555,"ph":"E","name":"V8.Execute","args":{},"tts":700249},{"cat":"blink","pid":25863,"tid":25913,"ts":531359477560,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":18,"tdur":17,"tts":700253},{"cat":"v8","pid":25863,"tid":25913,"ts":531359477562,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":15,"tdur":15,"tts":700255},{"cat":"v8","pid":25863,"tid":25913,"ts":531359477564,"ph":"X","name":"v8.callFunction","args":{},"dur":12,"tdur":12,"tts":700257},{"cat":"v8","pid":25863,"tid":25913,"ts":531359477565,"ph":"B","name":"V8.Execute","args":{},"tts":700258},{"cat":"blink","pid":25863,"tid":25913,"ts":531359477569,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":5,"tdur":5,"tts":700262},{"cat":"blink","pid":25863,"tid":25913,"ts":531359477571,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":2,"tdur":1,"tts":700265},{"cat":"v8","pid":25863,"tid":25913,"ts":531359477574,"ph":"E","name":"V8.Execute","args":{},"tts":700268},{"cat":"sky","pid":25863,"tid":25913,"ts":531359553667,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1340,"tdur":1190,"tts":700448},{"cat":"blink","pid":25863,"tid":25913,"ts":531359553671,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":111,"tdur":111,"tts":700451},{"cat":"blink","pid":25863,"tid":25913,"ts":531359553673,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":2,"tts":700454},{"cat":"blink","pid":25863,"tid":25913,"ts":531359553677,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":37,"tdur":38,"tts":700457},{"cat":"blink","pid":25863,"tid":25913,"ts":531359553688,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":26,"tdur":25,"tts":700469},{"cat":"v8","pid":25863,"tid":25913,"ts":531359553700,"ph":"X","name":"v8.callFunction","args":{},"dur":10,"tdur":10,"tts":700481},{"cat":"v8","pid":25863,"tid":25913,"ts":531359553702,"ph":"B","name":"V8.Execute","args":{},"tts":700483},{"cat":"v8","pid":25863,"tid":25913,"ts":531359553709,"ph":"E","name":"V8.Execute","args":{},"tts":700490},{"cat":"v8","pid":25863,"tid":25913,"ts":531359553716,"ph":"X","name":"v8.callFunction","args":{},"dur":64,"tdur":63,"tts":700497},{"cat":"v8","pid":25863,"tid":25913,"ts":531359553718,"ph":"B","name":"V8.Execute","args":{},"tts":700499},{"cat":"blink","pid":25863,"tid":25913,"ts":531359553721,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":10,"tdur":9,"tts":700502},{"cat":"v8","pid":25863,"tid":25913,"ts":531359553776,"ph":"E","name":"V8.Execute","args":{},"tts":700558},{"cat":"blink","pid":25863,"tid":25913,"ts":531359553782,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":32,"tdur":32,"tts":700563},{"cat":"blink","pid":25863,"tid":25913,"ts":531359553784,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":700565},{"cat":"blink","pid":25863,"tid":25913,"ts":531359553786,"ph":"X","name":"Document::updateStyle","args":{},"dur":19,"tdur":18,"tts":700567},{"cat":"blink","pid":25863,"tid":25913,"ts":531359553805,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":700586},{"cat":"blink","pid":25863,"tid":25913,"ts":531359553810,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":3,"tts":700591},{"cat":"sky","pid":25863,"tid":25913,"ts":531359553831,"ph":"X","name":"Layer::Display","args":{},"dur":889,"tdur":887,"tts":700613},{"cat":"sky","pid":25863,"tid":25913,"ts":531359554721,"ph":"X","name":"LayerHost::Upload","args":{},"dur":285,"tdur":135,"tts":701502},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359555021,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":52,"tdur":52,"tts":701653},{"cat":"blink","pid":25863,"tid":25913,"ts":531359555026,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":43,"tdur":42,"tts":701658},{"cat":"v8","pid":25863,"tid":25913,"ts":531359555029,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":39,"tdur":39,"tts":701660},{"cat":"v8","pid":25863,"tid":25913,"ts":531359555032,"ph":"X","name":"v8.callFunction","args":{},"dur":35,"tdur":35,"tts":701663},{"cat":"v8","pid":25863,"tid":25913,"ts":531359555034,"ph":"B","name":"V8.Execute","args":{},"tts":701665},{"cat":"blink","pid":25863,"tid":25913,"ts":531359555042,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":22,"tdur":21,"tts":701674},{"cat":"blink","pid":25863,"tid":25913,"ts":531359555049,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":14,"tdur":14,"tts":701681},{"cat":"v8","pid":25863,"tid":25913,"ts":531359555065,"ph":"E","name":"V8.Execute","args":{},"tts":701696},{"cat":"sky","pid":25863,"tid":25913,"ts":531359555318,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1099,"tdur":1006,"tts":701869},{"cat":"blink","pid":25863,"tid":25913,"ts":531359555322,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":104,"tdur":104,"tts":701872},{"cat":"blink","pid":25863,"tid":25913,"ts":531359555324,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":701875},{"cat":"blink","pid":25863,"tid":25913,"ts":531359555327,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":33,"tdur":32,"tts":701878},{"cat":"blink","pid":25863,"tid":25913,"ts":531359555334,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":25,"tdur":25,"tts":701884},{"cat":"v8","pid":25863,"tid":25913,"ts":531359555346,"ph":"X","name":"v8.callFunction","args":{},"dur":10,"tdur":9,"tts":701897},{"cat":"v8","pid":25863,"tid":25913,"ts":531359555348,"ph":"B","name":"V8.Execute","args":{},"tts":701898},{"cat":"v8","pid":25863,"tid":25913,"ts":531359555354,"ph":"E","name":"V8.Execute","args":{},"tts":701905},{"cat":"v8","pid":25863,"tid":25913,"ts":531359555361,"ph":"X","name":"v8.callFunction","args":{},"dur":63,"tdur":62,"tts":701912},{"cat":"v8","pid":25863,"tid":25913,"ts":531359555363,"ph":"B","name":"V8.Execute","args":{},"tts":701913},{"cat":"blink","pid":25863,"tid":25913,"ts":531359555366,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":9,"tdur":8,"tts":701917},{"cat":"v8","pid":25863,"tid":25913,"ts":531359555421,"ph":"E","name":"V8.Execute","args":{},"tts":701972},{"cat":"blink","pid":25863,"tid":25913,"ts":531359555426,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":28,"tdur":28,"tts":701977},{"cat":"blink","pid":25863,"tid":25913,"ts":531359555428,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":701979},{"cat":"blink","pid":25863,"tid":25913,"ts":531359555430,"ph":"X","name":"Document::updateStyle","args":{},"dur":16,"tdur":16,"tts":701980},{"cat":"blink","pid":25863,"tid":25913,"ts":531359555447,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":701997},{"cat":"blink","pid":25863,"tid":25913,"ts":531359555450,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":3,"tts":702001},{"cat":"sky","pid":25863,"tid":25913,"ts":531359555455,"ph":"X","name":"Layer::Display","args":{},"dur":794,"tdur":783,"tts":702006},{"cat":"sky","pid":25863,"tid":25913,"ts":531359556250,"ph":"X","name":"LayerHost::Upload","args":{},"dur":167,"tdur":82,"tts":702791},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359556429,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":44,"tdur":44,"tts":702887},{"cat":"blink","pid":25863,"tid":25913,"ts":531359556433,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":36,"tdur":35,"tts":702891},{"cat":"v8","pid":25863,"tid":25913,"ts":531359556436,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":32,"tdur":32,"tts":702893},{"cat":"v8","pid":25863,"tid":25913,"ts":531359556438,"ph":"X","name":"v8.callFunction","args":{},"dur":29,"tdur":28,"tts":702896},{"cat":"v8","pid":25863,"tid":25913,"ts":531359556440,"ph":"B","name":"V8.Execute","args":{},"tts":702897},{"cat":"blink","pid":25863,"tid":25913,"ts":531359556448,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":16,"tdur":16,"tts":702905},{"cat":"blink","pid":25863,"tid":25913,"ts":531359556453,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":10,"tdur":9,"tts":702911},{"cat":"v8","pid":25863,"tid":25913,"ts":531359556465,"ph":"E","name":"V8.Execute","args":{},"tts":702922},{"cat":"sky","pid":25863,"tid":25913,"ts":531359556731,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":999,"tdur":964,"tts":703106},{"cat":"blink","pid":25863,"tid":25913,"ts":531359556735,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":90,"tdur":89,"tts":703110},{"cat":"blink","pid":25863,"tid":25913,"ts":531359556737,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":2,"tts":703112},{"cat":"blink","pid":25863,"tid":25913,"ts":531359556740,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":32,"tdur":32,"tts":703115},{"cat":"blink","pid":25863,"tid":25913,"ts":531359556747,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":25,"tdur":25,"tts":703122},{"cat":"v8","pid":25863,"tid":25913,"ts":531359556759,"ph":"X","name":"v8.callFunction","args":{},"dur":10,"tdur":10,"tts":703134},{"cat":"v8","pid":25863,"tid":25913,"ts":531359556761,"ph":"B","name":"V8.Execute","args":{},"tts":703136},{"cat":"v8","pid":25863,"tid":25913,"ts":531359556767,"ph":"E","name":"V8.Execute","args":{},"tts":703142},{"cat":"v8","pid":25863,"tid":25913,"ts":531359556774,"ph":"X","name":"v8.callFunction","args":{},"dur":49,"tdur":48,"tts":703149},{"cat":"v8","pid":25863,"tid":25913,"ts":531359556776,"ph":"B","name":"V8.Execute","args":{},"tts":703151},{"cat":"blink","pid":25863,"tid":25913,"ts":531359556779,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":9,"tdur":9,"tts":703154},{"cat":"v8","pid":25863,"tid":25913,"ts":531359556820,"ph":"E","name":"V8.Execute","args":{},"tts":703195},{"cat":"blink","pid":25863,"tid":25913,"ts":531359556825,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":28,"tdur":28,"tts":703200},{"cat":"blink","pid":25863,"tid":25913,"ts":531359556827,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":703202},{"cat":"blink","pid":25863,"tid":25913,"ts":531359556828,"ph":"X","name":"Document::updateStyle","args":{},"dur":17,"tdur":16,"tts":703203},{"cat":"blink","pid":25863,"tid":25913,"ts":531359556845,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":703220},{"cat":"blink","pid":25863,"tid":25913,"ts":531359556849,"ph":"X","name":"FrameView::invalidateTree","args":{"root":"��ף&+"},"dur":4,"tdur":3,"tts":703224},{"cat":"sky","pid":25863,"tid":25913,"ts":531359556854,"ph":"X","name":"Layer::Display","args":{},"dur":761,"tdur":760,"tts":703229},{"cat":"sky","pid":25863,"tid":25913,"ts":531359557616,"ph":"X","name":"LayerHost::Upload","args":{},"dur":114,"tdur":78,"tts":703991},{"cat":"sky","pid":25863,"tid":25913,"ts":531359557907,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1096,"tdur":1061,"tts":704168},{"cat":"blink","pid":25863,"tid":25913,"ts":531359557911,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":103,"tdur":102,"tts":704171},{"cat":"blink","pid":25863,"tid":25913,"ts":531359557913,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":2,"tts":704173},{"cat":"blink","pid":25863,"tid":25913,"ts":531359557916,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":32,"tdur":31,"tts":704176},{"cat":"blink","pid":25863,"tid":25913,"ts":531359557923,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":24,"tdur":24,"tts":704183},{"cat":"v8","pid":25863,"tid":25913,"ts":531359557935,"ph":"X","name":"v8.callFunction","args":{},"dur":10,"tdur":9,"tts":704195},{"cat":"v8","pid":25863,"tid":25913,"ts":531359557937,"ph":"B","name":"V8.Execute","args":{},"tts":704197},{"cat":"v8","pid":25863,"tid":25913,"ts":531359557943,"ph":"E","name":"V8.Execute","args":{},"tts":704203},{"cat":"v8","pid":25863,"tid":25913,"ts":531359557950,"ph":"X","name":"v8.callFunction","args":{},"dur":61,"tdur":60,"tts":704210},{"cat":"v8","pid":25863,"tid":25913,"ts":531359557951,"ph":"B","name":"V8.Execute","args":{},"tts":704211},{"cat":"blink","pid":25863,"tid":25913,"ts":531359557955,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":13,"tdur":12,"tts":704215},{"cat":"v8","pid":25863,"tid":25913,"ts":531359558006,"ph":"E","name":"V8.Execute","args":{},"tts":704267},{"cat":"blink","pid":25863,"tid":25913,"ts":531359558014,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":40,"tdur":40,"tts":704274},{"cat":"blink","pid":25863,"tid":25913,"ts":531359558017,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":704277},{"cat":"blink","pid":25863,"tid":25913,"ts":531359558020,"ph":"X","name":"Document::updateStyle","args":{},"dur":22,"tdur":21,"tts":704280},{"cat":"blink","pid":25863,"tid":25913,"ts":531359558042,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":704302},{"cat":"blink","pid":25863,"tid":25913,"ts":531359558048,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":5,"tdur":5,"tts":704308},{"cat":"sky","pid":25863,"tid":25913,"ts":531359558055,"ph":"X","name":"Layer::Display","args":{},"dur":860,"tdur":859,"tts":704315},{"cat":"sky","pid":25863,"tid":25913,"ts":531359558916,"ph":"X","name":"LayerHost::Upload","args":{},"dur":87,"tdur":52,"tts":705176},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359559012,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":52,"tdur":51,"tts":705239},{"cat":"blink","pid":25863,"tid":25913,"ts":531359559016,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":27,"tdur":26,"tts":705243},{"cat":"v8","pid":25863,"tid":25913,"ts":531359559019,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":23,"tdur":23,"tts":705245},{"cat":"v8","pid":25863,"tid":25913,"ts":531359559021,"ph":"X","name":"v8.callFunction","args":{},"dur":20,"tdur":20,"tts":705247},{"cat":"v8","pid":25863,"tid":25913,"ts":531359559023,"ph":"B","name":"V8.Execute","args":{},"tts":705249},{"cat":"blink","pid":25863,"tid":25913,"ts":531359559030,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":8,"tdur":8,"tts":705256},{"cat":"blink","pid":25863,"tid":25913,"ts":531359559035,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":705262},{"cat":"v8","pid":25863,"tid":25913,"ts":531359559039,"ph":"E","name":"V8.Execute","args":{},"tts":705266},{"cat":"blink","pid":25863,"tid":25913,"ts":531359559044,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":16,"tdur":16,"tts":705270},{"cat":"v8","pid":25863,"tid":25913,"ts":531359559045,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":14,"tdur":13,"tts":705272},{"cat":"v8","pid":25863,"tid":25913,"ts":531359559047,"ph":"X","name":"v8.callFunction","args":{},"dur":11,"tdur":11,"tts":705273},{"cat":"v8","pid":25863,"tid":25913,"ts":531359559048,"ph":"B","name":"V8.Execute","args":{},"tts":705274},{"cat":"blink","pid":25863,"tid":25913,"ts":531359559051,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":5,"tdur":4,"tts":705278},{"cat":"blink","pid":25863,"tid":25913,"ts":531359559054,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":2,"tdur":2,"tts":705280},{"cat":"v8","pid":25863,"tid":25913,"ts":531359559057,"ph":"E","name":"V8.Execute","args":{},"tts":705283},{"cat":"sky","pid":25863,"tid":25913,"ts":531359620425,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2419,"tdur":2246,"tts":705424},{"cat":"blink","pid":25863,"tid":25913,"ts":531359620434,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":242,"tdur":241,"tts":705432},{"cat":"blink","pid":25863,"tid":25913,"ts":531359620440,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":4,"tdur":3,"tts":705438},{"cat":"blink","pid":25863,"tid":25913,"ts":531359620447,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":86,"tdur":84,"tts":705445},{"cat":"blink","pid":25863,"tid":25913,"ts":531359620473,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":59,"tdur":57,"tts":705471},{"cat":"v8","pid":25863,"tid":25913,"ts":531359620502,"ph":"X","name":"v8.callFunction","args":{},"dur":22,"tdur":22,"tts":705499},{"cat":"v8","pid":25863,"tid":25913,"ts":531359620506,"ph":"B","name":"V8.Execute","args":{},"tts":705503},{"cat":"v8","pid":25863,"tid":25913,"ts":531359620520,"ph":"E","name":"V8.Execute","args":{},"tts":705518},{"cat":"v8","pid":25863,"tid":25913,"ts":531359620537,"ph":"X","name":"v8.callFunction","args":{},"dur":134,"tdur":133,"tts":705535},{"cat":"v8","pid":25863,"tid":25913,"ts":531359620541,"ph":"B","name":"V8.Execute","args":{},"tts":705538},{"cat":"blink","pid":25863,"tid":25913,"ts":531359620557,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":22,"tdur":21,"tts":705555},{"cat":"v8","pid":25863,"tid":25913,"ts":531359620664,"ph":"E","name":"V8.Execute","args":{},"tts":705663},{"cat":"blink","pid":25863,"tid":25913,"ts":531359620677,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":66,"tdur":65,"tts":705675},{"cat":"blink","pid":25863,"tid":25913,"ts":531359620682,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":705679},{"cat":"blink","pid":25863,"tid":25913,"ts":531359620685,"ph":"X","name":"Document::updateStyle","args":{},"dur":39,"tdur":38,"tts":705682},{"cat":"blink","pid":25863,"tid":25913,"ts":531359620725,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":705722},{"cat":"blink","pid":25863,"tid":25913,"ts":531359620734,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":7,"tdur":7,"tts":705731},{"cat":"sky","pid":25863,"tid":25913,"ts":531359620744,"ph":"X","name":"Layer::Display","args":{},"dur":1754,"tdur":1751,"tts":705742},{"cat":"sky","pid":25863,"tid":25913,"ts":531359622500,"ph":"X","name":"LayerHost::Upload","args":{},"dur":342,"tdur":169,"tts":707498},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359622870,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":87,"tdur":85,"tts":707698},{"cat":"blink","pid":25863,"tid":25913,"ts":531359622881,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":66,"tdur":65,"tts":707708},{"cat":"v8","pid":25863,"tid":25913,"ts":531359622887,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":57,"tdur":56,"tts":707714},{"cat":"v8","pid":25863,"tid":25913,"ts":531359622893,"ph":"X","name":"v8.callFunction","args":{},"dur":49,"tdur":48,"tts":707720},{"cat":"v8","pid":25863,"tid":25913,"ts":531359622897,"ph":"B","name":"V8.Execute","args":{},"tts":707724},{"cat":"blink","pid":25863,"tid":25913,"ts":531359622915,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":21,"tdur":20,"tts":707742},{"cat":"blink","pid":25863,"tid":25913,"ts":531359622928,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":7,"tdur":5,"tts":707756},{"cat":"v8","pid":25863,"tid":25913,"ts":531359622938,"ph":"E","name":"V8.Execute","args":{},"tts":707765},{"cat":"sky","pid":25863,"tid":25913,"ts":531359623703,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2447,"tdur":2277,"tts":708161},{"cat":"blink","pid":25863,"tid":25913,"ts":531359623713,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":211,"tdur":210,"tts":708169},{"cat":"blink","pid":25863,"tid":25913,"ts":531359623719,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":4,"tdur":3,"tts":708175},{"cat":"blink","pid":25863,"tid":25913,"ts":531359623726,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":75,"tdur":74,"tts":708182},{"cat":"blink","pid":25863,"tid":25913,"ts":531359623741,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":59,"tdur":58,"tts":708197},{"cat":"v8","pid":25863,"tid":25913,"ts":531359623769,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":22,"tts":708226},{"cat":"v8","pid":25863,"tid":25913,"ts":531359623774,"ph":"B","name":"V8.Execute","args":{},"tts":708230},{"cat":"v8","pid":25863,"tid":25913,"ts":531359623788,"ph":"E","name":"V8.Execute","args":{},"tts":708244},{"cat":"v8","pid":25863,"tid":25913,"ts":531359623805,"ph":"X","name":"v8.callFunction","args":{},"dur":114,"tdur":113,"tts":708261},{"cat":"v8","pid":25863,"tid":25913,"ts":531359623809,"ph":"B","name":"V8.Execute","args":{},"tts":708265},{"cat":"blink","pid":25863,"tid":25913,"ts":531359623817,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":21,"tdur":20,"tts":708273},{"cat":"v8","pid":25863,"tid":25913,"ts":531359623913,"ph":"E","name":"V8.Execute","args":{},"tts":708370},{"cat":"blink","pid":25863,"tid":25913,"ts":531359623925,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":124,"tdur":105,"tts":708381},{"cat":"blink","pid":25863,"tid":25913,"ts":531359623929,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":708385},{"cat":"blink","pid":25863,"tid":25913,"ts":531359623932,"ph":"X","name":"Document::updateStyle","args":{},"dur":57,"tdur":56,"tts":708388},{"cat":"blink","pid":25863,"tid":25913,"ts":531359623990,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":708446},{"cat":"blink","pid":25863,"tid":25913,"ts":531359623999,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":48,"tdur":30,"tts":708455},{"cat":"sky","pid":25863,"tid":25913,"ts":531359624051,"ph":"X","name":"Layer::Display","args":{},"dur":1772,"tdur":1770,"tts":708489},{"cat":"sky","pid":25863,"tid":25913,"ts":531359625825,"ph":"X","name":"LayerHost::Upload","args":{},"dur":323,"tdur":172,"tts":710264},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359626176,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":86,"tdur":85,"tts":710465},{"cat":"blink","pid":25863,"tid":25913,"ts":531359626187,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":65,"tdur":64,"tts":710476},{"cat":"v8","pid":25863,"tid":25913,"ts":531359626192,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":57,"tdur":56,"tts":710481},{"cat":"v8","pid":25863,"tid":25913,"ts":531359626199,"ph":"X","name":"v8.callFunction","args":{},"dur":48,"tdur":48,"tts":710487},{"cat":"v8","pid":25863,"tid":25913,"ts":531359626202,"ph":"B","name":"V8.Execute","args":{},"tts":710491},{"cat":"blink","pid":25863,"tid":25913,"ts":531359626221,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":20,"tdur":19,"tts":710510},{"cat":"blink","pid":25863,"tid":25913,"ts":531359626234,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":6,"tdur":5,"tts":710523},{"cat":"v8","pid":25863,"tid":25913,"ts":531359626243,"ph":"E","name":"V8.Execute","args":{},"tts":710532},{"cat":"sky","pid":25863,"tid":25913,"ts":531359627003,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2342,"tdur":2237,"tts":710940},{"cat":"blink","pid":25863,"tid":25913,"ts":531359627012,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":211,"tdur":210,"tts":710948},{"cat":"blink","pid":25863,"tid":25913,"ts":531359627019,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":3,"tdur":3,"tts":710954},{"cat":"blink","pid":25863,"tid":25913,"ts":531359627026,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":75,"tdur":75,"tts":710961},{"cat":"blink","pid":25863,"tid":25913,"ts":531359627042,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":58,"tdur":58,"tts":710977},{"cat":"v8","pid":25863,"tid":25913,"ts":531359627070,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":22,"tts":711006},{"cat":"v8","pid":25863,"tid":25913,"ts":531359627074,"ph":"B","name":"V8.Execute","args":{},"tts":711010},{"cat":"v8","pid":25863,"tid":25913,"ts":531359627089,"ph":"E","name":"V8.Execute","args":{},"tts":711025},{"cat":"v8","pid":25863,"tid":25913,"ts":531359627106,"ph":"X","name":"v8.callFunction","args":{},"dur":112,"tdur":112,"tts":711041},{"cat":"v8","pid":25863,"tid":25913,"ts":531359627109,"ph":"B","name":"V8.Execute","args":{},"tts":711044},{"cat":"blink","pid":25863,"tid":25913,"ts":531359627117,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":21,"tdur":20,"tts":711053},{"cat":"v8","pid":25863,"tid":25913,"ts":531359627212,"ph":"E","name":"V8.Execute","args":{},"tts":711148},{"cat":"blink","pid":25863,"tid":25913,"ts":531359627224,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":67,"tdur":66,"tts":711160},{"cat":"blink","pid":25863,"tid":25913,"ts":531359627228,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":711164},{"cat":"blink","pid":25863,"tid":25913,"ts":531359627231,"ph":"X","name":"Document::updateStyle","args":{},"dur":41,"tdur":39,"tts":711167},{"cat":"blink","pid":25863,"tid":25913,"ts":531359627273,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":711208},{"cat":"blink","pid":25863,"tid":25913,"ts":531359627282,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":8,"tdur":7,"tts":711217},{"cat":"sky","pid":25863,"tid":25913,"ts":531359627293,"ph":"X","name":"Layer::Display","args":{},"dur":1759,"tdur":1758,"tts":711228},{"cat":"sky","pid":25863,"tid":25913,"ts":531359629054,"ph":"X","name":"LayerHost::Upload","args":{},"dur":289,"tdur":184,"tts":712990},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359629372,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":103,"tdur":102,"tts":713205},{"cat":"blink","pid":25863,"tid":25913,"ts":531359629402,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":63,"tdur":63,"tts":713234},{"cat":"v8","pid":25863,"tid":25913,"ts":531359629408,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":54,"tdur":54,"tts":713240},{"cat":"v8","pid":25863,"tid":25913,"ts":531359629414,"ph":"X","name":"v8.callFunction","args":{},"dur":46,"tdur":45,"tts":713246},{"cat":"v8","pid":25863,"tid":25913,"ts":531359629417,"ph":"B","name":"V8.Execute","args":{},"tts":713250},{"cat":"blink","pid":25863,"tid":25913,"ts":531359629436,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":18,"tdur":17,"tts":713268},{"cat":"blink","pid":25863,"tid":25913,"ts":531359629447,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":6,"tdur":5,"tts":713279},{"cat":"v8","pid":25863,"tid":25913,"ts":531359629456,"ph":"E","name":"V8.Execute","args":{},"tts":713288},{"cat":"sky","pid":25863,"tid":25913,"ts":531359630080,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2319,"tdur":2180,"tts":713683},{"cat":"blink","pid":25863,"tid":25913,"ts":531359630090,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":228,"tdur":227,"tts":713691},{"cat":"blink","pid":25863,"tid":25913,"ts":531359630096,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":4,"tdur":3,"tts":713697},{"cat":"blink","pid":25863,"tid":25913,"ts":531359630103,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":93,"tdur":92,"tts":713704},{"cat":"blink","pid":25863,"tid":25913,"ts":531359630129,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":66,"tdur":65,"tts":713730},{"cat":"v8","pid":25863,"tid":25913,"ts":531359630158,"ph":"X","name":"v8.callFunction","args":{},"dur":30,"tdur":29,"tts":713759},{"cat":"v8","pid":25863,"tid":25913,"ts":531359630162,"ph":"B","name":"V8.Execute","args":{},"tts":713763},{"cat":"v8","pid":25863,"tid":25913,"ts":531359630184,"ph":"E","name":"V8.Execute","args":{},"tts":713784},{"cat":"v8","pid":25863,"tid":25913,"ts":531359630200,"ph":"X","name":"v8.callFunction","args":{},"dur":114,"tdur":113,"tts":713801},{"cat":"v8","pid":25863,"tid":25913,"ts":531359630204,"ph":"B","name":"V8.Execute","args":{},"tts":713804},{"cat":"blink","pid":25863,"tid":25913,"ts":531359630212,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":21,"tdur":20,"tts":713813},{"cat":"v8","pid":25863,"tid":25913,"ts":531359630307,"ph":"E","name":"V8.Execute","args":{},"tts":713909},{"cat":"blink","pid":25863,"tid":25913,"ts":531359630319,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":66,"tdur":65,"tts":713920},{"cat":"blink","pid":25863,"tid":25913,"ts":531359630324,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":713925},{"cat":"blink","pid":25863,"tid":25913,"ts":531359630327,"ph":"X","name":"Document::updateStyle","args":{},"dur":39,"tdur":38,"tts":713927},{"cat":"blink","pid":25863,"tid":25913,"ts":531359630367,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":713968},{"cat":"blink","pid":25863,"tid":25913,"ts":531359630376,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":8,"tdur":7,"tts":713977},{"cat":"sky","pid":25863,"tid":25913,"ts":531359630387,"ph":"X","name":"Layer::Display","args":{},"dur":1756,"tdur":1738,"tts":713987},{"cat":"sky","pid":25863,"tid":25913,"ts":531359632144,"ph":"X","name":"LayerHost::Upload","args":{},"dur":254,"tdur":135,"tts":715727},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359632411,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":38,"tdur":38,"tts":715875},{"cat":"blink","pid":25863,"tid":25913,"ts":531359632415,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":29,"tdur":29,"tts":715880},{"cat":"v8","pid":25863,"tid":25913,"ts":531359632418,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":25,"tdur":25,"tts":715882},{"cat":"v8","pid":25863,"tid":25913,"ts":531359632421,"ph":"X","name":"v8.callFunction","args":{},"dur":21,"tdur":21,"tts":715885},{"cat":"v8","pid":25863,"tid":25913,"ts":531359632422,"ph":"B","name":"V8.Execute","args":{},"tts":715887},{"cat":"blink","pid":25863,"tid":25913,"ts":531359632430,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":9,"tts":715895},{"cat":"blink","pid":25863,"tid":25913,"ts":531359632436,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":715901},{"cat":"v8","pid":25863,"tid":25913,"ts":531359632440,"ph":"E","name":"V8.Execute","args":{},"tts":715905},{"cat":"sky","pid":25863,"tid":25913,"ts":531359670947,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1290,"tdur":1160,"tts":716169},{"cat":"blink","pid":25863,"tid":25913,"ts":531359670953,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":120,"tdur":120,"tts":716174},{"cat":"blink","pid":25863,"tid":25913,"ts":531359670957,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":716179},{"cat":"blink","pid":25863,"tid":25913,"ts":531359670961,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":43,"tdur":42,"tts":716183},{"cat":"blink","pid":25863,"tid":25913,"ts":531359670970,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":34,"tdur":34,"tts":716191},{"cat":"v8","pid":25863,"tid":25913,"ts":531359670988,"ph":"X","name":"v8.callFunction","args":{},"dur":12,"tdur":12,"tts":716209},{"cat":"v8","pid":25863,"tid":25913,"ts":531359670990,"ph":"B","name":"V8.Execute","args":{},"tts":716211},{"cat":"v8","pid":25863,"tid":25913,"ts":531359670998,"ph":"E","name":"V8.Execute","args":{},"tts":716219},{"cat":"v8","pid":25863,"tid":25913,"ts":531359671007,"ph":"X","name":"v8.callFunction","args":{},"dur":64,"tdur":64,"tts":716228},{"cat":"v8","pid":25863,"tid":25913,"ts":531359671008,"ph":"B","name":"V8.Execute","args":{},"tts":716230},{"cat":"blink","pid":25863,"tid":25913,"ts":531359671013,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":13,"tdur":12,"tts":716235},{"cat":"v8","pid":25863,"tid":25913,"ts":531359671068,"ph":"E","name":"V8.Execute","args":{},"tts":716290},{"cat":"blink","pid":25863,"tid":25913,"ts":531359671074,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":37,"tdur":37,"tts":716295},{"cat":"blink","pid":25863,"tid":25913,"ts":531359671076,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":716297},{"cat":"blink","pid":25863,"tid":25913,"ts":531359671077,"ph":"X","name":"Document::updateStyle","args":{},"dur":24,"tdur":23,"tts":716299},{"cat":"blink","pid":25863,"tid":25913,"ts":531359671102,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":716323},{"cat":"blink","pid":25863,"tid":25913,"ts":531359671107,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":3,"tts":716328},{"cat":"sky","pid":25863,"tid":25913,"ts":531359671112,"ph":"X","name":"Layer::Display","args":{},"dur":849,"tdur":847,"tts":716334},{"cat":"sky","pid":25863,"tid":25913,"ts":531359671962,"ph":"X","name":"LayerHost::Upload","args":{},"dur":273,"tdur":144,"tts":717183},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359672254,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":88,"tdur":87,"tts":717348},{"cat":"blink","pid":25863,"tid":25913,"ts":531359672261,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":71,"tdur":70,"tts":717354},{"cat":"v8","pid":25863,"tid":25913,"ts":531359672265,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":64,"tdur":64,"tts":717358},{"cat":"v8","pid":25863,"tid":25913,"ts":531359672268,"ph":"X","name":"v8.callFunction","args":{},"dur":59,"tdur":57,"tts":717362},{"cat":"v8","pid":25863,"tid":25913,"ts":531359672271,"ph":"B","name":"V8.Execute","args":{},"tts":717364},{"cat":"blink","pid":25863,"tid":25913,"ts":531359672298,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":22,"tdur":21,"tts":717392},{"cat":"blink","pid":25863,"tid":25913,"ts":531359672313,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":6,"tdur":6,"tts":717406},{"cat":"v8","pid":25863,"tid":25913,"ts":531359672323,"ph":"E","name":"V8.Execute","args":{},"tts":717416},{"cat":"sky","pid":25863,"tid":25913,"ts":531359673179,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":3246,"tdur":3048,"tts":717828},{"cat":"blink","pid":25863,"tid":25913,"ts":531359673188,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":272,"tdur":271,"tts":717835},{"cat":"blink","pid":25863,"tid":25913,"ts":531359673194,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":24,"tdur":23,"tts":717842},{"cat":"blink","pid":25863,"tid":25913,"ts":531359673222,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":70,"tdur":70,"tts":717869},{"cat":"blink","pid":25863,"tid":25913,"ts":531359673233,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":58,"tdur":58,"tts":717880},{"cat":"v8","pid":25863,"tid":25913,"ts":531359673261,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":22,"tts":717909},{"cat":"v8","pid":25863,"tid":25913,"ts":531359673265,"ph":"B","name":"V8.Execute","args":{},"tts":717913},{"cat":"v8","pid":25863,"tid":25913,"ts":531359673280,"ph":"E","name":"V8.Execute","args":{},"tts":717927},{"cat":"v8","pid":25863,"tid":25913,"ts":531359673297,"ph":"X","name":"v8.callFunction","args":{},"dur":158,"tdur":157,"tts":717944},{"cat":"v8","pid":25863,"tid":25913,"ts":531359673300,"ph":"B","name":"V8.Execute","args":{},"tts":717948},{"cat":"blink","pid":25863,"tid":25913,"ts":531359673308,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":22,"tdur":20,"tts":717956},{"cat":"v8","pid":25863,"tid":25913,"ts":531359673448,"ph":"E","name":"V8.Execute","args":{},"tts":718096},{"cat":"blink","pid":25863,"tid":25913,"ts":531359673461,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":724,"tdur":723,"tts":718109},{"cat":"blink","pid":25863,"tid":25913,"ts":531359673466,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":718113},{"cat":"blink","pid":25863,"tid":25913,"ts":531359673469,"ph":"X","name":"Document::updateStyle","args":{},"dur":161,"tdur":160,"tts":718116},{"cat":"blink","pid":25863,"tid":25913,"ts":531359673632,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":2},"tts":718279},{"cat":"blink","pid":25863,"tid":25913,"ts":531359673637,"ph":"X","name":"FrameView::layout","args":{},"dur":66,"tdur":66,"tts":718284},{"cat":"blink","pid":25863,"tid":25913,"ts":531359673640,"ph":"X","name":"FrameView::performPreLayoutTasks","args":{},"dur":5,"tdur":3,"tts":718288},{"cat":"blink","pid":25863,"tid":25913,"ts":531359673646,"ph":"X","name":"FrameView::performLayout","args":{},"dur":37,"tdur":36,"tts":718293},{"cat":"blink","pid":25863,"tid":25913,"ts":531359673684,"ph":"X","name":"RenderLayer::updateLayerPositionsAfterLayout","args":{},"dur":5,"tdur":4,"tts":718331},{"cat":"blink","pid":25863,"tid":25913,"ts":531359673689,"ph":"X","name":"FrameView::performPostLayoutTasks","args":{},"dur":12,"tdur":10,"tts":718337},{"cat":"blink","pid":25863,"tid":25913,"ts":531359673709,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":475,"tdur":473,"tts":718357},{"cat":"sky","pid":25863,"tid":25913,"ts":531359674188,"ph":"X","name":"Layer::Display","args":{},"dur":1810,"tdur":1808,"tts":718835},{"cat":"sky","pid":25863,"tid":25913,"ts":531359676021,"ph":"X","name":"LayerHost::Upload","args":{},"dur":402,"tdur":204,"tts":720669},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359676452,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":85,"tdur":84,"tts":720904},{"cat":"blink","pid":25863,"tid":25913,"ts":531359676462,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":66,"tdur":64,"tts":720914},{"cat":"v8","pid":25863,"tid":25913,"ts":531359676468,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":57,"tdur":56,"tts":720919},{"cat":"v8","pid":25863,"tid":25913,"ts":531359676474,"ph":"X","name":"v8.callFunction","args":{},"dur":49,"tdur":47,"tts":720926},{"cat":"v8","pid":25863,"tid":25913,"ts":531359676478,"ph":"B","name":"V8.Execute","args":{},"tts":720929},{"cat":"blink","pid":25863,"tid":25913,"ts":531359676496,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":21,"tdur":19,"tts":720948},{"cat":"blink","pid":25863,"tid":25913,"ts":531359676509,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":6,"tdur":5,"tts":720961},{"cat":"v8","pid":25863,"tid":25913,"ts":531359676519,"ph":"E","name":"V8.Execute","args":{},"tts":720970},{"cat":"sky","pid":25863,"tid":25913,"ts":531359677128,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2237,"tdur":2171,"tts":721262},{"cat":"blink","pid":25863,"tid":25913,"ts":531359677134,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":212,"tdur":210,"tts":721267},{"cat":"blink","pid":25863,"tid":25913,"ts":531359677138,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":3,"tdur":1,"tts":721271},{"cat":"blink","pid":25863,"tid":25913,"ts":531359677143,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":78,"tdur":78,"tts":721275},{"cat":"blink","pid":25863,"tid":25913,"ts":531359677152,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":68,"tdur":67,"tts":721285},{"cat":"v8","pid":25863,"tid":25913,"ts":531359677190,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":23,"tts":721322},{"cat":"v8","pid":25863,"tid":25913,"ts":531359677195,"ph":"B","name":"V8.Execute","args":{},"tts":721327},{"cat":"v8","pid":25863,"tid":25913,"ts":531359677209,"ph":"E","name":"V8.Execute","args":{},"tts":721342},{"cat":"v8","pid":25863,"tid":25913,"ts":531359677226,"ph":"X","name":"v8.callFunction","args":{},"dur":115,"tdur":115,"tts":721358},{"cat":"v8","pid":25863,"tid":25913,"ts":531359677229,"ph":"B","name":"V8.Execute","args":{},"tts":721362},{"cat":"blink","pid":25863,"tid":25913,"ts":531359677238,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":21,"tdur":20,"tts":721370},{"cat":"v8","pid":25863,"tid":25913,"ts":531359677335,"ph":"E","name":"V8.Execute","args":{},"tts":721468},{"cat":"blink","pid":25863,"tid":25913,"ts":531359677346,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":66,"tdur":65,"tts":721479},{"cat":"blink","pid":25863,"tid":25913,"ts":531359677351,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":721483},{"cat":"blink","pid":25863,"tid":25913,"ts":531359677354,"ph":"X","name":"Document::updateStyle","args":{},"dur":39,"tdur":38,"tts":721486},{"cat":"blink","pid":25863,"tid":25913,"ts":531359677394,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":721526},{"cat":"blink","pid":25863,"tid":25913,"ts":531359677403,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":8,"tdur":7,"tts":721535},{"cat":"sky","pid":25863,"tid":25913,"ts":531359677414,"ph":"X","name":"Layer::Display","args":{},"dur":1763,"tdur":1761,"tts":721546},{"cat":"sky","pid":25863,"tid":25913,"ts":531359679179,"ph":"X","name":"LayerHost::Upload","args":{},"dur":184,"tdur":121,"tts":723311},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359679390,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":75,"tdur":74,"tts":723460},{"cat":"blink","pid":25863,"tid":25913,"ts":531359679398,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":60,"tdur":59,"tts":723468},{"cat":"v8","pid":25863,"tid":25913,"ts":531359679404,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":53,"tdur":53,"tts":723473},{"cat":"v8","pid":25863,"tid":25913,"ts":531359679409,"ph":"X","name":"v8.callFunction","args":{},"dur":46,"tdur":45,"tts":723479},{"cat":"v8","pid":25863,"tid":25913,"ts":531359679413,"ph":"B","name":"V8.Execute","args":{},"tts":723483},{"cat":"blink","pid":25863,"tid":25913,"ts":531359679439,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":12,"tdur":12,"tts":723508},{"cat":"blink","pid":25863,"tid":25913,"ts":531359679447,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":4,"tdur":3,"tts":723517},{"cat":"v8","pid":25863,"tid":25913,"ts":531359679453,"ph":"E","name":"V8.Execute","args":{},"tts":723522},{"cat":"sky","pid":25863,"tid":25913,"ts":531359679740,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2056,"tdur":1866,"tts":723701},{"cat":"blink","pid":25863,"tid":25913,"ts":531359679744,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":459,"tdur":424,"tts":723705},{"cat":"blink","pid":25863,"tid":25913,"ts":531359679747,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":2,"tts":723708},{"cat":"blink","pid":25863,"tid":25913,"ts":531359679751,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":80,"tdur":79,"tts":723712},{"cat":"blink","pid":25863,"tid":25913,"ts":531359679765,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":65,"tdur":64,"tts":723726},{"cat":"v8","pid":25863,"tid":25913,"ts":531359679780,"ph":"X","name":"v8.callFunction","args":{},"dur":41,"tdur":41,"tts":723741},{"cat":"v8","pid":25863,"tid":25913,"ts":531359679783,"ph":"B","name":"V8.Execute","args":{},"tts":723743},{"cat":"v8","pid":25863,"tid":25913,"ts":531359679791,"ph":"E","name":"V8.Execute","args":{},"tts":723752},{"cat":"v8","pid":25863,"tid":25913,"ts":531359679836,"ph":"X","name":"v8.callFunction","args":{},"dur":364,"tdur":328,"tts":723797},{"cat":"v8","pid":25863,"tid":25913,"ts":531359679840,"ph":"B","name":"V8.Execute","args":{},"tts":723801},{"cat":"blink","pid":25863,"tid":25913,"ts":531359679860,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":10,"tdur":9,"tts":723821},{"cat":"v8","pid":25863,"tid":25913,"ts":531359680115,"ph":"E","name":"V8.Execute","args":{},"tts":724042},{"cat":"blink","pid":25863,"tid":25913,"ts":531359680204,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":452,"tdur":452,"tts":724130},{"cat":"blink","pid":25863,"tid":25913,"ts":531359680207,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":724133},{"cat":"blink","pid":25863,"tid":25913,"ts":531359680208,"ph":"X","name":"Document::updateStyle","args":{},"dur":83,"tdur":82,"tts":724134},{"cat":"blink","pid":25863,"tid":25913,"ts":531359680292,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":6},"tts":724218},{"cat":"blink","pid":25863,"tid":25913,"ts":531359680294,"ph":"X","name":"FrameView::layout","args":{},"dur":130,"tdur":130,"tts":724220},{"cat":"blink","pid":25863,"tid":25913,"ts":531359680296,"ph":"X","name":"FrameView::performPreLayoutTasks","args":{},"dur":1,"tdur":1,"tts":724222},{"cat":"blink","pid":25863,"tid":25913,"ts":531359680298,"ph":"X","name":"FrameView::performLayout","args":{},"dur":116,"tdur":115,"tts":724224},{"cat":"blink","pid":25863,"tid":25913,"ts":531359680415,"ph":"X","name":"RenderLayer::updateLayerPositionsAfterLayout","args":{},"dur":3,"tdur":3,"tts":724341},{"cat":"blink","pid":25863,"tid":25913,"ts":531359680419,"ph":"X","name":"FrameView::performPostLayoutTasks","args":{},"dur":4,"tdur":3,"tts":724345},{"cat":"blink","pid":25863,"tid":25913,"ts":531359680427,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":228,"tdur":228,"tts":724353},{"cat":"sky","pid":25863,"tid":25913,"ts":531359680657,"ph":"X","name":"Layer::Display","args":{},"dur":844,"tdur":843,"tts":724583},{"cat":"sky","pid":25863,"tid":25913,"ts":531359681502,"ph":"X","name":"LayerHost::Upload","args":{},"dur":293,"tdur":137,"tts":725428},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359681809,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":41,"tdur":40,"tts":725581},{"cat":"blink","pid":25863,"tid":25913,"ts":531359681814,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":32,"tdur":31,"tts":725586},{"cat":"v8","pid":25863,"tid":25913,"ts":531359681817,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":27,"tdur":26,"tts":725589},{"cat":"v8","pid":25863,"tid":25913,"ts":531359681820,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":22,"tts":725592},{"cat":"v8","pid":25863,"tid":25913,"ts":531359681822,"ph":"B","name":"V8.Execute","args":{},"tts":725594},{"cat":"blink","pid":25863,"tid":25913,"ts":531359681831,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":10,"tts":725602},{"cat":"blink","pid":25863,"tid":25913,"ts":531359681837,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":725608},{"cat":"v8","pid":25863,"tid":25913,"ts":531359681841,"ph":"E","name":"V8.Execute","args":{},"tts":725613},{"cat":"sky","pid":25863,"tid":25913,"ts":531359751718,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2312,"tdur":2210,"tts":725832},{"cat":"blink","pid":25863,"tid":25913,"ts":531359751731,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":293,"tdur":280,"tts":725843},{"cat":"blink","pid":25863,"tid":25913,"ts":531359751742,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":4,"tdur":3,"tts":725854},{"cat":"blink","pid":25863,"tid":25913,"ts":531359751751,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":99,"tdur":98,"tts":725863},{"cat":"blink","pid":25863,"tid":25913,"ts":531359751770,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":80,"tdur":79,"tts":725882},{"cat":"v8","pid":25863,"tid":25913,"ts":531359751814,"ph":"X","name":"v8.callFunction","args":{},"dur":30,"tdur":29,"tts":725926},{"cat":"v8","pid":25863,"tid":25913,"ts":531359751818,"ph":"B","name":"V8.Execute","args":{},"tts":725930},{"cat":"v8","pid":25863,"tid":25913,"ts":531359751840,"ph":"E","name":"V8.Execute","args":{},"tts":725952},{"cat":"v8","pid":25863,"tid":25913,"ts":531359751855,"ph":"X","name":"v8.callFunction","args":{},"dur":143,"tdur":143,"tts":725967},{"cat":"v8","pid":25863,"tid":25913,"ts":531359751858,"ph":"B","name":"V8.Execute","args":{},"tts":725970},{"cat":"blink","pid":25863,"tid":25913,"ts":531359751869,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":30,"tdur":29,"tts":725981},{"cat":"v8","pid":25863,"tid":25913,"ts":531359751995,"ph":"E","name":"V8.Execute","args":{},"tts":726107},{"cat":"blink","pid":25863,"tid":25913,"ts":531359752024,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":86,"tdur":85,"tts":726124},{"cat":"blink","pid":25863,"tid":25913,"ts":531359752028,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":726128},{"cat":"blink","pid":25863,"tid":25913,"ts":531359752030,"ph":"X","name":"Document::updateStyle","args":{},"dur":59,"tdur":58,"tts":726130},{"cat":"blink","pid":25863,"tid":25913,"ts":531359752090,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":726190},{"cat":"blink","pid":25863,"tid":25913,"ts":531359752099,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":9,"tdur":8,"tts":726200},{"cat":"sky","pid":25863,"tid":25913,"ts":531359752112,"ph":"X","name":"Layer::Display","args":{},"dur":1722,"tdur":1721,"tts":726212},{"cat":"sky","pid":25863,"tid":25913,"ts":531359753836,"ph":"X","name":"LayerHost::Upload","args":{},"dur":193,"tdur":105,"tts":727936},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359754053,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":62,"tdur":62,"tts":728066},{"cat":"blink","pid":25863,"tid":25913,"ts":531359754059,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":49,"tdur":49,"tts":728072},{"cat":"v8","pid":25863,"tid":25913,"ts":531359754064,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":42,"tdur":42,"tts":728077},{"cat":"v8","pid":25863,"tid":25913,"ts":531359754067,"ph":"X","name":"v8.callFunction","args":{},"dur":37,"tdur":36,"tts":728081},{"cat":"v8","pid":25863,"tid":25913,"ts":531359754070,"ph":"B","name":"V8.Execute","args":{},"tts":728083},{"cat":"blink","pid":25863,"tid":25913,"ts":531359754087,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":13,"tdur":12,"tts":728101},{"cat":"blink","pid":25863,"tid":25913,"ts":531359754096,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":4,"tdur":3,"tts":728109},{"cat":"v8","pid":25863,"tid":25913,"ts":531359754102,"ph":"E","name":"V8.Execute","args":{},"tts":728115},{"cat":"sky","pid":25863,"tid":25913,"ts":531359754432,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1759,"tdur":1674,"tts":728297},{"cat":"blink","pid":25863,"tid":25913,"ts":531359754437,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":122,"tdur":122,"tts":728301},{"cat":"blink","pid":25863,"tid":25913,"ts":531359754441,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":2,"tts":728305},{"cat":"blink","pid":25863,"tid":25913,"ts":531359754445,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":42,"tdur":42,"tts":728309},{"cat":"blink","pid":25863,"tid":25913,"ts":531359754453,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":33,"tdur":33,"tts":728317},{"cat":"v8","pid":25863,"tid":25913,"ts":531359754467,"ph":"X","name":"v8.callFunction","args":{},"dur":14,"tdur":14,"tts":728331},{"cat":"v8","pid":25863,"tid":25913,"ts":531359754470,"ph":"B","name":"V8.Execute","args":{},"tts":728334},{"cat":"v8","pid":25863,"tid":25913,"ts":531359754478,"ph":"E","name":"V8.Execute","args":{},"tts":728342},{"cat":"v8","pid":25863,"tid":25913,"ts":531359754490,"ph":"X","name":"v8.callFunction","args":{},"dur":66,"tdur":65,"tts":728354},{"cat":"v8","pid":25863,"tid":25913,"ts":531359754492,"ph":"B","name":"V8.Execute","args":{},"tts":728357},{"cat":"blink","pid":25863,"tid":25913,"ts":531359754498,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":12,"tdur":11,"tts":728362},{"cat":"v8","pid":25863,"tid":25913,"ts":531359754552,"ph":"E","name":"V8.Execute","args":{},"tts":728416},{"cat":"blink","pid":25863,"tid":25913,"ts":531359754560,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":54,"tdur":54,"tts":728424},{"cat":"blink","pid":25863,"tid":25913,"ts":531359754579,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":728444},{"cat":"blink","pid":25863,"tid":25913,"ts":531359754582,"ph":"X","name":"Document::updateStyle","args":{},"dur":20,"tdur":20,"tts":728446},{"cat":"blink","pid":25863,"tid":25913,"ts":531359754603,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":728467},{"cat":"blink","pid":25863,"tid":25913,"ts":531359754609,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":5,"tdur":4,"tts":728473},{"cat":"sky","pid":25863,"tid":25913,"ts":531359754615,"ph":"X","name":"Layer::Display","args":{},"dur":1415,"tdur":1413,"tts":728480},{"cat":"sky","pid":25863,"tid":25913,"ts":531359756031,"ph":"X","name":"LayerHost::Upload","args":{},"dur":159,"tdur":74,"tts":729896},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359756205,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":47,"tdur":47,"tts":729986},{"cat":"blink","pid":25863,"tid":25913,"ts":531359756210,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":36,"tdur":36,"tts":729991},{"cat":"v8","pid":25863,"tid":25913,"ts":531359756213,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":31,"tdur":31,"tts":729994},{"cat":"v8","pid":25863,"tid":25913,"ts":531359756216,"ph":"X","name":"v8.callFunction","args":{},"dur":27,"tdur":25,"tts":729998},{"cat":"v8","pid":25863,"tid":25913,"ts":531359756219,"ph":"B","name":"V8.Execute","args":{},"tts":730000},{"cat":"blink","pid":25863,"tid":25913,"ts":531359756228,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":11,"tdur":11,"tts":730009},{"cat":"blink","pid":25863,"tid":25913,"ts":531359756235,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":4,"tdur":3,"tts":730016},{"cat":"v8","pid":25863,"tid":25913,"ts":531359756240,"ph":"E","name":"V8.Execute","args":{},"tts":730022},{"cat":"sky","pid":25863,"tid":25913,"ts":531359756572,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1644,"tdur":1590,"tts":730191},{"cat":"blink","pid":25863,"tid":25913,"ts":531359756577,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":121,"tdur":120,"tts":730195},{"cat":"blink","pid":25863,"tid":25913,"ts":531359756581,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":2,"tts":730199},{"cat":"blink","pid":25863,"tid":25913,"ts":531359756585,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":43,"tdur":42,"tts":730203},{"cat":"blink","pid":25863,"tid":25913,"ts":531359756593,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":34,"tdur":33,"tts":730211},{"cat":"v8","pid":25863,"tid":25913,"ts":531359756608,"ph":"X","name":"v8.callFunction","args":{},"dur":14,"tdur":14,"tts":730226},{"cat":"v8","pid":25863,"tid":25913,"ts":531359756611,"ph":"B","name":"V8.Execute","args":{},"tts":730229},{"cat":"v8","pid":25863,"tid":25913,"ts":531359756619,"ph":"E","name":"V8.Execute","args":{},"tts":730237},{"cat":"v8","pid":25863,"tid":25913,"ts":531359756631,"ph":"X","name":"v8.callFunction","args":{},"dur":64,"tdur":63,"tts":730249},{"cat":"v8","pid":25863,"tid":25913,"ts":531359756634,"ph":"B","name":"V8.Execute","args":{},"tts":730252},{"cat":"blink","pid":25863,"tid":25913,"ts":531359756639,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":12,"tdur":11,"tts":730257},{"cat":"v8","pid":25863,"tid":25913,"ts":531359756691,"ph":"E","name":"V8.Execute","args":{},"tts":730309},{"cat":"blink","pid":25863,"tid":25913,"ts":531359756698,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":35,"tdur":35,"tts":730316},{"cat":"blink","pid":25863,"tid":25913,"ts":531359756701,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":730319},{"cat":"blink","pid":25863,"tid":25913,"ts":531359756703,"ph":"X","name":"Document::updateStyle","args":{},"dur":19,"tdur":18,"tts":730321},{"cat":"blink","pid":25863,"tid":25913,"ts":531359756723,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":730341},{"cat":"blink","pid":25863,"tid":25913,"ts":531359756728,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":4,"tts":730346},{"cat":"sky","pid":25863,"tid":25913,"ts":531359756734,"ph":"X","name":"Layer::Display","args":{},"dur":1363,"tdur":1362,"tts":730352},{"cat":"sky","pid":25863,"tid":25913,"ts":531359758098,"ph":"X","name":"LayerHost::Upload","args":{},"dur":117,"tdur":63,"tts":731717},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359758230,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":63,"tdur":63,"tts":731795},{"cat":"blink","pid":25863,"tid":25913,"ts":531359758235,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":51,"tdur":51,"tts":731800},{"cat":"v8","pid":25863,"tid":25913,"ts":531359758238,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":46,"tdur":45,"tts":731804},{"cat":"v8","pid":25863,"tid":25913,"ts":531359758241,"ph":"X","name":"v8.callFunction","args":{},"dur":42,"tdur":41,"tts":731807},{"cat":"v8","pid":25863,"tid":25913,"ts":531359758244,"ph":"B","name":"V8.Execute","args":{},"tts":731809},{"cat":"blink","pid":25863,"tid":25913,"ts":531359758253,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":25,"tdur":24,"tts":731819},{"cat":"blink","pid":25863,"tid":25913,"ts":531359758273,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":4,"tdur":3,"tts":731839},{"cat":"v8","pid":25863,"tid":25913,"ts":531359758279,"ph":"E","name":"V8.Execute","args":{},"tts":731845},{"cat":"sky","pid":25863,"tid":25913,"ts":531359758531,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1630,"tdur":1580,"tts":732013},{"cat":"blink","pid":25863,"tid":25913,"ts":531359758535,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":119,"tdur":118,"tts":732016},{"cat":"blink","pid":25863,"tid":25913,"ts":531359758538,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":2,"tts":732019},{"cat":"blink","pid":25863,"tid":25913,"ts":531359758541,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":42,"tdur":41,"tts":732023},{"cat":"blink","pid":25863,"tid":25913,"ts":531359758550,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":33,"tdur":32,"tts":732031},{"cat":"v8","pid":25863,"tid":25913,"ts":531359758563,"ph":"X","name":"v8.callFunction","args":{},"dur":15,"tdur":14,"tts":732045},{"cat":"v8","pid":25863,"tid":25913,"ts":531359758567,"ph":"B","name":"V8.Execute","args":{},"tts":732048},{"cat":"v8","pid":25863,"tid":25913,"ts":531359758575,"ph":"E","name":"V8.Execute","args":{},"tts":732057},{"cat":"v8","pid":25863,"tid":25913,"ts":531359758586,"ph":"X","name":"v8.callFunction","args":{},"dur":65,"tdur":64,"tts":732068},{"cat":"v8","pid":25863,"tid":25913,"ts":531359758589,"ph":"B","name":"V8.Execute","args":{},"tts":732070},{"cat":"blink","pid":25863,"tid":25913,"ts":531359758595,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":12,"tdur":11,"tts":732076},{"cat":"v8","pid":25863,"tid":25913,"ts":531359758647,"ph":"E","name":"V8.Execute","args":{},"tts":732129},{"cat":"blink","pid":25863,"tid":25913,"ts":531359758654,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":38,"tdur":37,"tts":732136},{"cat":"blink","pid":25863,"tid":25913,"ts":531359758657,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":732139},{"cat":"blink","pid":25863,"tid":25913,"ts":531359758659,"ph":"X","name":"Document::updateStyle","args":{},"dur":21,"tdur":19,"tts":732141},{"cat":"blink","pid":25863,"tid":25913,"ts":531359758681,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":732162},{"cat":"blink","pid":25863,"tid":25913,"ts":531359758686,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":5,"tdur":4,"tts":732167},{"cat":"sky","pid":25863,"tid":25913,"ts":531359758693,"ph":"X","name":"Layer::Display","args":{},"dur":1343,"tdur":1342,"tts":732174},{"cat":"sky","pid":25863,"tid":25913,"ts":531359760037,"ph":"X","name":"LayerHost::Upload","args":{},"dur":123,"tdur":73,"tts":733519},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359760175,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":69,"tdur":69,"tts":733608},{"cat":"blink","pid":25863,"tid":25913,"ts":531359760181,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":57,"tdur":56,"tts":733614},{"cat":"v8","pid":25863,"tid":25913,"ts":531359760184,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":51,"tdur":50,"tts":733617},{"cat":"v8","pid":25863,"tid":25913,"ts":531359760188,"ph":"X","name":"v8.callFunction","args":{},"dur":46,"tdur":45,"tts":733621},{"cat":"v8","pid":25863,"tid":25913,"ts":531359760200,"ph":"B","name":"V8.Execute","args":{},"tts":733632},{"cat":"blink","pid":25863,"tid":25913,"ts":531359760213,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":16,"tdur":16,"tts":733646},{"cat":"blink","pid":25863,"tid":25913,"ts":531359760225,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":4,"tdur":3,"tts":733658},{"cat":"v8","pid":25863,"tid":25913,"ts":531359760231,"ph":"E","name":"V8.Execute","args":{},"tts":733664},{"cat":"sky","pid":25863,"tid":25913,"ts":531359831303,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2971,"tdur":2736,"tts":733960},{"cat":"blink","pid":25863,"tid":25913,"ts":531359831319,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":383,"tdur":382,"tts":733974},{"cat":"blink","pid":25863,"tid":25913,"ts":531359831333,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":5,"tdur":4,"tts":733988},{"cat":"blink","pid":25863,"tid":25913,"ts":531359831345,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":140,"tdur":139,"tts":734000},{"cat":"blink","pid":25863,"tid":25913,"ts":531359831372,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":112,"tdur":111,"tts":734027},{"cat":"v8","pid":25863,"tid":25913,"ts":531359831434,"ph":"X","name":"v8.callFunction","args":{},"dur":41,"tdur":40,"tts":734089},{"cat":"v8","pid":25863,"tid":25913,"ts":531359831439,"ph":"B","name":"V8.Execute","args":{},"tts":734094},{"cat":"v8","pid":25863,"tid":25913,"ts":531359831470,"ph":"E","name":"V8.Execute","args":{},"tts":734125},{"cat":"v8","pid":25863,"tid":25913,"ts":531359831492,"ph":"X","name":"v8.callFunction","args":{},"dur":204,"tdur":203,"tts":734147},{"cat":"v8","pid":25863,"tid":25913,"ts":531359831496,"ph":"B","name":"V8.Execute","args":{},"tts":734151},{"cat":"blink","pid":25863,"tid":25913,"ts":531359831511,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":42,"tdur":41,"tts":734166},{"cat":"v8","pid":25863,"tid":25913,"ts":531359831690,"ph":"E","name":"V8.Execute","args":{},"tts":734346},{"cat":"blink","pid":25863,"tid":25913,"ts":531359831703,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":113,"tdur":112,"tts":734358},{"cat":"blink","pid":25863,"tid":25913,"ts":531359831708,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":734363},{"cat":"blink","pid":25863,"tid":25913,"ts":531359831711,"ph":"X","name":"Document::updateStyle","args":{},"dur":75,"tdur":74,"tts":734366},{"cat":"blink","pid":25863,"tid":25913,"ts":531359831787,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":734442},{"cat":"blink","pid":25863,"tid":25913,"ts":531359831802,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":12,"tdur":11,"tts":734457},{"cat":"sky","pid":25863,"tid":25913,"ts":531359831818,"ph":"X","name":"Layer::Display","args":{},"dur":2034,"tdur":2010,"tts":734473},{"cat":"sky","pid":25863,"tid":25913,"ts":531359833854,"ph":"X","name":"LayerHost::Upload","args":{},"dur":419,"tdur":207,"tts":736488},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359834292,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":95,"tdur":95,"tts":736714},{"cat":"blink","pid":25863,"tid":25913,"ts":531359834298,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":77,"tdur":76,"tts":736720},{"cat":"v8","pid":25863,"tid":25913,"ts":531359834302,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":70,"tdur":69,"tts":736724},{"cat":"v8","pid":25863,"tid":25913,"ts":531359834304,"ph":"X","name":"v8.callFunction","args":{},"dur":65,"tdur":65,"tts":736726},{"cat":"v8","pid":25863,"tid":25913,"ts":531359834306,"ph":"B","name":"V8.Execute","args":{},"tts":736728},{"cat":"blink","pid":25863,"tid":25913,"ts":531359834341,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":22,"tdur":21,"tts":736763},{"cat":"blink","pid":25863,"tid":25913,"ts":531359834355,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":7,"tdur":5,"tts":736778},{"cat":"v8","pid":25863,"tid":25913,"ts":531359834365,"ph":"E","name":"V8.Execute","args":{},"tts":736788},{"cat":"sky","pid":25863,"tid":25913,"ts":531359835116,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1803,"tdur":1643,"tts":737159},{"cat":"blink","pid":25863,"tid":25913,"ts":531359835138,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":214,"tdur":213,"tts":737167},{"cat":"blink","pid":25863,"tid":25913,"ts":531359835145,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":4,"tdur":4,"tts":737173},{"cat":"blink","pid":25863,"tid":25913,"ts":531359835152,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":77,"tdur":76,"tts":737181},{"cat":"blink","pid":25863,"tid":25913,"ts":531359835169,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":59,"tdur":59,"tts":737197},{"cat":"v8","pid":25863,"tid":25913,"ts":531359835197,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":22,"tts":737226},{"cat":"v8","pid":25863,"tid":25913,"ts":531359835202,"ph":"B","name":"V8.Execute","args":{},"tts":737230},{"cat":"v8","pid":25863,"tid":25913,"ts":531359835216,"ph":"E","name":"V8.Execute","args":{},"tts":737245},{"cat":"v8","pid":25863,"tid":25913,"ts":531359835233,"ph":"X","name":"v8.callFunction","args":{},"dur":114,"tdur":113,"tts":737262},{"cat":"v8","pid":25863,"tid":25913,"ts":531359835237,"ph":"B","name":"V8.Execute","args":{},"tts":737265},{"cat":"blink","pid":25863,"tid":25913,"ts":531359835245,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":21,"tdur":20,"tts":737274},{"cat":"v8","pid":25863,"tid":25913,"ts":531359835340,"ph":"E","name":"V8.Execute","args":{},"tts":737370},{"cat":"blink","pid":25863,"tid":25913,"ts":531359835353,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":66,"tdur":65,"tts":737382},{"cat":"blink","pid":25863,"tid":25913,"ts":531359835357,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":737386},{"cat":"blink","pid":25863,"tid":25913,"ts":531359835361,"ph":"X","name":"Document::updateStyle","args":{},"dur":39,"tdur":39,"tts":737389},{"cat":"blink","pid":25863,"tid":25913,"ts":531359835401,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":737430},{"cat":"blink","pid":25863,"tid":25913,"ts":531359835410,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":8,"tdur":7,"tts":737439},{"cat":"sky","pid":25863,"tid":25913,"ts":531359835421,"ph":"X","name":"Layer::Display","args":{},"dur":1249,"tdur":1218,"tts":737450},{"cat":"sky","pid":25863,"tid":25913,"ts":531359836671,"ph":"X","name":"LayerHost::Upload","args":{},"dur":248,"tdur":131,"tts":738670},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359836931,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":39,"tdur":38,"tts":738815},{"cat":"blink","pid":25863,"tid":25913,"ts":531359836936,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":30,"tdur":29,"tts":738819},{"cat":"v8","pid":25863,"tid":25913,"ts":531359836938,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":26,"tdur":26,"tts":738821},{"cat":"v8","pid":25863,"tid":25913,"ts":531359836941,"ph":"X","name":"v8.callFunction","args":{},"dur":22,"tdur":22,"tts":738824},{"cat":"v8","pid":25863,"tid":25913,"ts":531359836943,"ph":"B","name":"V8.Execute","args":{},"tts":738826},{"cat":"blink","pid":25863,"tid":25913,"ts":531359836951,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":9,"tts":738834},{"cat":"blink","pid":25863,"tid":25913,"ts":531359836957,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":738840},{"cat":"v8","pid":25863,"tid":25913,"ts":531359836961,"ph":"E","name":"V8.Execute","args":{},"tts":738844},{"cat":"sky","pid":25863,"tid":25913,"ts":531359837530,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1270,"tdur":1170,"tts":739069},{"cat":"blink","pid":25863,"tid":25913,"ts":531359837549,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":113,"tdur":112,"tts":739087},{"cat":"blink","pid":25863,"tid":25913,"ts":531359837553,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":2,"tts":739090},{"cat":"blink","pid":25863,"tid":25913,"ts":531359837556,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":47,"tdur":46,"tts":739094},{"cat":"blink","pid":25863,"tid":25913,"ts":531359837564,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":38,"tdur":38,"tts":739101},{"cat":"v8","pid":25863,"tid":25913,"ts":531359837578,"ph":"X","name":"v8.callFunction","args":{},"dur":20,"tdur":20,"tts":739115},{"cat":"v8","pid":25863,"tid":25913,"ts":531359837589,"ph":"B","name":"V8.Execute","args":{},"tts":739126},{"cat":"v8","pid":25863,"tid":25913,"ts":531359837596,"ph":"E","name":"V8.Execute","args":{},"tts":739134},{"cat":"v8","pid":25863,"tid":25913,"ts":531359837605,"ph":"X","name":"v8.callFunction","args":{},"dur":54,"tdur":54,"tts":739142},{"cat":"v8","pid":25863,"tid":25913,"ts":531359837607,"ph":"B","name":"V8.Execute","args":{},"tts":739144},{"cat":"blink","pid":25863,"tid":25913,"ts":531359837611,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":10,"tdur":10,"tts":739148},{"cat":"v8","pid":25863,"tid":25913,"ts":531359837656,"ph":"E","name":"V8.Execute","args":{},"tts":739194},{"cat":"blink","pid":25863,"tid":25913,"ts":531359837662,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":32,"tdur":31,"tts":739200},{"cat":"blink","pid":25863,"tid":25913,"ts":531359837664,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":739202},{"cat":"blink","pid":25863,"tid":25913,"ts":531359837666,"ph":"X","name":"Document::updateStyle","args":{},"dur":19,"tdur":19,"tts":739203},{"cat":"blink","pid":25863,"tid":25913,"ts":531359837685,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":739223},{"cat":"blink","pid":25863,"tid":25913,"ts":531359837690,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":3,"tts":739227},{"cat":"sky","pid":25863,"tid":25913,"ts":531359837695,"ph":"X","name":"Layer::Display","args":{},"dur":865,"tdur":864,"tts":739232},{"cat":"sky","pid":25863,"tid":25913,"ts":531359838561,"ph":"X","name":"LayerHost::Upload","args":{},"dur":238,"tdur":139,"tts":740098},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359838812,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":42,"tdur":41,"tts":740252},{"cat":"blink","pid":25863,"tid":25913,"ts":531359838818,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":31,"tdur":31,"tts":740257},{"cat":"v8","pid":25863,"tid":25913,"ts":531359838820,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":28,"tdur":27,"tts":740260},{"cat":"v8","pid":25863,"tid":25913,"ts":531359838823,"ph":"X","name":"v8.callFunction","args":{},"dur":24,"tdur":23,"tts":740263},{"cat":"v8","pid":25863,"tid":25913,"ts":531359838825,"ph":"B","name":"V8.Execute","args":{},"tts":740265},{"cat":"blink","pid":25863,"tid":25913,"ts":531359838834,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":10,"tdur":10,"tts":740273},{"cat":"blink","pid":25863,"tid":25913,"ts":531359838840,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":740280},{"cat":"v8","pid":25863,"tid":25913,"ts":531359838845,"ph":"E","name":"V8.Execute","args":{},"tts":740284},{"cat":"sky","pid":25863,"tid":25913,"ts":531359839384,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1144,"tdur":1114,"tts":740577},{"cat":"blink","pid":25863,"tid":25913,"ts":531359839388,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":101,"tdur":101,"tts":740580},{"cat":"blink","pid":25863,"tid":25913,"ts":531359839392,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":1,"tdur":2,"tts":740583},{"cat":"blink","pid":25863,"tid":25913,"ts":531359839395,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":36,"tdur":35,"tts":740587},{"cat":"blink","pid":25863,"tid":25913,"ts":531359839402,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":29,"tdur":28,"tts":740594},{"cat":"v8","pid":25863,"tid":25913,"ts":531359839416,"ph":"X","name":"v8.callFunction","args":{},"dur":11,"tdur":10,"tts":740608},{"cat":"v8","pid":25863,"tid":25913,"ts":531359839418,"ph":"B","name":"V8.Execute","args":{},"tts":740610},{"cat":"v8","pid":25863,"tid":25913,"ts":531359839425,"ph":"E","name":"V8.Execute","args":{},"tts":740617},{"cat":"v8","pid":25863,"tid":25913,"ts":531359839433,"ph":"X","name":"v8.callFunction","args":{},"dur":54,"tdur":53,"tts":740625},{"cat":"v8","pid":25863,"tid":25913,"ts":531359839435,"ph":"B","name":"V8.Execute","args":{},"tts":740626},{"cat":"blink","pid":25863,"tid":25913,"ts":531359839439,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":10,"tdur":10,"tts":740630},{"cat":"v8","pid":25863,"tid":25913,"ts":531359839484,"ph":"E","name":"V8.Execute","args":{},"tts":740676},{"cat":"blink","pid":25863,"tid":25913,"ts":531359839490,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":31,"tdur":32,"tts":740681},{"cat":"blink","pid":25863,"tid":25913,"ts":531359839492,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":740684},{"cat":"blink","pid":25863,"tid":25913,"ts":531359839493,"ph":"X","name":"Document::updateStyle","args":{},"dur":19,"tdur":18,"tts":740685},{"cat":"blink","pid":25863,"tid":25913,"ts":531359839513,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":740704},{"cat":"blink","pid":25863,"tid":25913,"ts":531359839517,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":3,"tts":740709},{"cat":"sky","pid":25863,"tid":25913,"ts":531359839522,"ph":"X","name":"Layer::Display","args":{},"dur":843,"tdur":841,"tts":740714},{"cat":"sky","pid":25863,"tid":25913,"ts":531359840366,"ph":"X","name":"LayerHost::Upload","args":{},"dur":161,"tdur":131,"tts":741558},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359841579,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":58,"tdur":57,"tts":742044},{"cat":"blink","pid":25863,"tid":25913,"ts":531359841585,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":46,"tdur":46,"tts":742050},{"cat":"v8","pid":25863,"tid":25913,"ts":531359841587,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":43,"tdur":42,"tts":742052},{"cat":"v8","pid":25863,"tid":25913,"ts":531359841590,"ph":"X","name":"v8.callFunction","args":{},"dur":39,"tdur":38,"tts":742055},{"cat":"v8","pid":25863,"tid":25913,"ts":531359841592,"ph":"B","name":"V8.Execute","args":{},"tts":742057},{"cat":"blink","pid":25863,"tid":25913,"ts":531359841614,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":12,"tdur":11,"tts":742079},{"cat":"blink","pid":25863,"tid":25913,"ts":531359841622,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":742087},{"cat":"v8","pid":25863,"tid":25913,"ts":531359841627,"ph":"E","name":"V8.Execute","args":{},"tts":742092},{"cat":"sky","pid":25863,"tid":25913,"ts":531359903173,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1684,"tdur":1495,"tts":742199},{"cat":"blink","pid":25863,"tid":25913,"ts":531359903178,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":127,"tdur":127,"tts":742203},{"cat":"blink","pid":25863,"tid":25913,"ts":531359903181,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":742206},{"cat":"blink","pid":25863,"tid":25913,"ts":531359903184,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":53,"tdur":53,"tts":742209},{"cat":"blink","pid":25863,"tid":25913,"ts":531359903197,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":40,"tdur":40,"tts":742222},{"cat":"v8","pid":25863,"tid":25913,"ts":531359903211,"ph":"X","name":"v8.callFunction","args":{},"dur":22,"tdur":22,"tts":742236},{"cat":"v8","pid":25863,"tid":25913,"ts":531359903213,"ph":"B","name":"V8.Execute","args":{},"tts":742238},{"cat":"v8","pid":25863,"tid":25913,"ts":531359903231,"ph":"E","name":"V8.Execute","args":{},"tts":742256},{"cat":"v8","pid":25863,"tid":25913,"ts":531359903239,"ph":"X","name":"v8.callFunction","args":{},"dur":63,"tdur":62,"tts":742265},{"cat":"v8","pid":25863,"tid":25913,"ts":531359903241,"ph":"B","name":"V8.Execute","args":{},"tts":742266},{"cat":"blink","pid":25863,"tid":25913,"ts":531359903245,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":9,"tdur":9,"tts":742270},{"cat":"v8","pid":25863,"tid":25913,"ts":531359903299,"ph":"E","name":"V8.Execute","args":{},"tts":742325},{"cat":"blink","pid":25863,"tid":25913,"ts":531359903305,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":37,"tdur":37,"tts":742330},{"cat":"blink","pid":25863,"tid":25913,"ts":531359903307,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":742332},{"cat":"blink","pid":25863,"tid":25913,"ts":531359903309,"ph":"X","name":"Document::updateStyle","args":{},"dur":19,"tdur":18,"tts":742334},{"cat":"blink","pid":25863,"tid":25913,"ts":531359903328,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":742353},{"cat":"blink","pid":25863,"tid":25913,"ts":531359903338,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":4,"tts":742363},{"cat":"sky","pid":25863,"tid":25913,"ts":531359903344,"ph":"X","name":"Layer::Display","args":{},"dur":1183,"tdur":1159,"tts":742369},{"cat":"sky","pid":25863,"tid":25913,"ts":531359904530,"ph":"X","name":"LayerHost::Upload","args":{},"dur":325,"tdur":159,"tts":743533},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359904880,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":68,"tdur":68,"tts":743718},{"cat":"blink","pid":25863,"tid":25913,"ts":531359904889,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":54,"tdur":54,"tts":743727},{"cat":"v8","pid":25863,"tid":25913,"ts":531359904894,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":48,"tdur":48,"tts":743732},{"cat":"v8","pid":25863,"tid":25913,"ts":531359904899,"ph":"X","name":"v8.callFunction","args":{},"dur":42,"tdur":42,"tts":743737},{"cat":"v8","pid":25863,"tid":25913,"ts":531359904902,"ph":"B","name":"V8.Execute","args":{},"tts":743741},{"cat":"blink","pid":25863,"tid":25913,"ts":531359904929,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":9,"tts":743767},{"cat":"blink","pid":25863,"tid":25913,"ts":531359904935,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":743773},{"cat":"v8","pid":25863,"tid":25913,"ts":531359904939,"ph":"E","name":"V8.Execute","args":{},"tts":743777},{"cat":"sky","pid":25863,"tid":25913,"ts":531359905322,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1078,"tdur":992,"tts":743961},{"cat":"blink","pid":25863,"tid":25913,"ts":531359905326,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":93,"tdur":92,"tts":743965},{"cat":"blink","pid":25863,"tid":25913,"ts":531359905329,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":743968},{"cat":"blink","pid":25863,"tid":25913,"ts":531359905332,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":33,"tdur":32,"tts":743971},{"cat":"blink","pid":25863,"tid":25913,"ts":531359905339,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":26,"tdur":26,"tts":743977},{"cat":"v8","pid":25863,"tid":25913,"ts":531359905351,"ph":"X","name":"v8.callFunction","args":{},"dur":11,"tdur":10,"tts":743990},{"cat":"v8","pid":25863,"tid":25913,"ts":531359905353,"ph":"B","name":"V8.Execute","args":{},"tts":743992},{"cat":"v8","pid":25863,"tid":25913,"ts":531359905360,"ph":"E","name":"V8.Execute","args":{},"tts":743998},{"cat":"v8","pid":25863,"tid":25913,"ts":531359905367,"ph":"X","name":"v8.callFunction","args":{},"dur":50,"tdur":49,"tts":744006},{"cat":"v8","pid":25863,"tid":25913,"ts":531359905369,"ph":"B","name":"V8.Execute","args":{},"tts":744007},{"cat":"blink","pid":25863,"tid":25913,"ts":531359905372,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":10,"tdur":9,"tts":744011},{"cat":"v8","pid":25863,"tid":25913,"ts":531359905414,"ph":"E","name":"V8.Execute","args":{},"tts":744053},{"cat":"blink","pid":25863,"tid":25913,"ts":531359905420,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":29,"tdur":29,"tts":744058},{"cat":"blink","pid":25863,"tid":25913,"ts":531359905422,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":744060},{"cat":"blink","pid":25863,"tid":25913,"ts":531359905423,"ph":"X","name":"Document::updateStyle","args":{},"dur":17,"tdur":17,"tts":744061},{"cat":"blink","pid":25863,"tid":25913,"ts":531359905441,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":744079},{"cat":"blink","pid":25863,"tid":25913,"ts":531359905445,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":3,"tdur":3,"tts":744083},{"cat":"sky","pid":25863,"tid":25913,"ts":531359905449,"ph":"X","name":"Layer::Display","args":{},"dur":773,"tdur":772,"tts":744088},{"cat":"sky","pid":25863,"tid":25913,"ts":531359906223,"ph":"X","name":"LayerHost::Upload","args":{},"dur":176,"tdur":90,"tts":744862},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359906411,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":39,"tdur":38,"tts":744965},{"cat":"blink","pid":25863,"tid":25913,"ts":531359906416,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":29,"tdur":29,"tts":744970},{"cat":"v8","pid":25863,"tid":25913,"ts":531359906419,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":25,"tdur":25,"tts":744972},{"cat":"v8","pid":25863,"tid":25913,"ts":531359906421,"ph":"X","name":"v8.callFunction","args":{},"dur":22,"tdur":21,"tts":744975},{"cat":"v8","pid":25863,"tid":25913,"ts":531359906423,"ph":"B","name":"V8.Execute","args":{},"tts":744977},{"cat":"blink","pid":25863,"tid":25913,"ts":531359906431,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":9,"tts":744985},{"cat":"blink","pid":25863,"tid":25913,"ts":531359906437,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":744991},{"cat":"v8","pid":25863,"tid":25913,"ts":531359906441,"ph":"E","name":"V8.Execute","args":{},"tts":744995},{"cat":"sky","pid":25863,"tid":25913,"ts":531359906769,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1027,"tdur":974,"tts":745145},{"cat":"blink","pid":25863,"tid":25913,"ts":531359906772,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":91,"tdur":91,"tts":745148},{"cat":"blink","pid":25863,"tid":25913,"ts":531359906775,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":745151},{"cat":"blink","pid":25863,"tid":25913,"ts":531359906778,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":31,"tdur":31,"tts":745153},{"cat":"blink","pid":25863,"tid":25913,"ts":531359906784,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":25,"tdur":24,"tts":745160},{"cat":"v8","pid":25863,"tid":25913,"ts":531359906796,"ph":"X","name":"v8.callFunction","args":{},"dur":10,"tdur":9,"tts":745172},{"cat":"v8","pid":25863,"tid":25913,"ts":531359906798,"ph":"B","name":"V8.Execute","args":{},"tts":745173},{"cat":"v8","pid":25863,"tid":25913,"ts":531359906804,"ph":"E","name":"V8.Execute","args":{},"tts":745180},{"cat":"v8","pid":25863,"tid":25913,"ts":531359906811,"ph":"X","name":"v8.callFunction","args":{},"dur":50,"tdur":50,"tts":745187},{"cat":"v8","pid":25863,"tid":25913,"ts":531359906813,"ph":"B","name":"V8.Execute","args":{},"tts":745188},{"cat":"blink","pid":25863,"tid":25913,"ts":531359906816,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":10,"tdur":9,"tts":745192},{"cat":"v8","pid":25863,"tid":25913,"ts":531359906859,"ph":"E","name":"V8.Execute","args":{},"tts":745234},{"cat":"blink","pid":25863,"tid":25913,"ts":531359906864,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":29,"tdur":29,"tts":745239},{"cat":"blink","pid":25863,"tid":25913,"ts":531359906866,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":745241},{"cat":"blink","pid":25863,"tid":25913,"ts":531359906867,"ph":"X","name":"Document::updateStyle","args":{},"dur":18,"tdur":17,"tts":745243},{"cat":"blink","pid":25863,"tid":25913,"ts":531359906885,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":745261},{"cat":"blink","pid":25863,"tid":25913,"ts":531359906889,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":3,"tts":745265},{"cat":"sky","pid":25863,"tid":25913,"ts":531359906894,"ph":"X","name":"Layer::Display","args":{},"dur":796,"tdur":795,"tts":745269},{"cat":"sky","pid":25863,"tid":25913,"ts":531359907691,"ph":"X","name":"LayerHost::Upload","args":{},"dur":105,"tdur":53,"tts":746066},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359907871,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":44,"tdur":42,"tts":746171},{"cat":"blink","pid":25863,"tid":25913,"ts":531359907875,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":35,"tdur":34,"tts":746175},{"cat":"v8","pid":25863,"tid":25913,"ts":531359907878,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":31,"tdur":31,"tts":746177},{"cat":"v8","pid":25863,"tid":25913,"ts":531359907880,"ph":"X","name":"v8.callFunction","args":{},"dur":28,"tdur":28,"tts":746179},{"cat":"v8","pid":25863,"tid":25913,"ts":531359907882,"ph":"B","name":"V8.Execute","args":{},"tts":746181},{"cat":"blink","pid":25863,"tid":25913,"ts":531359907889,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":16,"tdur":16,"tts":746188},{"cat":"blink","pid":25863,"tid":25913,"ts":531359907895,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":10,"tdur":9,"tts":746194},{"cat":"v8","pid":25863,"tid":25913,"ts":531359907906,"ph":"E","name":"V8.Execute","args":{},"tts":746205},{"cat":"sky","pid":25863,"tid":25913,"ts":531359908238,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1046,"tdur":998,"tts":746367},{"cat":"blink","pid":25863,"tid":25913,"ts":531359908242,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":94,"tdur":93,"tts":746371},{"cat":"blink","pid":25863,"tid":25913,"ts":531359908245,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":746374},{"cat":"blink","pid":25863,"tid":25913,"ts":531359908248,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":34,"tdur":33,"tts":746377},{"cat":"blink","pid":25863,"tid":25913,"ts":531359908255,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":26,"tdur":26,"tts":746383},{"cat":"v8","pid":25863,"tid":25913,"ts":531359908268,"ph":"X","name":"v8.callFunction","args":{},"dur":10,"tdur":10,"tts":746396},{"cat":"v8","pid":25863,"tid":25913,"ts":531359908269,"ph":"B","name":"V8.Execute","args":{},"tts":746398},{"cat":"v8","pid":25863,"tid":25913,"ts":531359908276,"ph":"E","name":"V8.Execute","args":{},"tts":746404},{"cat":"v8","pid":25863,"tid":25913,"ts":531359908284,"ph":"X","name":"v8.callFunction","args":{},"dur":50,"tdur":50,"tts":746412},{"cat":"v8","pid":25863,"tid":25913,"ts":531359908285,"ph":"B","name":"V8.Execute","args":{},"tts":746413},{"cat":"blink","pid":25863,"tid":25913,"ts":531359908289,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":9,"tdur":9,"tts":746417},{"cat":"v8","pid":25863,"tid":25913,"ts":531359908331,"ph":"E","name":"V8.Execute","args":{},"tts":746460},{"cat":"blink","pid":25863,"tid":25913,"ts":531359908336,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":30,"tdur":29,"tts":746465},{"cat":"blink","pid":25863,"tid":25913,"ts":531359908338,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":746467},{"cat":"blink","pid":25863,"tid":25913,"ts":531359908340,"ph":"X","name":"Document::updateStyle","args":{},"dur":17,"tdur":17,"tts":746468},{"cat":"blink","pid":25863,"tid":25913,"ts":531359908358,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":746486},{"cat":"blink","pid":25863,"tid":25913,"ts":531359908362,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":3,"tdur":3,"tts":746490},{"cat":"sky","pid":25863,"tid":25913,"ts":531359908366,"ph":"X","name":"Layer::Display","args":{},"dur":780,"tdur":778,"tts":746495},{"cat":"sky","pid":25863,"tid":25913,"ts":531359909147,"ph":"X","name":"LayerHost::Upload","args":{},"dur":136,"tdur":89,"tts":747275},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359910400,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":41,"tdur":41,"tts":747483},{"cat":"blink","pid":25863,"tid":25913,"ts":531359910406,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":30,"tdur":30,"tts":747488},{"cat":"v8","pid":25863,"tid":25913,"ts":531359910408,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":27,"tdur":26,"tts":747491},{"cat":"v8","pid":25863,"tid":25913,"ts":531359910411,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":22,"tts":747494},{"cat":"v8","pid":25863,"tid":25913,"ts":531359910413,"ph":"B","name":"V8.Execute","args":{},"tts":747495},{"cat":"blink","pid":25863,"tid":25913,"ts":531359910421,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":10,"tdur":10,"tts":747503},{"cat":"blink","pid":25863,"tid":25913,"ts":531359910428,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":747510},{"cat":"v8","pid":25863,"tid":25913,"ts":531359910432,"ph":"E","name":"V8.Execute","args":{},"tts":747515},{"cat":"sky","pid":25863,"tid":25913,"ts":531359969760,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2418,"tdur":2226,"tts":747621},{"cat":"blink","pid":25863,"tid":25913,"ts":531359969770,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":276,"tdur":276,"tts":747630},{"cat":"blink","pid":25863,"tid":25913,"ts":531359969779,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":3,"tdur":2,"tts":747639},{"cat":"blink","pid":25863,"tid":25913,"ts":531359969788,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":98,"tdur":97,"tts":747648},{"cat":"blink","pid":25863,"tid":25913,"ts":531359969811,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":75,"tdur":75,"tts":747670},{"cat":"v8","pid":25863,"tid":25913,"ts":531359969854,"ph":"X","name":"v8.callFunction","args":{},"dur":27,"tdur":27,"tts":747713},{"cat":"v8","pid":25863,"tid":25913,"ts":531359969857,"ph":"B","name":"V8.Execute","args":{},"tts":747717},{"cat":"v8","pid":25863,"tid":25913,"ts":531359969878,"ph":"E","name":"V8.Execute","args":{},"tts":747738},{"cat":"v8","pid":25863,"tid":25913,"ts":531359969891,"ph":"X","name":"v8.callFunction","args":{},"dur":153,"tdur":153,"tts":747750},{"cat":"v8","pid":25863,"tid":25913,"ts":531359969892,"ph":"B","name":"V8.Execute","args":{},"tts":747752},{"cat":"blink","pid":25863,"tid":25913,"ts":531359969902,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":28,"tdur":28,"tts":747762},{"cat":"v8","pid":25863,"tid":25913,"ts":531359970041,"ph":"E","name":"V8.Execute","args":{},"tts":747901},{"cat":"blink","pid":25863,"tid":25913,"ts":531359970047,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":601,"tdur":601,"tts":747906},{"cat":"blink","pid":25863,"tid":25913,"ts":531359970049,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":747909},{"cat":"blink","pid":25863,"tid":25913,"ts":531359970051,"ph":"X","name":"Document::updateStyle","args":{},"dur":161,"tdur":160,"tts":747910},{"cat":"blink","pid":25863,"tid":25913,"ts":531359970214,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":2},"tts":748074},{"cat":"blink","pid":25863,"tid":25913,"ts":531359970219,"ph":"X","name":"FrameView::layout","args":{},"dur":86,"tdur":85,"tts":748079},{"cat":"blink","pid":25863,"tid":25913,"ts":531359970223,"ph":"X","name":"FrameView::performPreLayoutTasks","args":{},"dur":4,"tdur":4,"tts":748082},{"cat":"blink","pid":25863,"tid":25913,"ts":531359970229,"ph":"X","name":"FrameView::performLayout","args":{},"dur":50,"tdur":49,"tts":748088},{"cat":"blink","pid":25863,"tid":25913,"ts":531359970280,"ph":"X","name":"RenderLayer::updateLayerPositionsAfterLayout","args":{},"dur":4,"tdur":3,"tts":748140},{"cat":"blink","pid":25863,"tid":25913,"ts":531359970285,"ph":"X","name":"FrameView::performPostLayoutTasks","args":{},"dur":16,"tdur":15,"tts":748145},{"cat":"blink","pid":25863,"tid":25913,"ts":531359970316,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":331,"tdur":330,"tts":748176},{"cat":"sky","pid":25863,"tid":25913,"ts":531359970650,"ph":"X","name":"Layer::Display","args":{},"dur":1126,"tdur":1125,"tts":748509},{"cat":"sky","pid":25863,"tid":25913,"ts":531359971779,"ph":"X","name":"LayerHost::Upload","args":{},"dur":397,"tdur":205,"tts":749639},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359972212,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":99,"tdur":98,"tts":749882},{"cat":"blink","pid":25863,"tid":25913,"ts":531359972225,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":75,"tdur":75,"tts":749894},{"cat":"v8","pid":25863,"tid":25913,"ts":531359972232,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":66,"tdur":65,"tts":749901},{"cat":"v8","pid":25863,"tid":25913,"ts":531359972238,"ph":"X","name":"v8.callFunction","args":{},"dur":57,"tdur":57,"tts":749907},{"cat":"v8","pid":25863,"tid":25913,"ts":531359972242,"ph":"B","name":"V8.Execute","args":{},"tts":749911},{"cat":"blink","pid":25863,"tid":25913,"ts":531359972268,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":21,"tdur":21,"tts":749937},{"cat":"blink","pid":25863,"tid":25913,"ts":531359972282,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":6,"tdur":6,"tts":749951},{"cat":"v8","pid":25863,"tid":25913,"ts":531359972292,"ph":"E","name":"V8.Execute","args":{},"tts":749961},{"cat":"sky","pid":25863,"tid":25913,"ts":531359973095,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2380,"tdur":2225,"tts":750343},{"cat":"blink","pid":25863,"tid":25913,"ts":531359973105,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":234,"tdur":233,"tts":750351},{"cat":"blink","pid":25863,"tid":25913,"ts":531359973112,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":3,"tdur":3,"tts":750357},{"cat":"blink","pid":25863,"tid":25913,"ts":531359973119,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":97,"tdur":97,"tts":750364},{"cat":"blink","pid":25863,"tid":25913,"ts":531359973157,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":58,"tdur":57,"tts":750403},{"cat":"v8","pid":25863,"tid":25913,"ts":531359973185,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":22,"tts":750431},{"cat":"v8","pid":25863,"tid":25913,"ts":531359973190,"ph":"B","name":"V8.Execute","args":{},"tts":750435},{"cat":"v8","pid":25863,"tid":25913,"ts":531359973204,"ph":"E","name":"V8.Execute","args":{},"tts":750450},{"cat":"v8","pid":25863,"tid":25913,"ts":531359973221,"ph":"X","name":"v8.callFunction","args":{},"dur":113,"tdur":112,"tts":750467},{"cat":"v8","pid":25863,"tid":25913,"ts":531359973224,"ph":"B","name":"V8.Execute","args":{},"tts":750470},{"cat":"blink","pid":25863,"tid":25913,"ts":531359973232,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":22,"tdur":21,"tts":750478},{"cat":"v8","pid":25863,"tid":25913,"ts":531359973328,"ph":"E","name":"V8.Execute","args":{},"tts":750574},{"cat":"blink","pid":25863,"tid":25913,"ts":531359973341,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":66,"tdur":65,"tts":750587},{"cat":"blink","pid":25863,"tid":25913,"ts":531359973345,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":750591},{"cat":"blink","pid":25863,"tid":25913,"ts":531359973348,"ph":"X","name":"Document::updateStyle","args":{},"dur":40,"tdur":39,"tts":750594},{"cat":"blink","pid":25863,"tid":25913,"ts":531359973389,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":750635},{"cat":"blink","pid":25863,"tid":25913,"ts":531359973398,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":8,"tdur":7,"tts":750644},{"cat":"sky","pid":25863,"tid":25913,"ts":531359973409,"ph":"X","name":"Layer::Display","args":{},"dur":1728,"tdur":1727,"tts":750654},{"cat":"sky","pid":25863,"tid":25913,"ts":531359975139,"ph":"X","name":"LayerHost::Upload","args":{},"dur":334,"tdur":180,"tts":752385},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359975502,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":87,"tdur":86,"tts":752595},{"cat":"blink","pid":25863,"tid":25913,"ts":531359975513,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":66,"tdur":65,"tts":752606},{"cat":"v8","pid":25863,"tid":25913,"ts":531359975518,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":58,"tdur":57,"tts":752611},{"cat":"v8","pid":25863,"tid":25913,"ts":531359975525,"ph":"X","name":"v8.callFunction","args":{},"dur":49,"tdur":48,"tts":752618},{"cat":"v8","pid":25863,"tid":25913,"ts":531359975528,"ph":"B","name":"V8.Execute","args":{},"tts":752621},{"cat":"blink","pid":25863,"tid":25913,"ts":531359975547,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":21,"tdur":20,"tts":752640},{"cat":"blink","pid":25863,"tid":25913,"ts":531359975560,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":6,"tdur":6,"tts":752653},{"cat":"v8","pid":25863,"tid":25913,"ts":531359975570,"ph":"E","name":"V8.Execute","args":{},"tts":752663},{"cat":"sky","pid":25863,"tid":25913,"ts":531359976309,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":3341,"tdur":3200,"tts":753016},{"cat":"blink","pid":25863,"tid":25913,"ts":531359976319,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":481,"tdur":481,"tts":753024},{"cat":"blink","pid":25863,"tid":25913,"ts":531359976325,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":4,"tdur":3,"tts":753030},{"cat":"blink","pid":25863,"tid":25913,"ts":531359976332,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":75,"tdur":74,"tts":753038},{"cat":"blink","pid":25863,"tid":25913,"ts":531359976347,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":59,"tdur":58,"tts":753053},{"cat":"v8","pid":25863,"tid":25913,"ts":531359976376,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":22,"tts":753081},{"cat":"v8","pid":25863,"tid":25913,"ts":531359976380,"ph":"B","name":"V8.Execute","args":{},"tts":753085},{"cat":"v8","pid":25863,"tid":25913,"ts":531359976395,"ph":"E","name":"V8.Execute","args":{},"tts":753100},{"cat":"v8","pid":25863,"tid":25913,"ts":531359976412,"ph":"X","name":"v8.callFunction","args":{},"dur":386,"tdur":385,"tts":753117},{"cat":"v8","pid":25863,"tid":25913,"ts":531359976415,"ph":"B","name":"V8.Execute","args":{},"tts":753120},{"cat":"blink","pid":25863,"tid":25913,"ts":531359976423,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":21,"tdur":20,"tts":753129},{"cat":"v8","pid":25863,"tid":25913,"ts":531359976730,"ph":"E","name":"V8.Execute","args":{},"tts":753436},{"cat":"blink","pid":25863,"tid":25913,"ts":531359976801,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":805,"tdur":805,"tts":753506},{"cat":"blink","pid":25863,"tid":25913,"ts":531359976804,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":753509},{"cat":"blink","pid":25863,"tid":25913,"ts":531359976805,"ph":"X","name":"Document::updateStyle","args":{},"dur":68,"tdur":67,"tts":753510},{"cat":"blink","pid":25863,"tid":25913,"ts":531359976873,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":6},"tts":753578},{"cat":"blink","pid":25863,"tid":25913,"ts":531359976875,"ph":"X","name":"FrameView::layout","args":{},"dur":248,"tdur":248,"tts":753580},{"cat":"blink","pid":25863,"tid":25913,"ts":531359976876,"ph":"X","name":"FrameView::performPreLayoutTasks","args":{},"dur":2,"tdur":1,"tts":753582},{"cat":"blink","pid":25863,"tid":25913,"ts":531359976878,"ph":"X","name":"FrameView::performLayout","args":{},"dur":225,"tdur":222,"tts":753584},{"cat":"blink","pid":25863,"tid":25913,"ts":531359977105,"ph":"X","name":"RenderLayer::updateLayerPositionsAfterLayout","args":{},"dur":6,"tdur":5,"tts":753810},{"cat":"blink","pid":25863,"tid":25913,"ts":531359977112,"ph":"X","name":"FrameView::performPostLayoutTasks","args":{},"dur":9,"tdur":8,"tts":753817},{"cat":"blink","pid":25863,"tid":25913,"ts":531359977129,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":475,"tdur":473,"tts":753835},{"cat":"sky","pid":25863,"tid":25913,"ts":531359977608,"ph":"X","name":"Layer::Display","args":{},"dur":1775,"tdur":1774,"tts":754313},{"cat":"sky","pid":25863,"tid":25913,"ts":531359979385,"ph":"X","name":"LayerHost::Upload","args":{},"dur":264,"tdur":123,"tts":756091},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359979675,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":91,"tdur":90,"tts":756242},{"cat":"blink","pid":25863,"tid":25913,"ts":531359979685,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":72,"tdur":71,"tts":756251},{"cat":"v8","pid":25863,"tid":25913,"ts":531359979690,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":64,"tdur":63,"tts":756256},{"cat":"v8","pid":25863,"tid":25913,"ts":531359979696,"ph":"X","name":"v8.callFunction","args":{},"dur":55,"tdur":55,"tts":756262},{"cat":"v8","pid":25863,"tid":25913,"ts":531359979699,"ph":"B","name":"V8.Execute","args":{},"tts":756266},{"cat":"blink","pid":25863,"tid":25913,"ts":531359979716,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":29,"tdur":28,"tts":756283},{"cat":"blink","pid":25863,"tid":25913,"ts":531359979738,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":7,"tdur":5,"tts":756305},{"cat":"v8","pid":25863,"tid":25913,"ts":531359979748,"ph":"E","name":"V8.Execute","args":{},"tts":756314},{"cat":"sky","pid":25863,"tid":25913,"ts":531359980339,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2373,"tdur":2251,"tts":756710},{"cat":"blink","pid":25863,"tid":25913,"ts":531359980348,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":229,"tdur":227,"tts":756718},{"cat":"blink","pid":25863,"tid":25913,"ts":531359980355,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":4,"tdur":3,"tts":756724},{"cat":"blink","pid":25863,"tid":25913,"ts":531359980362,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":74,"tdur":73,"tts":756732},{"cat":"blink","pid":25863,"tid":25913,"ts":531359980377,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":59,"tdur":57,"tts":756747},{"cat":"v8","pid":25863,"tid":25913,"ts":531359980405,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":22,"tts":756775},{"cat":"v8","pid":25863,"tid":25913,"ts":531359980410,"ph":"B","name":"V8.Execute","args":{},"tts":756779},{"cat":"v8","pid":25863,"tid":25913,"ts":531359980424,"ph":"E","name":"V8.Execute","args":{},"tts":756794},{"cat":"v8","pid":25863,"tid":25913,"ts":531359980441,"ph":"X","name":"v8.callFunction","args":{},"dur":131,"tdur":131,"tts":756810},{"cat":"v8","pid":25863,"tid":25913,"ts":531359980460,"ph":"B","name":"V8.Execute","args":{},"tts":756830},{"cat":"blink","pid":25863,"tid":25913,"ts":531359980469,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":21,"tdur":20,"tts":756839},{"cat":"v8","pid":25863,"tid":25913,"ts":531359980565,"ph":"E","name":"V8.Execute","args":{},"tts":756936},{"cat":"blink","pid":25863,"tid":25913,"ts":531359980578,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":66,"tdur":65,"tts":756948},{"cat":"blink","pid":25863,"tid":25913,"ts":531359980583,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":756952},{"cat":"blink","pid":25863,"tid":25913,"ts":531359980586,"ph":"X","name":"Document::updateStyle","args":{},"dur":39,"tdur":39,"tts":756955},{"cat":"blink","pid":25863,"tid":25913,"ts":531359980626,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":756996},{"cat":"blink","pid":25863,"tid":25913,"ts":531359980635,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":8,"tdur":7,"tts":757005},{"cat":"sky","pid":25863,"tid":25913,"ts":531359980646,"ph":"X","name":"Layer::Display","args":{},"dur":1767,"tdur":1765,"tts":757015},{"cat":"sky","pid":25863,"tid":25913,"ts":531359982415,"ph":"X","name":"LayerHost::Upload","args":{},"dur":295,"tdur":173,"tts":758785},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531359982739,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":85,"tdur":85,"tts":758988},{"cat":"blink","pid":25863,"tid":25913,"ts":531359982749,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":65,"tdur":64,"tts":758999},{"cat":"v8","pid":25863,"tid":25913,"ts":531359982755,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":57,"tdur":56,"tts":759005},{"cat":"v8","pid":25863,"tid":25913,"ts":531359982761,"ph":"X","name":"v8.callFunction","args":{},"dur":48,"tdur":47,"tts":759011},{"cat":"v8","pid":25863,"tid":25913,"ts":531359982765,"ph":"B","name":"V8.Execute","args":{},"tts":759014},{"cat":"blink","pid":25863,"tid":25913,"ts":531359982783,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":20,"tdur":19,"tts":759033},{"cat":"blink","pid":25863,"tid":25913,"ts":531359982796,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":6,"tdur":5,"tts":759046},{"cat":"v8","pid":25863,"tid":25913,"ts":531359982806,"ph":"E","name":"V8.Execute","args":{},"tts":759055},{"cat":"sky","pid":25863,"tid":25913,"ts":531360062923,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1513,"tdur":1418,"tts":759411},{"cat":"blink","pid":25863,"tid":25913,"ts":531360062930,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":201,"tdur":200,"tts":759418},{"cat":"blink","pid":25863,"tid":25913,"ts":531360062937,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":2,"tts":759424},{"cat":"blink","pid":25863,"tid":25913,"ts":531360062943,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":80,"tdur":79,"tts":759430},{"cat":"blink","pid":25863,"tid":25913,"ts":531360062963,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":59,"tdur":58,"tts":759451},{"cat":"v8","pid":25863,"tid":25913,"ts":531360062996,"ph":"X","name":"v8.callFunction","args":{},"dur":21,"tdur":21,"tts":759483},{"cat":"v8","pid":25863,"tid":25913,"ts":531360062999,"ph":"B","name":"V8.Execute","args":{},"tts":759486},{"cat":"v8","pid":25863,"tid":25913,"ts":531360063015,"ph":"E","name":"V8.Execute","args":{},"tts":759502},{"cat":"v8","pid":25863,"tid":25913,"ts":531360063026,"ph":"X","name":"v8.callFunction","args":{},"dur":102,"tdur":102,"tts":759513},{"cat":"v8","pid":25863,"tid":25913,"ts":531360063028,"ph":"B","name":"V8.Execute","args":{},"tts":759515},{"cat":"blink","pid":25863,"tid":25913,"ts":531360063036,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":20,"tdur":19,"tts":759523},{"cat":"v8","pid":25863,"tid":25913,"ts":531360063125,"ph":"E","name":"V8.Execute","args":{},"tts":759612},{"cat":"blink","pid":25863,"tid":25913,"ts":531360063132,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":63,"tdur":63,"tts":759619},{"cat":"blink","pid":25863,"tid":25913,"ts":531360063134,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":759621},{"cat":"blink","pid":25863,"tid":25913,"ts":531360063136,"ph":"X","name":"Document::updateStyle","args":{},"dur":44,"tdur":44,"tts":759623},{"cat":"blink","pid":25863,"tid":25913,"ts":531360063181,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":759668},{"cat":"blink","pid":25863,"tid":25913,"ts":531360063188,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":6,"tdur":6,"tts":759675},{"cat":"sky","pid":25863,"tid":25913,"ts":531360063196,"ph":"X","name":"Layer::Display","args":{},"dur":1038,"tdur":1026,"tts":759683},{"cat":"sky","pid":25863,"tid":25913,"ts":531360064234,"ph":"X","name":"LayerHost::Upload","args":{},"dur":201,"tdur":116,"tts":760712},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360064452,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":41,"tdur":41,"tts":760846},{"cat":"blink","pid":25863,"tid":25913,"ts":531360064457,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":32,"tdur":31,"tts":760851},{"cat":"v8","pid":25863,"tid":25913,"ts":531360064460,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":28,"tdur":28,"tts":760853},{"cat":"v8","pid":25863,"tid":25913,"ts":531360064462,"ph":"X","name":"v8.callFunction","args":{},"dur":25,"tdur":24,"tts":760856},{"cat":"v8","pid":25863,"tid":25913,"ts":531360064464,"ph":"B","name":"V8.Execute","args":{},"tts":760857},{"cat":"blink","pid":25863,"tid":25913,"ts":531360064475,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":8,"tts":760869},{"cat":"blink","pid":25863,"tid":25913,"ts":531360064481,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":760874},{"cat":"v8","pid":25863,"tid":25913,"ts":531360064485,"ph":"E","name":"V8.Execute","args":{},"tts":760879},{"cat":"sky","pid":25863,"tid":25913,"ts":531360064929,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1264,"tdur":1175,"tts":761069},{"cat":"blink","pid":25863,"tid":25913,"ts":531360064932,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":105,"tdur":105,"tts":761072},{"cat":"blink","pid":25863,"tid":25913,"ts":531360064935,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":761075},{"cat":"blink","pid":25863,"tid":25913,"ts":531360064938,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":31,"tdur":31,"tts":761078},{"cat":"blink","pid":25863,"tid":25913,"ts":531360064944,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":25,"tdur":24,"tts":761084},{"cat":"v8","pid":25863,"tid":25913,"ts":531360064956,"ph":"X","name":"v8.callFunction","args":{},"dur":10,"tdur":9,"tts":761096},{"cat":"v8","pid":25863,"tid":25913,"ts":531360064958,"ph":"B","name":"V8.Execute","args":{},"tts":761098},{"cat":"v8","pid":25863,"tid":25913,"ts":531360064964,"ph":"E","name":"V8.Execute","args":{},"tts":761104},{"cat":"v8","pid":25863,"tid":25913,"ts":531360064971,"ph":"X","name":"v8.callFunction","args":{},"dur":64,"tdur":64,"tts":761111},{"cat":"v8","pid":25863,"tid":25913,"ts":531360064973,"ph":"B","name":"V8.Execute","args":{},"tts":761112},{"cat":"blink","pid":25863,"tid":25913,"ts":531360064976,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":9,"tdur":8,"tts":761116},{"cat":"v8","pid":25863,"tid":25913,"ts":531360065032,"ph":"E","name":"V8.Execute","args":{},"tts":761172},{"cat":"blink","pid":25863,"tid":25913,"ts":531360065038,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":27,"tdur":28,"tts":761177},{"cat":"blink","pid":25863,"tid":25913,"ts":531360065039,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":761179},{"cat":"blink","pid":25863,"tid":25913,"ts":531360065041,"ph":"X","name":"Document::updateStyle","args":{},"dur":16,"tdur":16,"tts":761180},{"cat":"blink","pid":25863,"tid":25913,"ts":531360065058,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":761197},{"cat":"blink","pid":25863,"tid":25913,"ts":531360065061,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":3,"tts":761201},{"cat":"sky","pid":25863,"tid":25913,"ts":531360065066,"ph":"X","name":"Layer::Display","args":{},"dur":857,"tdur":842,"tts":761206},{"cat":"sky","pid":25863,"tid":25913,"ts":531360065925,"ph":"X","name":"LayerHost::Upload","args":{},"dur":267,"tdur":178,"tts":762065},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360066215,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":76,"tdur":76,"tts":762267},{"cat":"blink","pid":25863,"tid":25913,"ts":531360066219,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":62,"tdur":61,"tts":762271},{"cat":"v8","pid":25863,"tid":25913,"ts":531360066222,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":56,"tdur":55,"tts":762274},{"cat":"v8","pid":25863,"tid":25913,"ts":531360066224,"ph":"X","name":"v8.callFunction","args":{},"dur":51,"tdur":51,"tts":762276},{"cat":"v8","pid":25863,"tid":25913,"ts":531360066226,"ph":"B","name":"V8.Execute","args":{},"tts":762278},{"cat":"blink","pid":25863,"tid":25913,"ts":531360066248,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":21,"tdur":20,"tts":762300},{"cat":"blink","pid":25863,"tid":25913,"ts":531360066262,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":6,"tdur":5,"tts":762314},{"cat":"v8","pid":25863,"tid":25913,"ts":531360066271,"ph":"E","name":"V8.Execute","args":{},"tts":762324},{"cat":"sky","pid":25863,"tid":25913,"ts":531360066864,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1026,"tdur":958,"tts":762548},{"cat":"blink","pid":25863,"tid":25913,"ts":531360066868,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":98,"tdur":98,"tts":762551},{"cat":"blink","pid":25863,"tid":25913,"ts":531360066871,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":1,"tdur":2,"tts":762554},{"cat":"blink","pid":25863,"tid":25913,"ts":531360066874,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":35,"tdur":34,"tts":762558},{"cat":"blink","pid":25863,"tid":25913,"ts":531360066881,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":27,"tdur":28,"tts":762564},{"cat":"v8","pid":25863,"tid":25913,"ts":531360066895,"ph":"X","name":"v8.callFunction","args":{},"dur":10,"tdur":11,"tts":762578},{"cat":"v8","pid":25863,"tid":25913,"ts":531360066897,"ph":"B","name":"V8.Execute","args":{},"tts":762580},{"cat":"v8","pid":25863,"tid":25913,"ts":531360066904,"ph":"E","name":"V8.Execute","args":{},"tts":762587},{"cat":"v8","pid":25863,"tid":25913,"ts":531360066911,"ph":"X","name":"v8.callFunction","args":{},"dur":53,"tdur":53,"tts":762594},{"cat":"v8","pid":25863,"tid":25913,"ts":531360066912,"ph":"B","name":"V8.Execute","args":{},"tts":762596},{"cat":"blink","pid":25863,"tid":25913,"ts":531360066916,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":11,"tdur":10,"tts":762600},{"cat":"v8","pid":25863,"tid":25913,"ts":531360066961,"ph":"E","name":"V8.Execute","args":{},"tts":762645},{"cat":"blink","pid":25863,"tid":25913,"ts":531360066966,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":29,"tdur":28,"tts":762650},{"cat":"blink","pid":25863,"tid":25913,"ts":531360066968,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":762652},{"cat":"blink","pid":25863,"tid":25913,"ts":531360066969,"ph":"X","name":"Document::updateStyle","args":{},"dur":18,"tdur":17,"tts":762653},{"cat":"blink","pid":25863,"tid":25913,"ts":531360066987,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":762671},{"cat":"blink","pid":25863,"tid":25913,"ts":531360066991,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":3,"tdur":3,"tts":762675},{"cat":"sky","pid":25863,"tid":25913,"ts":531360066996,"ph":"X","name":"Layer::Display","args":{},"dur":775,"tdur":775,"tts":762679},{"cat":"sky","pid":25863,"tid":25913,"ts":531360067772,"ph":"X","name":"LayerHost::Upload","args":{},"dur":118,"tdur":49,"tts":763456},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360068019,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":36,"tdur":35,"tts":763579},{"cat":"blink","pid":25863,"tid":25913,"ts":531360068023,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":27,"tdur":27,"tts":763583},{"cat":"v8","pid":25863,"tid":25913,"ts":531360068025,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":24,"tdur":24,"tts":763585},{"cat":"v8","pid":25863,"tid":25913,"ts":531360068027,"ph":"X","name":"v8.callFunction","args":{},"dur":21,"tdur":21,"tts":763587},{"cat":"v8","pid":25863,"tid":25913,"ts":531360068029,"ph":"B","name":"V8.Execute","args":{},"tts":763589},{"cat":"blink","pid":25863,"tid":25913,"ts":531360068037,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":8,"tdur":8,"tts":763597},{"cat":"blink","pid":25863,"tid":25913,"ts":531360068042,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":763602},{"cat":"v8","pid":25863,"tid":25913,"ts":531360068046,"ph":"E","name":"V8.Execute","args":{},"tts":763607},{"cat":"sky","pid":25863,"tid":25913,"ts":531360068119,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":915,"tdur":898,"tts":763672},{"cat":"blink","pid":25863,"tid":25913,"ts":531360068122,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":78,"tdur":78,"tts":763674},{"cat":"blink","pid":25863,"tid":25913,"ts":531360068124,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":763676},{"cat":"blink","pid":25863,"tid":25913,"ts":531360068127,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":26,"tdur":26,"tts":763678},{"cat":"blink","pid":25863,"tid":25913,"ts":531360068132,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":20,"tdur":20,"tts":763684},{"cat":"v8","pid":25863,"tid":25913,"ts":531360068141,"ph":"X","name":"v8.callFunction","args":{},"dur":9,"tdur":8,"tts":763693},{"cat":"v8","pid":25863,"tid":25913,"ts":531360068143,"ph":"B","name":"V8.Execute","args":{},"tts":763695},{"cat":"v8","pid":25863,"tid":25913,"ts":531360068148,"ph":"E","name":"V8.Execute","args":{},"tts":763700},{"cat":"v8","pid":25863,"tid":25913,"ts":531360068155,"ph":"X","name":"v8.callFunction","args":{},"dur":44,"tdur":43,"tts":763707},{"cat":"v8","pid":25863,"tid":25913,"ts":531360068156,"ph":"B","name":"V8.Execute","args":{},"tts":763708},{"cat":"blink","pid":25863,"tid":25913,"ts":531360068160,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":7,"tdur":7,"tts":763712},{"cat":"v8","pid":25863,"tid":25913,"ts":531360068196,"ph":"E","name":"V8.Execute","args":{},"tts":763748},{"cat":"blink","pid":25863,"tid":25913,"ts":531360068201,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":25,"tdur":25,"tts":763753},{"cat":"blink","pid":25863,"tid":25913,"ts":531360068203,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":763755},{"cat":"blink","pid":25863,"tid":25913,"ts":531360068204,"ph":"X","name":"Document::updateStyle","args":{},"dur":15,"tdur":14,"tts":763756},{"cat":"blink","pid":25863,"tid":25913,"ts":531360068219,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":763771},{"cat":"blink","pid":25863,"tid":25913,"ts":531360068223,"ph":"X","name":"FrameView::invalidateTree","args":{"root":"\u0010\u0016أ&+"},"dur":3,"tdur":2,"tts":763775},{"cat":"sky","pid":25863,"tid":25913,"ts":531360068227,"ph":"X","name":"Layer::Display","args":{},"dur":736,"tdur":736,"tts":763779},{"cat":"sky","pid":25863,"tid":25913,"ts":531360068964,"ph":"X","name":"LayerHost::Upload","args":{},"dur":69,"tdur":53,"tts":764516},{"cat":"sky","pid":25863,"tid":25913,"ts":531360069230,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":999,"tdur":929,"tts":764671},{"cat":"blink","pid":25863,"tid":25913,"ts":531360069233,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":84,"tdur":84,"tts":764673},{"cat":"blink","pid":25863,"tid":25913,"ts":531360069235,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":2,"tts":764675},{"cat":"blink","pid":25863,"tid":25913,"ts":531360069238,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":29,"tdur":28,"tts":764678},{"cat":"blink","pid":25863,"tid":25913,"ts":531360069244,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":22,"tdur":22,"tts":764684},{"cat":"v8","pid":25863,"tid":25913,"ts":531360069254,"ph":"X","name":"v8.callFunction","args":{},"dur":10,"tdur":8,"tts":764695},{"cat":"v8","pid":25863,"tid":25913,"ts":531360069256,"ph":"B","name":"V8.Execute","args":{},"tts":764696},{"cat":"v8","pid":25863,"tid":25913,"ts":531360069262,"ph":"E","name":"V8.Execute","args":{},"tts":764702},{"cat":"v8","pid":25863,"tid":25913,"ts":531360069269,"ph":"X","name":"v8.callFunction","args":{},"dur":46,"tdur":46,"tts":764709},{"cat":"v8","pid":25863,"tid":25913,"ts":531360069270,"ph":"B","name":"V8.Execute","args":{},"tts":764710},{"cat":"blink","pid":25863,"tid":25913,"ts":531360069279,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":8,"tdur":7,"tts":764719},{"cat":"v8","pid":25863,"tid":25913,"ts":531360069312,"ph":"E","name":"V8.Execute","args":{},"tts":764753},{"cat":"blink","pid":25863,"tid":25913,"ts":531360069318,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":25,"tdur":25,"tts":764758},{"cat":"blink","pid":25863,"tid":25913,"ts":531360069319,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":764759},{"cat":"blink","pid":25863,"tid":25913,"ts":531360069321,"ph":"X","name":"Document::updateStyle","args":{},"dur":15,"tdur":15,"tts":764761},{"cat":"blink","pid":25863,"tid":25913,"ts":531360069336,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":764777},{"cat":"blink","pid":25863,"tid":25913,"ts":531360069340,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":3,"tdur":3,"tts":764780},{"cat":"sky","pid":25863,"tid":25913,"ts":531360069344,"ph":"X","name":"Layer::Display","args":{},"dur":729,"tdur":728,"tts":764784},{"cat":"sky","pid":25863,"tid":25913,"ts":531360070074,"ph":"X","name":"LayerHost::Upload","args":{},"dur":155,"tdur":85,"tts":765514},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360070238,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":34,"tdur":33,"tts":765609},{"cat":"blink","pid":25863,"tid":25913,"ts":531360070242,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":26,"tdur":25,"tts":765613},{"cat":"v8","pid":25863,"tid":25913,"ts":531360070244,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":23,"tdur":22,"tts":765615},{"cat":"v8","pid":25863,"tid":25913,"ts":531360070247,"ph":"X","name":"v8.callFunction","args":{},"dur":19,"tdur":19,"tts":765617},{"cat":"v8","pid":25863,"tid":25913,"ts":531360070248,"ph":"B","name":"V8.Execute","args":{},"tts":765619},{"cat":"blink","pid":25863,"tid":25913,"ts":531360070255,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":8,"tdur":8,"tts":765626},{"cat":"blink","pid":25863,"tid":25913,"ts":531360070261,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":2,"tdur":2,"tts":765632},{"cat":"v8","pid":25863,"tid":25913,"ts":531360070264,"ph":"E","name":"V8.Execute","args":{},"tts":765635},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360071386,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":38,"tdur":38,"tts":765815},{"cat":"blink","pid":25863,"tid":25913,"ts":531360071391,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":29,"tdur":29,"tts":765819},{"cat":"v8","pid":25863,"tid":25913,"ts":531360071394,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":24,"tdur":25,"tts":765822},{"cat":"v8","pid":25863,"tid":25913,"ts":531360071396,"ph":"X","name":"v8.callFunction","args":{},"dur":21,"tdur":21,"tts":765825},{"cat":"v8","pid":25863,"tid":25913,"ts":531360071398,"ph":"B","name":"V8.Execute","args":{},"tts":765827},{"cat":"blink","pid":25863,"tid":25913,"ts":531360071405,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":10,"tdur":9,"tts":765834},{"cat":"blink","pid":25863,"tid":25913,"ts":531360071412,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":2,"tdur":3,"tts":765840},{"cat":"v8","pid":25863,"tid":25913,"ts":531360071416,"ph":"E","name":"V8.Execute","args":{},"tts":765844},{"cat":"sky","pid":25863,"tid":25913,"ts":531360153178,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1202,"tdur":1046,"tts":765927},{"cat":"blink","pid":25863,"tid":25913,"ts":531360153183,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":112,"tdur":112,"tts":765932},{"cat":"blink","pid":25863,"tid":25913,"ts":531360153198,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":765947},{"cat":"blink","pid":25863,"tid":25913,"ts":531360153201,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":40,"tdur":39,"tts":765950},{"cat":"blink","pid":25863,"tid":25913,"ts":531360153213,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":27,"tdur":27,"tts":765962},{"cat":"v8","pid":25863,"tid":25913,"ts":531360153227,"ph":"X","name":"v8.callFunction","args":{},"dur":10,"tdur":10,"tts":765975},{"cat":"v8","pid":25863,"tid":25913,"ts":531360153229,"ph":"B","name":"V8.Execute","args":{},"tts":765977},{"cat":"v8","pid":25863,"tid":25913,"ts":531360153235,"ph":"E","name":"V8.Execute","args":{},"tts":765984},{"cat":"v8","pid":25863,"tid":25913,"ts":531360153243,"ph":"X","name":"v8.callFunction","args":{},"dur":50,"tdur":50,"tts":765991},{"cat":"v8","pid":25863,"tid":25913,"ts":531360153244,"ph":"B","name":"V8.Execute","args":{},"tts":765993},{"cat":"blink","pid":25863,"tid":25913,"ts":531360153248,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":9,"tdur":8,"tts":765997},{"cat":"v8","pid":25863,"tid":25913,"ts":531360153291,"ph":"E","name":"V8.Execute","args":{},"tts":766039},{"cat":"blink","pid":25863,"tid":25913,"ts":531360153296,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":31,"tdur":31,"tts":766044},{"cat":"blink","pid":25863,"tid":25913,"ts":531360153298,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":766046},{"cat":"blink","pid":25863,"tid":25913,"ts":531360153299,"ph":"X","name":"Document::updateStyle","args":{},"dur":19,"tdur":19,"tts":766047},{"cat":"blink","pid":25863,"tid":25913,"ts":531360153319,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":766067},{"cat":"blink","pid":25863,"tid":25913,"ts":531360153323,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":4,"tts":766071},{"cat":"sky","pid":25863,"tid":25913,"ts":531360153328,"ph":"X","name":"Layer::Display","args":{},"dur":750,"tdur":750,"tts":766076},{"cat":"sky","pid":25863,"tid":25913,"ts":531360154079,"ph":"X","name":"LayerHost::Upload","args":{},"dur":300,"tdur":144,"tts":766828},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360154392,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":36,"tdur":36,"tts":766985},{"cat":"blink","pid":25863,"tid":25913,"ts":531360154396,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":28,"tdur":27,"tts":766990},{"cat":"v8","pid":25863,"tid":25913,"ts":531360154399,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":24,"tdur":24,"tts":766992},{"cat":"v8","pid":25863,"tid":25913,"ts":531360154401,"ph":"X","name":"v8.callFunction","args":{},"dur":21,"tdur":20,"tts":766995},{"cat":"v8","pid":25863,"tid":25913,"ts":531360154403,"ph":"B","name":"V8.Execute","args":{},"tts":766996},{"cat":"blink","pid":25863,"tid":25913,"ts":531360154411,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":9,"tts":767004},{"cat":"blink","pid":25863,"tid":25913,"ts":531360154416,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":767010},{"cat":"v8","pid":25863,"tid":25913,"ts":531360154420,"ph":"E","name":"V8.Execute","args":{},"tts":767014},{"cat":"sky","pid":25863,"tid":25913,"ts":531360154827,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1064,"tdur":976,"tts":767212},{"cat":"blink","pid":25863,"tid":25913,"ts":531360154831,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":120,"tdur":119,"tts":767216},{"cat":"blink","pid":25863,"tid":25913,"ts":531360154835,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":2,"tts":767219},{"cat":"blink","pid":25863,"tid":25913,"ts":531360154839,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":49,"tdur":49,"tts":767223},{"cat":"blink","pid":25863,"tid":25913,"ts":531360154863,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":25,"tdur":24,"tts":767248},{"cat":"v8","pid":25863,"tid":25913,"ts":531360154875,"ph":"X","name":"v8.callFunction","args":{},"dur":10,"tdur":9,"tts":767260},{"cat":"v8","pid":25863,"tid":25913,"ts":531360154877,"ph":"B","name":"V8.Execute","args":{},"tts":767261},{"cat":"v8","pid":25863,"tid":25913,"ts":531360154883,"ph":"E","name":"V8.Execute","args":{},"tts":767268},{"cat":"v8","pid":25863,"tid":25913,"ts":531360154890,"ph":"X","name":"v8.callFunction","args":{},"dur":58,"tdur":58,"tts":767275},{"cat":"v8","pid":25863,"tid":25913,"ts":531360154891,"ph":"B","name":"V8.Execute","args":{},"tts":767276},{"cat":"blink","pid":25863,"tid":25913,"ts":531360154895,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":9,"tdur":9,"tts":767279},{"cat":"v8","pid":25863,"tid":25913,"ts":531360154941,"ph":"E","name":"V8.Execute","args":{},"tts":767326},{"cat":"blink","pid":25863,"tid":25913,"ts":531360154951,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":28,"tdur":27,"tts":767336},{"cat":"blink","pid":25863,"tid":25913,"ts":531360154953,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":767338},{"cat":"blink","pid":25863,"tid":25913,"ts":531360154954,"ph":"X","name":"Document::updateStyle","args":{},"dur":17,"tdur":16,"tts":767339},{"cat":"blink","pid":25863,"tid":25913,"ts":531360154971,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":767356},{"cat":"blink","pid":25863,"tid":25913,"ts":531360154975,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":3,"tts":767360},{"cat":"sky","pid":25863,"tid":25913,"ts":531360154980,"ph":"X","name":"Layer::Display","args":{},"dur":719,"tdur":718,"tts":767364},{"cat":"sky","pid":25863,"tid":25913,"ts":531360155700,"ph":"X","name":"LayerHost::Upload","args":{},"dur":190,"tdur":103,"tts":768084},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360155962,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":37,"tdur":37,"tts":768241},{"cat":"blink","pid":25863,"tid":25913,"ts":531360155967,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":28,"tdur":27,"tts":768246},{"cat":"v8","pid":25863,"tid":25913,"ts":531360155969,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":25,"tdur":24,"tts":768248},{"cat":"v8","pid":25863,"tid":25913,"ts":531360155972,"ph":"X","name":"v8.callFunction","args":{},"dur":21,"tdur":20,"tts":768251},{"cat":"v8","pid":25863,"tid":25913,"ts":531360155974,"ph":"B","name":"V8.Execute","args":{},"tts":768252},{"cat":"blink","pid":25863,"tid":25913,"ts":531360155981,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":9,"tts":768260},{"cat":"blink","pid":25863,"tid":25913,"ts":531360155987,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":768266},{"cat":"v8","pid":25863,"tid":25913,"ts":531360155991,"ph":"E","name":"V8.Execute","args":{},"tts":768270},{"cat":"sky","pid":25863,"tid":25913,"ts":531360156362,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1240,"tdur":1166,"tts":768482},{"cat":"blink","pid":25863,"tid":25913,"ts":531360156367,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":116,"tdur":115,"tts":768486},{"cat":"blink","pid":25863,"tid":25913,"ts":531360156371,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":1,"tdur":2,"tts":768489},{"cat":"blink","pid":25863,"tid":25913,"ts":531360156374,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":39,"tdur":38,"tts":768493},{"cat":"blink","pid":25863,"tid":25913,"ts":531360156382,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":31,"tdur":30,"tts":768501},{"cat":"v8","pid":25863,"tid":25913,"ts":531360156397,"ph":"X","name":"v8.callFunction","args":{},"dur":12,"tdur":12,"tts":768515},{"cat":"v8","pid":25863,"tid":25913,"ts":531360156399,"ph":"B","name":"V8.Execute","args":{},"tts":768517},{"cat":"v8","pid":25863,"tid":25913,"ts":531360156407,"ph":"E","name":"V8.Execute","args":{},"tts":768525},{"cat":"v8","pid":25863,"tid":25913,"ts":531360156416,"ph":"X","name":"v8.callFunction","args":{},"dur":65,"tdur":65,"tts":768534},{"cat":"v8","pid":25863,"tid":25913,"ts":531360156417,"ph":"B","name":"V8.Execute","args":{},"tts":768536},{"cat":"blink","pid":25863,"tid":25913,"ts":531360156422,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":11,"tdur":11,"tts":768540},{"cat":"v8","pid":25863,"tid":25913,"ts":531360156477,"ph":"E","name":"V8.Execute","args":{},"tts":768596},{"cat":"blink","pid":25863,"tid":25913,"ts":531360156484,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":34,"tdur":34,"tts":768602},{"cat":"blink","pid":25863,"tid":25913,"ts":531360156486,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":768604},{"cat":"blink","pid":25863,"tid":25913,"ts":531360156487,"ph":"X","name":"Document::updateStyle","args":{},"dur":21,"tdur":20,"tts":768606},{"cat":"blink","pid":25863,"tid":25913,"ts":531360156509,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":768627},{"cat":"blink","pid":25863,"tid":25913,"ts":531360156513,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":3,"tts":768632},{"cat":"sky","pid":25863,"tid":25913,"ts":531360156519,"ph":"X","name":"Layer::Display","args":{},"dur":907,"tdur":907,"tts":768637},{"cat":"sky","pid":25863,"tid":25913,"ts":531360157427,"ph":"X","name":"LayerHost::Upload","args":{},"dur":174,"tdur":101,"tts":769546},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360157615,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":45,"tdur":45,"tts":769662},{"cat":"blink","pid":25863,"tid":25913,"ts":531360157621,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":34,"tdur":33,"tts":769668},{"cat":"v8","pid":25863,"tid":25913,"ts":531360157624,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":30,"tdur":29,"tts":769671},{"cat":"v8","pid":25863,"tid":25913,"ts":531360157627,"ph":"X","name":"v8.callFunction","args":{},"dur":25,"tdur":25,"tts":769674},{"cat":"v8","pid":25863,"tid":25913,"ts":531360157629,"ph":"B","name":"V8.Execute","args":{},"tts":769676},{"cat":"blink","pid":25863,"tid":25913,"ts":531360157639,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":10,"tdur":10,"tts":769686},{"cat":"blink","pid":25863,"tid":25913,"ts":531360157646,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":769692},{"cat":"v8","pid":25863,"tid":25913,"ts":531360157650,"ph":"E","name":"V8.Execute","args":{},"tts":769697},{"cat":"sky","pid":25863,"tid":25913,"ts":531360158053,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1210,"tdur":1151,"tts":769906},{"cat":"blink","pid":25863,"tid":25913,"ts":531360158058,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":111,"tdur":110,"tts":769910},{"cat":"blink","pid":25863,"tid":25913,"ts":531360158061,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":769913},{"cat":"blink","pid":25863,"tid":25913,"ts":531360158065,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":39,"tdur":39,"tts":769916},{"cat":"blink","pid":25863,"tid":25913,"ts":531360158073,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":31,"tdur":30,"tts":769925},{"cat":"v8","pid":25863,"tid":25913,"ts":531360158088,"ph":"X","name":"v8.callFunction","args":{},"dur":12,"tdur":11,"tts":769940},{"cat":"v8","pid":25863,"tid":25913,"ts":531360158090,"ph":"B","name":"V8.Execute","args":{},"tts":769942},{"cat":"v8","pid":25863,"tid":25913,"ts":531360158098,"ph":"E","name":"V8.Execute","args":{},"tts":769949},{"cat":"v8","pid":25863,"tid":25913,"ts":531360158107,"ph":"X","name":"v8.callFunction","args":{},"dur":59,"tdur":59,"tts":769958},{"cat":"v8","pid":25863,"tid":25913,"ts":531360158109,"ph":"B","name":"V8.Execute","args":{},"tts":769960},{"cat":"blink","pid":25863,"tid":25913,"ts":531360158113,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":11,"tdur":11,"tts":769964},{"cat":"v8","pid":25863,"tid":25913,"ts":531360158163,"ph":"E","name":"V8.Execute","args":{},"tts":770015},{"cat":"blink","pid":25863,"tid":25913,"ts":531360158169,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":34,"tdur":34,"tts":770020},{"cat":"blink","pid":25863,"tid":25913,"ts":531360158171,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":770023},{"cat":"blink","pid":25863,"tid":25913,"ts":531360158173,"ph":"X","name":"Document::updateStyle","args":{},"dur":20,"tdur":20,"tts":770024},{"cat":"blink","pid":25863,"tid":25913,"ts":531360158194,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":770045},{"cat":"blink","pid":25863,"tid":25913,"ts":531360158199,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":4,"tts":770050},{"cat":"sky","pid":25863,"tid":25913,"ts":531360158204,"ph":"X","name":"Layer::Display","args":{},"dur":900,"tdur":899,"tts":770056},{"cat":"sky","pid":25863,"tid":25913,"ts":531360159105,"ph":"X","name":"LayerHost::Upload","args":{},"dur":157,"tdur":98,"tts":770957},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360159276,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":56,"tdur":55,"tts":771071},{"cat":"blink","pid":25863,"tid":25913,"ts":531360159282,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":45,"tdur":44,"tts":771076},{"cat":"v8","pid":25863,"tid":25913,"ts":531360159285,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":40,"tdur":40,"tts":771079},{"cat":"v8","pid":25863,"tid":25913,"ts":531360159297,"ph":"X","name":"v8.callFunction","args":{},"dur":27,"tdur":27,"tts":771091},{"cat":"v8","pid":25863,"tid":25913,"ts":531360159299,"ph":"B","name":"V8.Execute","args":{},"tts":771093},{"cat":"blink","pid":25863,"tid":25913,"ts":531360159308,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":13,"tdur":12,"tts":771103},{"cat":"blink","pid":25863,"tid":25913,"ts":531360159317,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":771111},{"cat":"v8","pid":25863,"tid":25913,"ts":531360159322,"ph":"E","name":"V8.Execute","args":{},"tts":771116},{"cat":"sky","pid":25863,"tid":25913,"ts":531360220732,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2443,"tdur":2273,"tts":771331},{"cat":"blink","pid":25863,"tid":25913,"ts":531360220741,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":213,"tdur":211,"tts":771339},{"cat":"blink","pid":25863,"tid":25913,"ts":531360220748,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":3,"tdur":3,"tts":771345},{"cat":"blink","pid":25863,"tid":25913,"ts":531360220755,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":75,"tdur":74,"tts":771352},{"cat":"blink","pid":25863,"tid":25913,"ts":531360220770,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":59,"tdur":58,"tts":771367},{"cat":"v8","pid":25863,"tid":25913,"ts":531360220799,"ph":"X","name":"v8.callFunction","args":{},"dur":22,"tdur":22,"tts":771396},{"cat":"v8","pid":25863,"tid":25913,"ts":531360220803,"ph":"B","name":"V8.Execute","args":{},"tts":771400},{"cat":"v8","pid":25863,"tid":25913,"ts":531360220817,"ph":"E","name":"V8.Execute","args":{},"tts":771415},{"cat":"v8","pid":25863,"tid":25913,"ts":531360220834,"ph":"X","name":"v8.callFunction","args":{},"dur":115,"tdur":114,"tts":771432},{"cat":"v8","pid":25863,"tid":25913,"ts":531360220838,"ph":"B","name":"V8.Execute","args":{},"tts":771435},{"cat":"blink","pid":25863,"tid":25913,"ts":531360220846,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":22,"tdur":21,"tts":771443},{"cat":"v8","pid":25863,"tid":25913,"ts":531360220943,"ph":"E","name":"V8.Execute","args":{},"tts":771541},{"cat":"blink","pid":25863,"tid":25913,"ts":531360220955,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":67,"tdur":66,"tts":771552},{"cat":"blink","pid":25863,"tid":25913,"ts":531360220959,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":771557},{"cat":"blink","pid":25863,"tid":25913,"ts":531360220962,"ph":"X","name":"Document::updateStyle","args":{},"dur":41,"tdur":39,"tts":771560},{"cat":"blink","pid":25863,"tid":25913,"ts":531360221004,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":771601},{"cat":"blink","pid":25863,"tid":25913,"ts":531360221013,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":8,"tdur":7,"tts":771610},{"cat":"sky","pid":25863,"tid":25913,"ts":531360221023,"ph":"X","name":"Layer::Display","args":{},"dur":1806,"tdur":1803,"tts":771621},{"cat":"sky","pid":25863,"tid":25913,"ts":531360222831,"ph":"X","name":"LayerHost::Upload","args":{},"dur":342,"tdur":173,"tts":773428},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360223201,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":88,"tdur":86,"tts":773631},{"cat":"blink","pid":25863,"tid":25913,"ts":531360223212,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":66,"tdur":65,"tts":773642},{"cat":"v8","pid":25863,"tid":25913,"ts":531360223218,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":58,"tdur":57,"tts":773647},{"cat":"v8","pid":25863,"tid":25913,"ts":531360223224,"ph":"X","name":"v8.callFunction","args":{},"dur":49,"tdur":48,"tts":773654},{"cat":"v8","pid":25863,"tid":25913,"ts":531360223228,"ph":"B","name":"V8.Execute","args":{},"tts":773658},{"cat":"blink","pid":25863,"tid":25913,"ts":531360223246,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":21,"tdur":20,"tts":773676},{"cat":"blink","pid":25863,"tid":25913,"ts":531360223260,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":6,"tdur":5,"tts":773690},{"cat":"v8","pid":25863,"tid":25913,"ts":531360223269,"ph":"E","name":"V8.Execute","args":{},"tts":773699},{"cat":"sky","pid":25863,"tid":25913,"ts":531360224063,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":3223,"tdur":3062,"tts":774112},{"cat":"blink","pid":25863,"tid":25913,"ts":531360224073,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":1004,"tdur":1003,"tts":774120},{"cat":"blink","pid":25863,"tid":25913,"ts":531360224079,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":4,"tdur":3,"tts":774126},{"cat":"blink","pid":25863,"tid":25913,"ts":531360224086,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":101,"tdur":100,"tts":774133},{"cat":"blink","pid":25863,"tid":25913,"ts":531360224102,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":84,"tdur":83,"tts":774149},{"cat":"v8","pid":25863,"tid":25913,"ts":531360224130,"ph":"X","name":"v8.callFunction","args":{},"dur":48,"tdur":46,"tts":774177},{"cat":"v8","pid":25863,"tid":25913,"ts":531360224135,"ph":"B","name":"V8.Execute","args":{},"tts":774182},{"cat":"v8","pid":25863,"tid":25913,"ts":531360224172,"ph":"E","name":"V8.Execute","args":{},"tts":774219},{"cat":"v8","pid":25863,"tid":25913,"ts":531360224192,"ph":"X","name":"v8.callFunction","args":{},"dur":879,"tdur":876,"tts":774239},{"cat":"v8","pid":25863,"tid":25913,"ts":531360224196,"ph":"B","name":"V8.Execute","args":{},"tts":774242},{"cat":"blink","pid":25863,"tid":25913,"ts":531360224204,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":22,"tdur":20,"tts":774251},{"cat":"v8","pid":25863,"tid":25913,"ts":531360224453,"ph":"E","name":"V8.Execute","args":{},"tts":774501},{"cat":"blink","pid":25863,"tid":25913,"ts":531360225079,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":70,"tdur":69,"tts":775126},{"cat":"blink","pid":25863,"tid":25913,"ts":531360225086,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":775133},{"cat":"blink","pid":25863,"tid":25913,"ts":531360225089,"ph":"X","name":"Document::updateStyle","args":{},"dur":41,"tdur":39,"tts":775136},{"cat":"blink","pid":25863,"tid":25913,"ts":531360225131,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":775178},{"cat":"blink","pid":25863,"tid":25913,"ts":531360225140,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":8,"tdur":7,"tts":775187},{"cat":"sky","pid":25863,"tid":25913,"ts":531360225151,"ph":"X","name":"Layer::Display","args":{},"dur":1793,"tdur":1791,"tts":775198},{"cat":"sky","pid":25863,"tid":25913,"ts":531360226946,"ph":"X","name":"LayerHost::Upload","args":{},"dur":338,"tdur":178,"tts":776993},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360227312,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":99,"tdur":97,"tts":777202},{"cat":"blink","pid":25863,"tid":25913,"ts":531360227323,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":78,"tdur":77,"tts":777212},{"cat":"v8","pid":25863,"tid":25913,"ts":531360227329,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":69,"tdur":68,"tts":777218},{"cat":"v8","pid":25863,"tid":25913,"ts":531360227335,"ph":"X","name":"v8.callFunction","args":{},"dur":60,"tdur":60,"tts":777224},{"cat":"v8","pid":25863,"tid":25913,"ts":531360227339,"ph":"B","name":"V8.Execute","args":{},"tts":777228},{"cat":"blink","pid":25863,"tid":25913,"ts":531360227367,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":22,"tdur":20,"tts":777257},{"cat":"blink","pid":25863,"tid":25913,"ts":531360227382,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":6,"tdur":5,"tts":777271},{"cat":"v8","pid":25863,"tid":25913,"ts":531360227391,"ph":"E","name":"V8.Execute","args":{},"tts":777280},{"cat":"sky","pid":25863,"tid":25913,"ts":531360228151,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":3074,"tdur":2953,"tts":777662},{"cat":"blink","pid":25863,"tid":25913,"ts":531360228160,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":267,"tdur":266,"tts":777669},{"cat":"blink","pid":25863,"tid":25913,"ts":531360228167,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":3,"tdur":3,"tts":777676},{"cat":"blink","pid":25863,"tid":25913,"ts":531360228174,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":99,"tdur":99,"tts":777683},{"cat":"blink","pid":25863,"tid":25913,"ts":531360228190,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":82,"tdur":81,"tts":777699},{"cat":"v8","pid":25863,"tid":25913,"ts":531360228242,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":22,"tts":777751},{"cat":"v8","pid":25863,"tid":25913,"ts":531360228246,"ph":"B","name":"V8.Execute","args":{},"tts":777755},{"cat":"v8","pid":25863,"tid":25913,"ts":531360228261,"ph":"E","name":"V8.Execute","args":{},"tts":777770},{"cat":"v8","pid":25863,"tid":25913,"ts":531360228278,"ph":"X","name":"v8.callFunction","args":{},"dur":144,"tdur":144,"tts":777787},{"cat":"v8","pid":25863,"tid":25913,"ts":531360228282,"ph":"B","name":"V8.Execute","args":{},"tts":777791},{"cat":"blink","pid":25863,"tid":25913,"ts":531360228290,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":22,"tdur":21,"tts":777799},{"cat":"v8","pid":25863,"tid":25913,"ts":531360228415,"ph":"E","name":"V8.Execute","args":{},"tts":777926},{"cat":"blink","pid":25863,"tid":25913,"ts":531360228428,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":725,"tdur":724,"tts":777938},{"cat":"blink","pid":25863,"tid":25913,"ts":531360228433,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":777942},{"cat":"blink","pid":25863,"tid":25913,"ts":531360228436,"ph":"X","name":"Document::updateStyle","args":{},"dur":147,"tdur":145,"tts":777945},{"cat":"blink","pid":25863,"tid":25913,"ts":531360228584,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":2},"tts":778093},{"cat":"blink","pid":25863,"tid":25913,"ts":531360228589,"ph":"X","name":"FrameView::layout","args":{},"dur":73,"tdur":72,"tts":778098},{"cat":"blink","pid":25863,"tid":25913,"ts":531360228592,"ph":"X","name":"FrameView::performPreLayoutTasks","args":{},"dur":5,"tdur":4,"tts":778101},{"cat":"blink","pid":25863,"tid":25913,"ts":531360228598,"ph":"X","name":"FrameView::performLayout","args":{},"dur":40,"tdur":39,"tts":778107},{"cat":"blink","pid":25863,"tid":25913,"ts":531360228639,"ph":"X","name":"RenderLayer::updateLayerPositionsAfterLayout","args":{},"dur":5,"tdur":4,"tts":778148},{"cat":"blink","pid":25863,"tid":25913,"ts":531360228644,"ph":"X","name":"FrameView::performPostLayoutTasks","args":{},"dur":15,"tdur":13,"tts":778154},{"cat":"blink","pid":25863,"tid":25913,"ts":531360228669,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":482,"tdur":481,"tts":778178},{"cat":"sky","pid":25863,"tid":25913,"ts":531360229155,"ph":"X","name":"Layer::Display","args":{},"dur":1774,"tdur":1772,"tts":778664},{"cat":"sky","pid":25863,"tid":25913,"ts":531360230931,"ph":"X","name":"LayerHost::Upload","args":{},"dur":292,"tdur":171,"tts":780441},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360231251,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":87,"tdur":86,"tts":780642},{"cat":"blink","pid":25863,"tid":25913,"ts":531360231262,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":66,"tdur":65,"tts":780653},{"cat":"v8","pid":25863,"tid":25913,"ts":531360231267,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":58,"tdur":57,"tts":780659},{"cat":"v8","pid":25863,"tid":25913,"ts":531360231274,"ph":"X","name":"v8.callFunction","args":{},"dur":49,"tdur":48,"tts":780665},{"cat":"v8","pid":25863,"tid":25913,"ts":531360231278,"ph":"B","name":"V8.Execute","args":{},"tts":780669},{"cat":"blink","pid":25863,"tid":25913,"ts":531360231296,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":21,"tdur":20,"tts":780687},{"cat":"blink","pid":25863,"tid":25913,"ts":531360231309,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":7,"tdur":5,"tts":780701},{"cat":"v8","pid":25863,"tid":25913,"ts":531360231319,"ph":"E","name":"V8.Execute","args":{},"tts":780710},{"cat":"sky","pid":25863,"tid":25913,"ts":531360232037,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2274,"tdur":2146,"tts":781078},{"cat":"blink","pid":25863,"tid":25913,"ts":531360232046,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":213,"tdur":213,"tts":781085},{"cat":"blink","pid":25863,"tid":25913,"ts":531360232053,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":3,"tdur":3,"tts":781092},{"cat":"blink","pid":25863,"tid":25913,"ts":531360232060,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":75,"tdur":75,"tts":781099},{"cat":"blink","pid":25863,"tid":25913,"ts":531360232076,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":58,"tdur":58,"tts":781115},{"cat":"v8","pid":25863,"tid":25913,"ts":531360232104,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":22,"tts":781144},{"cat":"v8","pid":25863,"tid":25913,"ts":531360232108,"ph":"B","name":"V8.Execute","args":{},"tts":781148},{"cat":"v8","pid":25863,"tid":25913,"ts":531360232123,"ph":"E","name":"V8.Execute","args":{},"tts":781162},{"cat":"v8","pid":25863,"tid":25913,"ts":531360232140,"ph":"X","name":"v8.callFunction","args":{},"dur":115,"tdur":114,"tts":781179},{"cat":"v8","pid":25863,"tid":25913,"ts":531360232143,"ph":"B","name":"V8.Execute","args":{},"tts":781183},{"cat":"blink","pid":25863,"tid":25913,"ts":531360232152,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":21,"tdur":21,"tts":781191},{"cat":"v8","pid":25863,"tid":25913,"ts":531360232248,"ph":"E","name":"V8.Execute","args":{},"tts":781288},{"cat":"blink","pid":25863,"tid":25913,"ts":531360232260,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":66,"tdur":65,"tts":781300},{"cat":"blink","pid":25863,"tid":25913,"ts":531360232265,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":781304},{"cat":"blink","pid":25863,"tid":25913,"ts":531360232268,"ph":"X","name":"Document::updateStyle","args":{},"dur":39,"tdur":38,"tts":781307},{"cat":"blink","pid":25863,"tid":25913,"ts":531360232308,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":781347},{"cat":"blink","pid":25863,"tid":25913,"ts":531360232317,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":8,"tdur":7,"tts":781356},{"cat":"sky","pid":25863,"tid":25913,"ts":531360232328,"ph":"X","name":"Layer::Display","args":{},"dur":1738,"tdur":1737,"tts":781367},{"cat":"sky","pid":25863,"tid":25913,"ts":531360234067,"ph":"X","name":"LayerHost::Upload","args":{},"dur":243,"tdur":116,"tts":783106},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360234335,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":80,"tdur":79,"tts":783249},{"cat":"blink","pid":25863,"tid":25913,"ts":531360234344,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":61,"tdur":61,"tts":783257},{"cat":"v8","pid":25863,"tid":25913,"ts":531360234349,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":54,"tdur":53,"tts":783263},{"cat":"v8","pid":25863,"tid":25913,"ts":531360234355,"ph":"X","name":"v8.callFunction","args":{},"dur":46,"tdur":46,"tts":783268},{"cat":"v8","pid":25863,"tid":25913,"ts":531360234358,"ph":"B","name":"V8.Execute","args":{},"tts":783272},{"cat":"blink","pid":25863,"tid":25913,"ts":531360234375,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":20,"tdur":19,"tts":783289},{"cat":"blink","pid":25863,"tid":25913,"ts":531360234388,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":6,"tdur":5,"tts":783302},{"cat":"v8","pid":25863,"tid":25913,"ts":531360234397,"ph":"E","name":"V8.Execute","args":{},"tts":783311},{"cat":"sky","pid":25863,"tid":25913,"ts":531360287659,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":4388,"tdur":4151,"tts":783672},{"cat":"blink","pid":25863,"tid":25913,"ts":531360287685,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":1029,"tdur":1013,"tts":783692},{"cat":"blink","pid":25863,"tid":25913,"ts":531360287710,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":6,"tdur":5,"tts":783717},{"cat":"blink","pid":25863,"tid":25913,"ts":531360287733,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":188,"tdur":187,"tts":783740},{"cat":"blink","pid":25863,"tid":25913,"ts":531360287772,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":148,"tdur":147,"tts":783779},{"cat":"v8","pid":25863,"tid":25913,"ts":531360287827,"ph":"X","name":"v8.callFunction","args":{},"dur":85,"tdur":84,"tts":783834},{"cat":"v8","pid":25863,"tid":25913,"ts":531360287829,"ph":"B","name":"V8.Execute","args":{},"tts":783836},{"cat":"v8","pid":25863,"tid":25913,"ts":531360287907,"ph":"E","name":"V8.Execute","args":{},"tts":783914},{"cat":"v8","pid":25863,"tid":25913,"ts":531360287928,"ph":"X","name":"v8.callFunction","args":{},"dur":782,"tdur":765,"tts":783935},{"cat":"v8","pid":25863,"tid":25913,"ts":531360287931,"ph":"B","name":"V8.Execute","args":{},"tts":783938},{"cat":"blink","pid":25863,"tid":25913,"ts":531360287968,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":85,"tdur":68,"tts":783975},{"cat":"v8","pid":25863,"tid":25913,"ts":531360288536,"ph":"E","name":"V8.Execute","args":{},"tts":784528},{"cat":"blink","pid":25863,"tid":25913,"ts":531360288715,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":955,"tdur":954,"tts":784706},{"cat":"blink","pid":25863,"tid":25913,"ts":531360288718,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":784709},{"cat":"blink","pid":25863,"tid":25913,"ts":531360288720,"ph":"X","name":"Document::updateStyle","args":{},"dur":175,"tdur":173,"tts":784711},{"cat":"blink","pid":25863,"tid":25913,"ts":531360288897,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":4},"tts":784888},{"cat":"blink","pid":25863,"tid":25913,"ts":531360288902,"ph":"X","name":"FrameView::layout","args":{},"dur":212,"tdur":212,"tts":784893},{"cat":"blink","pid":25863,"tid":25913,"ts":531360288905,"ph":"X","name":"FrameView::performPreLayoutTasks","args":{},"dur":4,"tdur":3,"tts":784896},{"cat":"blink","pid":25863,"tid":25913,"ts":531360288910,"ph":"X","name":"FrameView::performLayout","args":{},"dur":183,"tdur":181,"tts":784901},{"cat":"blink","pid":25863,"tid":25913,"ts":531360289094,"ph":"X","name":"RenderLayer::updateLayerPositionsAfterLayout","args":{},"dur":6,"tdur":5,"tts":785086},{"cat":"blink","pid":25863,"tid":25913,"ts":531360289101,"ph":"X","name":"FrameView::performPostLayoutTasks","args":{},"dur":11,"tdur":10,"tts":785092},{"cat":"blink","pid":25863,"tid":25913,"ts":531360289121,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":547,"tdur":546,"tts":785112},{"cat":"sky","pid":25863,"tid":25913,"ts":531360289675,"ph":"X","name":"Layer::Display","args":{},"dur":1970,"tdur":1947,"tts":785666},{"cat":"sky","pid":25863,"tid":25913,"ts":531360291647,"ph":"X","name":"LayerHost::Upload","args":{},"dur":398,"tdur":202,"tts":787618},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360292090,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":62,"tdur":61,"tts":787867},{"cat":"blink","pid":25863,"tid":25913,"ts":531360292114,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":33,"tdur":32,"tts":787891},{"cat":"v8","pid":25863,"tid":25913,"ts":531360292117,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":29,"tdur":28,"tts":787894},{"cat":"v8","pid":25863,"tid":25913,"ts":531360292120,"ph":"X","name":"v8.callFunction","args":{},"dur":24,"tdur":25,"tts":787896},{"cat":"v8","pid":25863,"tid":25913,"ts":531360292121,"ph":"B","name":"V8.Execute","args":{},"tts":787898},{"cat":"blink","pid":25863,"tid":25913,"ts":531360292132,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":10,"tdur":9,"tts":787909},{"cat":"blink","pid":25863,"tid":25913,"ts":531360292138,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":787915},{"cat":"v8","pid":25863,"tid":25913,"ts":531360292143,"ph":"E","name":"V8.Execute","args":{},"tts":787919},{"cat":"sky","pid":25863,"tid":25913,"ts":531360292560,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1097,"tdur":996,"tts":788125},{"cat":"blink","pid":25863,"tid":25913,"ts":531360292564,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":91,"tdur":91,"tts":788128},{"cat":"blink","pid":25863,"tid":25913,"ts":531360292567,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":1,"tdur":1,"tts":788131},{"cat":"blink","pid":25863,"tid":25913,"ts":531360292570,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":32,"tdur":32,"tts":788134},{"cat":"blink","pid":25863,"tid":25913,"ts":531360292577,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":25,"tdur":24,"tts":788141},{"cat":"v8","pid":25863,"tid":25913,"ts":531360292589,"ph":"X","name":"v8.callFunction","args":{},"dur":10,"tdur":9,"tts":788153},{"cat":"v8","pid":25863,"tid":25913,"ts":531360292590,"ph":"B","name":"V8.Execute","args":{},"tts":788155},{"cat":"v8","pid":25863,"tid":25913,"ts":531360292597,"ph":"E","name":"V8.Execute","args":{},"tts":788161},{"cat":"v8","pid":25863,"tid":25913,"ts":531360292604,"ph":"X","name":"v8.callFunction","args":{},"dur":49,"tdur":49,"tts":788168},{"cat":"v8","pid":25863,"tid":25913,"ts":531360292605,"ph":"B","name":"V8.Execute","args":{},"tts":788169},{"cat":"blink","pid":25863,"tid":25913,"ts":531360292609,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":9,"tdur":9,"tts":788173},{"cat":"v8","pid":25863,"tid":25913,"ts":531360292651,"ph":"E","name":"V8.Execute","args":{},"tts":788215},{"cat":"blink","pid":25863,"tid":25913,"ts":531360292656,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":28,"tdur":28,"tts":788220},{"cat":"blink","pid":25863,"tid":25913,"ts":531360292658,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":788222},{"cat":"blink","pid":25863,"tid":25913,"ts":531360292659,"ph":"X","name":"Document::updateStyle","args":{},"dur":17,"tdur":16,"tts":788223},{"cat":"blink","pid":25863,"tid":25913,"ts":531360292676,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":788240},{"cat":"blink","pid":25863,"tid":25913,"ts":531360292680,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":3,"tdur":3,"tts":788244},{"cat":"sky","pid":25863,"tid":25913,"ts":531360292685,"ph":"X","name":"Layer::Display","args":{},"dur":762,"tdur":761,"tts":788249},{"cat":"sky","pid":25863,"tid":25913,"ts":531360293448,"ph":"X","name":"LayerHost::Upload","args":{},"dur":208,"tdur":107,"tts":789012},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360293668,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":38,"tdur":37,"tts":789132},{"cat":"blink","pid":25863,"tid":25913,"ts":531360293673,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":28,"tdur":28,"tts":789137},{"cat":"v8","pid":25863,"tid":25913,"ts":531360293675,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":25,"tdur":25,"tts":789139},{"cat":"v8","pid":25863,"tid":25913,"ts":531360293678,"ph":"X","name":"v8.callFunction","args":{},"dur":21,"tdur":21,"tts":789142},{"cat":"v8","pid":25863,"tid":25913,"ts":531360293680,"ph":"B","name":"V8.Execute","args":{},"tts":789143},{"cat":"blink","pid":25863,"tid":25913,"ts":531360293688,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":9,"tts":789151},{"cat":"blink","pid":25863,"tid":25913,"ts":531360293693,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":789157},{"cat":"v8","pid":25863,"tid":25913,"ts":531360293697,"ph":"E","name":"V8.Execute","args":{},"tts":789161},{"cat":"sky","pid":25863,"tid":25913,"ts":531360294082,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1036,"tdur":1004,"tts":789368},{"cat":"blink","pid":25863,"tid":25913,"ts":531360294086,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":91,"tdur":91,"tts":789371},{"cat":"blink","pid":25863,"tid":25913,"ts":531360294089,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":1,"tdur":1,"tts":789374},{"cat":"blink","pid":25863,"tid":25913,"ts":531360294092,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":32,"tdur":32,"tts":789377},{"cat":"blink","pid":25863,"tid":25913,"ts":531360294098,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":26,"tdur":25,"tts":789383},{"cat":"v8","pid":25863,"tid":25913,"ts":531360294111,"ph":"X","name":"v8.callFunction","args":{},"dur":9,"tdur":9,"tts":789396},{"cat":"v8","pid":25863,"tid":25913,"ts":531360294112,"ph":"B","name":"V8.Execute","args":{},"tts":789397},{"cat":"v8","pid":25863,"tid":25913,"ts":531360294119,"ph":"E","name":"V8.Execute","args":{},"tts":789404},{"cat":"v8","pid":25863,"tid":25913,"ts":531360294126,"ph":"X","name":"v8.callFunction","args":{},"dur":49,"tdur":49,"tts":789411},{"cat":"v8","pid":25863,"tid":25913,"ts":531360294127,"ph":"B","name":"V8.Execute","args":{},"tts":789412},{"cat":"blink","pid":25863,"tid":25913,"ts":531360294131,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":9,"tdur":8,"tts":789416},{"cat":"v8","pid":25863,"tid":25913,"ts":531360294172,"ph":"E","name":"V8.Execute","args":{},"tts":789458},{"cat":"blink","pid":25863,"tid":25913,"ts":531360294177,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":41,"tdur":41,"tts":789462},{"cat":"blink","pid":25863,"tid":25913,"ts":531360294179,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":789464},{"cat":"blink","pid":25863,"tid":25913,"ts":531360294180,"ph":"X","name":"Document::updateStyle","args":{},"dur":30,"tdur":29,"tts":789465},{"cat":"blink","pid":25863,"tid":25913,"ts":531360294210,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":789495},{"cat":"blink","pid":25863,"tid":25913,"ts":531360294214,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":4,"tts":789499},{"cat":"sky","pid":25863,"tid":25913,"ts":531360294219,"ph":"X","name":"Layer::Display","args":{},"dur":762,"tdur":761,"tts":789504},{"cat":"sky","pid":25863,"tid":25913,"ts":531360294982,"ph":"X","name":"LayerHost::Upload","args":{},"dur":135,"tdur":104,"tts":790267},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360295189,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":38,"tdur":37,"tts":790429},{"cat":"blink","pid":25863,"tid":25913,"ts":531360295194,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":28,"tdur":28,"tts":790434},{"cat":"v8","pid":25863,"tid":25913,"ts":531360295196,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":25,"tdur":25,"tts":790436},{"cat":"v8","pid":25863,"tid":25913,"ts":531360295199,"ph":"X","name":"v8.callFunction","args":{},"dur":21,"tdur":21,"tts":790439},{"cat":"v8","pid":25863,"tid":25913,"ts":531360295200,"ph":"B","name":"V8.Execute","args":{},"tts":790440},{"cat":"blink","pid":25863,"tid":25913,"ts":531360295208,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":10,"tdur":9,"tts":790448},{"cat":"blink","pid":25863,"tid":25913,"ts":531360295214,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":790454},{"cat":"v8","pid":25863,"tid":25913,"ts":531360295219,"ph":"E","name":"V8.Execute","args":{},"tts":790459},{"cat":"sky","pid":25863,"tid":25913,"ts":531360295524,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1061,"tdur":1014,"tts":790642},{"cat":"blink","pid":25863,"tid":25913,"ts":531360295542,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":91,"tdur":91,"tts":790659},{"cat":"blink","pid":25863,"tid":25913,"ts":531360295544,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":790662},{"cat":"blink","pid":25863,"tid":25913,"ts":531360295548,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":32,"tdur":32,"tts":790665},{"cat":"blink","pid":25863,"tid":25913,"ts":531360295554,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":25,"tdur":25,"tts":790671},{"cat":"v8","pid":25863,"tid":25913,"ts":531360295566,"ph":"X","name":"v8.callFunction","args":{},"dur":10,"tdur":9,"tts":790684},{"cat":"v8","pid":25863,"tid":25913,"ts":531360295568,"ph":"B","name":"V8.Execute","args":{},"tts":790685},{"cat":"v8","pid":25863,"tid":25913,"ts":531360295574,"ph":"E","name":"V8.Execute","args":{},"tts":790692},{"cat":"v8","pid":25863,"tid":25913,"ts":531360295582,"ph":"X","name":"v8.callFunction","args":{},"dur":49,"tdur":49,"tts":790699},{"cat":"v8","pid":25863,"tid":25913,"ts":531360295583,"ph":"B","name":"V8.Execute","args":{},"tts":790700},{"cat":"blink","pid":25863,"tid":25913,"ts":531360295587,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":9,"tdur":9,"tts":790704},{"cat":"v8","pid":25863,"tid":25913,"ts":531360295628,"ph":"E","name":"V8.Execute","args":{},"tts":790745},{"cat":"blink","pid":25863,"tid":25913,"ts":531360295633,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":28,"tdur":28,"tts":790750},{"cat":"blink","pid":25863,"tid":25913,"ts":531360295635,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":790752},{"cat":"blink","pid":25863,"tid":25913,"ts":531360295636,"ph":"X","name":"Document::updateStyle","args":{},"dur":17,"tdur":17,"tts":790753},{"cat":"blink","pid":25863,"tid":25913,"ts":531360295654,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":790771},{"cat":"blink","pid":25863,"tid":25913,"ts":531360295657,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":3,"tts":790775},{"cat":"sky","pid":25863,"tid":25913,"ts":531360295662,"ph":"X","name":"Layer::Display","args":{},"dur":767,"tdur":766,"tts":790779},{"cat":"sky","pid":25863,"tid":25913,"ts":531360296430,"ph":"X","name":"LayerHost::Upload","args":{},"dur":155,"tdur":108,"tts":791547},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360296659,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":38,"tdur":37,"tts":791712},{"cat":"blink","pid":25863,"tid":25913,"ts":531360296664,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":29,"tdur":29,"tts":791716},{"cat":"v8","pid":25863,"tid":25913,"ts":531360296666,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":25,"tdur":24,"tts":791719},{"cat":"v8","pid":25863,"tid":25913,"ts":531360296669,"ph":"X","name":"v8.callFunction","args":{},"dur":22,"tdur":21,"tts":791721},{"cat":"v8","pid":25863,"tid":25913,"ts":531360296671,"ph":"B","name":"V8.Execute","args":{},"tts":791723},{"cat":"blink","pid":25863,"tid":25913,"ts":531360296678,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":10,"tdur":9,"tts":791731},{"cat":"blink","pid":25863,"tid":25913,"ts":531360296685,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":2,"tdur":2,"tts":791737},{"cat":"v8","pid":25863,"tid":25913,"ts":531360296689,"ph":"E","name":"V8.Execute","args":{},"tts":791741},{"cat":"sky","pid":25863,"tid":25913,"ts":531360353767,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1009,"tdur":991,"tts":791906},{"cat":"blink","pid":25863,"tid":25913,"ts":531360353772,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":129,"tdur":129,"tts":791910},{"cat":"blink","pid":25863,"tid":25913,"ts":531360353775,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":2,"tts":791913},{"cat":"blink","pid":25863,"tid":25913,"ts":531360353779,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":50,"tdur":50,"tts":791917},{"cat":"blink","pid":25863,"tid":25913,"ts":531360353787,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":41,"tdur":41,"tts":791925},{"cat":"v8","pid":25863,"tid":25913,"ts":531360353802,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":23,"tts":791940},{"cat":"v8","pid":25863,"tid":25913,"ts":531360353804,"ph":"B","name":"V8.Execute","args":{},"tts":791942},{"cat":"v8","pid":25863,"tid":25913,"ts":531360353823,"ph":"E","name":"V8.Execute","args":{},"tts":791961},{"cat":"v8","pid":25863,"tid":25913,"ts":531360353831,"ph":"X","name":"v8.callFunction","args":{},"dur":68,"tdur":68,"tts":791969},{"cat":"v8","pid":25863,"tid":25913,"ts":531360353832,"ph":"B","name":"V8.Execute","args":{},"tts":791970},{"cat":"blink","pid":25863,"tid":25913,"ts":531360353836,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":9,"tdur":9,"tts":791974},{"cat":"v8","pid":25863,"tid":25913,"ts":531360353896,"ph":"E","name":"V8.Execute","args":{},"tts":792035},{"cat":"blink","pid":25863,"tid":25913,"ts":531360353902,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":29,"tdur":28,"tts":792040},{"cat":"blink","pid":25863,"tid":25913,"ts":531360353904,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":792042},{"cat":"blink","pid":25863,"tid":25913,"ts":531360353905,"ph":"X","name":"Document::updateStyle","args":{},"dur":17,"tdur":17,"tts":792043},{"cat":"blink","pid":25863,"tid":25913,"ts":531360353923,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":792061},{"cat":"blink","pid":25863,"tid":25913,"ts":531360353927,"ph":"X","name":"FrameView::invalidateTree","args":{"root":"�!أ&+"},"dur":3,"tdur":3,"tts":792065},{"cat":"sky","pid":25863,"tid":25913,"ts":531360353931,"ph":"X","name":"Layer::Display","args":{},"dur":770,"tdur":769,"tts":792069},{"cat":"sky","pid":25863,"tid":25913,"ts":531360354702,"ph":"X","name":"LayerHost::Upload","args":{},"dur":73,"tdur":56,"tts":792840},{"cat":"sky","pid":25863,"tid":25913,"ts":531360355278,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1159,"tdur":1066,"tts":793190},{"cat":"blink","pid":25863,"tid":25913,"ts":531360355282,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":94,"tdur":94,"tts":793193},{"cat":"blink","pid":25863,"tid":25913,"ts":531360355284,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":793196},{"cat":"blink","pid":25863,"tid":25913,"ts":531360355287,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":41,"tdur":40,"tts":793199},{"cat":"blink","pid":25863,"tid":25913,"ts":531360355294,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":33,"tdur":33,"tts":793205},{"cat":"v8","pid":25863,"tid":25913,"ts":531360355306,"ph":"X","name":"v8.callFunction","args":{},"dur":18,"tdur":18,"tts":793217},{"cat":"v8","pid":25863,"tid":25913,"ts":531360355315,"ph":"B","name":"V8.Execute","args":{},"tts":793227},{"cat":"v8","pid":25863,"tid":25913,"ts":531360355322,"ph":"E","name":"V8.Execute","args":{},"tts":793233},{"cat":"v8","pid":25863,"tid":25913,"ts":531360355330,"ph":"X","name":"v8.callFunction","args":{},"dur":44,"tdur":44,"tts":793241},{"cat":"v8","pid":25863,"tid":25913,"ts":531360355331,"ph":"B","name":"V8.Execute","args":{},"tts":793243},{"cat":"blink","pid":25863,"tid":25913,"ts":531360355335,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":9,"tdur":9,"tts":793246},{"cat":"v8","pid":25863,"tid":25913,"ts":531360355371,"ph":"E","name":"V8.Execute","args":{},"tts":793283},{"cat":"blink","pid":25863,"tid":25913,"ts":531360355376,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":29,"tdur":28,"tts":793288},{"cat":"blink","pid":25863,"tid":25913,"ts":531360355378,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":793290},{"cat":"blink","pid":25863,"tid":25913,"ts":531360355380,"ph":"X","name":"Document::updateStyle","args":{},"dur":17,"tdur":16,"tts":793291},{"cat":"blink","pid":25863,"tid":25913,"ts":531360355397,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":793308},{"cat":"blink","pid":25863,"tid":25913,"ts":531360355401,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":3,"tdur":3,"tts":793312},{"cat":"sky","pid":25863,"tid":25913,"ts":531360355405,"ph":"X","name":"Layer::Display","args":{},"dur":847,"tdur":834,"tts":793317},{"cat":"sky","pid":25863,"tid":25913,"ts":531360356253,"ph":"X","name":"LayerHost::Upload","args":{},"dur":183,"tdur":100,"tts":794154},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360356452,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":65,"tdur":64,"tts":794272},{"cat":"blink","pid":25863,"tid":25913,"ts":531360356458,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":34,"tdur":34,"tts":794277},{"cat":"v8","pid":25863,"tid":25913,"ts":531360356461,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":30,"tdur":30,"tts":794280},{"cat":"v8","pid":25863,"tid":25913,"ts":531360356464,"ph":"X","name":"v8.callFunction","args":{},"dur":26,"tdur":24,"tts":794284},{"cat":"v8","pid":25863,"tid":25913,"ts":531360356466,"ph":"B","name":"V8.Execute","args":{},"tts":794286},{"cat":"blink","pid":25863,"tid":25913,"ts":531360356476,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":10,"tdur":10,"tts":794295},{"cat":"blink","pid":25863,"tid":25913,"ts":531360356483,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":794302},{"cat":"v8","pid":25863,"tid":25913,"ts":531360356488,"ph":"E","name":"V8.Execute","args":{},"tts":794307},{"cat":"blink","pid":25863,"tid":25913,"ts":531360356493,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":19,"tdur":19,"tts":794312},{"cat":"v8","pid":25863,"tid":25913,"ts":531360356495,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":16,"tdur":16,"tts":794314},{"cat":"v8","pid":25863,"tid":25913,"ts":531360356497,"ph":"X","name":"v8.callFunction","args":{},"dur":13,"tdur":13,"tts":794316},{"cat":"v8","pid":25863,"tid":25913,"ts":531360356498,"ph":"B","name":"V8.Execute","args":{},"tts":794318},{"cat":"blink","pid":25863,"tid":25913,"ts":531360356502,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":6,"tdur":6,"tts":794321},{"cat":"blink","pid":25863,"tid":25913,"ts":531360356505,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":2,"tdur":2,"tts":794324},{"cat":"v8","pid":25863,"tid":25913,"ts":531360356508,"ph":"E","name":"V8.Execute","args":{},"tts":794328},{"cat":"sky","pid":25863,"tid":25913,"ts":531360356905,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1268,"tdur":1197,"tts":794531},{"cat":"blink","pid":25863,"tid":25913,"ts":531360356910,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":110,"tdur":110,"tts":794535},{"cat":"blink","pid":25863,"tid":25913,"ts":531360356913,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":794539},{"cat":"blink","pid":25863,"tid":25913,"ts":531360356917,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":39,"tdur":39,"tts":794542},{"cat":"blink","pid":25863,"tid":25913,"ts":531360356925,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":30,"tdur":30,"tts":794550},{"cat":"v8","pid":25863,"tid":25913,"ts":531360356939,"ph":"X","name":"v8.callFunction","args":{},"dur":13,"tdur":12,"tts":794565},{"cat":"v8","pid":25863,"tid":25913,"ts":531360356942,"ph":"B","name":"V8.Execute","args":{},"tts":794567},{"cat":"v8","pid":25863,"tid":25913,"ts":531360356949,"ph":"E","name":"V8.Execute","args":{},"tts":794575},{"cat":"v8","pid":25863,"tid":25913,"ts":531360356958,"ph":"X","name":"v8.callFunction","args":{},"dur":60,"tdur":59,"tts":794584},{"cat":"v8","pid":25863,"tid":25913,"ts":531360356960,"ph":"B","name":"V8.Execute","args":{},"tts":794585},{"cat":"blink","pid":25863,"tid":25913,"ts":531360356964,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":11,"tdur":10,"tts":794590},{"cat":"v8","pid":25863,"tid":25913,"ts":531360357014,"ph":"E","name":"V8.Execute","args":{},"tts":794640},{"cat":"blink","pid":25863,"tid":25913,"ts":531360357021,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":34,"tdur":34,"tts":794646},{"cat":"blink","pid":25863,"tid":25913,"ts":531360357023,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":794648},{"cat":"blink","pid":25863,"tid":25913,"ts":531360357025,"ph":"X","name":"Document::updateStyle","args":{},"dur":20,"tdur":20,"tts":794650},{"cat":"blink","pid":25863,"tid":25913,"ts":531360357046,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":794671},{"cat":"blink","pid":25863,"tid":25913,"ts":531360357050,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":5,"tdur":4,"tts":794676},{"cat":"sky","pid":25863,"tid":25913,"ts":531360357056,"ph":"X","name":"Layer::Display","args":{},"dur":939,"tdur":939,"tts":794681},{"cat":"sky","pid":25863,"tid":25913,"ts":531360357996,"ph":"X","name":"LayerHost::Upload","args":{},"dur":176,"tdur":105,"tts":795622},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360358187,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":45,"tdur":45,"tts":795742},{"cat":"blink","pid":25863,"tid":25913,"ts":531360358192,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":35,"tdur":33,"tts":795748},{"cat":"v8","pid":25863,"tid":25913,"ts":531360358195,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":30,"tdur":30,"tts":795750},{"cat":"v8","pid":25863,"tid":25913,"ts":531360358199,"ph":"X","name":"v8.callFunction","args":{},"dur":25,"tdur":24,"tts":795754},{"cat":"v8","pid":25863,"tid":25913,"ts":531360358201,"ph":"B","name":"V8.Execute","args":{},"tts":795756},{"cat":"blink","pid":25863,"tid":25913,"ts":531360358210,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":11,"tdur":10,"tts":795765},{"cat":"blink","pid":25863,"tid":25913,"ts":531360358217,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":795772},{"cat":"v8","pid":25863,"tid":25913,"ts":531360358222,"ph":"E","name":"V8.Execute","args":{},"tts":795777},{"cat":"sky","pid":25863,"tid":25913,"ts":531360358568,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1200,"tdur":1181,"tts":795954},{"cat":"blink","pid":25863,"tid":25913,"ts":531360358572,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":124,"tdur":123,"tts":795958},{"cat":"blink","pid":25863,"tid":25913,"ts":531360358576,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":1,"tdur":2,"tts":795961},{"cat":"blink","pid":25863,"tid":25913,"ts":531360358579,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":39,"tdur":38,"tts":795965},{"cat":"blink","pid":25863,"tid":25913,"ts":531360358587,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":30,"tdur":29,"tts":795973},{"cat":"v8","pid":25863,"tid":25913,"ts":531360358602,"ph":"X","name":"v8.callFunction","args":{},"dur":11,"tdur":12,"tts":795987},{"cat":"v8","pid":25863,"tid":25913,"ts":531360358604,"ph":"B","name":"V8.Execute","args":{},"tts":795989},{"cat":"v8","pid":25863,"tid":25913,"ts":531360358611,"ph":"E","name":"V8.Execute","args":{},"tts":795997},{"cat":"v8","pid":25863,"tid":25913,"ts":531360358620,"ph":"X","name":"v8.callFunction","args":{},"dur":73,"tdur":73,"tts":796005},{"cat":"v8","pid":25863,"tid":25913,"ts":531360358634,"ph":"B","name":"V8.Execute","args":{},"tts":796020},{"cat":"blink","pid":25863,"tid":25913,"ts":531360358639,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":11,"tdur":11,"tts":796024},{"cat":"v8","pid":25863,"tid":25913,"ts":531360358690,"ph":"E","name":"V8.Execute","args":{},"tts":796076},{"cat":"blink","pid":25863,"tid":25913,"ts":531360358697,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":34,"tdur":34,"tts":796082},{"cat":"blink","pid":25863,"tid":25913,"ts":531360358699,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":796084},{"cat":"blink","pid":25863,"tid":25913,"ts":531360358700,"ph":"X","name":"Document::updateStyle","args":{},"dur":21,"tdur":20,"tts":796086},{"cat":"blink","pid":25863,"tid":25913,"ts":531360358722,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":796107},{"cat":"blink","pid":25863,"tid":25913,"ts":531360358726,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":5,"tdur":4,"tts":796112},{"cat":"sky","pid":25863,"tid":25913,"ts":531360358732,"ph":"X","name":"Layer::Display","args":{},"dur":951,"tdur":950,"tts":796118},{"cat":"sky","pid":25863,"tid":25913,"ts":531360359684,"ph":"X","name":"LayerHost::Upload","args":{},"dur":84,"tdur":64,"tts":797070},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360359781,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":43,"tdur":42,"tts":797148},{"cat":"blink","pid":25863,"tid":25913,"ts":531360359786,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":33,"tdur":32,"tts":797153},{"cat":"v8","pid":25863,"tid":25913,"ts":531360359789,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":28,"tdur":28,"tts":797156},{"cat":"v8","pid":25863,"tid":25913,"ts":531360359792,"ph":"X","name":"v8.callFunction","args":{},"dur":24,"tdur":23,"tts":797159},{"cat":"v8","pid":25863,"tid":25913,"ts":531360359794,"ph":"B","name":"V8.Execute","args":{},"tts":797161},{"cat":"blink","pid":25863,"tid":25913,"ts":531360359803,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":10,"tdur":9,"tts":797170},{"cat":"blink","pid":25863,"tid":25913,"ts":531360359809,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":4,"tdur":3,"tts":797176},{"cat":"v8","pid":25863,"tid":25913,"ts":531360359814,"ph":"E","name":"V8.Execute","args":{},"tts":797181},{"cat":"sky","pid":25863,"tid":25913,"ts":531360420578,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2164,"tdur":1998,"tts":797333},{"cat":"blink","pid":25863,"tid":25913,"ts":531360420583,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":211,"tdur":211,"tts":797337},{"cat":"blink","pid":25863,"tid":25913,"ts":531360420586,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":797340},{"cat":"blink","pid":25863,"tid":25913,"ts":531360420589,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":83,"tdur":83,"tts":797343},{"cat":"blink","pid":25863,"tid":25913,"ts":531360420612,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":59,"tdur":58,"tts":797366},{"cat":"v8","pid":25863,"tid":25913,"ts":531360420641,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":22,"tts":797395},{"cat":"v8","pid":25863,"tid":25913,"ts":531360420645,"ph":"B","name":"V8.Execute","args":{},"tts":797399},{"cat":"v8","pid":25863,"tid":25913,"ts":531360420660,"ph":"E","name":"V8.Execute","args":{},"tts":797414},{"cat":"v8","pid":25863,"tid":25913,"ts":531360420677,"ph":"X","name":"v8.callFunction","args":{},"dur":115,"tdur":114,"tts":797431},{"cat":"v8","pid":25863,"tid":25913,"ts":531360420680,"ph":"B","name":"V8.Execute","args":{},"tts":797434},{"cat":"blink","pid":25863,"tid":25913,"ts":531360420689,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":21,"tdur":20,"tts":797443},{"cat":"v8","pid":25863,"tid":25913,"ts":531360420789,"ph":"E","name":"V8.Execute","args":{},"tts":797543},{"cat":"blink","pid":25863,"tid":25913,"ts":531360420795,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":32,"tdur":32,"tts":797548},{"cat":"blink","pid":25863,"tid":25913,"ts":531360420797,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":797551},{"cat":"blink","pid":25863,"tid":25913,"ts":531360420798,"ph":"X","name":"Document::updateStyle","args":{},"dur":19,"tdur":19,"tts":797552},{"cat":"blink","pid":25863,"tid":25913,"ts":531360420818,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":797572},{"cat":"blink","pid":25863,"tid":25913,"ts":531360420822,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":3,"tts":797576},{"cat":"sky","pid":25863,"tid":25913,"ts":531360420827,"ph":"X","name":"Layer::Display","args":{},"dur":1574,"tdur":1572,"tts":797581},{"cat":"sky","pid":25863,"tid":25913,"ts":531360422404,"ph":"X","name":"LayerHost::Upload","args":{},"dur":336,"tdur":171,"tts":799158},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360422768,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":62,"tdur":61,"tts":799359},{"cat":"blink","pid":25863,"tid":25913,"ts":531360422779,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":46,"tdur":46,"tts":799369},{"cat":"v8","pid":25863,"tid":25913,"ts":531360422796,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":27,"tdur":27,"tts":799386},{"cat":"v8","pid":25863,"tid":25913,"ts":531360422799,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":23,"tts":799389},{"cat":"v8","pid":25863,"tid":25913,"ts":531360422801,"ph":"B","name":"V8.Execute","args":{},"tts":799391},{"cat":"blink","pid":25863,"tid":25913,"ts":531360422810,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":10,"tdur":9,"tts":799400},{"cat":"blink","pid":25863,"tid":25913,"ts":531360422816,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":799406},{"cat":"v8","pid":25863,"tid":25913,"ts":531360422821,"ph":"E","name":"V8.Execute","args":{},"tts":799411},{"cat":"sky","pid":25863,"tid":25913,"ts":531360423273,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1756,"tdur":1655,"tts":799602},{"cat":"blink","pid":25863,"tid":25913,"ts":531360423277,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":244,"tdur":243,"tts":799606},{"cat":"blink","pid":25863,"tid":25913,"ts":531360423280,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":799609},{"cat":"blink","pid":25863,"tid":25913,"ts":531360423284,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":42,"tdur":42,"tts":799612},{"cat":"blink","pid":25863,"tid":25913,"ts":531360423297,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":28,"tdur":28,"tts":799625},{"cat":"v8","pid":25863,"tid":25913,"ts":531360423311,"ph":"X","name":"v8.callFunction","args":{},"dur":11,"tdur":11,"tts":799639},{"cat":"v8","pid":25863,"tid":25913,"ts":531360423313,"ph":"B","name":"V8.Execute","args":{},"tts":799641},{"cat":"v8","pid":25863,"tid":25913,"ts":531360423320,"ph":"E","name":"V8.Execute","args":{},"tts":799648},{"cat":"v8","pid":25863,"tid":25913,"ts":531360423328,"ph":"X","name":"v8.callFunction","args":{},"dur":190,"tdur":189,"tts":799656},{"cat":"v8","pid":25863,"tid":25913,"ts":531360423329,"ph":"B","name":"V8.Execute","args":{},"tts":799658},{"cat":"blink","pid":25863,"tid":25913,"ts":531360423333,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":10,"tdur":9,"tts":799662},{"cat":"v8","pid":25863,"tid":25913,"ts":531360423449,"ph":"E","name":"V8.Execute","args":{},"tts":799778},{"cat":"blink","pid":25863,"tid":25913,"ts":531360423522,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":433,"tdur":433,"tts":799850},{"cat":"blink","pid":25863,"tid":25913,"ts":531360423525,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":799853},{"cat":"blink","pid":25863,"tid":25913,"ts":531360423526,"ph":"X","name":"Document::updateStyle","args":{},"dur":67,"tdur":65,"tts":799855},{"cat":"blink","pid":25863,"tid":25913,"ts":531360423594,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":6},"tts":799922},{"cat":"blink","pid":25863,"tid":25913,"ts":531360423596,"ph":"X","name":"FrameView::layout","args":{},"dur":123,"tdur":122,"tts":799925},{"cat":"blink","pid":25863,"tid":25913,"ts":531360423598,"ph":"X","name":"FrameView::performPreLayoutTasks","args":{},"dur":1,"tdur":1,"tts":799926},{"cat":"blink","pid":25863,"tid":25913,"ts":531360423600,"ph":"X","name":"FrameView::performLayout","args":{},"dur":109,"tdur":109,"tts":799928},{"cat":"blink","pid":25863,"tid":25913,"ts":531360423710,"ph":"X","name":"RenderLayer::updateLayerPositionsAfterLayout","args":{},"dur":3,"tdur":2,"tts":800039},{"cat":"blink","pid":25863,"tid":25913,"ts":531360423714,"ph":"X","name":"FrameView::performPostLayoutTasks","args":{},"dur":4,"tdur":4,"tts":800042},{"cat":"blink","pid":25863,"tid":25913,"ts":531360423723,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":231,"tdur":231,"tts":800051},{"cat":"sky","pid":25863,"tid":25913,"ts":531360423956,"ph":"X","name":"Layer::Display","args":{},"dur":885,"tdur":877,"tts":800284},{"cat":"sky","pid":25863,"tid":25913,"ts":531360424842,"ph":"X","name":"LayerHost::Upload","args":{},"dur":186,"tdur":92,"tts":801163},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360425045,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":42,"tdur":41,"tts":801273},{"cat":"blink","pid":25863,"tid":25913,"ts":531360425050,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":32,"tdur":32,"tts":801278},{"cat":"v8","pid":25863,"tid":25913,"ts":531360425053,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":28,"tdur":27,"tts":801281},{"cat":"v8","pid":25863,"tid":25913,"ts":531360425056,"ph":"X","name":"v8.callFunction","args":{},"dur":24,"tdur":23,"tts":801284},{"cat":"v8","pid":25863,"tid":25913,"ts":531360425058,"ph":"B","name":"V8.Execute","args":{},"tts":801286},{"cat":"blink","pid":25863,"tid":25913,"ts":531360425066,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":11,"tdur":10,"tts":801294},{"cat":"blink","pid":25863,"tid":25913,"ts":531360425073,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":801301},{"cat":"v8","pid":25863,"tid":25913,"ts":531360425078,"ph":"E","name":"V8.Execute","args":{},"tts":801306},{"cat":"sky","pid":25863,"tid":25913,"ts":531360425440,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1141,"tdur":1085,"tts":801502},{"cat":"blink","pid":25863,"tid":25913,"ts":531360425444,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":102,"tdur":102,"tts":801506},{"cat":"blink","pid":25863,"tid":25913,"ts":531360425448,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":1,"tdur":1,"tts":801510},{"cat":"blink","pid":25863,"tid":25913,"ts":531360425451,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":36,"tdur":36,"tts":801513},{"cat":"blink","pid":25863,"tid":25913,"ts":531360425458,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":28,"tdur":28,"tts":801520},{"cat":"v8","pid":25863,"tid":25913,"ts":531360425472,"ph":"X","name":"v8.callFunction","args":{},"dur":11,"tdur":11,"tts":801534},{"cat":"v8","pid":25863,"tid":25913,"ts":531360425474,"ph":"B","name":"V8.Execute","args":{},"tts":801536},{"cat":"v8","pid":25863,"tid":25913,"ts":531360425481,"ph":"E","name":"V8.Execute","args":{},"tts":801543},{"cat":"v8","pid":25863,"tid":25913,"ts":531360425489,"ph":"X","name":"v8.callFunction","args":{},"dur":55,"tdur":55,"tts":801551},{"cat":"v8","pid":25863,"tid":25913,"ts":531360425491,"ph":"B","name":"V8.Execute","args":{},"tts":801553},{"cat":"blink","pid":25863,"tid":25913,"ts":531360425495,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":10,"tdur":9,"tts":801557},{"cat":"v8","pid":25863,"tid":25913,"ts":531360425541,"ph":"E","name":"V8.Execute","args":{},"tts":801603},{"cat":"blink","pid":25863,"tid":25913,"ts":531360425547,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":31,"tdur":31,"tts":801609},{"cat":"blink","pid":25863,"tid":25913,"ts":531360425549,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":801611},{"cat":"blink","pid":25863,"tid":25913,"ts":531360425550,"ph":"X","name":"Document::updateStyle","args":{},"dur":19,"tdur":19,"tts":801612},{"cat":"blink","pid":25863,"tid":25913,"ts":531360425570,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":801632},{"cat":"blink","pid":25863,"tid":25913,"ts":531360425574,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":3,"tts":801636},{"cat":"sky","pid":25863,"tid":25913,"ts":531360425579,"ph":"X","name":"Layer::Display","args":{},"dur":852,"tdur":851,"tts":801641},{"cat":"sky","pid":25863,"tid":25913,"ts":531360426432,"ph":"X","name":"LayerHost::Upload","args":{},"dur":148,"tdur":92,"tts":802494},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360426594,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":41,"tdur":40,"tts":802600},{"cat":"blink","pid":25863,"tid":25913,"ts":531360426599,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":31,"tdur":31,"tts":802605},{"cat":"v8","pid":25863,"tid":25913,"ts":531360426602,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":27,"tdur":27,"tts":802607},{"cat":"v8","pid":25863,"tid":25913,"ts":531360426604,"ph":"X","name":"v8.callFunction","args":{},"dur":24,"tdur":23,"tts":802610},{"cat":"v8","pid":25863,"tid":25913,"ts":531360426606,"ph":"B","name":"V8.Execute","args":{},"tts":802612},{"cat":"blink","pid":25863,"tid":25913,"ts":531360426615,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":10,"tdur":9,"tts":802621},{"cat":"blink","pid":25863,"tid":25913,"ts":531360426621,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":802627},{"cat":"v8","pid":25863,"tid":25913,"ts":531360426626,"ph":"E","name":"V8.Execute","args":{},"tts":802632},{"cat":"sky","pid":25863,"tid":25913,"ts":531360426953,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1079,"tdur":1044,"tts":802794},{"cat":"blink","pid":25863,"tid":25913,"ts":531360426957,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":101,"tdur":100,"tts":802798},{"cat":"blink","pid":25863,"tid":25913,"ts":531360426960,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":802801},{"cat":"blink","pid":25863,"tid":25913,"ts":531360426964,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":35,"tdur":35,"tts":802804},{"cat":"blink","pid":25863,"tid":25913,"ts":531360426971,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":28,"tdur":28,"tts":802811},{"cat":"v8","pid":25863,"tid":25913,"ts":531360426984,"ph":"X","name":"v8.callFunction","args":{},"dur":11,"tdur":10,"tts":802825},{"cat":"v8","pid":25863,"tid":25913,"ts":531360426986,"ph":"B","name":"V8.Execute","args":{},"tts":802827},{"cat":"v8","pid":25863,"tid":25913,"ts":531360426993,"ph":"E","name":"V8.Execute","args":{},"tts":802834},{"cat":"v8","pid":25863,"tid":25913,"ts":531360427001,"ph":"X","name":"v8.callFunction","args":{},"dur":55,"tdur":54,"tts":802842},{"cat":"v8","pid":25863,"tid":25913,"ts":531360427003,"ph":"B","name":"V8.Execute","args":{},"tts":802844},{"cat":"blink","pid":25863,"tid":25913,"ts":531360427007,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":10,"tdur":9,"tts":802848},{"cat":"v8","pid":25863,"tid":25913,"ts":531360427053,"ph":"E","name":"V8.Execute","args":{},"tts":802894},{"cat":"blink","pid":25863,"tid":25913,"ts":531360427059,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":31,"tdur":31,"tts":802899},{"cat":"blink","pid":25863,"tid":25913,"ts":531360427061,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":802901},{"cat":"blink","pid":25863,"tid":25913,"ts":531360427062,"ph":"X","name":"Document::updateStyle","args":{},"dur":19,"tdur":19,"tts":802902},{"cat":"blink","pid":25863,"tid":25913,"ts":531360427081,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":802922},{"cat":"blink","pid":25863,"tid":25913,"ts":531360427086,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":4,"tts":802926},{"cat":"sky","pid":25863,"tid":25913,"ts":531360427091,"ph":"X","name":"Layer::Display","args":{},"dur":839,"tdur":837,"tts":802932},{"cat":"sky","pid":25863,"tid":25913,"ts":531360427931,"ph":"X","name":"LayerHost::Upload","args":{},"dur":101,"tdur":66,"tts":803771},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360429127,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":67,"tdur":65,"tts":804012},{"cat":"blink","pid":25863,"tid":25913,"ts":531360429134,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":55,"tdur":55,"tts":804017},{"cat":"v8","pid":25863,"tid":25913,"ts":531360429136,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":51,"tdur":51,"tts":804020},{"cat":"v8","pid":25863,"tid":25913,"ts":531360429139,"ph":"X","name":"v8.callFunction","args":{},"dur":47,"tdur":46,"tts":804023},{"cat":"v8","pid":25863,"tid":25913,"ts":531360429141,"ph":"B","name":"V8.Execute","args":{},"tts":804025},{"cat":"blink","pid":25863,"tid":25913,"ts":531360429174,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":8,"tts":804058},{"cat":"blink","pid":25863,"tid":25913,"ts":531360429179,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":804063},{"cat":"v8","pid":25863,"tid":25913,"ts":531360429184,"ph":"E","name":"V8.Execute","args":{},"tts":804068},{"cat":"sky","pid":25863,"tid":25913,"ts":531360487202,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2067,"tdur":1939,"tts":804157},{"cat":"blink","pid":25863,"tid":25913,"ts":531360487207,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":111,"tdur":110,"tts":804161},{"cat":"blink","pid":25863,"tid":25913,"ts":531360487210,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":804164},{"cat":"blink","pid":25863,"tid":25913,"ts":531360487214,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":43,"tdur":43,"tts":804167},{"cat":"blink","pid":25863,"tid":25913,"ts":531360487227,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":30,"tdur":30,"tts":804180},{"cat":"v8","pid":25863,"tid":25913,"ts":531360487242,"ph":"X","name":"v8.callFunction","args":{},"dur":11,"tdur":11,"tts":804195},{"cat":"v8","pid":25863,"tid":25913,"ts":531360487244,"ph":"B","name":"V8.Execute","args":{},"tts":804197},{"cat":"v8","pid":25863,"tid":25913,"ts":531360487251,"ph":"E","name":"V8.Execute","args":{},"tts":804205},{"cat":"v8","pid":25863,"tid":25913,"ts":531360487260,"ph":"X","name":"v8.callFunction","args":{},"dur":56,"tdur":56,"tts":804213},{"cat":"v8","pid":25863,"tid":25913,"ts":531360487261,"ph":"B","name":"V8.Execute","args":{},"tts":804215},{"cat":"blink","pid":25863,"tid":25913,"ts":531360487265,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":11,"tdur":10,"tts":804219},{"cat":"v8","pid":25863,"tid":25913,"ts":531360487313,"ph":"E","name":"V8.Execute","args":{},"tts":804266},{"cat":"blink","pid":25863,"tid":25913,"ts":531360487318,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":84,"tdur":84,"tts":804272},{"cat":"blink","pid":25863,"tid":25913,"ts":531360487320,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":804274},{"cat":"blink","pid":25863,"tid":25913,"ts":531360487322,"ph":"X","name":"Document::updateStyle","args":{},"dur":51,"tdur":50,"tts":804275},{"cat":"blink","pid":25863,"tid":25913,"ts":531360487374,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":804328},{"cat":"blink","pid":25863,"tid":25913,"ts":531360487383,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":19,"tdur":18,"tts":804337},{"cat":"sky","pid":25863,"tid":25913,"ts":531360487403,"ph":"X","name":"Layer::Display","args":{},"dur":1669,"tdur":1638,"tts":804357},{"cat":"sky","pid":25863,"tid":25913,"ts":531360489073,"ph":"X","name":"LayerHost::Upload","args":{},"dur":195,"tdur":98,"tts":805997},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360489282,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":42,"tdur":41,"tts":806110},{"cat":"blink","pid":25863,"tid":25913,"ts":531360489287,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":32,"tdur":31,"tts":806115},{"cat":"v8","pid":25863,"tid":25913,"ts":531360489290,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":27,"tdur":27,"tts":806118},{"cat":"v8","pid":25863,"tid":25913,"ts":531360489293,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":23,"tts":806121},{"cat":"v8","pid":25863,"tid":25913,"ts":531360489294,"ph":"B","name":"V8.Execute","args":{},"tts":806122},{"cat":"blink","pid":25863,"tid":25913,"ts":531360489304,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":9,"tts":806132},{"cat":"blink","pid":25863,"tid":25913,"ts":531360489310,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":806138},{"cat":"v8","pid":25863,"tid":25913,"ts":531360489314,"ph":"E","name":"V8.Execute","args":{},"tts":806142},{"cat":"sky","pid":25863,"tid":25913,"ts":531360489737,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1487,"tdur":1394,"tts":806327},{"cat":"blink","pid":25863,"tid":25913,"ts":531360489741,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":122,"tdur":121,"tts":806331},{"cat":"blink","pid":25863,"tid":25913,"ts":531360489744,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":2,"tts":806334},{"cat":"blink","pid":25863,"tid":25913,"ts":531360489748,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":41,"tdur":41,"tts":806338},{"cat":"blink","pid":25863,"tid":25913,"ts":531360489761,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":28,"tdur":27,"tts":806351},{"cat":"v8","pid":25863,"tid":25913,"ts":531360489774,"ph":"X","name":"v8.callFunction","args":{},"dur":11,"tdur":11,"tts":806364},{"cat":"v8","pid":25863,"tid":25913,"ts":531360489776,"ph":"B","name":"V8.Execute","args":{},"tts":806366},{"cat":"v8","pid":25863,"tid":25913,"ts":531360489783,"ph":"E","name":"V8.Execute","args":{},"tts":806373},{"cat":"v8","pid":25863,"tid":25913,"ts":531360489792,"ph":"X","name":"v8.callFunction","args":{},"dur":68,"tdur":69,"tts":806381},{"cat":"v8","pid":25863,"tid":25913,"ts":531360489793,"ph":"B","name":"V8.Execute","args":{},"tts":806383},{"cat":"blink","pid":25863,"tid":25913,"ts":531360489797,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":10,"tdur":10,"tts":806387},{"cat":"v8","pid":25863,"tid":25913,"ts":531360489857,"ph":"E","name":"V8.Execute","args":{},"tts":806447},{"cat":"blink","pid":25863,"tid":25913,"ts":531360489863,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":323,"tdur":322,"tts":806453},{"cat":"blink","pid":25863,"tid":25913,"ts":531360489865,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":806455},{"cat":"blink","pid":25863,"tid":25913,"ts":531360489867,"ph":"X","name":"Document::updateStyle","args":{},"dur":58,"tdur":57,"tts":806457},{"cat":"blink","pid":25863,"tid":25913,"ts":531360489926,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":2},"tts":806516},{"cat":"blink","pid":25863,"tid":25913,"ts":531360489928,"ph":"X","name":"FrameView::layout","args":{},"dur":29,"tdur":29,"tts":806518},{"cat":"blink","pid":25863,"tid":25913,"ts":531360489930,"ph":"X","name":"FrameView::performPreLayoutTasks","args":{},"dur":1,"tdur":1,"tts":806520},{"cat":"blink","pid":25863,"tid":25913,"ts":531360489932,"ph":"X","name":"FrameView::performLayout","args":{},"dur":16,"tdur":16,"tts":806522},{"cat":"blink","pid":25863,"tid":25913,"ts":531360489949,"ph":"X","name":"RenderLayer::updateLayerPositionsAfterLayout","args":{},"dur":2,"tdur":2,"tts":806539},{"cat":"blink","pid":25863,"tid":25913,"ts":531360489952,"ph":"X","name":"FrameView::performPostLayoutTasks","args":{},"dur":4,"tdur":5,"tts":806541},{"cat":"blink","pid":25863,"tid":25913,"ts":531360489960,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":225,"tdur":224,"tts":806550},{"cat":"sky","pid":25863,"tid":25913,"ts":531360490187,"ph":"X","name":"Layer::Display","args":{},"dur":849,"tdur":848,"tts":806777},{"cat":"sky","pid":25863,"tid":25913,"ts":531360491037,"ph":"X","name":"LayerHost::Upload","args":{},"dur":186,"tdur":92,"tts":807627},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360491240,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":42,"tdur":41,"tts":807738},{"cat":"blink","pid":25863,"tid":25913,"ts":531360491246,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":31,"tdur":31,"tts":807743},{"cat":"v8","pid":25863,"tid":25913,"ts":531360491248,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":28,"tdur":28,"tts":807745},{"cat":"v8","pid":25863,"tid":25913,"ts":531360491251,"ph":"X","name":"v8.callFunction","args":{},"dur":24,"tdur":24,"tts":807748},{"cat":"v8","pid":25863,"tid":25913,"ts":531360491253,"ph":"B","name":"V8.Execute","args":{},"tts":807750},{"cat":"blink","pid":25863,"tid":25913,"ts":531360491262,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":10,"tdur":10,"tts":807759},{"cat":"blink","pid":25863,"tid":25913,"ts":531360491268,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":4,"tdur":2,"tts":807766},{"cat":"v8","pid":25863,"tid":25913,"ts":531360491273,"ph":"E","name":"V8.Execute","args":{},"tts":807770},{"cat":"sky","pid":25863,"tid":25913,"ts":531360491698,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1138,"tdur":1083,"tts":807964},{"cat":"blink","pid":25863,"tid":25913,"ts":531360491702,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":137,"tdur":136,"tts":807968},{"cat":"blink","pid":25863,"tid":25913,"ts":531360491724,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":2,"tts":807989},{"cat":"blink","pid":25863,"tid":25913,"ts":531360491727,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":34,"tdur":33,"tts":807993},{"cat":"blink","pid":25863,"tid":25913,"ts":531360491732,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":29,"tdur":28,"tts":807998},{"cat":"v8","pid":25863,"tid":25913,"ts":531360491746,"ph":"X","name":"v8.callFunction","args":{},"dur":11,"tdur":10,"tts":808012},{"cat":"v8","pid":25863,"tid":25913,"ts":531360491748,"ph":"B","name":"V8.Execute","args":{},"tts":808014},{"cat":"v8","pid":25863,"tid":25913,"ts":531360491755,"ph":"E","name":"V8.Execute","args":{},"tts":808021},{"cat":"v8","pid":25863,"tid":25913,"ts":531360491763,"ph":"X","name":"v8.callFunction","args":{},"dur":74,"tdur":73,"tts":808029},{"cat":"v8","pid":25863,"tid":25913,"ts":531360491765,"ph":"B","name":"V8.Execute","args":{},"tts":808030},{"cat":"blink","pid":25863,"tid":25913,"ts":531360491769,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":10,"tdur":10,"tts":808034},{"cat":"v8","pid":25863,"tid":25913,"ts":531360491833,"ph":"E","name":"V8.Execute","args":{},"tts":808099},{"cat":"blink","pid":25863,"tid":25913,"ts":531360491839,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":32,"tdur":31,"tts":808105},{"cat":"blink","pid":25863,"tid":25913,"ts":531360491842,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":808107},{"cat":"blink","pid":25863,"tid":25913,"ts":531360491843,"ph":"X","name":"Document::updateStyle","args":{},"dur":19,"tdur":19,"tts":808108},{"cat":"blink","pid":25863,"tid":25913,"ts":531360491863,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":808128},{"cat":"blink","pid":25863,"tid":25913,"ts":531360491867,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":4,"tts":808132},{"cat":"sky","pid":25863,"tid":25913,"ts":531360491872,"ph":"X","name":"Layer::Display","args":{},"dur":847,"tdur":846,"tts":808138},{"cat":"sky","pid":25863,"tid":25913,"ts":531360492720,"ph":"X","name":"LayerHost::Upload","args":{},"dur":116,"tdur":60,"tts":808986},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360492885,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":39,"tdur":38,"tts":809097},{"cat":"blink","pid":25863,"tid":25913,"ts":531360492890,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":29,"tdur":29,"tts":809101},{"cat":"v8","pid":25863,"tid":25913,"ts":531360492892,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":26,"tdur":25,"tts":809104},{"cat":"v8","pid":25863,"tid":25913,"ts":531360492895,"ph":"X","name":"v8.callFunction","args":{},"dur":22,"tdur":21,"tts":809107},{"cat":"v8","pid":25863,"tid":25913,"ts":531360492897,"ph":"B","name":"V8.Execute","args":{},"tts":809108},{"cat":"blink","pid":25863,"tid":25913,"ts":531360492905,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":8,"tts":809117},{"cat":"blink","pid":25863,"tid":25913,"ts":531360492911,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":2,"tdur":3,"tts":809122},{"cat":"v8","pid":25863,"tid":25913,"ts":531360492915,"ph":"E","name":"V8.Execute","args":{},"tts":809126},{"cat":"sky","pid":25863,"tid":25913,"ts":531360493270,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1114,"tdur":1078,"tts":809332},{"cat":"blink","pid":25863,"tid":25913,"ts":531360493275,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":101,"tdur":101,"tts":809336},{"cat":"blink","pid":25863,"tid":25913,"ts":531360493278,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":809339},{"cat":"blink","pid":25863,"tid":25913,"ts":531360493281,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":36,"tdur":36,"tts":809342},{"cat":"blink","pid":25863,"tid":25913,"ts":531360493289,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":28,"tdur":28,"tts":809350},{"cat":"v8","pid":25863,"tid":25913,"ts":531360493302,"ph":"X","name":"v8.callFunction","args":{},"dur":11,"tdur":10,"tts":809364},{"cat":"v8","pid":25863,"tid":25913,"ts":531360493304,"ph":"B","name":"V8.Execute","args":{},"tts":809366},{"cat":"v8","pid":25863,"tid":25913,"ts":531360493311,"ph":"E","name":"V8.Execute","args":{},"tts":809373},{"cat":"v8","pid":25863,"tid":25913,"ts":531360493319,"ph":"X","name":"v8.callFunction","args":{},"dur":55,"tdur":54,"tts":809381},{"cat":"v8","pid":25863,"tid":25913,"ts":531360493321,"ph":"B","name":"V8.Execute","args":{},"tts":809382},{"cat":"blink","pid":25863,"tid":25913,"ts":531360493325,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":10,"tdur":10,"tts":809386},{"cat":"v8","pid":25863,"tid":25913,"ts":531360493371,"ph":"E","name":"V8.Execute","args":{},"tts":809433},{"cat":"blink","pid":25863,"tid":25913,"ts":531360493377,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":31,"tdur":31,"tts":809438},{"cat":"blink","pid":25863,"tid":25913,"ts":531360493379,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":809440},{"cat":"blink","pid":25863,"tid":25913,"ts":531360493380,"ph":"X","name":"Document::updateStyle","args":{},"dur":19,"tdur":19,"tts":809441},{"cat":"blink","pid":25863,"tid":25913,"ts":531360493400,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":809461},{"cat":"blink","pid":25863,"tid":25913,"ts":531360493404,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":4,"tts":809465},{"cat":"sky","pid":25863,"tid":25913,"ts":531360493409,"ph":"X","name":"Layer::Display","args":{},"dur":838,"tdur":836,"tts":809471},{"cat":"sky","pid":25863,"tid":25913,"ts":531360494248,"ph":"X","name":"LayerHost::Upload","args":{},"dur":135,"tdur":98,"tts":810310},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360494399,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":42,"tdur":41,"tts":810426},{"cat":"blink","pid":25863,"tid":25913,"ts":531360494404,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":32,"tdur":31,"tts":810431},{"cat":"v8","pid":25863,"tid":25913,"ts":531360494407,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":28,"tdur":28,"tts":810433},{"cat":"v8","pid":25863,"tid":25913,"ts":531360494410,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":23,"tts":810436},{"cat":"v8","pid":25863,"tid":25913,"ts":531360494412,"ph":"B","name":"V8.Execute","args":{},"tts":810438},{"cat":"blink","pid":25863,"tid":25913,"ts":531360494421,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":10,"tdur":10,"tts":810447},{"cat":"blink","pid":25863,"tid":25913,"ts":531360494427,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":810453},{"cat":"v8","pid":25863,"tid":25913,"ts":531360494432,"ph":"E","name":"V8.Execute","args":{},"tts":810458},{"cat":"sky","pid":25863,"tid":25913,"ts":531360553767,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2172,"tdur":2047,"tts":810653},{"cat":"blink","pid":25863,"tid":25913,"ts":531360553771,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":180,"tdur":180,"tts":810657},{"cat":"blink","pid":25863,"tid":25913,"ts":531360553775,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":810661},{"cat":"blink","pid":25863,"tid":25913,"ts":531360553778,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":39,"tdur":38,"tts":810664},{"cat":"blink","pid":25863,"tid":25913,"ts":531360553786,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":30,"tdur":30,"tts":810672},{"cat":"v8","pid":25863,"tid":25913,"ts":531360553801,"ph":"X","name":"v8.callFunction","args":{},"dur":11,"tdur":11,"tts":810687},{"cat":"v8","pid":25863,"tid":25913,"ts":531360553803,"ph":"B","name":"V8.Execute","args":{},"tts":810689},{"cat":"v8","pid":25863,"tid":25913,"ts":531360553810,"ph":"E","name":"V8.Execute","args":{},"tts":810696},{"cat":"v8","pid":25863,"tid":25913,"ts":531360553819,"ph":"X","name":"v8.callFunction","args":{},"dur":127,"tdur":126,"tts":810705},{"cat":"v8","pid":25863,"tid":25913,"ts":531360553821,"ph":"B","name":"V8.Execute","args":{},"tts":810707},{"cat":"blink","pid":25863,"tid":25913,"ts":531360553825,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":11,"tdur":10,"tts":810711},{"cat":"v8","pid":25863,"tid":25913,"ts":531360553922,"ph":"E","name":"V8.Execute","args":{},"tts":810809},{"cat":"blink","pid":25863,"tid":25913,"ts":531360553965,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":34,"tdur":34,"tts":810851},{"cat":"blink","pid":25863,"tid":25913,"ts":531360553967,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":810853},{"cat":"blink","pid":25863,"tid":25913,"ts":531360553969,"ph":"X","name":"Document::updateStyle","args":{},"dur":21,"tdur":20,"tts":810855},{"cat":"blink","pid":25863,"tid":25913,"ts":531360553990,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":810876},{"cat":"blink","pid":25863,"tid":25913,"ts":531360553995,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":3,"tts":810881},{"cat":"sky","pid":25863,"tid":25913,"ts":531360554000,"ph":"X","name":"Layer::Display","args":{},"dur":1629,"tdur":1627,"tts":810886},{"cat":"sky","pid":25863,"tid":25913,"ts":531360555631,"ph":"X","name":"LayerHost::Upload","args":{},"dur":306,"tdur":179,"tts":812518},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360555969,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":62,"tdur":55,"tts":812730},{"cat":"blink","pid":25863,"tid":25913,"ts":531360555974,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":52,"tdur":43,"tts":812736},{"cat":"v8","pid":25863,"tid":25913,"ts":531360555977,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":47,"tdur":39,"tts":812738},{"cat":"v8","pid":25863,"tid":25913,"ts":531360555980,"ph":"X","name":"v8.callFunction","args":{},"dur":43,"tdur":35,"tts":812741},{"cat":"v8","pid":25863,"tid":25913,"ts":531360555982,"ph":"B","name":"V8.Execute","args":{},"tts":812743},{"cat":"blink","pid":25863,"tid":25913,"ts":531360555991,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":28,"tdur":20,"tts":812752},{"cat":"blink","pid":25863,"tid":25913,"ts":531360555998,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":21,"tdur":12,"tts":812759},{"cat":"v8","pid":25863,"tid":25913,"ts":531360556020,"ph":"E","name":"V8.Execute","args":{},"tts":812774},{"cat":"sky","pid":25863,"tid":25913,"ts":531360556760,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2354,"tdur":2223,"tts":813159},{"cat":"blink","pid":25863,"tid":25913,"ts":531360556770,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":211,"tdur":211,"tts":813167},{"cat":"blink","pid":25863,"tid":25913,"ts":531360556776,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":4,"tdur":3,"tts":813173},{"cat":"blink","pid":25863,"tid":25913,"ts":531360556783,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":76,"tdur":75,"tts":813180},{"cat":"blink","pid":25863,"tid":25913,"ts":531360556799,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":59,"tdur":58,"tts":813196},{"cat":"v8","pid":25863,"tid":25913,"ts":531360556827,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":22,"tts":813224},{"cat":"v8","pid":25863,"tid":25913,"ts":531360556832,"ph":"B","name":"V8.Execute","args":{},"tts":813228},{"cat":"v8","pid":25863,"tid":25913,"ts":531360556846,"ph":"E","name":"V8.Execute","args":{},"tts":813243},{"cat":"v8","pid":25863,"tid":25913,"ts":531360556863,"ph":"X","name":"v8.callFunction","args":{},"dur":114,"tdur":113,"tts":813260},{"cat":"v8","pid":25863,"tid":25913,"ts":531360556867,"ph":"B","name":"V8.Execute","args":{},"tts":813264},{"cat":"blink","pid":25863,"tid":25913,"ts":531360556875,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":21,"tdur":20,"tts":813272},{"cat":"v8","pid":25863,"tid":25913,"ts":531360556970,"ph":"E","name":"V8.Execute","args":{},"tts":813368},{"cat":"blink","pid":25863,"tid":25913,"ts":531360556982,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":66,"tdur":66,"tts":813379},{"cat":"blink","pid":25863,"tid":25913,"ts":531360556987,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":813384},{"cat":"blink","pid":25863,"tid":25913,"ts":531360556990,"ph":"X","name":"Document::updateStyle","args":{},"dur":39,"tdur":38,"tts":813387},{"cat":"blink","pid":25863,"tid":25913,"ts":531360557030,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":813427},{"cat":"blink","pid":25863,"tid":25913,"ts":531360557039,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":8,"tdur":7,"tts":813436},{"cat":"sky","pid":25863,"tid":25913,"ts":531360557050,"ph":"X","name":"Layer::Display","args":{},"dur":1756,"tdur":1753,"tts":813447},{"cat":"sky","pid":25863,"tid":25913,"ts":531360558808,"ph":"X","name":"LayerHost::Upload","args":{},"dur":304,"tdur":174,"tts":815205},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360559140,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":87,"tdur":86,"tts":815409},{"cat":"blink","pid":25863,"tid":25913,"ts":531360559151,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":66,"tdur":65,"tts":815420},{"cat":"v8","pid":25863,"tid":25913,"ts":531360559156,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":58,"tdur":58,"tts":815425},{"cat":"v8","pid":25863,"tid":25913,"ts":531360559162,"ph":"X","name":"v8.callFunction","args":{},"dur":50,"tdur":49,"tts":815431},{"cat":"v8","pid":25863,"tid":25913,"ts":531360559166,"ph":"B","name":"V8.Execute","args":{},"tts":815435},{"cat":"blink","pid":25863,"tid":25913,"ts":531360559185,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":21,"tdur":20,"tts":815454},{"cat":"blink","pid":25863,"tid":25913,"ts":531360559198,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":7,"tdur":5,"tts":815468},{"cat":"v8","pid":25863,"tid":25913,"ts":531360559208,"ph":"E","name":"V8.Execute","args":{},"tts":815477},{"cat":"sky","pid":25863,"tid":25913,"ts":531360559917,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2430,"tdur":2252,"tts":815865},{"cat":"blink","pid":25863,"tid":25913,"ts":531360559926,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":256,"tdur":255,"tts":815873},{"cat":"blink","pid":25863,"tid":25913,"ts":531360559933,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":3,"tdur":3,"tts":815879},{"cat":"blink","pid":25863,"tid":25913,"ts":531360559940,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":105,"tdur":105,"tts":815886},{"cat":"blink","pid":25863,"tid":25913,"ts":531360559971,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":73,"tdur":72,"tts":815918},{"cat":"v8","pid":25863,"tid":25913,"ts":531360559999,"ph":"X","name":"v8.callFunction","args":{},"dur":37,"tdur":23,"tts":815959},{"cat":"v8","pid":25863,"tid":25913,"ts":531360560017,"ph":"B","name":"V8.Execute","args":{},"tts":815964},{"cat":"v8","pid":25863,"tid":25913,"ts":531360560032,"ph":"E","name":"V8.Execute","args":{},"tts":815979},{"cat":"v8","pid":25863,"tid":25913,"ts":531360560050,"ph":"X","name":"v8.callFunction","args":{},"dur":127,"tdur":126,"tts":815997},{"cat":"v8","pid":25863,"tid":25913,"ts":531360560054,"ph":"B","name":"V8.Execute","args":{},"tts":816000},{"cat":"blink","pid":25863,"tid":25913,"ts":531360560062,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":21,"tdur":20,"tts":816009},{"cat":"v8","pid":25863,"tid":25913,"ts":531360560171,"ph":"E","name":"V8.Execute","args":{},"tts":816118},{"cat":"blink","pid":25863,"tid":25913,"ts":531360560183,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":67,"tdur":65,"tts":816130},{"cat":"blink","pid":25863,"tid":25913,"ts":531360560188,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":816134},{"cat":"blink","pid":25863,"tid":25913,"ts":531360560190,"ph":"X","name":"Document::updateStyle","args":{},"dur":41,"tdur":39,"tts":816137},{"cat":"blink","pid":25863,"tid":25913,"ts":531360560231,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":816178},{"cat":"blink","pid":25863,"tid":25913,"ts":531360560240,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":8,"tdur":7,"tts":816187},{"cat":"sky","pid":25863,"tid":25913,"ts":531360560251,"ph":"X","name":"Layer::Display","args":{},"dur":1737,"tdur":1734,"tts":816198},{"cat":"sky","pid":25863,"tid":25913,"ts":531360561990,"ph":"X","name":"LayerHost::Upload","args":{},"dur":355,"tdur":177,"tts":817937},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360562373,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":110,"tdur":108,"tts":818145},{"cat":"blink","pid":25863,"tid":25913,"ts":531360562384,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":88,"tdur":87,"tts":818155},{"cat":"v8","pid":25863,"tid":25913,"ts":531360562390,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":79,"tdur":78,"tts":818161},{"cat":"v8","pid":25863,"tid":25913,"ts":531360562419,"ph":"X","name":"v8.callFunction","args":{},"dur":48,"tdur":47,"tts":818190},{"cat":"v8","pid":25863,"tid":25913,"ts":531360562424,"ph":"B","name":"V8.Execute","args":{},"tts":818195},{"cat":"blink","pid":25863,"tid":25913,"ts":531360562442,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":19,"tdur":18,"tts":818213},{"cat":"blink","pid":25863,"tid":25913,"ts":531360562453,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":7,"tdur":6,"tts":818224},{"cat":"v8","pid":25863,"tid":25913,"ts":531360562463,"ph":"E","name":"V8.Execute","args":{},"tts":818234},{"cat":"sky","pid":25863,"tid":25913,"ts":531360563072,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2364,"tdur":2207,"tts":818490},{"cat":"blink","pid":25863,"tid":25913,"ts":531360563077,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":200,"tdur":199,"tts":818495},{"cat":"blink","pid":25863,"tid":25913,"ts":531360563083,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":3,"tdur":2,"tts":818501},{"cat":"blink","pid":25863,"tid":25913,"ts":531360563089,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":67,"tdur":66,"tts":818507},{"cat":"blink","pid":25863,"tid":25913,"ts":531360563101,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":54,"tdur":53,"tts":818519},{"cat":"v8","pid":25863,"tid":25913,"ts":531360563127,"ph":"X","name":"v8.callFunction","args":{},"dur":22,"tdur":21,"tts":818545},{"cat":"v8","pid":25863,"tid":25913,"ts":531360563131,"ph":"B","name":"V8.Execute","args":{},"tts":818549},{"cat":"v8","pid":25863,"tid":25913,"ts":531360563145,"ph":"E","name":"V8.Execute","args":{},"tts":818563},{"cat":"v8","pid":25863,"tid":25913,"ts":531360563161,"ph":"X","name":"v8.callFunction","args":{},"dur":112,"tdur":111,"tts":818579},{"cat":"v8","pid":25863,"tid":25913,"ts":531360563164,"ph":"B","name":"V8.Execute","args":{},"tts":818582},{"cat":"blink","pid":25863,"tid":25913,"ts":531360563173,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":20,"tdur":20,"tts":818590},{"cat":"v8","pid":25863,"tid":25913,"ts":531360563266,"ph":"E","name":"V8.Execute","args":{},"tts":818685},{"cat":"blink","pid":25863,"tid":25913,"ts":531360563278,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":67,"tdur":66,"tts":818696},{"cat":"blink","pid":25863,"tid":25913,"ts":531360563283,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":818700},{"cat":"blink","pid":25863,"tid":25913,"ts":531360563286,"ph":"X","name":"Document::updateStyle","args":{},"dur":40,"tdur":38,"tts":818704},{"cat":"blink","pid":25863,"tid":25913,"ts":531360563327,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":818745},{"cat":"blink","pid":25863,"tid":25913,"ts":531360563336,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":8,"tdur":7,"tts":818753},{"cat":"sky","pid":25863,"tid":25913,"ts":531360563346,"ph":"X","name":"Layer::Display","args":{},"dur":1809,"tdur":1806,"tts":818764},{"cat":"sky","pid":25863,"tid":25913,"ts":531360565157,"ph":"X","name":"LayerHost::Upload","args":{},"dur":277,"tdur":120,"tts":820575},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360565465,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":78,"tdur":78,"tts":820727},{"cat":"blink","pid":25863,"tid":25913,"ts":531360565473,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":61,"tdur":59,"tts":820736},{"cat":"v8","pid":25863,"tid":25913,"ts":531360565479,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":52,"tdur":52,"tts":820741},{"cat":"v8","pid":25863,"tid":25913,"ts":531360565484,"ph":"X","name":"v8.callFunction","args":{},"dur":45,"tdur":45,"tts":820746},{"cat":"v8","pid":25863,"tid":25913,"ts":531360565488,"ph":"B","name":"V8.Execute","args":{},"tts":820750},{"cat":"blink","pid":25863,"tid":25913,"ts":531360565504,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":20,"tdur":19,"tts":820766},{"cat":"blink","pid":25863,"tid":25913,"ts":531360565517,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":6,"tdur":5,"tts":820779},{"cat":"v8","pid":25863,"tid":25913,"ts":531360565526,"ph":"E","name":"V8.Execute","args":{},"tts":820788},{"cat":"sky","pid":25863,"tid":25913,"ts":531360621324,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1937,"tdur":1849,"tts":821035},{"cat":"blink","pid":25863,"tid":25913,"ts":531360621328,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":214,"tdur":213,"tts":821039},{"cat":"blink","pid":25863,"tid":25913,"ts":531360621331,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":1,"tdur":2,"tts":821041},{"cat":"blink","pid":25863,"tid":25913,"ts":531360621334,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":76,"tdur":76,"tts":821044},{"cat":"blink","pid":25863,"tid":25913,"ts":531360621340,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":69,"tdur":68,"tts":821051},{"cat":"v8","pid":25863,"tid":25913,"ts":531360621378,"ph":"X","name":"v8.callFunction","args":{},"dur":24,"tdur":23,"tts":821089},{"cat":"v8","pid":25863,"tid":25913,"ts":531360621383,"ph":"B","name":"V8.Execute","args":{},"tts":821094},{"cat":"v8","pid":25863,"tid":25913,"ts":531360621397,"ph":"E","name":"V8.Execute","args":{},"tts":821108},{"cat":"v8","pid":25863,"tid":25913,"ts":531360621415,"ph":"X","name":"v8.callFunction","args":{},"dur":122,"tdur":121,"tts":821126},{"cat":"v8","pid":25863,"tid":25913,"ts":531360621418,"ph":"B","name":"V8.Execute","args":{},"tts":821129},{"cat":"blink","pid":25863,"tid":25913,"ts":531360621426,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":22,"tdur":20,"tts":821138},{"cat":"v8","pid":25863,"tid":25913,"ts":531360621530,"ph":"E","name":"V8.Execute","args":{},"tts":821242},{"cat":"blink","pid":25863,"tid":25913,"ts":531360621554,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":29,"tdur":28,"tts":821265},{"cat":"blink","pid":25863,"tid":25913,"ts":531360621557,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":821267},{"cat":"blink","pid":25863,"tid":25913,"ts":531360621558,"ph":"X","name":"Document::updateStyle","args":{},"dur":17,"tdur":16,"tts":821269},{"cat":"blink","pid":25863,"tid":25913,"ts":531360621575,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":821286},{"cat":"blink","pid":25863,"tid":25913,"ts":531360621579,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":3,"tdur":3,"tts":821290},{"cat":"sky","pid":25863,"tid":25913,"ts":531360621584,"ph":"X","name":"Layer::Display","args":{},"dur":1498,"tdur":1497,"tts":821295},{"cat":"sky","pid":25863,"tid":25913,"ts":531360623083,"ph":"X","name":"LayerHost::Upload","args":{},"dur":178,"tdur":89,"tts":822794},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360623273,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":51,"tdur":50,"tts":822896},{"cat":"blink","pid":25863,"tid":25913,"ts":531360623277,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":42,"tdur":42,"tts":822900},{"cat":"v8","pid":25863,"tid":25913,"ts":531360623280,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":38,"tdur":38,"tts":822902},{"cat":"v8","pid":25863,"tid":25913,"ts":531360623282,"ph":"X","name":"v8.callFunction","args":{},"dur":35,"tdur":34,"tts":822905},{"cat":"v8","pid":25863,"tid":25913,"ts":531360623284,"ph":"B","name":"V8.Execute","args":{},"tts":822907},{"cat":"blink","pid":25863,"tid":25913,"ts":531360623292,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":22,"tdur":22,"tts":822915},{"cat":"blink","pid":25863,"tid":25913,"ts":531360623311,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":822934},{"cat":"v8","pid":25863,"tid":25913,"ts":531360623315,"ph":"E","name":"V8.Execute","args":{},"tts":822938},{"cat":"sky","pid":25863,"tid":25913,"ts":531360623717,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1059,"tdur":998,"tts":823114},{"cat":"blink","pid":25863,"tid":25913,"ts":531360623721,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":98,"tdur":97,"tts":823118},{"cat":"blink","pid":25863,"tid":25913,"ts":531360623724,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":2,"tts":823120},{"cat":"blink","pid":25863,"tid":25913,"ts":531360623727,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":39,"tdur":39,"tts":823123},{"cat":"blink","pid":25863,"tid":25913,"ts":531360623733,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":33,"tdur":32,"tts":823130},{"cat":"v8","pid":25863,"tid":25913,"ts":531360623753,"ph":"X","name":"v8.callFunction","args":{},"dur":10,"tdur":10,"tts":823149},{"cat":"v8","pid":25863,"tid":25913,"ts":531360623755,"ph":"B","name":"V8.Execute","args":{},"tts":823151},{"cat":"v8","pid":25863,"tid":25913,"ts":531360623761,"ph":"E","name":"V8.Execute","args":{},"tts":823157},{"cat":"v8","pid":25863,"tid":25913,"ts":531360623768,"ph":"X","name":"v8.callFunction","args":{},"dur":49,"tdur":48,"tts":823165},{"cat":"v8","pid":25863,"tid":25913,"ts":531360623770,"ph":"B","name":"V8.Execute","args":{},"tts":823166},{"cat":"blink","pid":25863,"tid":25913,"ts":531360623773,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":10,"tdur":8,"tts":823170},{"cat":"v8","pid":25863,"tid":25913,"ts":531360623815,"ph":"E","name":"V8.Execute","args":{},"tts":823211},{"cat":"blink","pid":25863,"tid":25913,"ts":531360623820,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":32,"tdur":32,"tts":823216},{"cat":"blink","pid":25863,"tid":25913,"ts":531360623822,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":823218},{"cat":"blink","pid":25863,"tid":25913,"ts":531360623823,"ph":"X","name":"Document::updateStyle","args":{},"dur":21,"tdur":21,"tts":823219},{"cat":"blink","pid":25863,"tid":25913,"ts":531360623844,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":823241},{"cat":"blink","pid":25863,"tid":25913,"ts":531360623848,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":4,"tts":823244},{"cat":"sky","pid":25863,"tid":25913,"ts":531360623853,"ph":"X","name":"Layer::Display","args":{},"dur":782,"tdur":773,"tts":823249},{"cat":"sky","pid":25863,"tid":25913,"ts":531360624636,"ph":"X","name":"LayerHost::Upload","args":{},"dur":139,"tdur":87,"tts":824024},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360624806,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":38,"tdur":38,"tts":824143},{"cat":"blink","pid":25863,"tid":25913,"ts":531360624811,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":29,"tdur":28,"tts":824148},{"cat":"v8","pid":25863,"tid":25913,"ts":531360624814,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":25,"tdur":25,"tts":824150},{"cat":"v8","pid":25863,"tid":25913,"ts":531360624816,"ph":"X","name":"v8.callFunction","args":{},"dur":22,"tdur":21,"tts":824153},{"cat":"v8","pid":25863,"tid":25913,"ts":531360624818,"ph":"B","name":"V8.Execute","args":{},"tts":824155},{"cat":"blink","pid":25863,"tid":25913,"ts":531360624826,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":10,"tts":824162},{"cat":"blink","pid":25863,"tid":25913,"ts":531360624832,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":824169},{"cat":"v8","pid":25863,"tid":25913,"ts":531360624836,"ph":"E","name":"V8.Execute","args":{},"tts":824173},{"cat":"sky","pid":25863,"tid":25913,"ts":531360625130,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1015,"tdur":979,"tts":824340},{"cat":"blink","pid":25863,"tid":25913,"ts":531360625134,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":111,"tdur":110,"tts":824343},{"cat":"blink","pid":25863,"tid":25913,"ts":531360625137,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":824346},{"cat":"blink","pid":25863,"tid":25913,"ts":531360625140,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":38,"tdur":37,"tts":824349},{"cat":"blink","pid":25863,"tid":25913,"ts":531360625152,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":25,"tdur":25,"tts":824361},{"cat":"v8","pid":25863,"tid":25913,"ts":531360625165,"ph":"X","name":"v8.callFunction","args":{},"dur":9,"tdur":10,"tts":824373},{"cat":"v8","pid":25863,"tid":25913,"ts":531360625166,"ph":"B","name":"V8.Execute","args":{},"tts":824375},{"cat":"v8","pid":25863,"tid":25913,"ts":531360625173,"ph":"E","name":"V8.Execute","args":{},"tts":824382},{"cat":"v8","pid":25863,"tid":25913,"ts":531360625180,"ph":"X","name":"v8.callFunction","args":{},"dur":63,"tdur":62,"tts":824389},{"cat":"v8","pid":25863,"tid":25913,"ts":531360625181,"ph":"B","name":"V8.Execute","args":{},"tts":824390},{"cat":"blink","pid":25863,"tid":25913,"ts":531360625185,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":12,"tdur":12,"tts":824394},{"cat":"v8","pid":25863,"tid":25913,"ts":531360625240,"ph":"E","name":"V8.Execute","args":{},"tts":824449},{"cat":"blink","pid":25863,"tid":25913,"ts":531360625245,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":28,"tdur":28,"tts":824454},{"cat":"blink","pid":25863,"tid":25913,"ts":531360625247,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":824456},{"cat":"blink","pid":25863,"tid":25913,"ts":531360625248,"ph":"X","name":"Document::updateStyle","args":{},"dur":17,"tdur":17,"tts":824457},{"cat":"blink","pid":25863,"tid":25913,"ts":531360625266,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":824474},{"cat":"blink","pid":25863,"tid":25913,"ts":531360625269,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":3,"tts":824478},{"cat":"sky","pid":25863,"tid":25913,"ts":531360625274,"ph":"X","name":"Layer::Display","args":{},"dur":763,"tdur":762,"tts":824483},{"cat":"sky","pid":25863,"tid":25913,"ts":531360626038,"ph":"X","name":"LayerHost::Upload","args":{},"dur":106,"tdur":71,"tts":825247},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360626297,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":36,"tdur":36,"tts":825398},{"cat":"blink","pid":25863,"tid":25913,"ts":531360626301,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":28,"tdur":27,"tts":825402},{"cat":"v8","pid":25863,"tid":25913,"ts":531360626304,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":24,"tdur":24,"tts":825404},{"cat":"v8","pid":25863,"tid":25913,"ts":531360626306,"ph":"X","name":"v8.callFunction","args":{},"dur":21,"tdur":20,"tts":825407},{"cat":"v8","pid":25863,"tid":25913,"ts":531360626308,"ph":"B","name":"V8.Execute","args":{},"tts":825408},{"cat":"blink","pid":25863,"tid":25913,"ts":531360626315,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":9,"tts":825416},{"cat":"blink","pid":25863,"tid":25913,"ts":531360626321,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":825422},{"cat":"v8","pid":25863,"tid":25913,"ts":531360626325,"ph":"E","name":"V8.Execute","args":{},"tts":825426},{"cat":"sky","pid":25863,"tid":25913,"ts":531360626490,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":993,"tdur":941,"tts":825511},{"cat":"blink","pid":25863,"tid":25913,"ts":531360626493,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":92,"tdur":92,"tts":825514},{"cat":"blink","pid":25863,"tid":25913,"ts":531360626496,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":1,"tdur":2,"tts":825516},{"cat":"blink","pid":25863,"tid":25913,"ts":531360626498,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":38,"tdur":38,"tts":825519},{"cat":"blink","pid":25863,"tid":25913,"ts":531360626504,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":32,"tdur":31,"tts":825525},{"cat":"v8","pid":25863,"tid":25913,"ts":531360626523,"ph":"X","name":"v8.callFunction","args":{},"dur":10,"tdur":9,"tts":825544},{"cat":"v8","pid":25863,"tid":25913,"ts":531360626525,"ph":"B","name":"V8.Execute","args":{},"tts":825546},{"cat":"v8","pid":25863,"tid":25913,"ts":531360626531,"ph":"E","name":"V8.Execute","args":{},"tts":825552},{"cat":"v8","pid":25863,"tid":25913,"ts":531360626538,"ph":"X","name":"v8.callFunction","args":{},"dur":45,"tdur":45,"tts":825559},{"cat":"v8","pid":25863,"tid":25913,"ts":531360626540,"ph":"B","name":"V8.Execute","args":{},"tts":825560},{"cat":"blink","pid":25863,"tid":25913,"ts":531360626543,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":8,"tdur":8,"tts":825564},{"cat":"v8","pid":25863,"tid":25913,"ts":531360626580,"ph":"E","name":"V8.Execute","args":{},"tts":825602},{"cat":"blink","pid":25863,"tid":25913,"ts":531360626585,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":33,"tdur":33,"tts":825606},{"cat":"blink","pid":25863,"tid":25913,"ts":531360626587,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":825608},{"cat":"blink","pid":25863,"tid":25913,"ts":531360626589,"ph":"X","name":"Document::updateStyle","args":{},"dur":22,"tdur":22,"tts":825609},{"cat":"blink","pid":25863,"tid":25913,"ts":531360626611,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":825632},{"cat":"blink","pid":25863,"tid":25913,"ts":531360626615,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":3,"tdur":2,"tts":825636},{"cat":"sky","pid":25863,"tid":25913,"ts":531360626619,"ph":"X","name":"Layer::Display","args":{},"dur":741,"tdur":740,"tts":825640},{"cat":"sky","pid":25863,"tid":25913,"ts":531360627361,"ph":"X","name":"LayerHost::Upload","args":{},"dur":121,"tdur":69,"tts":826382},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360627638,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":39,"tdur":38,"tts":826526},{"cat":"blink","pid":25863,"tid":25913,"ts":531360627642,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":30,"tdur":30,"tts":826530},{"cat":"v8","pid":25863,"tid":25913,"ts":531360627644,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":27,"tdur":27,"tts":826532},{"cat":"v8","pid":25863,"tid":25913,"ts":531360627647,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":23,"tts":826535},{"cat":"v8","pid":25863,"tid":25913,"ts":531360627648,"ph":"B","name":"V8.Execute","args":{},"tts":826536},{"cat":"blink","pid":25863,"tid":25913,"ts":531360627655,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":13,"tdur":12,"tts":826543},{"cat":"blink","pid":25863,"tid":25913,"ts":531360627665,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":2,"tdur":2,"tts":826553},{"cat":"v8","pid":25863,"tid":25913,"ts":531360627669,"ph":"E","name":"V8.Execute","args":{},"tts":826556},{"cat":"sky","pid":25863,"tid":25913,"ts":531360687445,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":3272,"tdur":3130,"tts":826666},{"cat":"blink","pid":25863,"tid":25913,"ts":531360687450,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":319,"tdur":320,"tts":826670},{"cat":"blink","pid":25863,"tid":25913,"ts":531360687453,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":2,"tts":826673},{"cat":"blink","pid":25863,"tid":25913,"ts":531360687457,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":40,"tdur":40,"tts":826677},{"cat":"blink","pid":25863,"tid":25913,"ts":531360687465,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":32,"tdur":32,"tts":826685},{"cat":"v8","pid":25863,"tid":25913,"ts":531360687480,"ph":"X","name":"v8.callFunction","args":{},"dur":13,"tdur":12,"tts":826701},{"cat":"v8","pid":25863,"tid":25913,"ts":531360687483,"ph":"B","name":"V8.Execute","args":{},"tts":826703},{"cat":"v8","pid":25863,"tid":25913,"ts":531360687491,"ph":"E","name":"V8.Execute","args":{},"tts":826711},{"cat":"v8","pid":25863,"tid":25913,"ts":531360687500,"ph":"X","name":"v8.callFunction","args":{},"dur":265,"tdur":264,"tts":826720},{"cat":"v8","pid":25863,"tid":25913,"ts":531360687501,"ph":"B","name":"V8.Execute","args":{},"tts":826722},{"cat":"blink","pid":25863,"tid":25913,"ts":531360687506,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":11,"tdur":11,"tts":826726},{"cat":"v8","pid":25863,"tid":25913,"ts":531360687682,"ph":"E","name":"V8.Execute","args":{},"tts":826904},{"cat":"blink","pid":25863,"tid":25913,"ts":531360687770,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":822,"tdur":806,"tts":826991},{"cat":"blink","pid":25863,"tid":25913,"ts":531360687775,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":826995},{"cat":"blink","pid":25863,"tid":25913,"ts":531360687777,"ph":"X","name":"Document::updateStyle","args":{},"dur":97,"tdur":97,"tts":826997},{"cat":"blink","pid":25863,"tid":25913,"ts":531360687875,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":6},"tts":827096},{"cat":"blink","pid":25863,"tid":25913,"ts":531360687879,"ph":"X","name":"FrameView::layout","args":{},"dur":215,"tdur":201,"tts":827099},{"cat":"blink","pid":25863,"tid":25913,"ts":531360687881,"ph":"X","name":"FrameView::performPreLayoutTasks","args":{},"dur":2,"tdur":3,"tts":827101},{"cat":"blink","pid":25863,"tid":25913,"ts":531360687884,"ph":"X","name":"FrameView::performLayout","args":{},"dur":188,"tdur":171,"tts":827105},{"cat":"blink","pid":25863,"tid":25913,"ts":531360688074,"ph":"X","name":"RenderLayer::updateLayerPositionsAfterLayout","args":{},"dur":7,"tdur":6,"tts":827280},{"cat":"blink","pid":25863,"tid":25913,"ts":531360688081,"ph":"X","name":"FrameView::performPostLayoutTasks","args":{},"dur":11,"tdur":9,"tts":827288},{"cat":"blink","pid":25863,"tid":25913,"ts":531360688101,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":489,"tdur":487,"tts":827308},{"cat":"sky","pid":25863,"tid":25913,"ts":531360688594,"ph":"X","name":"Layer::Display","args":{},"dur":1811,"tdur":1809,"tts":827800},{"cat":"sky","pid":25863,"tid":25913,"ts":531360690407,"ph":"X","name":"LayerHost::Upload","args":{},"dur":308,"tdur":180,"tts":829614},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360690744,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":88,"tdur":88,"tts":829824},{"cat":"blink","pid":25863,"tid":25913,"ts":531360690755,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":66,"tdur":65,"tts":829835},{"cat":"v8","pid":25863,"tid":25913,"ts":531360690760,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":58,"tdur":56,"tts":829841},{"cat":"v8","pid":25863,"tid":25913,"ts":531360690767,"ph":"X","name":"v8.callFunction","args":{},"dur":48,"tdur":48,"tts":829847},{"cat":"v8","pid":25863,"tid":25913,"ts":531360690770,"ph":"B","name":"V8.Execute","args":{},"tts":829851},{"cat":"blink","pid":25863,"tid":25913,"ts":531360690789,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":20,"tdur":19,"tts":829870},{"cat":"blink","pid":25863,"tid":25913,"ts":531360690802,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":6,"tdur":5,"tts":829883},{"cat":"v8","pid":25863,"tid":25913,"ts":531360690812,"ph":"E","name":"V8.Execute","args":{},"tts":829892},{"cat":"sky","pid":25863,"tid":25913,"ts":531360691577,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2413,"tdur":2266,"tts":830295},{"cat":"blink","pid":25863,"tid":25913,"ts":531360691586,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":214,"tdur":214,"tts":830302},{"cat":"blink","pid":25863,"tid":25913,"ts":531360691593,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":4,"tdur":3,"tts":830309},{"cat":"blink","pid":25863,"tid":25913,"ts":531360691600,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":75,"tdur":74,"tts":830317},{"cat":"blink","pid":25863,"tid":25913,"ts":531360691615,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":59,"tdur":58,"tts":830332},{"cat":"v8","pid":25863,"tid":25913,"ts":531360691644,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":22,"tts":830360},{"cat":"v8","pid":25863,"tid":25913,"ts":531360691648,"ph":"B","name":"V8.Execute","args":{},"tts":830364},{"cat":"v8","pid":25863,"tid":25913,"ts":531360691663,"ph":"E","name":"V8.Execute","args":{},"tts":830379},{"cat":"v8","pid":25863,"tid":25913,"ts":531360691680,"ph":"X","name":"v8.callFunction","args":{},"dur":115,"tdur":115,"tts":830396},{"cat":"v8","pid":25863,"tid":25913,"ts":531360691683,"ph":"B","name":"V8.Execute","args":{},"tts":830399},{"cat":"blink","pid":25863,"tid":25913,"ts":531360691691,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":22,"tdur":20,"tts":830408},{"cat":"v8","pid":25863,"tid":25913,"ts":531360691789,"ph":"E","name":"V8.Execute","args":{},"tts":830506},{"cat":"blink","pid":25863,"tid":25913,"ts":531360691801,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":66,"tdur":66,"tts":830517},{"cat":"blink","pid":25863,"tid":25913,"ts":531360691805,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":830522},{"cat":"blink","pid":25863,"tid":25913,"ts":531360691808,"ph":"X","name":"Document::updateStyle","args":{},"dur":40,"tdur":38,"tts":830525},{"cat":"blink","pid":25863,"tid":25913,"ts":531360691849,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":830566},{"cat":"blink","pid":25863,"tid":25913,"ts":531360691858,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":8,"tdur":8,"tts":830574},{"cat":"sky","pid":25863,"tid":25913,"ts":531360691869,"ph":"X","name":"Layer::Display","args":{},"dur":1792,"tdur":1790,"tts":830585},{"cat":"sky","pid":25863,"tid":25913,"ts":531360693663,"ph":"X","name":"LayerHost::Upload","args":{},"dur":325,"tdur":178,"tts":832380},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360694016,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":103,"tdur":102,"tts":832588},{"cat":"blink","pid":25863,"tid":25913,"ts":531360694043,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":65,"tdur":64,"tts":832616},{"cat":"v8","pid":25863,"tid":25913,"ts":531360694049,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":56,"tdur":55,"tts":832622},{"cat":"v8","pid":25863,"tid":25913,"ts":531360694056,"ph":"X","name":"v8.callFunction","args":{},"dur":47,"tdur":46,"tts":832628},{"cat":"v8","pid":25863,"tid":25913,"ts":531360694059,"ph":"B","name":"V8.Execute","args":{},"tts":832632},{"cat":"blink","pid":25863,"tid":25913,"ts":531360694078,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":19,"tdur":18,"tts":832650},{"cat":"blink","pid":25863,"tid":25913,"ts":531360694090,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":6,"tdur":5,"tts":832662},{"cat":"v8","pid":25863,"tid":25913,"ts":531360694099,"ph":"E","name":"V8.Execute","args":{},"tts":832671},{"cat":"sky","pid":25863,"tid":25913,"ts":531360694860,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2440,"tdur":2292,"tts":833067},{"cat":"blink","pid":25863,"tid":25913,"ts":531360694869,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":227,"tdur":226,"tts":833075},{"cat":"blink","pid":25863,"tid":25913,"ts":531360694876,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":3,"tdur":3,"tts":833081},{"cat":"blink","pid":25863,"tid":25913,"ts":531360694882,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":91,"tdur":90,"tts":833088},{"cat":"blink","pid":25863,"tid":25913,"ts":531360694913,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":59,"tdur":58,"tts":833119},{"cat":"v8","pid":25863,"tid":25913,"ts":531360694942,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":22,"tts":833148},{"cat":"v8","pid":25863,"tid":25913,"ts":531360694946,"ph":"B","name":"V8.Execute","args":{},"tts":833152},{"cat":"v8","pid":25863,"tid":25913,"ts":531360694961,"ph":"E","name":"V8.Execute","args":{},"tts":833167},{"cat":"v8","pid":25863,"tid":25913,"ts":531360694978,"ph":"X","name":"v8.callFunction","args":{},"dur":114,"tdur":113,"tts":833184},{"cat":"v8","pid":25863,"tid":25913,"ts":531360694981,"ph":"B","name":"V8.Execute","args":{},"tts":833187},{"cat":"blink","pid":25863,"tid":25913,"ts":531360694989,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":22,"tdur":20,"tts":833195},{"cat":"v8","pid":25863,"tid":25913,"ts":531360695085,"ph":"E","name":"V8.Execute","args":{},"tts":833292},{"cat":"blink","pid":25863,"tid":25913,"ts":531360695097,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":66,"tdur":65,"tts":833303},{"cat":"blink","pid":25863,"tid":25913,"ts":531360695102,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":833308},{"cat":"blink","pid":25863,"tid":25913,"ts":531360695105,"ph":"X","name":"Document::updateStyle","args":{},"dur":39,"tdur":39,"tts":833310},{"cat":"blink","pid":25863,"tid":25913,"ts":531360695145,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":833351},{"cat":"blink","pid":25863,"tid":25913,"ts":531360695154,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":8,"tdur":7,"tts":833360},{"cat":"sky","pid":25863,"tid":25913,"ts":531360695165,"ph":"X","name":"Layer::Display","args":{},"dur":1812,"tdur":1809,"tts":833371},{"cat":"sky","pid":25863,"tid":25913,"ts":531360696979,"ph":"X","name":"LayerHost::Upload","args":{},"dur":319,"tdur":171,"tts":835185},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360697326,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":87,"tdur":86,"tts":835386},{"cat":"blink","pid":25863,"tid":25913,"ts":531360697337,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":66,"tdur":65,"tts":835397},{"cat":"v8","pid":25863,"tid":25913,"ts":531360697342,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":58,"tdur":57,"tts":835403},{"cat":"v8","pid":25863,"tid":25913,"ts":531360697349,"ph":"X","name":"v8.callFunction","args":{},"dur":49,"tdur":48,"tts":835409},{"cat":"v8","pid":25863,"tid":25913,"ts":531360697353,"ph":"B","name":"V8.Execute","args":{},"tts":835413},{"cat":"blink","pid":25863,"tid":25913,"ts":531360697371,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":21,"tdur":20,"tts":835431},{"cat":"blink","pid":25863,"tid":25913,"ts":531360697385,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":6,"tdur":5,"tts":835445},{"cat":"v8","pid":25863,"tid":25913,"ts":531360697394,"ph":"E","name":"V8.Execute","args":{},"tts":835454},{"cat":"sky","pid":25863,"tid":25913,"ts":531360697990,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2313,"tdur":2187,"tts":835700},{"cat":"blink","pid":25863,"tid":25913,"ts":531360697995,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":212,"tdur":210,"tts":835706},{"cat":"blink","pid":25863,"tid":25913,"ts":531360698001,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":4,"tdur":3,"tts":835711},{"cat":"blink","pid":25863,"tid":25913,"ts":531360698007,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":79,"tdur":78,"tts":835717},{"cat":"blink","pid":25863,"tid":25913,"ts":531360698030,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":55,"tdur":54,"tts":835740},{"cat":"v8","pid":25863,"tid":25913,"ts":531360698056,"ph":"X","name":"v8.callFunction","args":{},"dur":22,"tdur":21,"tts":835767},{"cat":"v8","pid":25863,"tid":25913,"ts":531360698060,"ph":"B","name":"V8.Execute","args":{},"tts":835771},{"cat":"v8","pid":25863,"tid":25913,"ts":531360698075,"ph":"E","name":"V8.Execute","args":{},"tts":835785},{"cat":"v8","pid":25863,"tid":25913,"ts":531360698090,"ph":"X","name":"v8.callFunction","args":{},"dur":112,"tdur":112,"tts":835800},{"cat":"v8","pid":25863,"tid":25913,"ts":531360698094,"ph":"B","name":"V8.Execute","args":{},"tts":835804},{"cat":"blink","pid":25863,"tid":25913,"ts":531360698102,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":21,"tdur":21,"tts":835812},{"cat":"v8","pid":25863,"tid":25913,"ts":531360698195,"ph":"E","name":"V8.Execute","args":{},"tts":835907},{"cat":"blink","pid":25863,"tid":25913,"ts":531360698208,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":66,"tdur":66,"tts":835918},{"cat":"blink","pid":25863,"tid":25913,"ts":531360698212,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":835923},{"cat":"blink","pid":25863,"tid":25913,"ts":531360698215,"ph":"X","name":"Document::updateStyle","args":{},"dur":40,"tdur":38,"tts":835926},{"cat":"blink","pid":25863,"tid":25913,"ts":531360698256,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":835967},{"cat":"blink","pid":25863,"tid":25913,"ts":531360698265,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":8,"tdur":8,"tts":835975},{"cat":"sky","pid":25863,"tid":25913,"ts":531360698276,"ph":"X","name":"Layer::Display","args":{},"dur":1834,"tdur":1815,"tts":835986},{"cat":"sky","pid":25863,"tid":25913,"ts":531360700110,"ph":"X","name":"LayerHost::Upload","args":{},"dur":193,"tdur":83,"tts":837803},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360700314,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":38,"tdur":37,"tts":837898},{"cat":"blink","pid":25863,"tid":25913,"ts":531360700318,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":29,"tdur":29,"tts":837902},{"cat":"v8","pid":25863,"tid":25913,"ts":531360700321,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":25,"tdur":24,"tts":837905},{"cat":"v8","pid":25863,"tid":25913,"ts":531360700323,"ph":"X","name":"v8.callFunction","args":{},"dur":22,"tdur":21,"tts":837907},{"cat":"v8","pid":25863,"tid":25913,"ts":531360700325,"ph":"B","name":"V8.Execute","args":{},"tts":837909},{"cat":"blink","pid":25863,"tid":25913,"ts":531360700333,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":9,"tts":837917},{"cat":"blink","pid":25863,"tid":25913,"ts":531360700339,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":2,"tdur":2,"tts":837923},{"cat":"v8","pid":25863,"tid":25913,"ts":531360700343,"ph":"E","name":"V8.Execute","args":{},"tts":837927},{"cat":"sky","pid":25863,"tid":25913,"ts":531360771391,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2434,"tdur":2257,"tts":838133},{"cat":"blink","pid":25863,"tid":25913,"ts":531360771396,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":137,"tdur":137,"tts":838137},{"cat":"blink","pid":25863,"tid":25913,"ts":531360771399,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":16,"tdur":15,"tts":838140},{"cat":"blink","pid":25863,"tid":25913,"ts":531360771416,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":35,"tdur":34,"tts":838157},{"cat":"blink","pid":25863,"tid":25913,"ts":531360771422,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":28,"tdur":28,"tts":838163},{"cat":"v8","pid":25863,"tid":25913,"ts":531360771436,"ph":"X","name":"v8.callFunction","args":{},"dur":11,"tdur":10,"tts":838177},{"cat":"v8","pid":25863,"tid":25913,"ts":531360771438,"ph":"B","name":"V8.Execute","args":{},"tts":838179},{"cat":"v8","pid":25863,"tid":25913,"ts":531360771445,"ph":"E","name":"V8.Execute","args":{},"tts":838186},{"cat":"v8","pid":25863,"tid":25913,"ts":531360771453,"ph":"X","name":"v8.callFunction","args":{},"dur":78,"tdur":77,"tts":838194},{"cat":"v8","pid":25863,"tid":25913,"ts":531360771455,"ph":"B","name":"V8.Execute","args":{},"tts":838196},{"cat":"blink","pid":25863,"tid":25913,"ts":531360771459,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":10,"tdur":9,"tts":838200},{"cat":"v8","pid":25863,"tid":25913,"ts":531360771527,"ph":"E","name":"V8.Execute","args":{},"tts":838269},{"cat":"blink","pid":25863,"tid":25913,"ts":531360771534,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":325,"tdur":325,"tts":838275},{"cat":"blink","pid":25863,"tid":25913,"ts":531360771536,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":838277},{"cat":"blink","pid":25863,"tid":25913,"ts":531360771538,"ph":"X","name":"Document::updateStyle","args":{},"dur":61,"tdur":60,"tts":838279},{"cat":"blink","pid":25863,"tid":25913,"ts":531360771600,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":2},"tts":838341},{"cat":"blink","pid":25863,"tid":25913,"ts":531360771603,"ph":"X","name":"FrameView::layout","args":{},"dur":28,"tdur":27,"tts":838344},{"cat":"blink","pid":25863,"tid":25913,"ts":531360771604,"ph":"X","name":"FrameView::performPreLayoutTasks","args":{},"dur":2,"tdur":1,"tts":838345},{"cat":"blink","pid":25863,"tid":25913,"ts":531360771606,"ph":"X","name":"FrameView::performLayout","args":{},"dur":16,"tdur":16,"tts":838347},{"cat":"blink","pid":25863,"tid":25913,"ts":531360771623,"ph":"X","name":"RenderLayer::updateLayerPositionsAfterLayout","args":{},"dur":2,"tdur":2,"tts":838363},{"cat":"blink","pid":25863,"tid":25913,"ts":531360771625,"ph":"X","name":"FrameView::performPostLayoutTasks","args":{},"dur":4,"tdur":4,"tts":838366},{"cat":"blink","pid":25863,"tid":25913,"ts":531360771634,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":225,"tdur":224,"tts":838375},{"cat":"sky","pid":25863,"tid":25913,"ts":531360771860,"ph":"X","name":"Layer::Display","args":{},"dur":1637,"tdur":1622,"tts":838601},{"cat":"sky","pid":25863,"tid":25913,"ts":531360773498,"ph":"X","name":"LayerHost::Upload","args":{},"dur":326,"tdur":160,"tts":840228},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360773843,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":98,"tdur":97,"tts":840408},{"cat":"blink","pid":25863,"tid":25913,"ts":531360773863,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":67,"tdur":66,"tts":840428},{"cat":"v8","pid":25863,"tid":25913,"ts":531360773869,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":59,"tdur":58,"tts":840434},{"cat":"v8","pid":25863,"tid":25913,"ts":531360773876,"ph":"X","name":"v8.callFunction","args":{},"dur":49,"tdur":48,"tts":840441},{"cat":"v8","pid":25863,"tid":25913,"ts":531360773880,"ph":"B","name":"V8.Execute","args":{},"tts":840444},{"cat":"blink","pid":25863,"tid":25913,"ts":531360773898,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":22,"tdur":20,"tts":840463},{"cat":"blink","pid":25863,"tid":25913,"ts":531360773912,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":6,"tdur":5,"tts":840477},{"cat":"v8","pid":25863,"tid":25913,"ts":531360773922,"ph":"E","name":"V8.Execute","args":{},"tts":840486},{"cat":"sky","pid":25863,"tid":25913,"ts":531360774701,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2415,"tdur":2249,"tts":840879},{"cat":"blink","pid":25863,"tid":25913,"ts":531360774711,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":211,"tdur":210,"tts":840887},{"cat":"blink","pid":25863,"tid":25913,"ts":531360774717,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":4,"tdur":3,"tts":840893},{"cat":"blink","pid":25863,"tid":25913,"ts":531360774725,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":74,"tdur":74,"tts":840901},{"cat":"blink","pid":25863,"tid":25913,"ts":531360774740,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":58,"tdur":57,"tts":840916},{"cat":"v8","pid":25863,"tid":25913,"ts":531360774768,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":22,"tts":840944},{"cat":"v8","pid":25863,"tid":25913,"ts":531360774772,"ph":"B","name":"V8.Execute","args":{},"tts":840948},{"cat":"v8","pid":25863,"tid":25913,"ts":531360774787,"ph":"E","name":"V8.Execute","args":{},"tts":840963},{"cat":"v8","pid":25863,"tid":25913,"ts":531360774804,"ph":"X","name":"v8.callFunction","args":{},"dur":113,"tdur":113,"tts":840980},{"cat":"v8","pid":25863,"tid":25913,"ts":531360774807,"ph":"B","name":"V8.Execute","args":{},"tts":840983},{"cat":"blink","pid":25863,"tid":25913,"ts":531360774816,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":21,"tdur":20,"tts":840992},{"cat":"v8","pid":25863,"tid":25913,"ts":531360774911,"ph":"E","name":"V8.Execute","args":{},"tts":841088},{"cat":"blink","pid":25863,"tid":25913,"ts":531360774923,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":67,"tdur":66,"tts":841099},{"cat":"blink","pid":25863,"tid":25913,"ts":531360774927,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":841103},{"cat":"blink","pid":25863,"tid":25913,"ts":531360774930,"ph":"X","name":"Document::updateStyle","args":{},"dur":40,"tdur":39,"tts":841106},{"cat":"blink","pid":25863,"tid":25913,"ts":531360774971,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":841147},{"cat":"blink","pid":25863,"tid":25913,"ts":531360774980,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":8,"tdur":8,"tts":841156},{"cat":"sky","pid":25863,"tid":25913,"ts":531360774991,"ph":"X","name":"Layer::Display","args":{},"dur":1832,"tdur":1830,"tts":841167},{"cat":"sky","pid":25863,"tid":25913,"ts":531360776825,"ph":"X","name":"LayerHost::Upload","args":{},"dur":289,"tdur":125,"tts":843001},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360777140,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":82,"tdur":81,"tts":843154},{"cat":"blink","pid":25863,"tid":25913,"ts":531360777150,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":62,"tdur":62,"tts":843163},{"cat":"v8","pid":25863,"tid":25913,"ts":531360777155,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":55,"tdur":53,"tts":843169},{"cat":"v8","pid":25863,"tid":25913,"ts":531360777161,"ph":"X","name":"v8.callFunction","args":{},"dur":46,"tdur":46,"tts":843174},{"cat":"v8","pid":25863,"tid":25913,"ts":531360777165,"ph":"B","name":"V8.Execute","args":{},"tts":843178},{"cat":"blink","pid":25863,"tid":25913,"ts":531360777182,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":20,"tdur":19,"tts":843195},{"cat":"blink","pid":25863,"tid":25913,"ts":531360777195,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":6,"tdur":5,"tts":843208},{"cat":"v8","pid":25863,"tid":25913,"ts":531360777204,"ph":"E","name":"V8.Execute","args":{},"tts":843217},{"cat":"sky","pid":25863,"tid":25913,"ts":531360777979,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2493,"tdur":2319,"tts":843628},{"cat":"blink","pid":25863,"tid":25913,"ts":531360777988,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":236,"tdur":235,"tts":843636},{"cat":"blink","pid":25863,"tid":25913,"ts":531360777995,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":3,"tdur":3,"tts":843642},{"cat":"blink","pid":25863,"tid":25913,"ts":531360778002,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":98,"tdur":98,"tts":843649},{"cat":"blink","pid":25863,"tid":25913,"ts":531360778028,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":71,"tdur":70,"tts":843676},{"cat":"v8","pid":25863,"tid":25913,"ts":531360778057,"ph":"X","name":"v8.callFunction","args":{},"dur":34,"tdur":33,"tts":843705},{"cat":"v8","pid":25863,"tid":25913,"ts":531360778061,"ph":"B","name":"V8.Execute","args":{},"tts":843709},{"cat":"v8","pid":25863,"tid":25913,"ts":531360778076,"ph":"E","name":"V8.Execute","args":{},"tts":843723},{"cat":"v8","pid":25863,"tid":25913,"ts":531360778105,"ph":"X","name":"v8.callFunction","args":{},"dur":115,"tdur":114,"tts":843753},{"cat":"v8","pid":25863,"tid":25913,"ts":531360778109,"ph":"B","name":"V8.Execute","args":{},"tts":843756},{"cat":"blink","pid":25863,"tid":25913,"ts":531360778117,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":22,"tdur":20,"tts":843765},{"cat":"v8","pid":25863,"tid":25913,"ts":531360778213,"ph":"E","name":"V8.Execute","args":{},"tts":843862},{"cat":"blink","pid":25863,"tid":25913,"ts":531360778226,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":66,"tdur":66,"tts":843873},{"cat":"blink","pid":25863,"tid":25913,"ts":531360778230,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":843878},{"cat":"blink","pid":25863,"tid":25913,"ts":531360778233,"ph":"X","name":"Document::updateStyle","args":{},"dur":40,"tdur":39,"tts":843880},{"cat":"blink","pid":25863,"tid":25913,"ts":531360778274,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":843921},{"cat":"blink","pid":25863,"tid":25913,"ts":531360778283,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":8,"tdur":7,"tts":843930},{"cat":"sky","pid":25863,"tid":25913,"ts":531360778294,"ph":"X","name":"Layer::Display","args":{},"dur":1808,"tdur":1806,"tts":843941},{"cat":"sky","pid":25863,"tid":25913,"ts":531360780104,"ph":"X","name":"LayerHost::Upload","args":{},"dur":366,"tdur":192,"tts":845752},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360780499,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":88,"tdur":87,"tts":845974},{"cat":"blink","pid":25863,"tid":25913,"ts":531360780510,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":66,"tdur":66,"tts":845985},{"cat":"v8","pid":25863,"tid":25913,"ts":531360780515,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":59,"tdur":57,"tts":845991},{"cat":"v8","pid":25863,"tid":25913,"ts":531360780521,"ph":"X","name":"v8.callFunction","args":{},"dur":50,"tdur":49,"tts":845997},{"cat":"v8","pid":25863,"tid":25913,"ts":531360780525,"ph":"B","name":"V8.Execute","args":{},"tts":846001},{"cat":"blink","pid":25863,"tid":25913,"ts":531360780543,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":22,"tdur":21,"tts":846019},{"cat":"blink","pid":25863,"tid":25913,"ts":531360780557,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":7,"tdur":6,"tts":846033},{"cat":"v8","pid":25863,"tid":25913,"ts":531360780567,"ph":"E","name":"V8.Execute","args":{},"tts":846043},{"cat":"sky","pid":25863,"tid":25913,"ts":531360781165,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2395,"tdur":2250,"tts":846362},{"cat":"blink","pid":25863,"tid":25913,"ts":531360781173,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":212,"tdur":211,"tts":846370},{"cat":"blink","pid":25863,"tid":25913,"ts":531360781180,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":4,"tdur":3,"tts":846377},{"cat":"blink","pid":25863,"tid":25913,"ts":531360781187,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":74,"tdur":73,"tts":846384},{"cat":"blink","pid":25863,"tid":25913,"ts":531360781202,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":58,"tdur":57,"tts":846399},{"cat":"v8","pid":25863,"tid":25913,"ts":531360781230,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":22,"tts":846427},{"cat":"v8","pid":25863,"tid":25913,"ts":531360781235,"ph":"B","name":"V8.Execute","args":{},"tts":846431},{"cat":"v8","pid":25863,"tid":25913,"ts":531360781249,"ph":"E","name":"V8.Execute","args":{},"tts":846446},{"cat":"v8","pid":25863,"tid":25913,"ts":531360781266,"ph":"X","name":"v8.callFunction","args":{},"dur":114,"tdur":114,"tts":846462},{"cat":"v8","pid":25863,"tid":25913,"ts":531360781269,"ph":"B","name":"V8.Execute","args":{},"tts":846466},{"cat":"blink","pid":25863,"tid":25913,"ts":531360781278,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":21,"tdur":21,"tts":846474},{"cat":"v8","pid":25863,"tid":25913,"ts":531360781373,"ph":"E","name":"V8.Execute","args":{},"tts":846571},{"cat":"blink","pid":25863,"tid":25913,"ts":531360781386,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":66,"tdur":65,"tts":846583},{"cat":"blink","pid":25863,"tid":25913,"ts":531360781390,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":846587},{"cat":"blink","pid":25863,"tid":25913,"ts":531360781393,"ph":"X","name":"Document::updateStyle","args":{},"dur":40,"tdur":39,"tts":846590},{"cat":"blink","pid":25863,"tid":25913,"ts":531360781434,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":846631},{"cat":"blink","pid":25863,"tid":25913,"ts":531360781443,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":8,"tdur":7,"tts":846640},{"cat":"sky","pid":25863,"tid":25913,"ts":531360781454,"ph":"X","name":"Layer::Display","args":{},"dur":1782,"tdur":1780,"tts":846651},{"cat":"sky","pid":25863,"tid":25913,"ts":531360783238,"ph":"X","name":"LayerHost::Upload","args":{},"dur":320,"tdur":174,"tts":848435},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360783587,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":93,"tdur":93,"tts":848639},{"cat":"blink","pid":25863,"tid":25913,"ts":531360783597,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":73,"tdur":71,"tts":848650},{"cat":"v8","pid":25863,"tid":25913,"ts":531360783603,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":64,"tdur":63,"tts":848656},{"cat":"v8","pid":25863,"tid":25913,"ts":531360783609,"ph":"X","name":"v8.callFunction","args":{},"dur":56,"tdur":54,"tts":848662},{"cat":"v8","pid":25863,"tid":25913,"ts":531360783613,"ph":"B","name":"V8.Execute","args":{},"tts":848665},{"cat":"blink","pid":25863,"tid":25913,"ts":531360783637,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":22,"tdur":20,"tts":848690},{"cat":"blink","pid":25863,"tid":25913,"ts":531360783651,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":7,"tdur":5,"tts":848704},{"cat":"v8","pid":25863,"tid":25913,"ts":531360783661,"ph":"E","name":"V8.Execute","args":{},"tts":848713},{"cat":"sky","pid":25863,"tid":25913,"ts":531360838041,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2270,"tdur":2105,"tts":849061},{"cat":"blink","pid":25863,"tid":25913,"ts":531360838064,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":236,"tdur":235,"tts":849083},{"cat":"blink","pid":25863,"tid":25913,"ts":531360838071,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":3,"tdur":3,"tts":849090},{"cat":"blink","pid":25863,"tid":25913,"ts":531360838078,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":78,"tdur":77,"tts":849097},{"cat":"blink","pid":25863,"tid":25913,"ts":531360838094,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":61,"tdur":60,"tts":849113},{"cat":"v8","pid":25863,"tid":25913,"ts":531360838123,"ph":"X","name":"v8.callFunction","args":{},"dur":24,"tdur":22,"tts":849143},{"cat":"v8","pid":25863,"tid":25913,"ts":531360838128,"ph":"B","name":"V8.Execute","args":{},"tts":849147},{"cat":"v8","pid":25863,"tid":25913,"ts":531360838143,"ph":"E","name":"V8.Execute","args":{},"tts":849162},{"cat":"v8","pid":25863,"tid":25913,"ts":531360838160,"ph":"X","name":"v8.callFunction","args":{},"dur":138,"tdur":137,"tts":849179},{"cat":"v8","pid":25863,"tid":25913,"ts":531360838164,"ph":"B","name":"V8.Execute","args":{},"tts":849183},{"cat":"blink","pid":25863,"tid":25913,"ts":531360838172,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":22,"tdur":21,"tts":849191},{"cat":"v8","pid":25863,"tid":25913,"ts":531360838295,"ph":"E","name":"V8.Execute","args":{},"tts":849314},{"cat":"blink","pid":25863,"tid":25913,"ts":531360838300,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":29,"tdur":29,"tts":849319},{"cat":"blink","pid":25863,"tid":25913,"ts":531360838302,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":849321},{"cat":"blink","pid":25863,"tid":25913,"ts":531360838303,"ph":"X","name":"Document::updateStyle","args":{},"dur":18,"tdur":17,"tts":849322},{"cat":"blink","pid":25863,"tid":25913,"ts":531360838321,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":849340},{"cat":"blink","pid":25863,"tid":25913,"ts":531360838325,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":3,"tts":849344},{"cat":"sky","pid":25863,"tid":25913,"ts":531360838343,"ph":"X","name":"Layer::Display","args":{},"dur":1708,"tdur":1654,"tts":849362},{"cat":"sky","pid":25863,"tid":25913,"ts":531360840053,"ph":"X","name":"LayerHost::Upload","args":{},"dur":256,"tdur":112,"tts":851052},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360840336,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":80,"tdur":79,"tts":851193},{"cat":"blink","pid":25863,"tid":25913,"ts":531360840346,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":66,"tdur":66,"tts":851202},{"cat":"v8","pid":25863,"tid":25913,"ts":531360840351,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":59,"tdur":58,"tts":851208},{"cat":"v8","pid":25863,"tid":25913,"ts":531360840357,"ph":"X","name":"v8.callFunction","args":{},"dur":52,"tdur":51,"tts":851214},{"cat":"v8","pid":25863,"tid":25913,"ts":531360840361,"ph":"B","name":"V8.Execute","args":{},"tts":851218},{"cat":"blink","pid":25863,"tid":25913,"ts":531360840378,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":29,"tdur":28,"tts":851235},{"cat":"blink","pid":25863,"tid":25913,"ts":531360840404,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":2,"tdur":2,"tts":851260},{"cat":"v8","pid":25863,"tid":25913,"ts":531360840408,"ph":"E","name":"V8.Execute","args":{},"tts":851264},{"cat":"sky","pid":25863,"tid":25913,"ts":531360840729,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":961,"tdur":910,"tts":851372},{"cat":"blink","pid":25863,"tid":25913,"ts":531360840731,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":82,"tdur":82,"tts":851374},{"cat":"blink","pid":25863,"tid":25913,"ts":531360840734,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":1,"tdur":1,"tts":851376},{"cat":"blink","pid":25863,"tid":25913,"ts":531360840736,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":30,"tdur":30,"tts":851379},{"cat":"blink","pid":25863,"tid":25913,"ts":531360840745,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":21,"tdur":20,"tts":851388},{"cat":"v8","pid":25863,"tid":25913,"ts":531360840754,"ph":"X","name":"v8.callFunction","args":{},"dur":9,"tdur":9,"tts":851397},{"cat":"v8","pid":25863,"tid":25913,"ts":531360840756,"ph":"B","name":"V8.Execute","args":{},"tts":851399},{"cat":"v8","pid":25863,"tid":25913,"ts":531360840762,"ph":"E","name":"V8.Execute","args":{},"tts":851405},{"cat":"v8","pid":25863,"tid":25913,"ts":531360840768,"ph":"X","name":"v8.callFunction","args":{},"dur":43,"tdur":43,"tts":851411},{"cat":"v8","pid":25863,"tid":25913,"ts":531360840769,"ph":"B","name":"V8.Execute","args":{},"tts":851412},{"cat":"blink","pid":25863,"tid":25913,"ts":531360840773,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":8,"tdur":7,"tts":851416},{"cat":"v8","pid":25863,"tid":25913,"ts":531360840809,"ph":"E","name":"V8.Execute","args":{},"tts":851452},{"cat":"blink","pid":25863,"tid":25913,"ts":531360840814,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":25,"tdur":24,"tts":851457},{"cat":"blink","pid":25863,"tid":25913,"ts":531360840815,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":851458},{"cat":"blink","pid":25863,"tid":25913,"ts":531360840817,"ph":"X","name":"Document::updateStyle","args":{},"dur":15,"tdur":14,"tts":851460},{"cat":"blink","pid":25863,"tid":25913,"ts":531360840832,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":851475},{"cat":"blink","pid":25863,"tid":25913,"ts":531360840835,"ph":"X","name":"FrameView::invalidateTree","args":{"root":"X:أ&+"},"dur":3,"tdur":3,"tts":851478},{"cat":"sky","pid":25863,"tid":25913,"ts":531360840839,"ph":"X","name":"Layer::Display","args":{},"dur":712,"tdur":711,"tts":851482},{"cat":"sky","pid":25863,"tid":25913,"ts":531360841552,"ph":"X","name":"LayerHost::Upload","args":{},"dur":137,"tdur":85,"tts":852195},{"cat":"sky","pid":25863,"tid":25913,"ts":531360842048,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":988,"tdur":942,"tts":852485},{"cat":"blink","pid":25863,"tid":25913,"ts":531360842051,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":93,"tdur":92,"tts":852488},{"cat":"blink","pid":25863,"tid":25913,"ts":531360842054,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":852491},{"cat":"blink","pid":25863,"tid":25913,"ts":531360842057,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":31,"tdur":30,"tts":852494},{"cat":"blink","pid":25863,"tid":25913,"ts":531360842063,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":24,"tdur":24,"tts":852500},{"cat":"v8","pid":25863,"tid":25913,"ts":531360842075,"ph":"X","name":"v8.callFunction","args":{},"dur":9,"tdur":9,"tts":852512},{"cat":"v8","pid":25863,"tid":25913,"ts":531360842077,"ph":"B","name":"V8.Execute","args":{},"tts":852513},{"cat":"v8","pid":25863,"tid":25913,"ts":531360842083,"ph":"E","name":"V8.Execute","args":{},"tts":852519},{"cat":"v8","pid":25863,"tid":25913,"ts":531360842090,"ph":"X","name":"v8.callFunction","args":{},"dur":52,"tdur":52,"tts":852526},{"cat":"v8","pid":25863,"tid":25913,"ts":531360842091,"ph":"B","name":"V8.Execute","args":{},"tts":852528},{"cat":"blink","pid":25863,"tid":25913,"ts":531360842094,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":9,"tdur":9,"tts":852531},{"cat":"v8","pid":25863,"tid":25913,"ts":531360842139,"ph":"E","name":"V8.Execute","args":{},"tts":852576},{"cat":"blink","pid":25863,"tid":25913,"ts":531360842144,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":28,"tdur":27,"tts":852581},{"cat":"blink","pid":25863,"tid":25913,"ts":531360842146,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":852583},{"cat":"blink","pid":25863,"tid":25913,"ts":531360842147,"ph":"X","name":"Document::updateStyle","args":{},"dur":17,"tdur":16,"tts":852584},{"cat":"blink","pid":25863,"tid":25913,"ts":531360842164,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":852601},{"cat":"blink","pid":25863,"tid":25913,"ts":531360842168,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":3,"tdur":3,"tts":852605},{"cat":"sky","pid":25863,"tid":25913,"ts":531360842172,"ph":"X","name":"Layer::Display","args":{},"dur":730,"tdur":729,"tts":852609},{"cat":"sky","pid":25863,"tid":25913,"ts":531360842903,"ph":"X","name":"LayerHost::Upload","args":{},"dur":132,"tdur":86,"tts":853340},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360843046,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":36,"tdur":36,"tts":853437},{"cat":"blink","pid":25863,"tid":25913,"ts":531360843050,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":27,"tdur":27,"tts":853442},{"cat":"v8","pid":25863,"tid":25913,"ts":531360843053,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":23,"tdur":23,"tts":853444},{"cat":"v8","pid":25863,"tid":25913,"ts":531360843055,"ph":"X","name":"v8.callFunction","args":{},"dur":20,"tdur":19,"tts":853447},{"cat":"v8","pid":25863,"tid":25913,"ts":531360843057,"ph":"B","name":"V8.Execute","args":{},"tts":853448},{"cat":"blink","pid":25863,"tid":25913,"ts":531360843064,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":8,"tts":853456},{"cat":"blink","pid":25863,"tid":25913,"ts":531360843070,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":2,"tdur":2,"tts":853461},{"cat":"v8","pid":25863,"tid":25913,"ts":531360843074,"ph":"E","name":"V8.Execute","args":{},"tts":853465},{"cat":"sky","pid":25863,"tid":25913,"ts":531360843396,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1031,"tdur":969,"tts":853587},{"cat":"blink","pid":25863,"tid":25913,"ts":531360843399,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":91,"tdur":91,"tts":853589},{"cat":"blink","pid":25863,"tid":25913,"ts":531360843402,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":1,"tdur":1,"tts":853592},{"cat":"blink","pid":25863,"tid":25913,"ts":531360843404,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":29,"tdur":28,"tts":853595},{"cat":"blink","pid":25863,"tid":25913,"ts":531360843410,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":23,"tdur":23,"tts":853600},{"cat":"v8","pid":25863,"tid":25913,"ts":531360843421,"ph":"X","name":"v8.callFunction","args":{},"dur":9,"tdur":9,"tts":853611},{"cat":"v8","pid":25863,"tid":25913,"ts":531360843423,"ph":"B","name":"V8.Execute","args":{},"tts":853613},{"cat":"v8","pid":25863,"tid":25913,"ts":531360843428,"ph":"E","name":"V8.Execute","args":{},"tts":853619},{"cat":"v8","pid":25863,"tid":25913,"ts":531360843435,"ph":"X","name":"v8.callFunction","args":{},"dur":53,"tdur":53,"tts":853625},{"cat":"v8","pid":25863,"tid":25913,"ts":531360843446,"ph":"B","name":"V8.Execute","args":{},"tts":853637},{"cat":"blink","pid":25863,"tid":25913,"ts":531360843450,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":9,"tdur":8,"tts":853641},{"cat":"v8","pid":25863,"tid":25913,"ts":531360843486,"ph":"E","name":"V8.Execute","args":{},"tts":853676},{"cat":"blink","pid":25863,"tid":25913,"ts":531360843491,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":27,"tdur":27,"tts":853681},{"cat":"blink","pid":25863,"tid":25913,"ts":531360843493,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":853683},{"cat":"blink","pid":25863,"tid":25913,"ts":531360843494,"ph":"X","name":"Document::updateStyle","args":{},"dur":16,"tdur":16,"tts":853684},{"cat":"blink","pid":25863,"tid":25913,"ts":531360843511,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":853701},{"cat":"blink","pid":25863,"tid":25913,"ts":531360843515,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":3,"tdur":3,"tts":853705},{"cat":"sky","pid":25863,"tid":25913,"ts":531360843519,"ph":"X","name":"Layer::Display","args":{},"dur":774,"tdur":762,"tts":853709},{"cat":"sky","pid":25863,"tid":25913,"ts":531360844293,"ph":"X","name":"LayerHost::Upload","args":{},"dur":133,"tdur":82,"tts":854473},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360844438,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":36,"tdur":36,"tts":854567},{"cat":"blink","pid":25863,"tid":25913,"ts":531360844442,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":27,"tdur":26,"tts":854572},{"cat":"v8","pid":25863,"tid":25913,"ts":531360844445,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":23,"tdur":23,"tts":854574},{"cat":"v8","pid":25863,"tid":25913,"ts":531360844447,"ph":"X","name":"v8.callFunction","args":{},"dur":20,"tdur":19,"tts":854577},{"cat":"v8","pid":25863,"tid":25913,"ts":531360844449,"ph":"B","name":"V8.Execute","args":{},"tts":854578},{"cat":"blink","pid":25863,"tid":25913,"ts":531360844456,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":8,"tts":854586},{"cat":"blink","pid":25863,"tid":25913,"ts":531360844462,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":2,"tdur":2,"tts":854591},{"cat":"v8","pid":25863,"tid":25913,"ts":531360844466,"ph":"E","name":"V8.Execute","args":{},"tts":854595},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360845551,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":50,"tdur":50,"tts":854725},{"cat":"blink","pid":25863,"tid":25913,"ts":531360845555,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":42,"tdur":42,"tts":854729},{"cat":"v8","pid":25863,"tid":25913,"ts":531360845558,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":38,"tdur":39,"tts":854731},{"cat":"v8","pid":25863,"tid":25913,"ts":531360845560,"ph":"X","name":"v8.callFunction","args":{},"dur":35,"tdur":35,"tts":854734},{"cat":"v8","pid":25863,"tid":25913,"ts":531360845561,"ph":"B","name":"V8.Execute","args":{},"tts":854735},{"cat":"blink","pid":25863,"tid":25913,"ts":531360845573,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":20,"tdur":19,"tts":854747},{"cat":"blink","pid":25863,"tid":25913,"ts":531360845590,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":2,"tts":854764},{"cat":"v8","pid":25863,"tid":25913,"ts":531360845594,"ph":"E","name":"V8.Execute","args":{},"tts":854767},{"cat":"sky","pid":25863,"tid":25913,"ts":531360903160,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2097,"tdur":1922,"tts":854848},{"cat":"blink","pid":25863,"tid":25913,"ts":531360903165,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":186,"tdur":186,"tts":854851},{"cat":"blink","pid":25863,"tid":25913,"ts":531360903168,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":1,"tts":854855},{"cat":"blink","pid":25863,"tid":25913,"ts":531360903172,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":42,"tdur":42,"tts":854858},{"cat":"blink","pid":25863,"tid":25913,"ts":531360903185,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":28,"tdur":28,"tts":854871},{"cat":"v8","pid":25863,"tid":25913,"ts":531360903199,"ph":"X","name":"v8.callFunction","args":{},"dur":11,"tdur":11,"tts":854885},{"cat":"v8","pid":25863,"tid":25913,"ts":531360903201,"ph":"B","name":"V8.Execute","args":{},"tts":854887},{"cat":"v8","pid":25863,"tid":25913,"ts":531360903208,"ph":"E","name":"V8.Execute","args":{},"tts":854894},{"cat":"v8","pid":25863,"tid":25913,"ts":531360903231,"ph":"X","name":"v8.callFunction","args":{},"dur":115,"tdur":115,"tts":854917},{"cat":"v8","pid":25863,"tid":25913,"ts":531360903235,"ph":"B","name":"V8.Execute","args":{},"tts":854921},{"cat":"blink","pid":25863,"tid":25913,"ts":531360903243,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":22,"tdur":21,"tts":854930},{"cat":"v8","pid":25863,"tid":25913,"ts":531360903340,"ph":"E","name":"V8.Execute","args":{},"tts":855027},{"cat":"blink","pid":25863,"tid":25913,"ts":531360903352,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":78,"tdur":77,"tts":855039},{"cat":"blink","pid":25863,"tid":25913,"ts":531360903356,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":855043},{"cat":"blink","pid":25863,"tid":25913,"ts":531360903360,"ph":"X","name":"Document::updateStyle","args":{},"dur":39,"tdur":39,"tts":855046},{"cat":"blink","pid":25863,"tid":25913,"ts":531360903400,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":855087},{"cat":"blink","pid":25863,"tid":25913,"ts":531360903409,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":20,"tdur":19,"tts":855096},{"cat":"sky","pid":25863,"tid":25913,"ts":531360903430,"ph":"X","name":"Layer::Display","args":{},"dur":1487,"tdur":1475,"tts":855117},{"cat":"sky","pid":25863,"tid":25913,"ts":531360904919,"ph":"X","name":"LayerHost::Upload","args":{},"dur":336,"tdur":170,"tts":856596},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360905283,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":87,"tdur":86,"tts":856797},{"cat":"blink","pid":25863,"tid":25913,"ts":531360905294,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":66,"tdur":66,"tts":856807},{"cat":"v8","pid":25863,"tid":25913,"ts":531360905299,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":58,"tdur":57,"tts":856813},{"cat":"v8","pid":25863,"tid":25913,"ts":531360905305,"ph":"X","name":"v8.callFunction","args":{},"dur":50,"tdur":49,"tts":856819},{"cat":"v8","pid":25863,"tid":25913,"ts":531360905309,"ph":"B","name":"V8.Execute","args":{},"tts":856823},{"cat":"blink","pid":25863,"tid":25913,"ts":531360905328,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":21,"tdur":21,"tts":856841},{"cat":"blink","pid":25863,"tid":25913,"ts":531360905342,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":6,"tdur":6,"tts":856855},{"cat":"v8","pid":25863,"tid":25913,"ts":531360905351,"ph":"E","name":"V8.Execute","args":{},"tts":856864},{"cat":"sky","pid":25863,"tid":25913,"ts":531360906096,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2411,"tdur":2259,"tts":857256},{"cat":"blink","pid":25863,"tid":25913,"ts":531360906105,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":232,"tdur":231,"tts":857263},{"cat":"blink","pid":25863,"tid":25913,"ts":531360906112,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":3,"tdur":3,"tts":857270},{"cat":"blink","pid":25863,"tid":25913,"ts":531360906119,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":75,"tdur":74,"tts":857277},{"cat":"blink","pid":25863,"tid":25913,"ts":531360906134,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":59,"tdur":58,"tts":857292},{"cat":"v8","pid":25863,"tid":25913,"ts":531360906162,"ph":"X","name":"v8.callFunction","args":{},"dur":24,"tdur":22,"tts":857321},{"cat":"v8","pid":25863,"tid":25913,"ts":531360906167,"ph":"B","name":"V8.Execute","args":{},"tts":857325},{"cat":"v8","pid":25863,"tid":25913,"ts":531360906181,"ph":"E","name":"V8.Execute","args":{},"tts":857340},{"cat":"v8","pid":25863,"tid":25913,"ts":531360906198,"ph":"X","name":"v8.callFunction","args":{},"dur":133,"tdur":132,"tts":857357},{"cat":"v8","pid":25863,"tid":25913,"ts":531360906202,"ph":"B","name":"V8.Execute","args":{},"tts":857360},{"cat":"blink","pid":25863,"tid":25913,"ts":531360906210,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":38,"tdur":37,"tts":857368},{"cat":"v8","pid":25863,"tid":25913,"ts":531360906325,"ph":"E","name":"V8.Execute","args":{},"tts":857484},{"cat":"blink","pid":25863,"tid":25913,"ts":531360906338,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":66,"tdur":66,"tts":857496},{"cat":"blink","pid":25863,"tid":25913,"ts":531360906342,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":857500},{"cat":"blink","pid":25863,"tid":25913,"ts":531360906345,"ph":"X","name":"Document::updateStyle","args":{},"dur":40,"tdur":39,"tts":857503},{"cat":"blink","pid":25863,"tid":25913,"ts":531360906386,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":857544},{"cat":"blink","pid":25863,"tid":25913,"ts":531360906395,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":8,"tdur":8,"tts":857553},{"cat":"sky","pid":25863,"tid":25913,"ts":531360906406,"ph":"X","name":"Layer::Display","args":{},"dur":1776,"tdur":1774,"tts":857564},{"cat":"sky","pid":25863,"tid":25913,"ts":531360908184,"ph":"X","name":"LayerHost::Upload","args":{},"dur":321,"tdur":170,"tts":859342},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360908534,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":87,"tdur":86,"tts":859543},{"cat":"blink","pid":25863,"tid":25913,"ts":531360908545,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":66,"tdur":65,"tts":859554},{"cat":"v8","pid":25863,"tid":25913,"ts":531360908550,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":58,"tdur":57,"tts":859559},{"cat":"v8","pid":25863,"tid":25913,"ts":531360908557,"ph":"X","name":"v8.callFunction","args":{},"dur":49,"tdur":48,"tts":859566},{"cat":"v8","pid":25863,"tid":25913,"ts":531360908561,"ph":"B","name":"V8.Execute","args":{},"tts":859569},{"cat":"blink","pid":25863,"tid":25913,"ts":531360908579,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":21,"tdur":20,"tts":859588},{"cat":"blink","pid":25863,"tid":25913,"ts":531360908593,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":6,"tdur":5,"tts":859602},{"cat":"v8","pid":25863,"tid":25913,"ts":531360908602,"ph":"E","name":"V8.Execute","args":{},"tts":859611},{"cat":"sky","pid":25863,"tid":25913,"ts":531360909328,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2383,"tdur":2255,"tts":860001},{"cat":"blink","pid":25863,"tid":25913,"ts":531360909337,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":222,"tdur":222,"tts":860008},{"cat":"blink","pid":25863,"tid":25913,"ts":531360909344,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":4,"tdur":3,"tts":860015},{"cat":"blink","pid":25863,"tid":25913,"ts":531360909351,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":85,"tdur":85,"tts":860022},{"cat":"blink","pid":25863,"tid":25913,"ts":531360909376,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":59,"tdur":57,"tts":860048},{"cat":"v8","pid":25863,"tid":25913,"ts":531360909405,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":21,"tts":860077},{"cat":"v8","pid":25863,"tid":25913,"ts":531360909409,"ph":"B","name":"V8.Execute","args":{},"tts":860081},{"cat":"v8","pid":25863,"tid":25913,"ts":531360909424,"ph":"E","name":"V8.Execute","args":{},"tts":860095},{"cat":"v8","pid":25863,"tid":25913,"ts":531360909441,"ph":"X","name":"v8.callFunction","args":{},"dur":113,"tdur":113,"tts":860112},{"cat":"v8","pid":25863,"tid":25913,"ts":531360909444,"ph":"B","name":"V8.Execute","args":{},"tts":860115},{"cat":"blink","pid":25863,"tid":25913,"ts":531360909452,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":22,"tdur":21,"tts":860123},{"cat":"v8","pid":25863,"tid":25913,"ts":531360909548,"ph":"E","name":"V8.Execute","args":{},"tts":860220},{"cat":"blink","pid":25863,"tid":25913,"ts":531360909560,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":66,"tdur":66,"tts":860231},{"cat":"blink","pid":25863,"tid":25913,"ts":531360909564,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":860236},{"cat":"blink","pid":25863,"tid":25913,"ts":531360909567,"ph":"X","name":"Document::updateStyle","args":{},"dur":40,"tdur":38,"tts":860239},{"cat":"blink","pid":25863,"tid":25913,"ts":531360909608,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":860279},{"cat":"blink","pid":25863,"tid":25913,"ts":531360909617,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":8,"tdur":7,"tts":860288},{"cat":"sky","pid":25863,"tid":25913,"ts":531360909628,"ph":"X","name":"Layer::Display","args":{},"dur":1773,"tdur":1771,"tts":860299},{"cat":"sky","pid":25863,"tid":25913,"ts":531360911403,"ph":"X","name":"LayerHost::Upload","args":{},"dur":306,"tdur":178,"tts":862075},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360911737,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":86,"tdur":86,"tts":862283},{"cat":"blink","pid":25863,"tid":25913,"ts":531360911748,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":66,"tdur":65,"tts":862294},{"cat":"v8","pid":25863,"tid":25913,"ts":531360911753,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":58,"tdur":57,"tts":862299},{"cat":"v8","pid":25863,"tid":25913,"ts":531360911759,"ph":"X","name":"v8.callFunction","args":{},"dur":49,"tdur":49,"tts":862305},{"cat":"v8","pid":25863,"tid":25913,"ts":531360911763,"ph":"B","name":"V8.Execute","args":{},"tts":862309},{"cat":"blink","pid":25863,"tid":25913,"ts":531360911781,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":21,"tdur":20,"tts":862328},{"cat":"blink","pid":25863,"tid":25913,"ts":531360911795,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":6,"tdur":5,"tts":862341},{"cat":"v8","pid":25863,"tid":25913,"ts":531360911804,"ph":"E","name":"V8.Execute","args":{},"tts":862350},{"cat":"sky","pid":25863,"tid":25913,"ts":531360912432,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":3656,"tdur":3518,"tts":862602},{"cat":"blink","pid":25863,"tid":25913,"ts":531360912438,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":787,"tdur":786,"tts":862608},{"cat":"blink","pid":25863,"tid":25913,"ts":531360912444,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":3,"tdur":2,"tts":862614},{"cat":"blink","pid":25863,"tid":25913,"ts":531360912450,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":68,"tdur":67,"tts":862620},{"cat":"blink","pid":25863,"tid":25913,"ts":531360912463,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":54,"tdur":54,"tts":862632},{"cat":"v8","pid":25863,"tid":25913,"ts":531360912488,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":22,"tts":862658},{"cat":"v8","pid":25863,"tid":25913,"ts":531360912492,"ph":"B","name":"V8.Execute","args":{},"tts":862662},{"cat":"v8","pid":25863,"tid":25913,"ts":531360912507,"ph":"E","name":"V8.Execute","args":{},"tts":862676},{"cat":"v8","pid":25863,"tid":25913,"ts":531360912522,"ph":"X","name":"v8.callFunction","args":{},"dur":696,"tdur":694,"tts":862692},{"cat":"v8","pid":25863,"tid":25913,"ts":531360912526,"ph":"B","name":"V8.Execute","args":{},"tts":862695},{"cat":"blink","pid":25863,"tid":25913,"ts":531360912534,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":21,"tdur":20,"tts":862704},{"cat":"v8","pid":25863,"tid":25913,"ts":531360912653,"ph":"B","name":"V8.ParseLazy","args":{},"tts":862824},{"cat":"v8","pid":25863,"tid":25913,"ts":531360912755,"ph":"E","name":"V8.ParseLazy","args":{},"tts":862925},{"cat":"v8","pid":25863,"tid":25913,"ts":531360912775,"ph":"B","name":"V8.RecompileSynchronous","args":{},"tts":862945},{"cat":"v8","pid":25863,"tid":25913,"ts":531360912780,"ph":"B","name":"V8.CompileFullCode","args":{},"tts":862950},{"cat":"v8","pid":25863,"tid":25913,"ts":531360912875,"ph":"E","name":"V8.CompileFullCode","args":{},"tts":863046},{"cat":"v8","pid":25863,"tid":25913,"ts":531360913004,"ph":"E","name":"V8.RecompileSynchronous","args":{},"tts":863174},{"cat":"v8","pid":25863,"tid":25913,"ts":531360913133,"ph":"E","name":"V8.Execute","args":{},"tts":863304},{"cat":"blink","pid":25863,"tid":25913,"ts":531360913226,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":775,"tdur":774,"tts":863396},{"cat":"blink","pid":25863,"tid":25913,"ts":531360913232,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":863402},{"cat":"blink","pid":25863,"tid":25913,"ts":531360913236,"ph":"X","name":"Document::updateStyle","args":{},"dur":121,"tdur":120,"tts":863406},{"cat":"blink","pid":25863,"tid":25913,"ts":531360913359,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":4},"tts":863529},{"cat":"blink","pid":25863,"tid":25913,"ts":531360913364,"ph":"X","name":"FrameView::layout","args":{},"dur":150,"tdur":149,"tts":863534},{"cat":"blink","pid":25863,"tid":25913,"ts":531360913367,"ph":"X","name":"FrameView::performPreLayoutTasks","args":{},"dur":4,"tdur":3,"tts":863537},{"cat":"blink","pid":25863,"tid":25913,"ts":531360913372,"ph":"X","name":"FrameView::performLayout","args":{},"dur":120,"tdur":118,"tts":863542},{"cat":"blink","pid":25863,"tid":25913,"ts":531360913494,"ph":"X","name":"RenderLayer::updateLayerPositionsAfterLayout","args":{},"dur":6,"tdur":5,"tts":863664},{"cat":"blink","pid":25863,"tid":25913,"ts":531360913500,"ph":"X","name":"FrameView::performPostLayoutTasks","args":{},"dur":11,"tdur":10,"tts":863670},{"cat":"blink","pid":25863,"tid":25913,"ts":531360913520,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":479,"tdur":478,"tts":863690},{"cat":"sky","pid":25863,"tid":25913,"ts":531360914003,"ph":"X","name":"Layer::Display","args":{},"dur":1794,"tdur":1792,"tts":864173},{"cat":"sky","pid":25863,"tid":25913,"ts":531360915799,"ph":"X","name":"LayerHost::Upload","args":{},"dur":288,"tdur":149,"tts":865970},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360916100,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":133,"tdur":133,"tts":866132},{"cat":"blink","pid":25863,"tid":25913,"ts":531360916104,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":124,"tdur":123,"tts":866137},{"cat":"v8","pid":25863,"tid":25913,"ts":531360916107,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":119,"tdur":120,"tts":866139},{"cat":"v8","pid":25863,"tid":25913,"ts":531360916109,"ph":"X","name":"v8.callFunction","args":{},"dur":116,"tdur":115,"tts":866142},{"cat":"v8","pid":25863,"tid":25913,"ts":531360916111,"ph":"B","name":"V8.Execute","args":{},"tts":866144},{"cat":"v8","pid":25863,"tid":25913,"ts":531360916117,"ph":"B","name":"V8.RecompileSynchronous","args":{},"tts":866149},{"cat":"v8","pid":25863,"tid":25913,"ts":531360916191,"ph":"E","name":"V8.RecompileSynchronous","args":{},"tts":866224},{"cat":"blink","pid":25863,"tid":25913,"ts":531360916213,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":9,"tdur":9,"tts":866245},{"cat":"blink","pid":25863,"tid":25913,"ts":531360916219,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":866251},{"cat":"v8","pid":25863,"tid":25913,"ts":531360916223,"ph":"E","name":"V8.Execute","args":{},"tts":866256},{"cat":"sky","pid":25863,"tid":25913,"ts":531360971272,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1688,"tdur":1515,"tts":866471},{"cat":"blink","pid":25863,"tid":25913,"ts":531360971277,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":102,"tdur":103,"tts":866475},{"cat":"blink","pid":25863,"tid":25913,"ts":531360971280,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":2,"tdur":2,"tts":866478},{"cat":"blink","pid":25863,"tid":25913,"ts":531360971283,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":37,"tdur":36,"tts":866482},{"cat":"blink","pid":25863,"tid":25913,"ts":531360971291,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":28,"tdur":28,"tts":866490},{"cat":"v8","pid":25863,"tid":25913,"ts":531360971305,"ph":"X","name":"v8.callFunction","args":{},"dur":11,"tdur":11,"tts":866503},{"cat":"v8","pid":25863,"tid":25913,"ts":531360971307,"ph":"B","name":"V8.Execute","args":{},"tts":866505},{"cat":"v8","pid":25863,"tid":25913,"ts":531360971314,"ph":"E","name":"V8.Execute","args":{},"tts":866513},{"cat":"v8","pid":25863,"tid":25913,"ts":531360971322,"ph":"X","name":"v8.callFunction","args":{},"dur":55,"tdur":54,"tts":866521},{"cat":"v8","pid":25863,"tid":25913,"ts":531360971324,"ph":"B","name":"V8.Execute","args":{},"tts":866522},{"cat":"blink","pid":25863,"tid":25913,"ts":531360971328,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":10,"tdur":10,"tts":866526},{"cat":"v8","pid":25863,"tid":25913,"ts":531360971374,"ph":"E","name":"V8.Execute","args":{},"tts":866573},{"cat":"blink","pid":25863,"tid":25913,"ts":531360971380,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":48,"tdur":49,"tts":866578},{"cat":"blink","pid":25863,"tid":25913,"ts":531360971382,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":866580},{"cat":"blink","pid":25863,"tid":25913,"ts":531360971383,"ph":"X","name":"Document::updateStyle","args":{},"dur":36,"tdur":35,"tts":866582},{"cat":"blink","pid":25863,"tid":25913,"ts":531360971419,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":866618},{"cat":"blink","pid":25863,"tid":25913,"ts":531360971424,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":4,"tdur":3,"tts":866623},{"cat":"sky","pid":25863,"tid":25913,"ts":531360971429,"ph":"X","name":"Layer::Display","args":{},"dur":1217,"tdur":1203,"tts":866628},{"cat":"sky","pid":25863,"tid":25913,"ts":531360972648,"ph":"X","name":"LayerHost::Upload","args":{},"dur":310,"tdur":147,"tts":867836},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360972986,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":87,"tdur":86,"tts":868014},{"cat":"blink","pid":25863,"tid":25913,"ts":531360972997,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":67,"tdur":66,"tts":868024},{"cat":"v8","pid":25863,"tid":25913,"ts":531360973003,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":58,"tdur":57,"tts":868030},{"cat":"v8","pid":25863,"tid":25913,"ts":531360973009,"ph":"X","name":"v8.callFunction","args":{},"dur":50,"tdur":49,"tts":868036},{"cat":"v8","pid":25863,"tid":25913,"ts":531360973013,"ph":"B","name":"V8.Execute","args":{},"tts":868040},{"cat":"blink","pid":25863,"tid":25913,"ts":531360973031,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":21,"tdur":21,"tts":868058},{"cat":"blink","pid":25863,"tid":25913,"ts":531360973045,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":6,"tdur":6,"tts":868072},{"cat":"v8","pid":25863,"tid":25913,"ts":531360973055,"ph":"E","name":"V8.Execute","args":{},"tts":868082},{"cat":"sky","pid":25863,"tid":25913,"ts":531360973765,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2267,"tdur":2145,"tts":868459},{"cat":"blink","pid":25863,"tid":25913,"ts":531360973774,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":214,"tdur":212,"tts":868467},{"cat":"blink","pid":25863,"tid":25913,"ts":531360973781,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":3,"tdur":3,"tts":868473},{"cat":"blink","pid":25863,"tid":25913,"ts":531360973788,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":76,"tdur":76,"tts":868480},{"cat":"blink","pid":25863,"tid":25913,"ts":531360973804,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":59,"tdur":58,"tts":868497},{"cat":"v8","pid":25863,"tid":25913,"ts":531360973833,"ph":"X","name":"v8.callFunction","args":{},"dur":23,"tdur":22,"tts":868526},{"cat":"v8","pid":25863,"tid":25913,"ts":531360973837,"ph":"B","name":"V8.Execute","args":{},"tts":868530},{"cat":"v8","pid":25863,"tid":25913,"ts":531360973852,"ph":"E","name":"V8.Execute","args":{},"tts":868544},{"cat":"v8","pid":25863,"tid":25913,"ts":531360973869,"ph":"X","name":"v8.callFunction","args":{},"dur":114,"tdur":114,"tts":868561},{"cat":"v8","pid":25863,"tid":25913,"ts":531360973872,"ph":"B","name":"V8.Execute","args":{},"tts":868565},{"cat":"blink","pid":25863,"tid":25913,"ts":531360973881,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":21,"tdur":20,"tts":868573},{"cat":"v8","pid":25863,"tid":25913,"ts":531360973976,"ph":"E","name":"V8.Execute","args":{},"tts":868670},{"cat":"blink","pid":25863,"tid":25913,"ts":531360973989,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":66,"tdur":65,"tts":868681},{"cat":"blink","pid":25863,"tid":25913,"ts":531360973993,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":868685},{"cat":"blink","pid":25863,"tid":25913,"ts":531360973996,"ph":"X","name":"Document::updateStyle","args":{},"dur":40,"tdur":39,"tts":868688},{"cat":"blink","pid":25863,"tid":25913,"ts":531360974036,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":868729},{"cat":"blink","pid":25863,"tid":25913,"ts":531360974045,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":8,"tdur":7,"tts":868738},{"cat":"sky","pid":25863,"tid":25913,"ts":531360974056,"ph":"X","name":"Layer::Display","args":{},"dur":1741,"tdur":1738,"tts":868749},{"cat":"sky","pid":25863,"tid":25913,"ts":531360975799,"ph":"X","name":"LayerHost::Upload","args":{},"dur":233,"tdur":111,"tts":870492},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360976044,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":80,"tdur":80,"tts":870615},{"cat":"blink","pid":25863,"tid":25913,"ts":531360976048,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":66,"tdur":66,"tts":870619},{"cat":"v8","pid":25863,"tid":25913,"ts":531360976050,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":61,"tdur":60,"tts":870621},{"cat":"v8","pid":25863,"tid":25913,"ts":531360976053,"ph":"X","name":"v8.callFunction","args":{},"dur":55,"tdur":55,"tts":870624},{"cat":"v8","pid":25863,"tid":25913,"ts":531360976054,"ph":"B","name":"V8.Execute","args":{},"tts":870626},{"cat":"blink","pid":25863,"tid":25913,"ts":531360976082,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":20,"tdur":19,"tts":870654},{"cat":"blink","pid":25863,"tid":25913,"ts":531360976095,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":6,"tdur":5,"tts":870667},{"cat":"v8","pid":25863,"tid":25913,"ts":531360976104,"ph":"E","name":"V8.Execute","args":{},"tts":870676},{"cat":"sky","pid":25863,"tid":25913,"ts":531360976839,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":2367,"tdur":2225,"tts":870976},{"cat":"blink","pid":25863,"tid":25913,"ts":531360976848,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":211,"tdur":210,"tts":870984},{"cat":"blink","pid":25863,"tid":25913,"ts":531360976855,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":3,"tdur":3,"tts":870990},{"cat":"blink","pid":25863,"tid":25913,"ts":531360976862,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":75,"tdur":75,"tts":870997},{"cat":"blink","pid":25863,"tid":25913,"ts":531360976877,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":59,"tdur":58,"tts":871013},{"cat":"v8","pid":25863,"tid":25913,"ts":531360976906,"ph":"X","name":"v8.callFunction","args":{},"dur":22,"tdur":21,"tts":871042},{"cat":"v8","pid":25863,"tid":25913,"ts":531360976910,"ph":"B","name":"V8.Execute","args":{},"tts":871046},{"cat":"v8","pid":25863,"tid":25913,"ts":531360976924,"ph":"E","name":"V8.Execute","args":{},"tts":871060},{"cat":"v8","pid":25863,"tid":25913,"ts":531360976941,"ph":"X","name":"v8.callFunction","args":{},"dur":113,"tdur":112,"tts":871077},{"cat":"v8","pid":25863,"tid":25913,"ts":531360976945,"ph":"B","name":"V8.Execute","args":{},"tts":871080},{"cat":"blink","pid":25863,"tid":25913,"ts":531360976953,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":21,"tdur":20,"tts":871089},{"cat":"v8","pid":25863,"tid":25913,"ts":531360977048,"ph":"E","name":"V8.Execute","args":{},"tts":871185},{"cat":"blink","pid":25863,"tid":25913,"ts":531360977060,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":66,"tdur":65,"tts":871196},{"cat":"blink","pid":25863,"tid":25913,"ts":531360977064,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":871200},{"cat":"blink","pid":25863,"tid":25913,"ts":531360977067,"ph":"X","name":"Document::updateStyle","args":{},"dur":40,"tdur":39,"tts":871203},{"cat":"blink","pid":25863,"tid":25913,"ts":531360977108,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":1},"tts":871244},{"cat":"blink","pid":25863,"tid":25913,"ts":531360977117,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":8,"tdur":7,"tts":871253},{"cat":"sky","pid":25863,"tid":25913,"ts":531360977128,"ph":"X","name":"Layer::Display","args":{},"dur":1798,"tdur":1797,"tts":871263},{"cat":"sky","pid":25863,"tid":25913,"ts":531360978928,"ph":"X","name":"LayerHost::Upload","args":{},"dur":276,"tdur":135,"tts":873064},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360979231,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":81,"tdur":80,"tts":873227},{"cat":"blink","pid":25863,"tid":25913,"ts":531360979240,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":63,"tdur":62,"tts":873236},{"cat":"v8","pid":25863,"tid":25913,"ts":531360979246,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":54,"tdur":53,"tts":873242},{"cat":"v8","pid":25863,"tid":25913,"ts":531360979251,"ph":"X","name":"v8.callFunction","args":{},"dur":47,"tdur":46,"tts":873247},{"cat":"v8","pid":25863,"tid":25913,"ts":531360979255,"ph":"B","name":"V8.Execute","args":{},"tts":873251},{"cat":"blink","pid":25863,"tid":25913,"ts":531360979272,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":20,"tdur":19,"tts":873268},{"cat":"blink","pid":25863,"tid":25913,"ts":531360979285,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":6,"tdur":5,"tts":873281},{"cat":"v8","pid":25863,"tid":25913,"ts":531360979294,"ph":"E","name":"V8.Execute","args":{},"tts":873290},{"cat":"sky","pid":25863,"tid":25913,"ts":531360979878,"ph":"X","name":"LayerHost::BeginFrame","args":{},"dur":1756,"tdur":1586,"tts":873528},{"cat":"blink","pid":25863,"tid":25913,"ts":531360979883,"ph":"X","name":"WebViewImpl::beginFrame","args":{},"dur":234,"tdur":215,"tts":873533},{"cat":"blink","pid":25863,"tid":25913,"ts":531360979888,"ph":"X","name":"AnimationTimeline::serviceAnimations","args":{},"dur":4,"tdur":3,"tts":873538},{"cat":"blink","pid":25863,"tid":25913,"ts":531360979894,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":74,"tdur":73,"tts":873544},{"cat":"blink","pid":25863,"tid":25913,"ts":531360979916,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":51,"tdur":49,"tts":873567},{"cat":"v8","pid":25863,"tid":25913,"ts":531360979939,"ph":"X","name":"v8.callFunction","args":{},"dur":21,"tdur":20,"tts":873590},{"cat":"v8","pid":25863,"tid":25913,"ts":531360979944,"ph":"B","name":"V8.Execute","args":{},"tts":873594},{"cat":"v8","pid":25863,"tid":25913,"ts":531360979957,"ph":"E","name":"V8.Execute","args":{},"tts":873607},{"cat":"v8","pid":25863,"tid":25913,"ts":531360979972,"ph":"X","name":"v8.callFunction","args":{},"dur":142,"tdur":123,"tts":873623},{"cat":"v8","pid":25863,"tid":25913,"ts":531360979976,"ph":"B","name":"V8.Execute","args":{},"tts":873626},{"cat":"blink","pid":25863,"tid":25913,"ts":531360979984,"ph":"X","name":"ScrollableArea::scrollPositionChanged","args":{},"dur":53,"tdur":34,"tts":873634},{"cat":"v8","pid":25863,"tid":25913,"ts":531360980111,"ph":"E","name":"V8.Execute","args":{},"tts":873743},{"cat":"blink","pid":25863,"tid":25913,"ts":531360980117,"ph":"X","name":"WebViewImpl::layout","args":{},"dur":332,"tdur":332,"tts":873749},{"cat":"blink","pid":25863,"tid":25913,"ts":531360980119,"ph":"B","name":"Document::updateRenderTree","args":{},"tts":873751},{"cat":"blink","pid":25863,"tid":25913,"ts":531360980121,"ph":"X","name":"Document::updateStyle","args":{},"dur":61,"tdur":60,"tts":873753},{"cat":"blink","pid":25863,"tid":25913,"ts":531360980183,"ph":"E","name":"Document::updateRenderTree","args":{"elementCount":2},"tts":873815},{"cat":"blink","pid":25863,"tid":25913,"ts":531360980186,"ph":"X","name":"FrameView::layout","args":{},"dur":29,"tdur":28,"tts":873818},{"cat":"blink","pid":25863,"tid":25913,"ts":531360980187,"ph":"X","name":"FrameView::performPreLayoutTasks","args":{},"dur":2,"tdur":1,"tts":873819},{"cat":"blink","pid":25863,"tid":25913,"ts":531360980189,"ph":"X","name":"FrameView::performLayout","args":{},"dur":17,"tdur":16,"tts":873821},{"cat":"blink","pid":25863,"tid":25913,"ts":531360980206,"ph":"X","name":"RenderLayer::updateLayerPositionsAfterLayout","args":{},"dur":3,"tdur":2,"tts":873838},{"cat":"blink","pid":25863,"tid":25913,"ts":531360980209,"ph":"X","name":"FrameView::performPostLayoutTasks","args":{},"dur":4,"tdur":4,"tts":873841},{"cat":"blink","pid":25863,"tid":25913,"ts":531360980217,"ph":"X","name":"FrameView::invalidateTree","args":{"root":""},"dur":232,"tdur":231,"tts":873849},{"cat":"sky","pid":25863,"tid":25913,"ts":531360980450,"ph":"X","name":"Layer::Display","args":{},"dur":886,"tdur":885,"tts":874082},{"cat":"sky","pid":25863,"tid":25913,"ts":531360981337,"ph":"X","name":"LayerHost::Upload","args":{},"dur":296,"tdur":142,"tts":874970},{"cat":"toplevel","pid":25863,"tid":25913,"ts":531360981647,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../sky/viewer/platform/platform_impl.cc","src_func":"setSharedTimerFireInterval"},"dur":50,"tdur":50,"tts":875127},{"cat":"blink","pid":25863,"tid":25913,"ts":531360981653,"ph":"X","name":"ThreadTimers::sharedTimerFiredInternal","args":{"src_file":"../../sky/engine/core/frame/DOMTimer.cpp","src_func":"DOMTimer"},"dur":38,"tdur":38,"tts":875133},{"cat":"v8","pid":25863,"tid":25913,"ts":531360981655,"ph":"X","name":"ScheduledAction::execute","args":{},"dur":35,"tdur":34,"tts":875135},{"cat":"v8","pid":25863,"tid":25913,"ts":531360981658,"ph":"X","name":"v8.callFunction","args":{},"dur":31,"tdur":29,"tts":875139},{"cat":"v8","pid":25863,"tid":25913,"ts":531360981663,"ph":"B","name":"V8.Execute","args":{},"tts":875144},{"cat":"blink","pid":25863,"tid":25913,"ts":531360981676,"ph":"X","name":"EventDispatcher::dispatchEvent","args":{},"dur":10,"tdur":9,"tts":875156},{"cat":"blink","pid":25863,"tid":25913,"ts":531360981682,"ph":"X","name":"EventDispatcher::dispatch","args":{},"dur":3,"tdur":3,"tts":875162},{"cat":"v8","pid":25863,"tid":25913,"ts":531360981687,"ph":"E","name":"V8.Execute","args":{},"tts":875167},{"cat":"__metadata","pid":25863,"tid":25913,"ts":0,"ph":"M","name":"overhead","args":{"average_overhead":0.002081478081248566}},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358200202,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":53,"tdur":47,"tts":77652},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358200264,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":375,"tdur":212,"tts":77709},{"cat":"cc","pid":25863,"tid":25871,"ts":531358200267,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":199,"tdur":100,"tts":77712},{"cat":"cc","pid":25863,"tid":25871,"ts":531358200288,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":13,"tdur":12,"tts":77734},{"cat":"cc","pid":25863,"tid":25871,"ts":531358200467,"ph":"X","name":"Display::Draw","args":{},"dur":170,"tdur":105,"tts":77814},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358200472,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":77819,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358200478,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":19,"tdur":19,"tts":77825},{"cat":"cc","pid":25863,"tid":25871,"ts":531358200481,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":6,"tdur":6,"tts":77828},{"cat":"cc","pid":25863,"tid":25871,"ts":531358200487,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":8,"tdur":7,"tts":77835},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358200497,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":131,"tdur":65,"tts":77845},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358201963,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":17,"tdur":15,"tts":78007},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358201987,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":330,"tdur":186,"tts":78030},{"cat":"cc","pid":25863,"tid":25871,"ts":531358201990,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":165,"tdur":92,"tts":78032},{"cat":"cc","pid":25863,"tid":25871,"ts":531358202007,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":11,"tdur":11,"tts":78049},{"cat":"cc","pid":25863,"tid":25871,"ts":531358202156,"ph":"X","name":"Display::Draw","args":{},"dur":159,"tdur":88,"tts":78127},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358202160,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":78131,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358202165,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":16,"tdur":15,"tts":78136},{"cat":"cc","pid":25863,"tid":25871,"ts":531358202168,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":5,"tts":78138},{"cat":"cc","pid":25863,"tid":25871,"ts":531358202173,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":7,"tdur":6,"tts":78144},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358202182,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":124,"tdur":53,"tts":78152},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358203627,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":16,"tdur":15,"tts":78302},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358203651,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":251,"tdur":194,"tts":78325},{"cat":"cc","pid":25863,"tid":25871,"ts":531358203653,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":125,"tdur":90,"tts":78327},{"cat":"cc","pid":25863,"tid":25871,"ts":531358203670,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":12,"tdur":11,"tts":78344},{"cat":"cc","pid":25863,"tid":25871,"ts":531358203779,"ph":"X","name":"Display::Draw","args":{},"dur":121,"tdur":98,"tts":78419},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358203784,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":78424,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358203789,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":16,"tdur":16,"tts":78429},{"cat":"cc","pid":25863,"tid":25871,"ts":531358203791,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":6,"tdur":5,"tts":78431},{"cat":"cc","pid":25863,"tid":25871,"ts":531358203797,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":6,"tts":78437},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358203805,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":85,"tdur":62,"tts":78445},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358205121,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":21,"tdur":20,"tts":78605},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358205163,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":80414,"tdur":569,"tts":78646},{"cat":"cc","pid":25863,"tid":25871,"ts":531358205166,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":147,"tdur":94,"tts":78649},{"cat":"cc","pid":25863,"tid":25871,"ts":531358205183,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":11,"tdur":10,"tts":78667},{"cat":"cc","pid":25863,"tid":25871,"ts":531358205315,"ph":"X","name":"Display::Draw","args":{},"dur":80248,"tdur":456,"tts":78745},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358205319,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":78750,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358205325,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":16,"tdur":16,"tts":78755},{"cat":"cc","pid":25863,"tid":25871,"ts":531358205327,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":6,"tdur":5,"tts":78758},{"cat":"cc","pid":25863,"tid":25871,"ts":531358205333,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":6,"tts":78764},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358205342,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":80091,"tdur":299,"tts":78772},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358290877,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":21,"tdur":20,"tts":79354},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358290905,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":392,"tdur":240,"tts":79382},{"cat":"cc","pid":25863,"tid":25871,"ts":531358290909,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":190,"tdur":110,"tts":79385},{"cat":"cc","pid":25863,"tid":25871,"ts":531358290940,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":16,"tdur":16,"tts":79416},{"cat":"cc","pid":25863,"tid":25871,"ts":531358291100,"ph":"X","name":"Display::Draw","args":{},"dur":196,"tdur":124,"tts":79497},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358291104,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":79501,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358291110,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":53,"tdur":53,"tts":79507},{"cat":"cc","pid":25863,"tid":25871,"ts":531358291112,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":28,"tdur":27,"tts":79510},{"cat":"cc","pid":25863,"tid":25871,"ts":531358291141,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":20,"tdur":19,"tts":79538},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358291163,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":125,"tdur":53,"tts":79560},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358292415,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":18,"tdur":17,"tts":79698},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358292439,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":269,"tdur":167,"tts":79722},{"cat":"cc","pid":25863,"tid":25871,"ts":531358292441,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":135,"tdur":83,"tts":79724},{"cat":"cc","pid":25863,"tid":25871,"ts":531358292455,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":8,"tdur":8,"tts":79738},{"cat":"cc","pid":25863,"tid":25871,"ts":531358292576,"ph":"X","name":"Display::Draw","args":{},"dur":131,"tdur":80,"tts":79808},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358292580,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":79812,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358292584,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":13,"tdur":13,"tts":79816},{"cat":"cc","pid":25863,"tid":25871,"ts":531358292586,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":4,"tts":79818},{"cat":"cc","pid":25863,"tid":25871,"ts":531358292591,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":5,"tts":79823},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358292598,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":101,"tdur":50,"tts":79830},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358293806,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":18,"tdur":17,"tts":79961},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358293831,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":276,"tdur":163,"tts":79985},{"cat":"cc","pid":25863,"tid":25871,"ts":531358293833,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":107,"tdur":71,"tts":79987},{"cat":"cc","pid":25863,"tid":25871,"ts":531358293846,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":8,"tdur":7,"tts":80001},{"cat":"cc","pid":25863,"tid":25871,"ts":531358293941,"ph":"X","name":"Display::Draw","args":{},"dur":165,"tdur":87,"tts":80060},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358293956,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":80075,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358293959,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":13,"tdur":13,"tts":80078},{"cat":"cc","pid":25863,"tid":25871,"ts":531358293961,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":4,"tdur":4,"tts":80080},{"cat":"cc","pid":25863,"tid":25871,"ts":531358293966,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":4,"tts":80085},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358293973,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":125,"tdur":48,"tts":80091},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358296041,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":19,"tdur":17,"tts":80222},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358296066,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":57961,"tdur":253,"tts":80246},{"cat":"cc","pid":25863,"tid":25871,"ts":531358296068,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":150,"tdur":81,"tts":80248},{"cat":"cc","pid":25863,"tid":25871,"ts":531358296082,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":8,"tdur":8,"tts":80262},{"cat":"cc","pid":25863,"tid":25871,"ts":531358296218,"ph":"X","name":"Display::Draw","args":{},"dur":57808,"tdur":167,"tts":80331},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358296222,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":80335,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358296227,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":13,"tdur":13,"tts":80339},{"cat":"cc","pid":25863,"tid":25871,"ts":531358296228,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":4,"tts":80341},{"cat":"cc","pid":25863,"tid":25871,"ts":531358296233,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":5,"tts":80346},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358296240,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":57777,"tdur":135,"tts":80353},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358356341,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":16,"tdur":14,"tts":80631},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358356364,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":347,"tdur":190,"tts":80653},{"cat":"cc","pid":25863,"tid":25871,"ts":531358356366,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":184,"tdur":93,"tts":80655},{"cat":"cc","pid":25863,"tid":25871,"ts":531358356382,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":11,"tdur":11,"tts":80671},{"cat":"cc","pid":25863,"tid":25871,"ts":531358356551,"ph":"X","name":"Display::Draw","args":{},"dur":158,"tdur":91,"tts":80750},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358356556,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":80754,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358356561,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":15,"tdur":15,"tts":80759},{"cat":"cc","pid":25863,"tid":25871,"ts":531358356563,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":5,"tts":80761},{"cat":"cc","pid":25863,"tid":25871,"ts":531358356568,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":5,"tts":80767},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358356576,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":124,"tdur":57,"tts":80775},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358357935,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":16,"tdur":15,"tts":80934},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358357958,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":337,"tdur":189,"tts":80957},{"cat":"cc","pid":25863,"tid":25871,"ts":531358357961,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":147,"tdur":95,"tts":80959},{"cat":"cc","pid":25863,"tid":25871,"ts":531358357977,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":11,"tdur":11,"tts":80975},{"cat":"cc","pid":25863,"tid":25871,"ts":531358358109,"ph":"X","name":"Display::Draw","args":{},"dur":184,"tdur":89,"tts":81056},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358358114,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":81061,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358358119,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":15,"tdur":15,"tts":81065},{"cat":"cc","pid":25863,"tid":25871,"ts":531358358121,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":5,"tts":81067},{"cat":"cc","pid":25863,"tid":25871,"ts":531358358126,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":5,"tts":81073},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358358134,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":150,"tdur":55,"tts":81081},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358359644,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":16,"tdur":16,"tts":81236},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358359668,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":267,"tdur":159,"tts":81259},{"cat":"cc","pid":25863,"tid":25871,"ts":531358359670,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":134,"tdur":81,"tts":81261},{"cat":"cc","pid":25863,"tid":25871,"ts":531358359686,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":12,"tdur":11,"tts":81278},{"cat":"cc","pid":25863,"tid":25871,"ts":531358359805,"ph":"X","name":"Display::Draw","args":{},"dur":128,"tdur":73,"tts":81344},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358359809,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":81347,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358359813,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":15,"tdur":14,"tts":81352},{"cat":"cc","pid":25863,"tid":25871,"ts":531358359815,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":5,"tts":81354},{"cat":"cc","pid":25863,"tid":25871,"ts":531358359821,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":6,"tts":81359},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358359828,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":100,"tdur":44,"tts":81367},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358361270,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":16,"tdur":14,"tts":81499},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358361293,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":58317,"tdur":279,"tts":81521},{"cat":"cc","pid":25863,"tid":25871,"ts":531358361295,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":126,"tdur":95,"tts":81523},{"cat":"cc","pid":25863,"tid":25871,"ts":531358361311,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":11,"tdur":11,"tts":81539},{"cat":"cc","pid":25863,"tid":25871,"ts":531358361422,"ph":"X","name":"Display::Draw","args":{},"dur":58186,"tdur":178,"tts":81620},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358361426,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":81624,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358361431,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":15,"tdur":15,"tts":81629},{"cat":"cc","pid":25863,"tid":25871,"ts":531358361433,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":4,"tts":81632},{"cat":"cc","pid":25863,"tid":25871,"ts":531358361439,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":6,"tts":81637},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358361447,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":58151,"tdur":143,"tts":81645},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358422024,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":17,"tdur":15,"tts":81914},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358422048,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":390,"tdur":207,"tts":81937},{"cat":"cc","pid":25863,"tid":25871,"ts":531358422050,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":190,"tdur":90,"tts":81939},{"cat":"cc","pid":25863,"tid":25871,"ts":531358422067,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":12,"tdur":11,"tts":81956},{"cat":"cc","pid":25863,"tid":25871,"ts":531358422241,"ph":"X","name":"Display::Draw","args":{},"dur":195,"tdur":111,"tts":82031},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358422246,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":82036,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358422251,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":28,"tdur":28,"tts":82041},{"cat":"cc","pid":25863,"tid":25871,"ts":531358422254,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":5,"tts":82044},{"cat":"cc","pid":25863,"tid":25871,"ts":531358422260,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":18,"tdur":18,"tts":82049},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358422280,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":146,"tdur":62,"tts":82070},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358423770,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":16,"tdur":15,"tts":82232},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358423793,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":345,"tdur":199,"tts":82255},{"cat":"cc","pid":25863,"tid":25871,"ts":531358423796,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":162,"tdur":93,"tts":82257},{"cat":"cc","pid":25863,"tid":25871,"ts":531358423813,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":11,"tdur":11,"tts":82275},{"cat":"cc","pid":25863,"tid":25871,"ts":531358423959,"ph":"X","name":"Display::Draw","args":{},"dur":178,"tdur":100,"tts":82352},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358423964,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":82356,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358423969,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":24,"tdur":24,"tts":82361},{"cat":"cc","pid":25863,"tid":25871,"ts":531358423971,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":14,"tdur":14,"tts":82363},{"cat":"cc","pid":25863,"tid":25871,"ts":531358423985,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":7,"tdur":6,"tts":82378},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358423994,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":133,"tdur":56,"tts":82386},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358426808,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":16,"tdur":15,"tts":82541},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358426832,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":334,"tdur":186,"tts":82564},{"cat":"cc","pid":25863,"tid":25871,"ts":531358426834,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":185,"tdur":90,"tts":82566},{"cat":"cc","pid":25863,"tid":25871,"ts":531358426851,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":12,"tdur":11,"tts":82583},{"cat":"cc","pid":25863,"tid":25871,"ts":531358427020,"ph":"X","name":"Display::Draw","args":{},"dur":144,"tdur":90,"tts":82658},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358427025,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":82662,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358427030,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":15,"tdur":15,"tts":82668},{"cat":"cc","pid":25863,"tid":25871,"ts":531358427032,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":5,"tts":82670},{"cat":"cc","pid":25863,"tid":25871,"ts":531358427038,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":5,"tts":82676},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358427046,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":108,"tdur":54,"tts":82684},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358428370,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":14,"tdur":13,"tts":82803},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358428391,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":58839,"tdur":263,"tts":82823},{"cat":"cc","pid":25863,"tid":25871,"ts":531358428393,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":147,"tdur":88,"tts":82825},{"cat":"cc","pid":25863,"tid":25871,"ts":531358428409,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":10,"tdur":10,"tts":82841},{"cat":"cc","pid":25863,"tid":25871,"ts":531358428541,"ph":"X","name":"Display::Draw","args":{},"dur":58688,"tdur":170,"tts":82915},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358428546,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":82919,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358428551,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":16,"tdur":15,"tts":82925},{"cat":"cc","pid":25863,"tid":25871,"ts":531358428554,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":5,"tts":82927},{"cat":"cc","pid":25863,"tid":25871,"ts":531358428559,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":5,"tts":82933},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358428567,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":58653,"tdur":135,"tts":82941},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358489623,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":15,"tdur":14,"tts":83211},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358489646,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":312,"tdur":159,"tts":83233},{"cat":"cc","pid":25863,"tid":25871,"ts":531358489648,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":183,"tdur":90,"tts":83235},{"cat":"cc","pid":25863,"tid":25871,"ts":531358489663,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":11,"tdur":9,"tts":83251},{"cat":"cc","pid":25863,"tid":25871,"ts":531358489832,"ph":"X","name":"Display::Draw","args":{},"dur":125,"tdur":63,"tts":83327},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358489836,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":83331,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358489841,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":14,"tdur":13,"tts":83336},{"cat":"cc","pid":25863,"tid":25871,"ts":531358489843,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":4,"tts":83338},{"cat":"cc","pid":25863,"tid":25871,"ts":531358489848,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":5,"tts":83343},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358489855,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":96,"tdur":34,"tts":83350},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358491172,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":16,"tdur":15,"tts":83468},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358491195,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":305,"tdur":181,"tts":83490},{"cat":"cc","pid":25863,"tid":25871,"ts":531358491197,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":149,"tdur":97,"tts":83492},{"cat":"cc","pid":25863,"tid":25871,"ts":531358491219,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":11,"tdur":10,"tts":83515},{"cat":"cc","pid":25863,"tid":25871,"ts":531358491347,"ph":"X","name":"Display::Draw","args":{},"dur":151,"tdur":79,"tts":83591},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358491351,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":83595,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358491356,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":13,"tdur":13,"tts":83599},{"cat":"cc","pid":25863,"tid":25871,"ts":531358491358,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":4,"tdur":4,"tts":83601},{"cat":"cc","pid":25863,"tid":25871,"ts":531358491362,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":5,"tts":83606},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358491369,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":121,"tdur":48,"tts":83613},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358492694,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":18,"tdur":18,"tts":83748},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358492719,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":239,"tdur":166,"tts":83773},{"cat":"cc","pid":25863,"tid":25871,"ts":531358492721,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":111,"tdur":78,"tts":83775},{"cat":"cc","pid":25863,"tid":25871,"ts":531358492736,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":8,"tdur":8,"tts":83790},{"cat":"cc","pid":25863,"tid":25871,"ts":531358492833,"ph":"X","name":"Display::Draw","args":{},"dur":124,"tdur":83,"tts":83855},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358492837,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":83859,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358492842,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":14,"tdur":13,"tts":83864},{"cat":"cc","pid":25863,"tid":25871,"ts":531358492844,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":4,"tdur":4,"tts":83866},{"cat":"cc","pid":25863,"tid":25871,"ts":531358492849,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":5,"tts":83871},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358492856,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":92,"tdur":51,"tts":83878},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358494062,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":14,"tdur":13,"tts":84018},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358494083,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":59438,"tdur":281,"tts":84038},{"cat":"cc","pid":25863,"tid":25871,"ts":531358494085,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":121,"tdur":90,"tts":84040},{"cat":"cc","pid":25863,"tid":25871,"ts":531358494109,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":11,"tdur":11,"tts":84064},{"cat":"cc","pid":25863,"tid":25871,"ts":531358494207,"ph":"X","name":"Display::Draw","args":{},"dur":59310,"tdur":170,"tts":84132},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358494211,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":84136,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358494216,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":13,"tdur":13,"tts":84141},{"cat":"cc","pid":25863,"tid":25871,"ts":531358494218,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":4,"tdur":4,"tts":84143},{"cat":"cc","pid":25863,"tid":25871,"ts":531358494223,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":5,"tts":84148},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358494230,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":59265,"tdur":137,"tts":84155},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358555015,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":16,"tdur":14,"tts":84472},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358555038,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":336,"tdur":181,"tts":84494},{"cat":"cc","pid":25863,"tid":25871,"ts":531358555040,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":184,"tdur":88,"tts":84496},{"cat":"cc","pid":25863,"tid":25871,"ts":531358555056,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":11,"tdur":10,"tts":84512},{"cat":"cc","pid":25863,"tid":25871,"ts":531358555225,"ph":"X","name":"Display::Draw","args":{},"dur":148,"tdur":87,"tts":84586},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358555229,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":84590,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358555234,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":15,"tdur":15,"tts":84595},{"cat":"cc","pid":25863,"tid":25871,"ts":531358555236,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":5,"tts":84597},{"cat":"cc","pid":25863,"tid":25871,"ts":531358555241,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":5,"tts":84603},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358555249,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":115,"tdur":54,"tts":84610},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358556669,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":15,"tdur":14,"tts":84763},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358556691,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":340,"tdur":194,"tts":84784},{"cat":"cc","pid":25863,"tid":25871,"ts":531358556693,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":160,"tdur":89,"tts":84786},{"cat":"cc","pid":25863,"tid":25871,"ts":531358556709,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":11,"tdur":11,"tts":84802},{"cat":"cc","pid":25863,"tid":25871,"ts":531358556854,"ph":"X","name":"Display::Draw","args":{},"dur":176,"tdur":100,"tts":84877},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358556859,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":84881,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358556863,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":24,"tdur":23,"tts":84886},{"cat":"cc","pid":25863,"tid":25871,"ts":531358556866,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":5,"tts":84888},{"cat":"cc","pid":25863,"tid":25871,"ts":531358556871,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":14,"tdur":14,"tts":84893},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358556887,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":134,"tdur":58,"tts":84910},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358558236,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":17,"tdur":16,"tts":85062},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358558260,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":289,"tdur":182,"tts":85085},{"cat":"cc","pid":25863,"tid":25871,"ts":531358558262,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":147,"tdur":92,"tts":85087},{"cat":"cc","pid":25863,"tid":25871,"ts":531358558278,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":11,"tdur":11,"tts":85103},{"cat":"cc","pid":25863,"tid":25871,"ts":531358558410,"ph":"X","name":"Display::Draw","args":{},"dur":138,"tdur":85,"tts":85181},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358558414,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":85185,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358558419,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":15,"tdur":14,"tts":85190},{"cat":"cc","pid":25863,"tid":25871,"ts":531358558421,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":4,"tts":85192},{"cat":"cc","pid":25863,"tid":25871,"ts":531358558427,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":6,"tts":85197},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358558435,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":104,"tdur":51,"tts":85205},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358559684,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":14,"tdur":13,"tts":85321},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358559704,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":48093,"tdur":320,"tts":85341},{"cat":"cc","pid":25863,"tid":25871,"ts":531358559706,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":153,"tdur":95,"tts":85343},{"cat":"cc","pid":25863,"tid":25871,"ts":531358559722,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":9,"tdur":9,"tts":85359},{"cat":"cc","pid":25863,"tid":25871,"ts":531358559860,"ph":"X","name":"Display::Draw","args":{},"dur":47933,"tdur":217,"tts":85440},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358559864,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":85444,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358559869,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":15,"tdur":14,"tts":85449},{"cat":"cc","pid":25863,"tid":25871,"ts":531358559871,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":4,"tts":85451},{"cat":"cc","pid":25863,"tid":25871,"ts":531358559876,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":6,"tts":85456},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358559884,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":47888,"tdur":171,"tts":85464},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358610362,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":24,"tdur":22,"tts":85830},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358610395,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":410,"tdur":230,"tts":85862},{"cat":"cc","pid":25863,"tid":25871,"ts":531358610399,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":195,"tdur":109,"tts":85865},{"cat":"cc","pid":25863,"tid":25871,"ts":531358610421,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":15,"tdur":15,"tts":85887},{"cat":"cc","pid":25863,"tid":25871,"ts":531358610595,"ph":"X","name":"Display::Draw","args":{},"dur":208,"tdur":115,"tts":85976},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358610601,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":85982,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358610608,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":22,"tdur":22,"tts":85989},{"cat":"cc","pid":25863,"tid":25871,"ts":531358610611,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":8,"tdur":7,"tts":85993},{"cat":"cc","pid":25863,"tid":25871,"ts":531358610619,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":9,"tdur":8,"tts":86001},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358610631,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":161,"tdur":67,"tts":86012},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358612397,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":14,"tdur":14,"tts":86199},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358612417,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":397,"tdur":228,"tts":86220},{"cat":"cc","pid":25863,"tid":25871,"ts":531358612419,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":199,"tdur":98,"tts":86222},{"cat":"cc","pid":25863,"tid":25871,"ts":531358612434,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":9,"tdur":9,"tts":86236},{"cat":"cc","pid":25863,"tid":25871,"ts":531358612619,"ph":"X","name":"Display::Draw","args":{},"dur":192,"tdur":123,"tts":86322},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358612624,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":86328,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358612630,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":38,"tdur":37,"tts":86334},{"cat":"cc","pid":25863,"tid":25871,"ts":531358612656,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":5,"tts":86359},{"cat":"cc","pid":25863,"tid":25871,"ts":531358612661,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":5,"tts":86365},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358612669,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":134,"tdur":64,"tts":86372},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358613982,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":35,"tdur":34,"tts":86559},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358614027,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":414,"tdur":248,"tts":86603},{"cat":"cc","pid":25863,"tid":25871,"ts":531358614030,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":230,"tdur":144,"tts":86606},{"cat":"cc","pid":25863,"tid":25871,"ts":531358614074,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":10,"tdur":9,"tts":86651},{"cat":"cc","pid":25863,"tid":25871,"ts":531358614261,"ph":"X","name":"Display::Draw","args":{},"dur":178,"tdur":97,"tts":86752},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358614265,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":86756,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358614269,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":14,"tdur":14,"tts":86760},{"cat":"cc","pid":25863,"tid":25871,"ts":531358614271,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":5,"tts":86762},{"cat":"cc","pid":25863,"tid":25871,"ts":531358614276,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":5,"tts":86767},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358614284,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":144,"tdur":62,"tts":86775},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358616524,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":30,"tdur":29,"tts":86914},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358616566,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":53502,"tdur":293,"tts":86956},{"cat":"cc","pid":25863,"tid":25871,"ts":531358616570,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":169,"tdur":112,"tts":86960},{"cat":"cc","pid":25863,"tid":25871,"ts":531358616598,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":25,"tdur":24,"tts":86988},{"cat":"cc","pid":25863,"tid":25871,"ts":531358616740,"ph":"X","name":"Display::Draw","args":{},"dur":53326,"tdur":173,"tts":87074},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358616745,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":87078,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358616750,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":15,"tdur":15,"tts":87083},{"cat":"cc","pid":25863,"tid":25871,"ts":531358616752,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":5,"tts":87085},{"cat":"cc","pid":25863,"tid":25871,"ts":531358616757,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":5,"tts":87091},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358616765,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":53291,"tdur":138,"tts":87098},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358672315,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":19,"tdur":17,"tts":87366},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358672343,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":367,"tdur":202,"tts":87393},{"cat":"cc","pid":25863,"tid":25871,"ts":531358672346,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":199,"tdur":102,"tts":87396},{"cat":"cc","pid":25863,"tid":25871,"ts":531358672364,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":13,"tdur":12,"tts":87414},{"cat":"cc","pid":25863,"tid":25871,"ts":531358672547,"ph":"X","name":"Display::Draw","args":{},"dur":162,"tdur":93,"tts":87500},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358672551,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":87505,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358672556,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":18,"tdur":16,"tts":87510},{"cat":"cc","pid":25863,"tid":25871,"ts":531358672559,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":6,"tdur":6,"tts":87512},{"cat":"cc","pid":25863,"tid":25871,"ts":531358672565,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":7,"tdur":7,"tts":87518},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358672574,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":125,"tdur":56,"tts":87527},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358674718,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":17,"tdur":15,"tts":87687},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358674744,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":374,"tdur":213,"tts":87712},{"cat":"cc","pid":25863,"tid":25871,"ts":531358674746,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":193,"tdur":101,"tts":87714},{"cat":"cc","pid":25863,"tid":25871,"ts":531358674763,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":12,"tdur":11,"tts":87731},{"cat":"cc","pid":25863,"tid":25871,"ts":531358674940,"ph":"X","name":"Display::Draw","args":{},"dur":176,"tdur":106,"tts":87817},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358674945,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":87822,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358674950,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":28,"tdur":27,"tts":87827},{"cat":"cc","pid":25863,"tid":25871,"ts":531358674953,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":6,"tdur":6,"tts":87829},{"cat":"cc","pid":25863,"tid":25871,"ts":531358674959,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":17,"tdur":17,"tts":87835},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358674979,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":127,"tdur":57,"tts":87855},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358676480,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":17,"tdur":15,"tts":88013},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358676505,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":287,"tdur":181,"tts":88037},{"cat":"cc","pid":25863,"tid":25871,"ts":531358676508,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":141,"tdur":99,"tts":88039},{"cat":"cc","pid":25863,"tid":25871,"ts":531358676525,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":12,"tdur":11,"tts":88057},{"cat":"cc","pid":25863,"tid":25871,"ts":531358676650,"ph":"X","name":"Display::Draw","args":{},"dur":141,"tdur":77,"tts":88140},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358676655,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":88145,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358676660,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":16,"tdur":16,"tts":88150},{"cat":"cc","pid":25863,"tid":25871,"ts":531358676662,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":6,"tdur":6,"tts":88152},{"cat":"cc","pid":25863,"tid":25871,"ts":531358676668,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":7,"tdur":6,"tts":88158},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358676677,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":107,"tdur":43,"tts":88167},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358678065,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":15,"tdur":14,"tts":88292},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358678087,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":57498,"tdur":262,"tts":88313},{"cat":"cc","pid":25863,"tid":25871,"ts":531358678089,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":152,"tdur":93,"tts":88315},{"cat":"cc","pid":25863,"tid":25871,"ts":531358678106,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":10,"tdur":10,"tts":88332},{"cat":"cc","pid":25863,"tid":25871,"ts":531358678242,"ph":"X","name":"Display::Draw","args":{},"dur":57341,"tdur":164,"tts":88410},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358678247,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":88415,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358678252,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":17,"tdur":16,"tts":88420},{"cat":"cc","pid":25863,"tid":25871,"ts":531358678255,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":6,"tts":88422},{"cat":"cc","pid":25863,"tid":25871,"ts":531358678261,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":6,"tts":88428},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358678269,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":57304,"tdur":126,"tts":88437},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358737833,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":28,"tdur":26,"tts":88658},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358737868,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":309,"tdur":168,"tts":88692},{"cat":"cc","pid":25863,"tid":25871,"ts":531358737870,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":171,"tdur":84,"tts":88694},{"cat":"cc","pid":25863,"tid":25871,"ts":531358737887,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":10,"tdur":10,"tts":88711},{"cat":"cc","pid":25863,"tid":25871,"ts":531358738042,"ph":"X","name":"Display::Draw","args":{},"dur":133,"tdur":79,"tts":88780},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358738047,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":88784,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358738051,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":15,"tdur":14,"tts":88788},{"cat":"cc","pid":25863,"tid":25871,"ts":531358738053,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":5,"tts":88790},{"cat":"cc","pid":25863,"tid":25871,"ts":531358738058,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":6,"tts":88795},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358738066,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":101,"tdur":47,"tts":88803},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358739354,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":15,"tdur":13,"tts":88938},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358739375,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":307,"tdur":176,"tts":88959},{"cat":"cc","pid":25863,"tid":25871,"ts":531358739378,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":158,"tdur":87,"tts":88961},{"cat":"cc","pid":25863,"tid":25871,"ts":531358739392,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":12,"tdur":11,"tts":88976},{"cat":"cc","pid":25863,"tid":25871,"ts":531358739537,"ph":"X","name":"Display::Draw","args":{},"dur":144,"tdur":84,"tts":89050},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358739541,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":89054,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358739546,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":13,"tdur":14,"tts":89058},{"cat":"cc","pid":25863,"tid":25871,"ts":531358739548,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":4,"tdur":4,"tts":89060},{"cat":"cc","pid":25863,"tid":25871,"ts":531358739553,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":5,"tts":89065},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358739560,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":113,"tdur":53,"tts":89072},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358740880,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":16,"tdur":15,"tts":89212},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358740903,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":282,"tdur":176,"tts":89234},{"cat":"cc","pid":25863,"tid":25871,"ts":531358740905,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":144,"tdur":85,"tts":89236},{"cat":"cc","pid":25863,"tid":25871,"ts":531358740920,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":10,"tdur":10,"tts":89251},{"cat":"cc","pid":25863,"tid":25871,"ts":531358741050,"ph":"X","name":"Display::Draw","args":{},"dur":134,"tdur":86,"tts":89322},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358741055,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":89327,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358741059,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":14,"tdur":14,"tts":89331},{"cat":"cc","pid":25863,"tid":25871,"ts":531358741061,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":4,"tts":89333},{"cat":"cc","pid":25863,"tid":25871,"ts":531358741066,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":5,"tts":89338},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358741073,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":102,"tdur":55,"tts":89345},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358742288,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":12,"tdur":12,"tts":89457},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358742306,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":77900,"tdur":188,"tts":89476},{"cat":"cc","pid":25863,"tid":25871,"ts":531358742308,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":137,"tdur":79,"tts":89478},{"cat":"cc","pid":25863,"tid":25871,"ts":531358742323,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":9,"tdur":9,"tts":89492},{"cat":"cc","pid":25863,"tid":25871,"ts":531358742446,"ph":"X","name":"Display::Draw","args":{},"dur":77759,"tdur":103,"tts":89559},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358742450,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":89563,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358742454,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":14,"tdur":14,"tts":89567},{"cat":"cc","pid":25863,"tid":25871,"ts":531358742456,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":5,"tts":89569},{"cat":"cc","pid":25863,"tid":25871,"ts":531358742461,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":5,"tts":89574},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358742468,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":77727,"tdur":71,"tts":89581},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358823254,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":14,"tdur":13,"tts":89781},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358823275,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":336,"tdur":174,"tts":89801},{"cat":"cc","pid":25863,"tid":25871,"ts":531358823277,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":170,"tdur":85,"tts":89803},{"cat":"cc","pid":25863,"tid":25871,"ts":531358823292,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":10,"tdur":9,"tts":89819},{"cat":"cc","pid":25863,"tid":25871,"ts":531358823447,"ph":"X","name":"Display::Draw","args":{},"dur":162,"tdur":84,"tts":89890},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358823451,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":89893,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358823456,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":14,"tdur":14,"tts":89898},{"cat":"cc","pid":25863,"tid":25871,"ts":531358823458,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":4,"tts":89901},{"cat":"cc","pid":25863,"tid":25871,"ts":531358823463,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":5,"tts":89906},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358823471,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":131,"tdur":53,"tts":89913},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358824738,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":18,"tdur":17,"tts":90049},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358824763,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":337,"tdur":179,"tts":90073},{"cat":"cc","pid":25863,"tid":25871,"ts":531358824765,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":165,"tdur":81,"tts":90075},{"cat":"cc","pid":25863,"tid":25871,"ts":531358824778,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":8,"tdur":7,"tts":90089},{"cat":"cc","pid":25863,"tid":25871,"ts":531358824930,"ph":"X","name":"Display::Draw","args":{},"dur":168,"tdur":93,"tts":90158},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358824934,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":90162,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358824938,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":23,"tdur":22,"tts":90166},{"cat":"cc","pid":25863,"tid":25871,"ts":531358824940,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":4,"tdur":4,"tts":90168},{"cat":"cc","pid":25863,"tid":25871,"ts":531358824945,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":14,"tdur":14,"tts":90172},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358824961,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":130,"tdur":54,"tts":90189},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358826776,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":13,"tdur":13,"tts":90325},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358826796,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":277,"tdur":174,"tts":90345},{"cat":"cc","pid":25863,"tid":25871,"ts":531358826798,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":137,"tdur":80,"tts":90347},{"cat":"cc","pid":25863,"tid":25871,"ts":531358826813,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":9,"tdur":9,"tts":90362},{"cat":"cc","pid":25863,"tid":25871,"ts":531358826936,"ph":"X","name":"Display::Draw","args":{},"dur":136,"tdur":89,"tts":90429},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358826951,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":90444,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358826954,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":13,"tdur":13,"tts":90447},{"cat":"cc","pid":25863,"tid":25871,"ts":531358826956,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":4,"tdur":4,"tts":90449},{"cat":"cc","pid":25863,"tid":25871,"ts":531358826961,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":5,"tts":90453},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358826967,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":97,"tdur":50,"tts":90460},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358828140,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":14,"tdur":12,"tts":90563},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358828159,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":73874,"tdur":256,"tts":90581},{"cat":"cc","pid":25863,"tid":25871,"ts":531358828161,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":132,"tdur":82,"tts":90583},{"cat":"cc","pid":25863,"tid":25871,"ts":531358828182,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":10,"tdur":10,"tts":90604},{"cat":"cc","pid":25863,"tid":25871,"ts":531358828294,"ph":"X","name":"Display::Draw","args":{},"dur":73735,"tdur":168,"tts":90666},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358828298,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":90670,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358828302,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":28,"tdur":28,"tts":90674},{"cat":"cc","pid":25863,"tid":25871,"ts":531358828304,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":4,"tdur":4,"tts":90676},{"cat":"cc","pid":25863,"tid":25871,"ts":531358828308,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":20,"tdur":19,"tts":90681},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358828330,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":73683,"tdur":115,"tts":90702},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358903679,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":33,"tdur":33,"tts":90939},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358903722,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":395,"tdur":202,"tts":90981},{"cat":"cc","pid":25863,"tid":25871,"ts":531358903725,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":187,"tdur":101,"tts":90985},{"cat":"cc","pid":25863,"tid":25871,"ts":531358903752,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":13,"tdur":12,"tts":91012},{"cat":"cc","pid":25863,"tid":25871,"ts":531358903913,"ph":"X","name":"Display::Draw","args":{},"dur":202,"tdur":94,"tts":91088},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358903919,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":91094,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358903926,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":25,"tdur":24,"tts":91101},{"cat":"cc","pid":25863,"tid":25871,"ts":531358903931,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":6,"tdur":6,"tts":91106},{"cat":"cc","pid":25863,"tid":25871,"ts":531358903938,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":10,"tdur":11,"tts":91112},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358903951,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":155,"tdur":47,"tts":91126},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358905209,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":18,"tdur":17,"tts":91252},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358905234,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":279,"tdur":166,"tts":91276},{"cat":"cc","pid":25863,"tid":25871,"ts":531358905236,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":148,"tdur":82,"tts":91278},{"cat":"cc","pid":25863,"tid":25871,"ts":531358905250,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":8,"tdur":7,"tts":91293},{"cat":"cc","pid":25863,"tid":25871,"ts":531358905385,"ph":"X","name":"Display::Draw","args":{},"dur":126,"tdur":78,"tts":91362},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358905388,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":91366,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358905393,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":13,"tdur":13,"tts":91370},{"cat":"cc","pid":25863,"tid":25871,"ts":531358905395,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":4,"tdur":4,"tts":91372},{"cat":"cc","pid":25863,"tid":25871,"ts":531358905399,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":4,"tts":91377},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358905406,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":98,"tdur":49,"tts":91383},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358906570,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":14,"tdur":13,"tts":91514},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358906592,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":253,"tdur":157,"tts":91535},{"cat":"cc","pid":25863,"tid":25871,"ts":531358906594,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":128,"tdur":80,"tts":91537},{"cat":"cc","pid":25863,"tid":25871,"ts":531358906608,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":10,"tdur":9,"tts":91551},{"cat":"cc","pid":25863,"tid":25871,"ts":531358906723,"ph":"X","name":"Display::Draw","args":{},"dur":120,"tdur":72,"tts":91619},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358906727,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":91622,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358906731,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":13,"tdur":13,"tts":91626},{"cat":"cc","pid":25863,"tid":25871,"ts":531358906733,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":4,"tdur":4,"tts":91628},{"cat":"cc","pid":25863,"tid":25871,"ts":531358906738,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":5,"tts":91633},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358906745,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":91,"tdur":43,"tts":91640},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358907905,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":15,"tdur":14,"tts":91764},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358907926,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":63027,"tdur":339,"tts":91784},{"cat":"cc","pid":25863,"tid":25871,"ts":531358907928,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":161,"tdur":91,"tts":91786},{"cat":"cc","pid":25863,"tid":25871,"ts":531358907942,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":10,"tdur":10,"tts":91800},{"cat":"cc","pid":25863,"tid":25871,"ts":531358908089,"ph":"X","name":"Display::Draw","args":{},"dur":62858,"tdur":238,"tts":91879},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358908093,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":91883,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358908097,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":14,"tdur":13,"tts":91887},{"cat":"cc","pid":25863,"tid":25871,"ts":531358908099,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":4,"tts":91889},{"cat":"cc","pid":25863,"tid":25871,"ts":531358908104,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":4,"tts":91894},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358908111,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":62812,"tdur":180,"tts":91900},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358974207,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":35,"tdur":34,"tts":92276},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358974251,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":343,"tdur":225,"tts":92319},{"cat":"cc","pid":25863,"tid":25871,"ts":531358974255,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":167,"tdur":101,"tts":92323},{"cat":"cc","pid":25863,"tid":25871,"ts":531358974283,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":13,"tdur":13,"tts":92351},{"cat":"cc","pid":25863,"tid":25871,"ts":531358974423,"ph":"X","name":"Display::Draw","args":{},"dur":169,"tdur":116,"tts":92426},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358974430,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":92432,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358974437,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":39,"tdur":38,"tts":92440},{"cat":"cc","pid":25863,"tid":25871,"ts":531358974442,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":7,"tdur":7,"tts":92445},{"cat":"cc","pid":25863,"tid":25871,"ts":531358974450,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":24,"tdur":24,"tts":92452},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358974477,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":107,"tdur":53,"tts":92480},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358975843,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":15,"tdur":14,"tts":92623},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358975865,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":340,"tdur":202,"tts":92644},{"cat":"cc","pid":25863,"tid":25871,"ts":531358975867,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":180,"tdur":97,"tts":92646},{"cat":"cc","pid":25863,"tid":25871,"ts":531358975890,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":10,"tdur":10,"tts":92669},{"cat":"cc","pid":25863,"tid":25871,"ts":531358976048,"ph":"X","name":"Display::Draw","args":{},"dur":155,"tdur":99,"tts":92745},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358976052,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":92749,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358976056,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":28,"tdur":28,"tts":92753},{"cat":"cc","pid":25863,"tid":25871,"ts":531358976058,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":5,"tts":92755},{"cat":"cc","pid":25863,"tid":25871,"ts":531358976063,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":19,"tdur":18,"tts":92761},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358976084,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":111,"tdur":54,"tts":92782},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358977446,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":14,"tdur":13,"tts":92924},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358977467,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":306,"tdur":181,"tts":92944},{"cat":"cc","pid":25863,"tid":25871,"ts":531358977469,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":154,"tdur":89,"tts":92946},{"cat":"cc","pid":25863,"tid":25871,"ts":531358977484,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":10,"tdur":10,"tts":92961},{"cat":"cc","pid":25863,"tid":25871,"ts":531358977624,"ph":"X","name":"Display::Draw","args":{},"dur":147,"tdur":87,"tts":93037},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358977628,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":93041,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358977633,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":14,"tdur":13,"tts":93046},{"cat":"cc","pid":25863,"tid":25871,"ts":531358977635,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":4,"tdur":4,"tts":93048},{"cat":"cc","pid":25863,"tid":25871,"ts":531358977640,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":5,"tts":93053},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358977647,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":116,"tdur":55,"tts":93060},{"cat":"mojo","pid":25863,"tid":25871,"ts":531358978919,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":16,"tdur":15,"tts":93205},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531358978942,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":126541,"tdur":297,"tts":93227},{"cat":"cc","pid":25863,"tid":25871,"ts":531358978944,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":132,"tdur":82,"tts":93229},{"cat":"cc","pid":25863,"tid":25871,"ts":531358978958,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":11,"tdur":10,"tts":93244},{"cat":"cc","pid":25863,"tid":25871,"ts":531358979077,"ph":"X","name":"Display::Draw","args":{},"dur":126402,"tdur":207,"tts":93312},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531358979081,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":93316,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531358979086,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":14,"tdur":13,"tts":93321},{"cat":"cc","pid":25863,"tid":25871,"ts":531358979088,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":4,"tdur":4,"tts":93323},{"cat":"cc","pid":25863,"tid":25871,"ts":531358979093,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":5,"tts":93328},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531358979100,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":126354,"tdur":159,"tts":93335},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359108215,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":46,"tdur":43,"tts":93723},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359108282,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":700,"tdur":385,"tts":93788},{"cat":"cc","pid":25863,"tid":25871,"ts":531359108288,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":339,"tdur":184,"tts":93794},{"cat":"cc","pid":25863,"tid":25871,"ts":531359108331,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":26,"tdur":25,"tts":93837},{"cat":"cc","pid":25863,"tid":25871,"ts":531359108629,"ph":"X","name":"Display::Draw","args":{},"dur":350,"tdur":187,"tts":93982},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359108640,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":93993,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359108653,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":43,"tdur":42,"tts":94006},{"cat":"cc","pid":25863,"tid":25871,"ts":531359108660,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":13,"tdur":12,"tts":94013},{"cat":"cc","pid":25863,"tid":25871,"ts":531359108674,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":18,"tdur":17,"tts":94027},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359108697,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":263,"tdur":100,"tts":94050},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359111498,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":36,"tdur":33,"tts":94329},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359111550,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":621,"tdur":365,"tts":94379},{"cat":"cc","pid":25863,"tid":25871,"ts":531359111554,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":320,"tdur":168,"tts":94384},{"cat":"cc","pid":25863,"tid":25871,"ts":531359111588,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":23,"tdur":22,"tts":94418},{"cat":"cc","pid":25863,"tid":25871,"ts":531359111877,"ph":"X","name":"Display::Draw","args":{},"dur":291,"tdur":184,"tts":94556},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359111886,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":94565,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359111896,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":32,"tdur":31,"tts":94575},{"cat":"cc","pid":25863,"tid":25871,"ts":531359111900,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":11,"tdur":10,"tts":94580},{"cat":"cc","pid":25863,"tid":25871,"ts":531359111912,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":12,"tdur":12,"tts":94591},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359111929,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":220,"tdur":112,"tts":94608},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359114672,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":34,"tdur":31,"tts":94900},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359114721,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":621,"tdur":350,"tts":94947},{"cat":"cc","pid":25863,"tid":25871,"ts":531359114726,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":290,"tdur":166,"tts":94952},{"cat":"cc","pid":25863,"tid":25871,"ts":531359114758,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":25,"tdur":24,"tts":94984},{"cat":"cc","pid":25863,"tid":25871,"ts":531359115018,"ph":"X","name":"Display::Draw","args":{},"dur":321,"tdur":172,"tts":95122},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359115027,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":95131,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359115038,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":31,"tdur":31,"tts":95141},{"cat":"cc","pid":25863,"tid":25871,"ts":531359115042,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":11,"tdur":10,"tts":95145},{"cat":"cc","pid":25863,"tid":25871,"ts":531359115054,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":12,"tdur":12,"tts":95157},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359115070,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":253,"tdur":105,"tts":95173},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359117478,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":16,"tdur":15,"tts":95414},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359117502,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":69189,"tdur":381,"tts":95437},{"cat":"cc","pid":25863,"tid":25871,"ts":531359117504,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":244,"tdur":160,"tts":95439},{"cat":"cc","pid":25863,"tid":25871,"ts":531359117539,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":12,"tdur":12,"tts":95474},{"cat":"cc","pid":25863,"tid":25871,"ts":531359117750,"ph":"X","name":"Display::Draw","args":{},"dur":68939,"tdur":213,"tts":95603},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359117759,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":95612,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359117769,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":30,"tdur":30,"tts":95622},{"cat":"cc","pid":25863,"tid":25871,"ts":531359117785,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":6,"tdur":6,"tts":95638},{"cat":"cc","pid":25863,"tid":25871,"ts":531359117791,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":7,"tdur":6,"tts":95644},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359117800,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":68879,"tdur":152,"tts":95653},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359189270,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":33,"tdur":31,"tts":95990},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359189318,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":601,"tdur":346,"tts":96037},{"cat":"cc","pid":25863,"tid":25871,"ts":531359189322,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":321,"tdur":164,"tts":96042},{"cat":"cc","pid":25863,"tid":25871,"ts":531359189355,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":24,"tdur":22,"tts":96075},{"cat":"cc","pid":25863,"tid":25871,"ts":531359189646,"ph":"X","name":"Display::Draw","args":{},"dur":270,"tdur":170,"tts":96210},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359189655,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":96219,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359189664,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":32,"tdur":31,"tts":96228},{"cat":"cc","pid":25863,"tid":25871,"ts":531359189669,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":10,"tdur":10,"tts":96233},{"cat":"cc","pid":25863,"tid":25871,"ts":531359189680,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":13,"tdur":12,"tts":96244},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359189697,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":200,"tdur":100,"tts":96261},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359193750,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":33,"tdur":30,"tts":96531},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359193797,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":640,"tdur":365,"tts":96577},{"cat":"cc","pid":25863,"tid":25871,"ts":531359193802,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":320,"tdur":168,"tts":96582},{"cat":"cc","pid":25863,"tid":25871,"ts":531359193835,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":24,"tdur":23,"tts":96615},{"cat":"cc","pid":25863,"tid":25871,"ts":531359194124,"ph":"X","name":"Display::Draw","args":{},"dur":310,"tdur":185,"tts":96754},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359194133,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":96763,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359194142,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":53,"tdur":53,"tts":96772},{"cat":"cc","pid":25863,"tid":25871,"ts":531359194147,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":10,"tdur":10,"tts":96777},{"cat":"cc","pid":25863,"tid":25871,"ts":531359194158,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":33,"tdur":32,"tts":96789},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359194196,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":218,"tdur":91,"tts":96827},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359197014,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":33,"tdur":30,"tts":97105},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359197062,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":552,"tdur":304,"tts":97151},{"cat":"cc","pid":25863,"tid":25871,"ts":531359197067,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":315,"tdur":163,"tts":97156},{"cat":"cc","pid":25863,"tid":25871,"ts":531359197099,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":24,"tdur":22,"tts":97189},{"cat":"cc","pid":25863,"tid":25871,"ts":531359197384,"ph":"X","name":"Display::Draw","args":{},"dur":228,"tdur":129,"tts":97323},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359197394,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":97332,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359197404,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":31,"tdur":30,"tts":97343},{"cat":"cc","pid":25863,"tid":25871,"ts":531359197408,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":11,"tdur":10,"tts":97347},{"cat":"cc","pid":25863,"tid":25871,"ts":531359197420,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":12,"tdur":12,"tts":97358},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359197436,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":161,"tdur":61,"tts":97375},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359200121,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":16,"tdur":14,"tts":97551},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359200144,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":53022,"tdur":380,"tts":97573},{"cat":"cc","pid":25863,"tid":25871,"ts":531359200146,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":183,"tdur":90,"tts":97575},{"cat":"cc","pid":25863,"tid":25871,"ts":531359200162,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":11,"tdur":10,"tts":97591},{"cat":"cc","pid":25863,"tid":25871,"ts":531359200330,"ph":"X","name":"Display::Draw","args":{},"dur":52818,"tdur":268,"tts":97667},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359200334,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":97671,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359200338,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":14,"tdur":14,"tts":97675},{"cat":"cc","pid":25863,"tid":25871,"ts":531359200340,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":5,"tts":97677},{"cat":"cc","pid":25863,"tid":25871,"ts":531359200345,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":5,"tts":97682},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359200353,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":52771,"tdur":220,"tts":97690},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359254732,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":15,"tdur":14,"tts":98114},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359254754,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":354,"tdur":183,"tts":98135},{"cat":"cc","pid":25863,"tid":25871,"ts":531359254756,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":179,"tdur":94,"tts":98137},{"cat":"cc","pid":25863,"tid":25871,"ts":531359254776,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":11,"tdur":10,"tts":98158},{"cat":"cc","pid":25863,"tid":25871,"ts":531359254936,"ph":"X","name":"Display::Draw","args":{},"dur":171,"tdur":84,"tts":98233},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359254940,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":98237,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359254944,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":13,"tdur":13,"tts":98241},{"cat":"cc","pid":25863,"tid":25871,"ts":531359254946,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":4,"tdur":4,"tts":98243},{"cat":"cc","pid":25863,"tid":25871,"ts":531359254951,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":5,"tts":98248},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359254958,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":141,"tdur":54,"tts":98255},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359256270,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":14,"tdur":13,"tts":98399},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359256290,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":299,"tdur":175,"tts":98419},{"cat":"cc","pid":25863,"tid":25871,"ts":531359256292,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":150,"tdur":79,"tts":98421},{"cat":"cc","pid":25863,"tid":25871,"ts":531359256307,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":10,"tdur":10,"tts":98435},{"cat":"cc","pid":25863,"tid":25871,"ts":531359256443,"ph":"X","name":"Display::Draw","args":{},"dur":144,"tdur":90,"tts":98502},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359256447,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":98506,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359256451,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":22,"tdur":21,"tts":98510},{"cat":"cc","pid":25863,"tid":25871,"ts":531359256461,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":5,"tts":98519},{"cat":"cc","pid":25863,"tid":25871,"ts":531359256466,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":4,"tts":98525},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359256473,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":106,"tdur":52,"tts":98532},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359257696,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":19,"tdur":17,"tts":98668},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359257721,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":276,"tdur":177,"tts":98692},{"cat":"cc","pid":25863,"tid":25871,"ts":531359257723,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":140,"tdur":92,"tts":98694},{"cat":"cc","pid":25863,"tid":25871,"ts":531359257744,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":9,"tdur":8,"tts":98716},{"cat":"cc","pid":25863,"tid":25871,"ts":531359257864,"ph":"X","name":"Display::Draw","args":{},"dur":131,"tdur":80,"tts":98788},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359257868,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":98791,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359257872,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":13,"tdur":13,"tts":98796},{"cat":"cc","pid":25863,"tid":25871,"ts":531359257874,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":4,"tdur":5,"tts":98797},{"cat":"cc","pid":25863,"tid":25871,"ts":531359257879,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":5,"tts":98802},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359257886,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":101,"tdur":51,"tts":98809},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359259079,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":13,"tdur":12,"tts":98916},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359259099,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":78022,"tdur":230,"tts":98935},{"cat":"cc","pid":25863,"tid":25871,"ts":531359259101,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":125,"tdur":77,"tts":98937},{"cat":"cc","pid":25863,"tid":25871,"ts":531359259115,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":9,"tdur":9,"tts":98951},{"cat":"cc","pid":25863,"tid":25871,"ts":531359259227,"ph":"X","name":"Display::Draw","args":{},"dur":77892,"tdur":148,"tts":99015},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359259231,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":99019,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359259235,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":13,"tdur":13,"tts":99024},{"cat":"cc","pid":25863,"tid":25871,"ts":531359259237,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":4,"tdur":5,"tts":99025},{"cat":"cc","pid":25863,"tid":25871,"ts":531359259242,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":5,"tts":99030},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359259249,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":77860,"tdur":116,"tts":99037},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359339541,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":16,"tdur":14,"tts":99276},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359339563,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":334,"tdur":170,"tts":99297},{"cat":"cc","pid":25863,"tid":25871,"ts":531359339565,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":181,"tdur":86,"tts":99299},{"cat":"cc","pid":25863,"tid":25871,"ts":531359339580,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":10,"tdur":9,"tts":99314},{"cat":"cc","pid":25863,"tid":25871,"ts":531359339747,"ph":"X","name":"Display::Draw","args":{},"dur":149,"tdur":79,"tts":99387},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359339751,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":99391,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359339755,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":15,"tdur":14,"tts":99395},{"cat":"cc","pid":25863,"tid":25871,"ts":531359339758,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":4,"tdur":5,"tts":99397},{"cat":"cc","pid":25863,"tid":25871,"ts":531359339763,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":6,"tts":99402},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359339770,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":117,"tdur":47,"tts":99410},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359341081,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":14,"tdur":13,"tts":99541},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359341101,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":333,"tdur":172,"tts":99561},{"cat":"cc","pid":25863,"tid":25871,"ts":531359341103,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":169,"tdur":84,"tts":99563},{"cat":"cc","pid":25863,"tid":25871,"ts":531359341117,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":10,"tdur":9,"tts":99577},{"cat":"cc","pid":25863,"tid":25871,"ts":531359341273,"ph":"X","name":"Display::Draw","args":{},"dur":160,"tdur":84,"tts":99648},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359341277,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":99652,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359341280,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":13,"tdur":13,"tts":99656},{"cat":"cc","pid":25863,"tid":25871,"ts":531359341282,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":4,"tts":99658},{"cat":"cc","pid":25863,"tid":25871,"ts":531359341287,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":5,"tts":99662},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359341294,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":131,"tdur":55,"tts":99669},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359342521,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":17,"tdur":16,"tts":99807},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359342544,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":265,"tdur":165,"tts":99830},{"cat":"cc","pid":25863,"tid":25871,"ts":531359342546,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":126,"tdur":76,"tts":99832},{"cat":"cc","pid":25863,"tid":25871,"ts":531359342560,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":8,"tdur":8,"tts":99845},{"cat":"cc","pid":25863,"tid":25871,"ts":531359342672,"ph":"X","name":"Display::Draw","args":{},"dur":136,"tdur":83,"tts":99910},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359342676,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":99913,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359342680,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":21,"tdur":20,"tts":99917},{"cat":"cc","pid":25863,"tid":25871,"ts":531359342682,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":12,"tdur":11,"tts":99919},{"cat":"cc","pid":25863,"tid":25871,"ts":531359342694,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":5,"tts":99931},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359342701,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":99,"tdur":47,"tts":99938},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359343855,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":12,"tdur":11,"tts":100038},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359343872,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":59448,"tdur":211,"tts":100054},{"cat":"cc","pid":25863,"tid":25871,"ts":531359343874,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":110,"tdur":76,"tts":100056},{"cat":"cc","pid":25863,"tid":25871,"ts":531359343888,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":9,"tdur":9,"tts":100070},{"cat":"cc","pid":25863,"tid":25871,"ts":531359343985,"ph":"X","name":"Display::Draw","args":{},"dur":59334,"tdur":131,"tts":100133},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359343989,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":100137,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359343993,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":28,"tdur":20,"tts":100141},{"cat":"cc","pid":25863,"tid":25871,"ts":531359343995,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":4,"tdur":4,"tts":100143},{"cat":"cc","pid":25863,"tid":25871,"ts":531359344014,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":6,"tts":100154},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359344021,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":59288,"tdur":91,"tts":100162},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359405546,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":80,"tdur":60,"tts":100407},{"cat":"trace_event_overhead","pid":25863,"tid":25871,"ts":531359405546,"ph":"X","name":"overhead","args":{},"dur":53,"tdur":32,"tts":100407},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359405642,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":665,"tdur":374,"tts":100483},{"cat":"cc","pid":25863,"tid":25871,"ts":531359405647,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":325,"tdur":171,"tts":100489},{"cat":"cc","pid":25863,"tid":25871,"ts":531359405680,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":26,"tdur":26,"tts":100521},{"cat":"cc","pid":25863,"tid":25871,"ts":531359405974,"ph":"X","name":"Display::Draw","args":{},"dur":329,"tdur":191,"tts":100663},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359405983,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":100673,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359405993,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":33,"tdur":31,"tts":100683},{"cat":"cc","pid":25863,"tid":25871,"ts":531359405998,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":10,"tdur":10,"tts":100687},{"cat":"cc","pid":25863,"tid":25871,"ts":531359406009,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":13,"tdur":12,"tts":100698},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359406026,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":255,"tdur":115,"tts":100716},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359408869,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":33,"tdur":30,"tts":101012},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359408917,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":611,"tdur":356,"tts":101058},{"cat":"cc","pid":25863,"tid":25871,"ts":531359408922,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":318,"tdur":161,"tts":101063},{"cat":"cc","pid":25863,"tid":25871,"ts":531359408955,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":23,"tdur":22,"tts":101096},{"cat":"cc","pid":25863,"tid":25871,"ts":531359409242,"ph":"X","name":"Display::Draw","args":{},"dur":283,"tdur":183,"tts":101228},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359409251,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":101237,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359409261,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":32,"tdur":31,"tts":101247},{"cat":"cc","pid":25863,"tid":25871,"ts":531359409265,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":11,"tdur":10,"tts":101251},{"cat":"cc","pid":25863,"tid":25871,"ts":531359409276,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":13,"tdur":12,"tts":101262},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359409293,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":213,"tdur":113,"tts":101279},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359412705,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":33,"tdur":30,"tts":101565},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359412753,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":528,"tdur":337,"tts":101611},{"cat":"cc","pid":25863,"tid":25871,"ts":531359412757,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":289,"tdur":172,"tts":101616},{"cat":"cc","pid":25863,"tid":25871,"ts":531359412790,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":24,"tdur":23,"tts":101648},{"cat":"cc","pid":25863,"tid":25871,"ts":531359413049,"ph":"X","name":"Display::Draw","args":{},"dur":229,"tdur":152,"tts":101792},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359413058,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":101801,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359413068,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":31,"tdur":31,"tts":101811},{"cat":"cc","pid":25863,"tid":25871,"ts":531359413072,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":11,"tdur":9,"tts":101816},{"cat":"cc","pid":25863,"tid":25871,"ts":531359413084,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":12,"tdur":11,"tts":101827},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359413100,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":158,"tdur":81,"tts":101843},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359415653,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":36,"tdur":33,"tts":102098},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359415704,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":54182,"tdur":405,"tts":102147},{"cat":"cc","pid":25863,"tid":25871,"ts":531359415709,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":362,"tdur":190,"tts":102151},{"cat":"cc","pid":25863,"tid":25871,"ts":531359415742,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":24,"tdur":23,"tts":102185},{"cat":"cc","pid":25863,"tid":25871,"ts":531359416073,"ph":"X","name":"Display::Draw","args":{},"dur":53812,"tdur":206,"tts":102345},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359416082,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":102354,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359416092,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":32,"tdur":31,"tts":102364},{"cat":"cc","pid":25863,"tid":25871,"ts":531359416097,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":10,"tdur":9,"tts":102369},{"cat":"cc","pid":25863,"tid":25871,"ts":531359416108,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":12,"tdur":11,"tts":102380},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359416125,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":53751,"tdur":144,"tts":102397},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359473186,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":36,"tdur":33,"tts":102674},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359473236,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":323,"tdur":187,"tts":102722},{"cat":"cc","pid":25863,"tid":25871,"ts":531359473241,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":187,"tdur":100,"tts":102727},{"cat":"cc","pid":25863,"tid":25871,"ts":531359473274,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":11,"tdur":11,"tts":102760},{"cat":"cc","pid":25863,"tid":25871,"ts":531359473429,"ph":"X","name":"Display::Draw","args":{},"dur":129,"tdur":80,"tts":102828},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359473433,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":102833,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359473437,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":14,"tdur":13,"tts":102837},{"cat":"cc","pid":25863,"tid":25871,"ts":531359473439,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":4,"tts":102839},{"cat":"cc","pid":25863,"tid":25871,"ts":531359473444,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":5,"tts":102844},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359473452,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":98,"tdur":48,"tts":102851},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359474610,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":19,"tdur":18,"tts":102989},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359474635,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":275,"tdur":170,"tts":103014},{"cat":"cc","pid":25863,"tid":25871,"ts":531359474638,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":135,"tdur":82,"tts":103016},{"cat":"cc","pid":25863,"tid":25871,"ts":531359474652,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":9,"tdur":8,"tts":103031},{"cat":"cc","pid":25863,"tid":25871,"ts":531359474774,"ph":"X","name":"Display::Draw","args":{},"dur":135,"tdur":83,"tts":103100},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359474778,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":103104,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359474783,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":14,"tdur":14,"tts":103108},{"cat":"cc","pid":25863,"tid":25871,"ts":531359474785,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":4,"tdur":5,"tts":103110},{"cat":"cc","pid":25863,"tid":25871,"ts":531359474790,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":6,"tts":103115},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359474797,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":103,"tdur":51,"tts":103123},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359476043,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":19,"tdur":18,"tts":103264},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359476069,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":320,"tdur":202,"tts":103289},{"cat":"cc","pid":25863,"tid":25871,"ts":531359476071,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":139,"tdur":105,"tts":103291},{"cat":"cc","pid":25863,"tid":25871,"ts":531359476093,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":15,"tdur":14,"tts":103314},{"cat":"cc","pid":25863,"tid":25871,"ts":531359476211,"ph":"X","name":"Display::Draw","args":{},"dur":176,"tdur":91,"tts":103398},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359476215,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":103402,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359476219,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":22,"tdur":21,"tts":103406},{"cat":"cc","pid":25863,"tid":25871,"ts":531359476221,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":4,"tts":103408},{"cat":"cc","pid":25863,"tid":25871,"ts":531359476226,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":13,"tdur":13,"tts":103413},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359476241,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":138,"tdur":53,"tts":103428},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359477521,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":14,"tdur":12,"tts":103541},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359477540,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":76085,"tdur":306,"tts":103559},{"cat":"cc","pid":25863,"tid":25871,"ts":531359477542,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":146,"tdur":81,"tts":103561},{"cat":"cc","pid":25863,"tid":25871,"ts":531359477557,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":9,"tdur":8,"tts":103576},{"cat":"cc","pid":25863,"tid":25871,"ts":531359477689,"ph":"X","name":"Display::Draw","args":{},"dur":75935,"tdur":219,"tts":103644},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359477693,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":103648,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359477697,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":14,"tdur":13,"tts":103652},{"cat":"cc","pid":25863,"tid":25871,"ts":531359477699,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":4,"tdur":4,"tts":103654},{"cat":"cc","pid":25863,"tid":25871,"ts":531359477704,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":5,"tts":103659},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359477711,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":75905,"tdur":188,"tts":103666},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359555038,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":29,"tdur":27,"tts":103918},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359555073,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":207,"tdur":128,"tts":103952},{"cat":"cc","pid":25863,"tid":25871,"ts":531359555075,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":99,"tdur":47,"tts":103954},{"cat":"cc","pid":25863,"tid":25871,"ts":531359555089,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":10,"tdur":10,"tts":103968},{"cat":"cc","pid":25863,"tid":25871,"ts":531359555175,"ph":"X","name":"Display::Draw","args":{},"dur":104,"tdur":77,"tts":104002},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359555178,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":104006,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359555182,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":14,"tdur":14,"tts":104009},{"cat":"cc","pid":25863,"tid":25871,"ts":531359555184,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":4,"tts":104012},{"cat":"cc","pid":25863,"tid":25871,"ts":531359555189,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":6,"tts":104016},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359555196,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":75,"tdur":46,"tts":104024},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359556433,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":12,"tdur":11,"tts":104125},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359556451,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":239,"tdur":87,"tts":104143},{"cat":"cc","pid":25863,"tid":25871,"ts":531359556453,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":130,"tdur":45,"tts":104144},{"cat":"cc","pid":25863,"tid":25871,"ts":531359556466,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":9,"tdur":9,"tts":104158},{"cat":"cc","pid":25863,"tid":25871,"ts":531359556584,"ph":"X","name":"Display::Draw","args":{},"dur":105,"tdur":39,"tts":104190},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359556587,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":104193,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359556590,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":14,"tdur":13,"tts":104196},{"cat":"cc","pid":25863,"tid":25871,"ts":531359556592,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":4,"tts":104198},{"cat":"cc","pid":25863,"tid":25871,"ts":531359556597,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":5,"tts":104203},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359556604,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":80,"tdur":15,"tts":104210},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359557742,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":9,"tdur":9,"tts":104267},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359557756,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":144,"tdur":81,"tts":104282},{"cat":"cc","pid":25863,"tid":25871,"ts":531359557758,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":73,"tdur":39,"tts":104283},{"cat":"cc","pid":25863,"tid":25871,"ts":531359557770,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":8,"tdur":8,"tts":104295},{"cat":"cc","pid":25863,"tid":25871,"ts":531359557832,"ph":"X","name":"Display::Draw","args":{},"dur":67,"tdur":39,"tts":104323},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359557835,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":104326,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359557838,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":11,"tdur":11,"tts":104329},{"cat":"cc","pid":25863,"tid":25871,"ts":531359557840,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":4,"tdur":4,"tts":104331},{"cat":"cc","pid":25863,"tid":25871,"ts":531359557844,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":4,"tdur":4,"tts":104335},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359557850,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":44,"tdur":17,"tts":104341},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359559014,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":10,"tdur":8,"tts":104400},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359559028,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":61362,"tdur":305,"tts":104413},{"cat":"cc","pid":25863,"tid":25871,"ts":531359559030,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":108,"tdur":72,"tts":104415},{"cat":"cc","pid":25863,"tid":25871,"ts":531359559042,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":7,"tdur":7,"tts":104427},{"cat":"cc","pid":25863,"tid":25871,"ts":531359559139,"ph":"X","name":"Display::Draw","args":{},"dur":61248,"tdur":226,"tts":104489},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359559143,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":104493,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359559147,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":14,"tdur":13,"tts":104497},{"cat":"cc","pid":25863,"tid":25871,"ts":531359559149,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":4,"tts":104499},{"cat":"cc","pid":25863,"tid":25871,"ts":531359559154,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":5,"tts":104504},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359559161,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":61208,"tdur":184,"tts":104511},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359622923,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":33,"tdur":31,"tts":104878},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359622971,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":658,"tdur":355,"tts":104925},{"cat":"cc","pid":25863,"tid":25871,"ts":531359622975,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":333,"tdur":167,"tts":104929},{"cat":"cc","pid":25863,"tid":25871,"ts":531359623009,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":23,"tdur":22,"tts":104963},{"cat":"cc","pid":25863,"tid":25871,"ts":531359623310,"ph":"X","name":"Display::Draw","args":{},"dur":315,"tdur":177,"tts":105100},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359623319,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":105109,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359623329,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":51,"tdur":50,"tts":105119},{"cat":"cc","pid":25863,"tid":25871,"ts":531359623333,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":30,"tdur":29,"tts":105123},{"cat":"cc","pid":25863,"tid":25871,"ts":531359623364,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":12,"tdur":12,"tts":105154},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359623381,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":225,"tdur":86,"tts":105171},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359626252,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":32,"tdur":31,"tts":105450},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359626300,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":628,"tdur":364,"tts":105497},{"cat":"cc","pid":25863,"tid":25871,"ts":531359626305,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":318,"tdur":162,"tts":105502},{"cat":"cc","pid":25863,"tid":25871,"ts":531359626337,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":24,"tdur":23,"tts":105534},{"cat":"cc","pid":25863,"tid":25871,"ts":531359626625,"ph":"X","name":"Display::Draw","args":{},"dur":300,"tdur":189,"tts":105668},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359626634,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":105677,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359626644,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":32,"tdur":31,"tts":105687},{"cat":"cc","pid":25863,"tid":25871,"ts":531359626649,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":11,"tdur":10,"tts":105692},{"cat":"cc","pid":25863,"tid":25871,"ts":531359626660,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":12,"tdur":12,"tts":105703},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359626677,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":228,"tdur":117,"tts":105720},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359629380,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":29,"tdur":27,"tts":105961},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359629421,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":588,"tdur":356,"tts":106002},{"cat":"cc","pid":25863,"tid":25871,"ts":531359629426,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":263,"tdur":167,"tts":106007},{"cat":"cc","pid":25863,"tid":25871,"ts":531359629460,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":20,"tdur":19,"tts":106041},{"cat":"cc","pid":25863,"tid":25871,"ts":531359629691,"ph":"X","name":"Display::Draw","args":{},"dur":314,"tdur":177,"tts":106178},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359629700,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":106187,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359629711,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":49,"tdur":49,"tts":106197},{"cat":"cc","pid":25863,"tid":25871,"ts":531359629715,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":11,"tdur":9,"tts":106202},{"cat":"cc","pid":25863,"tid":25871,"ts":531359629727,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":29,"tdur":28,"tts":106213},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359629761,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":225,"tdur":88,"tts":106247},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359632414,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":13,"tdur":12,"tts":106434},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359632433,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":38449,"tdur":367,"tts":106452},{"cat":"cc","pid":25863,"tid":25871,"ts":531359632435,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":153,"tdur":104,"tts":106454},{"cat":"cc","pid":25863,"tid":25871,"ts":531359632449,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":10,"tdur":9,"tts":106469},{"cat":"cc","pid":25863,"tid":25871,"ts":531359632590,"ph":"X","name":"Display::Draw","args":{},"dur":38290,"tdur":254,"tts":106562},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359632600,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":106571,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359632610,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":30,"tdur":30,"tts":106581},{"cat":"cc","pid":25863,"tid":25871,"ts":531359632614,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":19,"tdur":17,"tts":106586},{"cat":"cc","pid":25863,"tid":25871,"ts":531359632633,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":5,"tts":106604},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359632641,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":38206,"tdur":170,"tts":106612},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359672323,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":36,"tdur":34,"tts":106952},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359672375,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":726,"tdur":377,"tts":107003},{"cat":"cc","pid":25863,"tid":25871,"ts":531359672379,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":369,"tdur":190,"tts":107008},{"cat":"cc","pid":25863,"tid":25871,"ts":531359672417,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":25,"tdur":24,"tts":107045},{"cat":"cc","pid":25863,"tid":25871,"ts":531359672750,"ph":"X","name":"Display::Draw","args":{},"dur":348,"tdur":175,"tts":107202},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359672759,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":107210,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359672769,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":33,"tdur":32,"tts":107221},{"cat":"cc","pid":25863,"tid":25871,"ts":531359672774,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":11,"tdur":10,"tts":107225},{"cat":"cc","pid":25863,"tid":25871,"ts":531359672785,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":14,"tdur":12,"tts":107237},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359672803,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":277,"tdur":105,"tts":107254},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359676485,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":32,"tdur":30,"tts":107523},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359676532,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":549,"tdur":317,"tts":107569},{"cat":"cc","pid":25863,"tid":25871,"ts":531359676536,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":296,"tdur":166,"tts":107573},{"cat":"cc","pid":25863,"tid":25871,"ts":531359676569,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":20,"tdur":19,"tts":107606},{"cat":"cc","pid":25863,"tid":25871,"ts":531359676834,"ph":"X","name":"Display::Draw","args":{},"dur":245,"tdur":142,"tts":107742},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359676840,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":107748,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359676846,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":20,"tdur":20,"tts":107754},{"cat":"cc","pid":25863,"tid":25871,"ts":531359676849,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":7,"tdur":6,"tts":107757},{"cat":"cc","pid":25863,"tid":25871,"ts":531359676857,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":7,"tdur":7,"tts":107765},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359676867,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":200,"tdur":96,"tts":107775},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359679453,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":22,"tdur":20,"tts":108021},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359679484,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":224,"tdur":153,"tts":108051},{"cat":"cc","pid":25863,"tid":25871,"ts":531359679487,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":94,"tdur":72,"tts":108054},{"cat":"cc","pid":25863,"tid":25871,"ts":531359679509,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":17,"tdur":16,"tts":108076},{"cat":"cc","pid":25863,"tid":25871,"ts":531359679581,"ph":"X","name":"Display::Draw","args":{},"dur":125,"tdur":73,"tts":108128},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359679586,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":108132,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359679592,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":20,"tdur":20,"tts":108138},{"cat":"cc","pid":25863,"tid":25871,"ts":531359679595,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":6,"tdur":6,"tts":108141},{"cat":"cc","pid":25863,"tid":25871,"ts":531359679602,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":8,"tdur":8,"tts":108148},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359679613,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":80,"tdur":29,"tts":108159},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359681844,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":16,"tdur":14,"tts":108319},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359681867,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":69811,"tdur":343,"tts":108341},{"cat":"cc","pid":25863,"tid":25871,"ts":531359681880,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":338,"tdur":142,"tts":108354},{"cat":"cc","pid":25863,"tid":25871,"ts":531359681901,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":12,"tdur":11,"tts":108375},{"cat":"cc","pid":25863,"tid":25871,"ts":531359682220,"ph":"X","name":"Display::Draw","args":{},"dur":69455,"tdur":181,"tts":108499},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359682226,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":108504,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359682232,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":20,"tdur":19,"tts":108511},{"cat":"cc","pid":25863,"tid":25871,"ts":531359682235,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":7,"tdur":6,"tts":108514},{"cat":"cc","pid":25863,"tid":25871,"ts":531359682242,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":8,"tdur":7,"tts":108521},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359682252,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":69407,"tdur":133,"tts":108531},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359754088,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":32,"tdur":31,"tts":108798},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359754130,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":286,"tdur":198,"tts":108839},{"cat":"cc","pid":25863,"tid":25871,"ts":531359754134,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":148,"tdur":102,"tts":108843},{"cat":"cc","pid":25863,"tid":25871,"ts":531359754162,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":13,"tdur":12,"tts":108871},{"cat":"cc","pid":25863,"tid":25871,"ts":531359754282,"ph":"X","name":"Display::Draw","args":{},"dur":133,"tdur":90,"tts":108946},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359754288,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":108952,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359754295,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":25,"tdur":24,"tts":108959},{"cat":"cc","pid":25863,"tid":25871,"ts":531359754300,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":7,"tdur":6,"tts":108964},{"cat":"cc","pid":25863,"tid":25871,"ts":531359754307,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":11,"tdur":10,"tts":108971},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359754320,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":87,"tdur":43,"tts":108984},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359756232,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":15,"tdur":14,"tts":109109},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359756253,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":303,"tdur":167,"tts":109129},{"cat":"cc","pid":25863,"tid":25871,"ts":531359756255,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":165,"tdur":84,"tts":109131},{"cat":"cc","pid":25863,"tid":25871,"ts":531359756269,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":11,"tdur":10,"tts":109146},{"cat":"cc","pid":25863,"tid":25871,"ts":531359756421,"ph":"X","name":"Display::Draw","args":{},"dur":134,"tdur":77,"tts":109217},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359756425,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":109221,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359756429,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":14,"tdur":13,"tts":109225},{"cat":"cc","pid":25863,"tid":25871,"ts":531359756431,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":5,"tts":109227},{"cat":"cc","pid":25863,"tid":25871,"ts":531359756436,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":5,"tts":109232},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359756443,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":104,"tdur":47,"tts":109239},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359758280,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":14,"tdur":13,"tts":109380},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359758300,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":215,"tdur":104,"tts":109399},{"cat":"cc","pid":25863,"tid":25871,"ts":531359758302,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":101,"tdur":47,"tts":109401},{"cat":"cc","pid":25863,"tid":25871,"ts":531359758316,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":11,"tdur":11,"tts":109415},{"cat":"cc","pid":25863,"tid":25871,"ts":531359758404,"ph":"X","name":"Display::Draw","args":{},"dur":110,"tdur":53,"tts":109449},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359758407,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":109452,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359758410,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":26,"tdur":25,"tts":109456},{"cat":"cc","pid":25863,"tid":25871,"ts":531359758412,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":4,"tts":109458},{"cat":"cc","pid":25863,"tid":25871,"ts":531359758417,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":17,"tdur":17,"tts":109462},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359758436,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":73,"tdur":16,"tts":109481},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359760207,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":13,"tdur":13,"tts":109580},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359760226,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":70935,"tdur":317,"tts":109599},{"cat":"cc","pid":25863,"tid":25871,"ts":531359760228,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":121,"tdur":70,"tts":109601},{"cat":"cc","pid":25863,"tid":25871,"ts":531359760242,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":11,"tdur":10,"tts":109615},{"cat":"cc","pid":25863,"tid":25871,"ts":531359760349,"ph":"X","name":"Display::Draw","args":{},"dur":70809,"tdur":239,"tts":109673},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359760353,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":109676,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359760357,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":13,"tdur":13,"tts":109680},{"cat":"cc","pid":25863,"tid":25871,"ts":531359760359,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":4,"tdur":4,"tts":109682},{"cat":"cc","pid":25863,"tid":25871,"ts":531359760363,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":4,"tts":109687},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359760370,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":70771,"tdur":202,"tts":109693},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359834359,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":51,"tdur":48,"tts":110088},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359834427,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":628,"tdur":354,"tts":110155},{"cat":"cc","pid":25863,"tid":25871,"ts":531359834434,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":323,"tdur":172,"tts":110161},{"cat":"cc","pid":25863,"tid":25871,"ts":531359834480,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":27,"tdur":27,"tts":110207},{"cat":"cc","pid":25863,"tid":25871,"ts":531359834759,"ph":"X","name":"Display::Draw","args":{},"dur":293,"tdur":170,"tts":110336},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359834769,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":110347,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359834780,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":40,"tdur":39,"tts":110358},{"cat":"cc","pid":25863,"tid":25871,"ts":531359834787,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":12,"tdur":10,"tts":110365},{"cat":"cc","pid":25863,"tid":25871,"ts":531359834799,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":18,"tdur":16,"tts":110377},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359834821,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":215,"tdur":90,"tts":110399},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359836970,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":17,"tdur":16,"tts":110615},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359836994,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":505,"tdur":322,"tts":110638},{"cat":"cc","pid":25863,"tid":25871,"ts":531359836997,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":288,"tdur":153,"tts":110640},{"cat":"cc","pid":25863,"tid":25871,"ts":531359837013,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":11,"tdur":10,"tts":110657},{"cat":"cc","pid":25863,"tid":25871,"ts":531359837287,"ph":"X","name":"Display::Draw","args":{},"dur":208,"tdur":159,"tts":110797},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359837295,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":110805,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359837335,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":16,"tdur":15,"tts":110845},{"cat":"cc","pid":25863,"tid":25871,"ts":531359837338,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":5,"tts":110847},{"cat":"cc","pid":25863,"tid":25871,"ts":531359837343,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":5,"tts":110853},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359837351,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":132,"tdur":82,"tts":110861},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359838847,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":17,"tdur":16,"tts":111071},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359838871,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":424,"tdur":301,"tts":111094},{"cat":"cc","pid":25863,"tid":25871,"ts":531359838873,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":222,"tdur":142,"tts":111097},{"cat":"cc","pid":25863,"tid":25871,"ts":531359838890,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":11,"tdur":11,"tts":111113},{"cat":"cc","pid":25863,"tid":25871,"ts":531359839096,"ph":"X","name":"Display::Draw","args":{},"dur":197,"tdur":149,"tts":111243},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359839104,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":111250,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359839112,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":38,"tdur":37,"tts":111259},{"cat":"cc","pid":25863,"tid":25871,"ts":531359839116,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":9,"tdur":9,"tts":111262},{"cat":"cc","pid":25863,"tid":25871,"ts":531359839126,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":22,"tdur":22,"tts":111272},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359839151,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":126,"tdur":78,"tts":111297},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359840577,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":33,"tdur":20,"tts":111531},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359840626,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":62485,"tdur":428,"tts":111581},{"cat":"cc","pid":25863,"tid":25871,"ts":531359840632,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":277,"tdur":193,"tts":111586},{"cat":"cc","pid":25863,"tid":25871,"ts":531359840684,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":11,"tdur":10,"tts":111638},{"cat":"cc","pid":25863,"tid":25871,"ts":531359840910,"ph":"X","name":"Display::Draw","args":{},"dur":62200,"tdur":225,"tts":111782},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359840919,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":111790,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359840927,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":44,"tdur":43,"tts":111799},{"cat":"cc","pid":25863,"tid":25871,"ts":531359840931,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":24,"tdur":24,"tts":111802},{"cat":"cc","pid":25863,"tid":25871,"ts":531359840956,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":12,"tdur":12,"tts":111827},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359840972,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":62129,"tdur":154,"tts":111844},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359904936,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":15,"tdur":13,"tts":112128},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359904958,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":321,"tdur":174,"tts":112148},{"cat":"cc","pid":25863,"tid":25871,"ts":531359904960,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":169,"tdur":87,"tts":112150},{"cat":"cc","pid":25863,"tid":25871,"ts":531359904974,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":11,"tdur":10,"tts":112165},{"cat":"cc","pid":25863,"tid":25871,"ts":531359905130,"ph":"X","name":"Display::Draw","args":{},"dur":148,"tdur":81,"tts":112239},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359905134,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":112243,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359905139,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":14,"tdur":14,"tts":112247},{"cat":"cc","pid":25863,"tid":25871,"ts":531359905141,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":4,"tdur":5,"tts":112249},{"cat":"cc","pid":25863,"tid":25871,"ts":531359905146,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":5,"tts":112255},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359905153,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":117,"tdur":50,"tts":112262},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359906445,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":14,"tdur":13,"tts":112398},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359906466,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":277,"tdur":165,"tts":112418},{"cat":"cc","pid":25863,"tid":25871,"ts":531359906468,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":136,"tdur":84,"tts":112420},{"cat":"cc","pid":25863,"tid":25871,"ts":531359906482,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":11,"tdur":10,"tts":112435},{"cat":"cc","pid":25863,"tid":25871,"ts":531359906605,"ph":"X","name":"Display::Draw","args":{},"dur":137,"tdur":77,"tts":112505},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359906609,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":112509,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359906614,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":14,"tdur":13,"tts":112514},{"cat":"cc","pid":25863,"tid":25871,"ts":531359906616,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":4,"tts":112516},{"cat":"cc","pid":25863,"tid":25871,"ts":531359906621,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":5,"tts":112521},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359906628,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":105,"tdur":45,"tts":112528},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359907842,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":19,"tdur":18,"tts":112660},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359907868,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":333,"tdur":170,"tts":112685},{"cat":"cc","pid":25863,"tid":25871,"ts":531359907870,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":170,"tdur":84,"tts":112687},{"cat":"cc","pid":25863,"tid":25871,"ts":531359907885,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":8,"tdur":8,"tts":112702},{"cat":"cc","pid":25863,"tid":25871,"ts":531359908041,"ph":"X","name":"Display::Draw","args":{},"dur":159,"tdur":81,"tts":112773},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359908045,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":112777,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359908049,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":14,"tdur":14,"tts":112781},{"cat":"cc","pid":25863,"tid":25871,"ts":531359908051,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":4,"tdur":5,"tts":112783},{"cat":"cc","pid":25863,"tid":25871,"ts":531359908056,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":5,"tts":112788},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359908063,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":129,"tdur":49,"tts":112796},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359909303,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":13,"tdur":12,"tts":112904},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359909322,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":60382,"tdur":268,"tts":112923},{"cat":"cc","pid":25863,"tid":25871,"ts":531359909324,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":121,"tdur":85,"tts":112925},{"cat":"cc","pid":25863,"tid":25871,"ts":531359909338,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":9,"tdur":9,"tts":112939},{"cat":"cc","pid":25863,"tid":25871,"ts":531359909446,"ph":"X","name":"Display::Draw","args":{},"dur":60253,"tdur":174,"tts":113012},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359909450,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":113016,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359909455,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":26,"tdur":25,"tts":113021},{"cat":"cc","pid":25863,"tid":25871,"ts":531359909457,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":16,"tdur":16,"tts":113023},{"cat":"cc","pid":25863,"tid":25871,"ts":531359909474,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":6,"tts":113039},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358198786,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":16,"tdur":11,"tts":997050},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358199036,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":19,"tdur":18,"tts":997111},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358199043,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":11,"tdur":10,"tts":997118},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358199058,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":64,"tdur":63,"tts":997133},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358199062,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":58,"tdur":57,"tts":997137},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358199078,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":32,"tdur":30,"tts":997153},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358200026,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":17667,"tdur":1465,"tts":997308},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358200041,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":17648,"tdur":1448,"tts":997322},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358217670,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":17},"dur":13,"tdur":11,"tts":998753},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358217702,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":3,"tts":998784},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358217718,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":3588,"tdur":3573,"tts":998800},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358217722,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":3467,"tdur":3450,"tts":998804},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358221219,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":83,"tdur":83,"tts":1002286},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358221344,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":16,"tdur":14,"tts":1002412},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358221410,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":823,"tdur":823,"tts":1002477},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358221417,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":814,"tdur":813,"tts":1002485},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358221608,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":17},"dur":241,"tdur":239,"tts":1002676},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358222090,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1003158,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358222096,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":160},"dur":132,"tdur":130,"tts":1003164},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358222099,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":127,"tdur":126,"tts":1003167},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358222248,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":7,"tdur":5,"tts":1003316},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358222271,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":422,"tdur":365,"tts":1003339},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358222277,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":393,"tdur":337,"tts":1003344},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358222674,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":18,"tdur":17,"tts":1003686},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358222696,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":30,"tdur":29,"tts":1003708},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358222700,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":24,"tdur":23,"tts":1003712},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358222748,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":201,"tdur":199,"tts":1003761},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358222758,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":188,"tdur":186,"tts":1003770},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358222805,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":108,"tdur":105,"tts":1003818},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358222956,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":30051,"tdur":3007,"tts":1003968},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358222968,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":30037,"tdur":2992,"tts":1003980},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358252941,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":229},"dur":59,"tdur":56,"tts":1006911},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358253031,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":7,"tdur":6,"tts":1007000},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358253060,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":467,"tdur":338,"tts":1007028},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358253068,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":434,"tdur":304,"tts":1007037},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358253506,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":18,"tdur":17,"tts":1007346},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358253544,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1007385},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358253554,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":259,"tdur":259,"tts":1007394},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358253561,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":250,"tdur":248,"tts":1007402},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358253601,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":229},"dur":39,"tdur":37,"tts":1007442},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358253714,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1007556,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358253721,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":161},"dur":86,"tdur":85,"tts":1007562},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358253725,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":81,"tdur":79,"tts":1007566},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358253835,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":7,"tdur":6,"tts":1007676},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358253845,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":470,"tdur":364,"tts":1007685},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358253851,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":440,"tdur":332,"tts":1007692},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358254294,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":19,"tdur":18,"tts":1008029},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358254333,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":24,"tdur":23,"tts":1008068},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358254341,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":15,"tdur":13,"tts":1008076},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358254361,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":107,"tdur":107,"tts":1008095},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358254367,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":99,"tdur":97,"tts":1008102},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358254395,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":54,"tdur":52,"tts":1008130},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358254486,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":2045,"tdur":1055,"tts":1008221},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358254495,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":2032,"tdur":1041,"tts":1008230},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358256540,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":1682,"tdur":1681,"tts":1009286},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358256553,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":1666,"tdur":1665,"tts":1009299},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358258150,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":85},"dur":64,"tdur":61,"tts":1010898},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358258249,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":9,"tdur":8,"tts":1010996},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358258262,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":1676,"tdur":1551,"tts":1011009},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358258271,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":1636,"tdur":1510,"tts":1011017},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358259911,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":24,"tdur":22,"tts":1012535},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358259963,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":9,"tdur":8,"tts":1012586},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358259975,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":2903,"tdur":2719,"tts":1012598},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358259984,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":2810,"tdur":2625,"tts":1012607},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358198821,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":20,"tdur":19,"tts":97179},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358199056,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":97330},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358200063,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":5,"tts":97568},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358200466,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":97727},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358200646,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":97871},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358200952,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":97987},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358201881,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":98098},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358202142,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":98212},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358202283,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":98304},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358202614,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":3,"tts":98366},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358203293,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":98427},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358203547,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":98487},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358203736,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":98546},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358203807,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":98590},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358203844,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":98627},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358204125,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":98686},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358205057,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":98746},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358205270,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":98805},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358205427,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":98882},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358285416,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":99138},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358287672,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":21,"tdur":17,"tts":99390},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358290776,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":99662},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358291089,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":3,"tts":99818},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358291276,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":99963},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358291593,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":3,"tts":100090},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358292353,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":100179},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358292554,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":100266},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358292675,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":100329},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358292974,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":100412},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358293752,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":100497},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358293903,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":100564},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358294076,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":100671},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358295249,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":100767},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358296017,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":100865},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358296178,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":100943},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358296285,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":101017},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358354036,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":5,"tts":101220},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358354618,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":101478},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358356265,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":101743},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358356539,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":101923},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358356705,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":5,"tts":102046},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358357045,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":102192},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358357841,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":102260},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358358097,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":102356},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358358288,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":102507},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358358594,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":102615},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358359362,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":102715},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358359548,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":102793},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358359793,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":102874},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358359910,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":102940},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358360239,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":103007},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358361210,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":103064},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358361375,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":103122},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358361499,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":103183},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358361519,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":103199},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358419617,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":103340},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358420122,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":103544},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358421938,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":103805},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358422244,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":6,"tts":103996},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358422414,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":104134},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358422742,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":104259},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358423666,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":104373},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358423924,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":104489},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358424077,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":104593},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358198980,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":37,"tdur":36,"tts":54276},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358199908,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":62,"tdur":60,"tts":54369},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358200382,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":31,"tdur":30,"tts":54472},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358200567,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":25,"tdur":24,"tts":54543},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358200594,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":5,"tts":54569},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358200885,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":20,"tts":54615},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358201829,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":25,"tdur":24,"tts":54679},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358202080,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":25,"tdur":24,"tts":54743},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358202248,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":26,"tdur":25,"tts":54802},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358202276,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":6,"tdur":5,"tts":54829},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358202583,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":21,"tts":54876},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358203265,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":20,"tdur":19,"tts":54938},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358203513,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":26,"tdur":25,"tts":54999},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358203709,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":19,"tdur":18,"tts":55048},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358203798,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":8,"tdur":7,"tts":55073},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358203829,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":13,"tdur":13,"tts":55087},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358204102,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":15,"tdur":15,"tts":55116},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358205023,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":26,"tdur":25,"tts":55171},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358205234,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":28,"tdur":27,"tts":55233},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358205396,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":23,"tdur":21,"tts":55302},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358205420,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":6,"tdur":6,"tts":55325},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358285254,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":139,"tdur":138,"tts":55401},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358287538,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":56,"tdur":54,"tts":55605},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358290637,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":62,"tdur":59,"tts":55723},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358291025,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":24,"tdur":23,"tts":55827},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358291219,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":17,"tdur":16,"tts":55885},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358291237,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":9,"tdur":9,"tts":55902},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358291539,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":17,"tdur":17,"tts":55948},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358292295,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":19,"tts":56000},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358292505,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":20,"tdur":20,"tts":56055},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358292645,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":21,"tts":56111},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358292669,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":5,"tts":56135},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358292929,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":11,"tdur":11,"tts":56163},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358293698,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":14,"tdur":13,"tts":56198},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358293885,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":15,"tdur":15,"tts":56217},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358294034,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":17,"tdur":15,"tts":56266},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358294052,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":9,"tdur":8,"tts":56283},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358295207,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":17,"tts":56326},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358295957,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":20,"tts":56381},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358296147,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":23,"tdur":22,"tts":56433},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358296260,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":17,"tdur":15,"tts":56490},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358296279,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":6,"tts":56507},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358353941,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":45,"tdur":42,"tts":56573},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358354485,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":53,"tdur":51,"tts":56680},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358356130,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":64,"tdur":62,"tts":56802},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358356469,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":27,"tdur":27,"tts":56906},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358356638,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":24,"tdur":23,"tts":56971},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358356664,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":5,"tts":56995},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358356984,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":20,"tdur":19,"tts":57041},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358357807,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":26,"tdur":25,"tts":57100},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358358030,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":24,"tdur":23,"tts":57164},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358358224,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":25,"tdur":23,"tts":57225},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358358250,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":5,"tts":57250},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358358546,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":20,"tdur":20,"tts":57292},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358359317,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":19,"tdur":18,"tts":57352},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358359515,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":25,"tdur":23,"tts":57412},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358359741,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":24,"tdur":23,"tts":57473},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358359878,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":25,"tdur":23,"tts":57534},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358359904,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":5,"tts":57559},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358360211,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":20,"tts":57603},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358361172,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":32,"tdur":31,"tts":57643},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358361341,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":26,"tdur":25,"tts":57690},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358361480,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":19,"tdur":18,"tts":57728},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358361501,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":16,"tdur":15,"tts":57748},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358262799,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":75,"tdur":74,"tts":1015239},{"cat":"trace_event_overhead","pid":25863,"tid":25870,"ts":531358262799,"ph":"X","name":"overhead","args":{},"dur":60,"tdur":57,"tts":1015239},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358262906,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":566,"tdur":447,"tts":1015346},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358262917,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":327,"tdur":208,"tts":1015357},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358263248,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":222,"tdur":221,"tts":1015570},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358263285,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":85},"dur":37,"tdur":35,"tts":1015607},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358263393,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1015716,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358263399,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":162},"dur":68,"tdur":67,"tts":1015721},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358263402,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":64,"tdur":63,"tts":1015724},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358263478,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1015800},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358263505,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":485,"tdur":369,"tts":1015827},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358263511,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":449,"tdur":332,"tts":1015833},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358263963,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":25,"tdur":22,"tts":1016171},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358263997,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":157,"tdur":133,"tts":1016204},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358264050,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":103,"tdur":102,"tts":1016234},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358264090,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":55,"tdur":54,"tts":1016274},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358264164,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":19972,"tdur":1230,"tts":1016348},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358264168,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":19967,"tdur":1226,"tts":1016351},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358284107,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":81},"dur":26,"tdur":25,"tts":1017550},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358284138,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1017581},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358284148,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":408,"tdur":346,"tts":1017591},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358284151,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":379,"tdur":317,"tts":1017593},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358284534,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":18,"tts":1017916},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358284562,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1017944},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358284582,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":239,"tdur":238,"tts":1017964},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358284589,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":230,"tdur":229,"tts":1017971},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358284627,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":81},"dur":36,"tdur":35,"tts":1018009},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358284736,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1018118,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358284742,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":163},"dur":74,"tdur":73,"tts":1018124},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358284745,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":70,"tdur":69,"tts":1018127},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358284826,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":95,"tdur":94,"tts":1018208},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358284939,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":301,"tdur":242,"tts":1018321},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358284946,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":260,"tdur":201,"tts":1018328},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358285209,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":24,"tdur":23,"tts":1018533},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358285377,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":18,"tdur":17,"tts":1018637},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358287602,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":37,"tdur":34,"tts":1018703},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358287617,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":19,"tts":1018716},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358287644,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":109,"tdur":107,"tts":1018743},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358287649,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":102,"tdur":101,"tts":1018747},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358287675,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":56,"tdur":53,"tts":1018774},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358290694,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":27705,"tdur":1926,"tts":1018913},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358290706,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":27690,"tdur":1912,"tts":1018924},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358318344,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":165},"dur":48,"tdur":45,"tts":1020787},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358318405,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1020846},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358318435,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":418,"tdur":351,"tts":1020876},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358318442,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":385,"tdur":317,"tts":1020883},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358318831,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":20,"tdur":18,"tts":1021206},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358318859,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1021234},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358318879,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":167,"tdur":116,"tts":1021254},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358318885,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":153,"tdur":102,"tts":1021259},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358319039,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":7,"tdur":6,"tts":1021363},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358319048,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":349,"tdur":295,"tts":1021372},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358319050,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":128,"tdur":74,"tts":1021374},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358319180,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":215,"tdur":215,"tts":1021450},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358319197,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":165},"dur":41,"tdur":39,"tts":1021468},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358319317,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1021588,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358319323,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":164},"dur":70,"tdur":68,"tts":1021594},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358319326,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":65,"tdur":64,"tts":1021597},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358319417,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1021688},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358319425,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":397,"tdur":308,"tts":1021695},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358319430,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":371,"tdur":282,"tts":1021700},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358319804,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":16,"tdur":15,"tts":1021986},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358319853,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":119,"tdur":118,"tts":1022035},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358319863,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":107,"tdur":106,"tts":1022045},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358319889,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":66,"tdur":64,"tts":1022072},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358319977,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":2898,"tdur":1997,"tts":1022159},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358319985,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":2887,"tdur":1986,"tts":1022167},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358322827,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":22},"dur":42,"tdur":39,"tts":1024110},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358322895,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1024177},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358322903,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":470,"tdur":359,"tts":1024185},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358322909,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":438,"tdur":326,"tts":1024191},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358323351,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":19,"tts":1024523},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358323391,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1024564},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358323399,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":249,"tdur":249,"tts":1024571},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358323405,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":241,"tdur":241,"tts":1024577},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358323453,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":22},"dur":36,"tdur":34,"tts":1024626},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358323562,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1024735,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358323568,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":165},"dur":75,"tdur":75,"tts":1024740},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358323571,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":71,"tdur":69,"tts":1024744},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358323668,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1024840},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358323676,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":530,"tdur":415,"tts":1024848},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358323680,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":491,"tdur":374,"tts":1024853},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358324176,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":26,"tdur":25,"tts":1025234},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358324229,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":30,"tdur":28,"tts":1025288},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358324240,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":17,"tdur":16,"tts":1025298},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358324264,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":131,"tdur":130,"tts":1025322},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358324272,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":120,"tdur":119,"tts":1025330},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358324302,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":67,"tdur":66,"tts":1025360},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358324418,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":11031,"tdur":2169,"tts":1025476},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358324430,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":11016,"tdur":2153,"tts":1025489},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358335389,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":33},"dur":53,"tdur":50,"tts":1027588},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358335455,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1027652},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358335479,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":498,"tdur":372,"tts":1027676},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358335485,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":466,"tdur":338,"tts":1027683},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358335956,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":18,"tts":1028027},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358335983,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1028054},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358336036,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":356,"tdur":227,"tts":1028096},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358336043,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":322,"tdur":193,"tts":1028102},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358336369,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":19,"tts":1028301},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358336398,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":562,"tdur":438,"tts":1028329},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358336404,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":298,"tdur":173,"tts":1028335},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358336706,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":252,"tdur":251,"tts":1028514},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358336763,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":33},"dur":38,"tdur":36,"tts":1028571},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358336873,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1028681,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358336879,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":166},"dur":76,"tdur":75,"tts":1028687},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358336882,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":72,"tdur":70,"tts":1028690},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358336983,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1028790},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358336991,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":502,"tdur":393,"tts":1028798},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358336996,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":462,"tdur":351,"tts":1028803},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358337462,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":27,"tdur":25,"tts":1029162},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358337517,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":137,"tdur":136,"tts":1029217},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358337528,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":124,"tdur":122,"tts":1029228},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358337561,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":67,"tdur":66,"tts":1029260},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358337660,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":14520,"tdur":2112,"tts":1029359},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358337668,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":14510,"tdur":2102,"tts":1029367},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358352148,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":146},"dur":26,"tdur":24,"tts":1031441},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358352202,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1031494},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358352209,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":494,"tdur":368,"tts":1031501},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358352216,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":461,"tdur":336,"tts":1031507},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358352681,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":18,"tts":1031849},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358352721,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1031888},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358352728,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":342,"tdur":215,"tts":1031896},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358352733,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":310,"tdur":182,"tts":1031901},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358353047,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":19,"tts":1032089},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358353089,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":622,"tdur":494,"tts":1032131},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358353095,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":298,"tdur":168,"tts":1032137},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358353397,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":311,"tdur":311,"tts":1032311},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358353479,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":146},"dur":39,"tdur":37,"tts":1032394},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358353611,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1032525,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358353630,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":167},"dur":75,"tdur":74,"tts":1032544},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358353633,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":71,"tdur":69,"tts":1032548},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358353717,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":24,"tdur":23,"tts":1032631},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358354021,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":7,"tdur":6,"tts":1032730},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358354561,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":276,"tdur":163,"tts":1032804},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358354577,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":244,"tdur":131,"tts":1032819},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358354823,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":13,"tdur":12,"tts":1032953},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358354841,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":145,"tdur":145,"tts":1032971},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358354859,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":126,"tdur":125,"tts":1032990},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358354912,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":62,"tdur":61,"tts":1033043},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358356199,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":29115,"tdur":1971,"tts":1033180},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358356217,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":29094,"tdur":1952,"tts":1033197},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358385279,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":246},"dur":28,"tdur":26,"tts":1035119},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358385320,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1035159},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358385350,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":453,"tdur":324,"tts":1035189},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358385357,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":424,"tdur":295,"tts":1035195},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358385784,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":17,"tdur":15,"tts":1035495},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358385807,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1035518},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358385825,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":233,"tdur":232,"tts":1035536},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358385832,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":224,"tdur":223,"tts":1035542},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358385877,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":246},"dur":36,"tdur":35,"tts":1035588},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358385978,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1035689,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358385984,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":168},"dur":69,"tdur":69,"tts":1035694},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358385987,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":65,"tdur":63,"tts":1035698},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358386063,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1035774},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358386084,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":501,"tdur":383,"tts":1035795},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358386089,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":467,"tdur":348,"tts":1035800},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358386559,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":23,"tdur":21,"tts":1036154},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358386590,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":29,"tdur":27,"tts":1036185},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358386600,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":17,"tdur":16,"tts":1036194},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358386640,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":121,"tdur":120,"tts":1036235},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358386650,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":109,"tdur":107,"tts":1036245},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358386694,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":45,"tdur":43,"tts":1036289},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358386768,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":3037,"tdur":2102,"tts":1036363},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358386778,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":3025,"tdur":2089,"tts":1036373},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358389772,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":254},"dur":28,"tdur":25,"tts":1038434},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358389826,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1038486},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358389834,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":484,"tdur":361,"tts":1038494},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358389839,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":452,"tdur":329,"tts":1038499},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358390295,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":20,"tdur":18,"tts":1038834},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358390336,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1038874},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358390343,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":231,"tdur":230,"tts":1038882},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358390349,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":223,"tdur":222,"tts":1038888},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358390380,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":254},"dur":36,"tdur":34,"tts":1038919},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358390489,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1039028,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358390495,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":169},"dur":74,"tdur":74,"tts":1039033},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358390498,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":70,"tdur":69,"tts":1039036},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358390593,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":4,"tts":1039132},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358390601,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":519,"tdur":409,"tts":1039139},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358390606,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":480,"tdur":368,"tts":1039144},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358391091,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":26,"tdur":25,"tts":1039520},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358391145,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":32,"tdur":31,"tts":1039574},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358391156,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":19,"tdur":17,"tts":1039585},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358391182,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":133,"tdur":131,"tts":1039611},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358391191,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":121,"tdur":121,"tts":1039619},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358391240,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":46,"tdur":44,"tts":1039669},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358391336,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":9427,"tdur":950,"tts":1039765},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358391348,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":9410,"tdur":933,"tts":1039776},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358400772,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":1190,"tdur":1189,"tts":1040726},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358400787,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":1172,"tdur":1172,"tts":1040741},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358401907,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":39},"dur":49,"tdur":47,"tts":1041862},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358401983,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1041937},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358401991,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":485,"tdur":379,"tts":1041945},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358401997,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":453,"tdur":345,"tts":1041951},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358402454,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":19,"tts":1042302},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358402495,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1042344},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358402503,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":288,"tdur":288,"tts":1042351},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358402509,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":280,"tdur":278,"tts":1042358},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358402588,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":39},"dur":38,"tdur":37,"tts":1042437},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358402699,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1042548,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358402705,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":170},"dur":81,"tdur":81,"tts":1042553},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358402708,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":77,"tdur":76,"tts":1042556},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358402810,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":4,"tts":1042659},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358402818,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":454,"tdur":368,"tts":1042667},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358402823,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":406,"tdur":320,"tts":1042671},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358403243,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":26,"tdur":24,"tts":1043007},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358403296,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":34,"tdur":32,"tts":1043060},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358403308,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":18,"tts":1043072},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358403335,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":114,"tdur":113,"tts":1043099},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358403343,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":104,"tdur":103,"tts":1043107},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358403398,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":37,"tdur":35,"tts":1043162},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358403463,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":15053,"tdur":2118,"tts":1043227},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358403483,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":15031,"tdur":2096,"tts":1043247},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358417326,"ph":"X","name":"GLES2DecoderImpl::HandleTexSubImage2D","args":{"width":63,"height":10},"dur":119,"tdur":114,"tts":1044158},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358418493,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":229},"dur":17,"tdur":15,"tts":1045324},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358418523,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1045352},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358418546,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":437,"tdur":371,"tts":1045376},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358418553,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":398,"tdur":332,"tts":1045382},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358418956,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":24,"tdur":23,"tts":1045721},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358418990,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1045755},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358419018,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":295,"tdur":294,"tts":1045783},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358419029,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":282,"tdur":280,"tts":1045794},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358419094,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":229},"dur":41,"tdur":39,"tts":1045860},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358419195,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1045961,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358419204,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":171},"dur":102,"tdur":102,"tts":1045968},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358419208,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":97,"tdur":95,"tts":1045973},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358419320,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":30,"tdur":28,"tts":1046085},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358419374,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":306,"tdur":264,"tts":1046139},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358419383,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":265,"tdur":223,"tts":1046148},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358419650,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":28,"tdur":27,"tts":1046374},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358419684,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":3,"tts":1046409},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358420053,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":29,"tdur":27,"tts":1046469},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358420064,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":16,"tdur":15,"tts":1046479},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358420085,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":147,"tdur":146,"tts":1046500},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358420111,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":118,"tdur":116,"tts":1046526},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358420142,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":67,"tdur":64,"tts":1046558},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358421860,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":30507,"tdur":2187,"tts":1046721},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358421872,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":30492,"tdur":2172,"tts":1046733},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358451319,"ph":"X","name":"GLES2DecoderImpl::HandleTexSubImage2D","args":{"width":7,"height":9},"dur":37,"tdur":34,"tts":1047879},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358452344,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":228},"dur":17,"tdur":15,"tts":1048887},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358452373,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1048915},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358452403,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":502,"tdur":367,"tts":1048945},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358452410,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":469,"tdur":332,"tts":1048952},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358452883,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":20,"tdur":19,"tts":1049290},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358452911,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":4,"tts":1049318},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358452931,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":282,"tdur":157,"tts":1049338},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358452936,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":256,"tdur":129,"tts":1049344},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358453195,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":16,"tdur":15,"tts":1049478},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358453218,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":470,"tdur":344,"tts":1049501},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358453223,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":220,"tdur":94,"tts":1049506},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358453446,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":240,"tdur":239,"tts":1049604},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358453498,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":228},"dur":38,"tdur":37,"tts":1049656},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358453608,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1049767,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358453614,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":172},"dur":69,"tdur":68,"tts":1049772},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358453617,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":65,"tdur":63,"tts":1049776},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358453708,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1049866},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358453715,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":378,"tdur":317,"tts":1049873},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358419501,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":68,"tdur":66,"tts":57822},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358419985,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":58,"tdur":44,"tts":57938},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358421800,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":60,"tdur":58,"tts":58045},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358422163,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":28,"tdur":27,"tts":58152},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358422353,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":19,"tdur":19,"tts":58220},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358422374,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":11,"tdur":12,"tts":58240},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358422706,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":15,"tdur":14,"tts":58278},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358423631,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":17,"tts":58319},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358423888,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":17,"tts":58361},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358424053,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":11,"tdur":10,"tts":58387},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358424078,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":13,"tdur":14,"tts":58405},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358425767,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":20,"tts":58458},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358426674,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":27,"tdur":26,"tts":58519},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358426946,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":25,"tdur":24,"tts":58587},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358427079,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":20,"tdur":18,"tts":58651},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358427100,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":12,"tdur":11,"tts":58671},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358427366,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":20,"tts":58721},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358428306,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":25,"tdur":24,"tts":58782},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358428465,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":26,"tdur":26,"tts":58848},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358428589,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":20,"tdur":19,"tts":58912},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358428611,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":6,"tdur":6,"tts":58933},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358487152,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":44,"tdur":42,"tts":59007},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358487665,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":54,"tdur":52,"tts":59113},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358489377,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":62,"tdur":60,"tts":59226},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358489753,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":25,"tdur":24,"tts":59332},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358489913,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":21,"tts":59391},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358489937,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":4,"tdur":4,"tts":59414},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358490222,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":19,"tdur":17,"tts":59459},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358490936,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":17,"tts":59514},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358491046,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":20,"tts":59568},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358491271,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":21,"tts":59626},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358491437,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":21,"tts":59685},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358491460,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":4,"tts":59708},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358491735,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":19,"tdur":18,"tts":59751},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358492575,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":23,"tdur":22,"tts":59808},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358492770,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":17,"tdur":16,"tts":59852},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358492891,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":26,"tdur":25,"tts":59891},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358492918,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":4,"tts":59918},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358493129,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":7,"tdur":6,"tts":59929},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358493971,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":23,"tdur":22,"tts":59972},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358494144,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":17,"tdur":16,"tts":60016},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358494253,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":17,"tts":60068},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358494272,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":6,"tdur":5,"tts":60087},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358553437,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":29,"tdur":29,"tts":60162},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358553822,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":26,"tdur":25,"tts":60231},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358554787,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":60,"tdur":58,"tts":60322},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358555149,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":27,"tdur":26,"tts":60425},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358555306,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":26,"tdur":25,"tts":60492},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358555333,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":5,"tts":60518},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358555642,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":19,"tdur":19,"tts":60564},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358556537,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":24,"tdur":22,"tts":60621},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358556779,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":25,"tdur":24,"tts":60682},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358556950,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":20,"tdur":18,"tts":60744},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358556971,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":15,"tdur":14,"tts":60764},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358557266,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":19,"tts":60819},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358558109,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":25,"tdur":24,"tts":60878},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358558332,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":26,"tdur":24,"tts":60942},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358558483,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":24,"tdur":23,"tts":61004},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358558509,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":5,"tts":61029},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358558791,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":20,"tts":61076},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358559620,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":19,"tdur":18,"tts":61119},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358559786,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":25,"tdur":24,"tts":61178},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358559921,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":15,"tdur":14,"tts":61227},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358559937,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":4,"tdur":5,"tts":61242},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358424093,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":13,"tdur":12,"tts":104609},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358425833,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":4,"tts":104773},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358426754,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":4,"tts":104933},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358427021,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":105088},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358427130,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":3,"tts":105175},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358427414,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":105259},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358428359,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":105340},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358428499,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":105402},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358428616,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":105478},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358487243,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":5,"tts":105683},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358487790,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":105910},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358489521,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":106178},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358489822,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":106343},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358489983,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":5,"tts":106472},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358490282,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":106613},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358490994,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":106747},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358491095,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":106814},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358491322,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":106892},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358491493,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":2,"tts":107001},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358491761,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":107056},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358492606,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":107110},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358492795,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":1,"tts":107168},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358492925,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":3,"tts":107235},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358493137,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":107275},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358494001,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":107331},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358494167,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":107395},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358494278,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":107464},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358553551,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":107711},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358553892,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":107876},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358554925,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":4,"tts":108104},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358555227,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":108257},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358555382,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":108382},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358555687,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":108489},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358556597,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":108596},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358556813,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":108677},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358556977,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":108752},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358556992,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":108767},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358557294,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":108822},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358558141,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":108877},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358558365,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":108934},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358558515,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":109006},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358558819,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":109063},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358559647,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":109118},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358559819,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":109176},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358559959,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":109257},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358607819,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":7,"tdur":6,"tts":109512},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358608434,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":109727},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358610246,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":109989},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358610593,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":7,"tdur":5,"tts":110168},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358610779,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":7,"tdur":6,"tts":110316},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358611231,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":7,"tdur":5,"tts":110485},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358612044,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":110572},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358612338,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":110696},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358612619,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":7,"tdur":6,"tts":110868},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358612768,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":4,"tts":110982},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358613086,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":111089},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358613910,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":4,"tts":111204},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358614225,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":111329},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358614396,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":111439},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358615301,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":111518},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358616437,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":111589},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358616700,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":111669},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358616854,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":111738},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358670076,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":111923},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358453720,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":356,"tdur":294,"tts":1049878},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358454079,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":13,"tdur":12,"tts":1050176},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358454105,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":137,"tdur":136,"tts":1050202},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358454124,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":117,"tdur":116,"tts":1050221},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358454170,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":62,"tdur":60,"tts":1050268},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358454245,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":2298,"tdur":1657,"tts":1050342},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358454249,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":2293,"tdur":1651,"tts":1050346},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358456518,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":224},"dur":22,"tdur":21,"tts":1051974},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358456555,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1052011},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358456560,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":365,"tdur":290,"tts":1052015},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358456563,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":348,"tdur":272,"tts":1052018},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358456913,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":10,"tdur":9,"tts":1052294},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358456935,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":3,"tts":1052315},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358456939,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":207,"tdur":131,"tts":1052319},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358456942,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":190,"tdur":113,"tts":1052322},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358457134,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":11,"tdur":11,"tts":1052438},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358457156,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":325,"tdur":249,"tts":1052460},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358457160,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":184,"tdur":107,"tts":1052464},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358457346,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":134,"tdur":133,"tts":1052575},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358457372,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":224},"dur":21,"tdur":19,"tts":1052601},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358457433,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1052661,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358457436,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":173},"dur":42,"tdur":42,"tts":1052664},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358457438,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":40,"tdur":39,"tts":1052666},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358457485,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":3,"tts":1052713},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358457498,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":408,"tdur":332,"tts":1052726},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358457501,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":385,"tdur":309,"tts":1052729},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358457889,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":16,"tdur":14,"tts":1053042},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358457910,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":71,"tdur":70,"tts":1053063},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358457916,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":64,"tdur":63,"tts":1053069},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358457933,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":38,"tdur":36,"tts":1053086},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358457993,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":9734,"tdur":1289,"tts":1053145},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358457997,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":9729,"tdur":1282,"tts":1053150},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358467711,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":218},"dur":13,"tdur":12,"tts":1054418},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358467731,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1054438},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358467744,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":302,"tdur":246,"tts":1054450},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358467747,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":282,"tdur":204,"tts":1054454},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358468032,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":13,"tdur":12,"tts":1054682},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358468049,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":3,"tts":1054699},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358468061,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":259,"tdur":215,"tts":1054710},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358468080,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":214,"tdur":167,"tts":1054730},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358468298,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":19,"tts":1054903},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358468327,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":468,"tdur":345,"tts":1054932},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358468333,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":234,"tdur":111,"tts":1054938},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358468570,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":223,"tdur":222,"tts":1055053},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358468605,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":218},"dur":36,"tdur":35,"tts":1055089},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358468713,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1055197,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358468719,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":174},"dur":71,"tdur":70,"tts":1055203},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358468722,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":67,"tdur":65,"tts":1055206},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358468816,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":4,"tts":1055300},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358468824,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":477,"tdur":363,"tts":1055307},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358468829,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":442,"tdur":327,"tts":1055312},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358469275,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":23,"tdur":22,"tts":1055645},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358469320,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":122,"tdur":120,"tts":1055691},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358469330,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":110,"tdur":107,"tts":1055701},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358469362,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":61,"tdur":60,"tts":1055732},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358469447,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":15974,"tdur":2090,"tts":1055817},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358469455,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":15964,"tdur":2079,"tts":1055825},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358485392,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":13},"dur":23,"tdur":20,"tts":1057880},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358485442,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1057928},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358485450,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":499,"tdur":370,"tts":1057936},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358485456,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":467,"tdur":337,"tts":1057942},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358485927,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":20,"tdur":18,"tts":1058285},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358485967,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":4,"tts":1058325},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358485975,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":355,"tdur":227,"tts":1058332},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358485980,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":323,"tdur":192,"tts":1058338},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358486307,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":19,"tts":1058537},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358486349,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":554,"tdur":425,"tts":1058579},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358486355,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":309,"tdur":179,"tts":1058585},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358486668,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":233,"tdur":232,"tts":1058770},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358486707,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":13},"dur":37,"tdur":35,"tts":1058809},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358486817,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1058919,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358486823,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":175},"dur":75,"tdur":74,"tts":1058924},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358486826,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":70,"tdur":70,"tts":1058927},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358486909,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":25,"tdur":23,"tts":1059011},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358487242,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1059120},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358487734,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":265,"tdur":160,"tts":1059184},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358487749,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":235,"tdur":132,"tts":1059197},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358487987,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":10,"tdur":10,"tts":1059332},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358488033,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":139,"tdur":139,"tts":1059379},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358488045,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":126,"tdur":125,"tts":1059391},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358488078,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":70,"tdur":68,"tts":1059424},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358489477,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":29479,"tdur":2159,"tts":1059606},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358489491,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":29462,"tdur":2143,"tts":1059619},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358518893,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":127},"dur":56,"tdur":54,"tts":1061704},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358518962,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1061772},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358518993,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":284,"tdur":162,"tts":1061803},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358518999,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":257,"tdur":134,"tts":1061809},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358519259,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":16,"tdur":15,"tts":1061948},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358519282,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":4,"tts":1061970},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358519299,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":217,"tdur":216,"tts":1061987},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358519305,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":209,"tdur":208,"tts":1061993},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358519334,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":127},"dur":37,"tdur":35,"tts":1062023},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358519434,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1062123,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358519440,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":176},"dur":71,"tdur":71,"tts":1062128},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358519443,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":67,"tdur":66,"tts":1062131},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358519521,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":4,"tts":1062209},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358519541,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":370,"tdur":311,"tts":1062230},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358519546,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":353,"tdur":293,"tts":1062235},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358519900,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":10,"tdur":10,"tts":1062530},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358519928,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":33,"tdur":31,"tts":1062559},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358519938,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":19,"tts":1062568},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358519989,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":114,"tdur":107,"tts":1062619},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358519993,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":106,"tdur":99,"tts":1062623},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358520021,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":57,"tdur":55,"tts":1062645},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358520109,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":1447,"tdur":907,"tts":1062734},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358520122,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":1429,"tdur":888,"tts":1062747},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358521584,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":1049,"tdur":1046,"tts":1063672},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358521605,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":1025,"tdur":1025,"tts":1063691},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358522602,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":73},"dur":25,"tdur":22,"tts":1064690},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358522639,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1064725},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358522661,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":362,"tdur":267,"tts":1064747},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358522667,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":347,"tdur":251,"tts":1064754},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358523015,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":7,"tdur":6,"tts":1065007},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358523025,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":1,"tts":1065017},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358523032,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":214,"tdur":213,"tts":1065024},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358523034,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":210,"tdur":209,"tts":1065026},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358523067,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":73},"dur":36,"tdur":35,"tts":1065059},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358523167,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1065160,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358523173,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":177},"dur":68,"tdur":68,"tts":1065165},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358523176,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":64,"tdur":63,"tts":1065168},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358523251,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1065244},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358523272,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":369,"tdur":309,"tts":1065264},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358523277,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":351,"tdur":291,"tts":1065269},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358523630,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":10,"tdur":9,"tts":1065563},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358523644,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":10,"tdur":10,"tts":1065576},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358523648,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":5,"tdur":5,"tts":1065580},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358523660,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":50,"tdur":49,"tts":1065593},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358523663,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":45,"tdur":45,"tts":1065595},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358523672,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":28,"tdur":26,"tts":1065605},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358523712,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":11452,"tdur":1984,"tts":1065645},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358523717,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":11444,"tdur":1977,"tts":1065649},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358535140,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":215},"dur":18,"tdur":16,"tts":1067607},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358535183,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1067649},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358535191,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":339,"tdur":279,"tts":1067657},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358535197,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":320,"tdur":260,"tts":1067663},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358535519,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":10,"tdur":10,"tts":1067925},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358535557,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1067963},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358535564,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":215,"tdur":215,"tts":1067970},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358535570,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":207,"tdur":207,"tts":1067976},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358535598,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":215},"dur":35,"tdur":34,"tts":1068004},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358535696,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1068103,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358535702,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":178},"dur":73,"tdur":72,"tts":1068108},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358535705,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":68,"tdur":67,"tts":1068111},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358535797,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":4,"tts":1068204},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358535806,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":392,"tdur":319,"tts":1068212},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358535810,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":349,"tdur":275,"tts":1068217},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358536162,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":32,"tdur":31,"tts":1068496},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358536221,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":33,"tdur":32,"tts":1068555},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358536231,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":21,"tdur":19,"tts":1068566},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358536257,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":82,"tdur":80,"tts":1068592},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358536263,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":74,"tdur":61,"tts":1068609},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358536289,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":35,"tdur":34,"tts":1068623},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358536352,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":15847,"tdur":2191,"tts":1068687},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358536373,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":15824,"tdur":2169,"tts":1068707},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358552176,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":147},"dur":17,"tdur":16,"tts":1070857},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358552205,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1070885},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358552227,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":375,"tdur":304,"tts":1070907},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358552233,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":348,"tdur":277,"tts":1070913},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358552584,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":16,"tdur":15,"tts":1071194},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358552607,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1071217},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358552624,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":186,"tdur":129,"tts":1071234},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358552629,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":161,"tdur":103,"tts":1071239},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358552793,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":15,"tdur":14,"tts":1071347},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358552814,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":370,"tdur":315,"tts":1071368},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358552819,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":147,"tdur":92,"tts":1071373},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358552969,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":213,"tdur":212,"tts":1071469},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358553000,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":147},"dur":36,"tdur":34,"tts":1071501},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358553099,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1071600,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358553104,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":179},"dur":75,"tdur":73,"tts":1071605},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358553107,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":71,"tdur":69,"tts":1071608},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358553203,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":22,"tdur":22,"tts":1071703},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358553465,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":3,"tts":1071755},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358553854,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":186,"tdur":104,"tts":1071789},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358553861,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":164,"tdur":83,"tts":1071795},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358554027,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":11,"tdur":10,"tts":1071881},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358554043,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":56,"tdur":56,"tts":1071896},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358554047,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":51,"tdur":50,"tts":1071901},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358554060,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":29,"tdur":27,"tts":1071915},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358554879,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":29977,"tdur":1768,"tts":1072038},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358554894,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":29960,"tdur":1752,"tts":1072051},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358584826,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":151},"dur":24,"tdur":21,"tts":1073778},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358584862,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1073813},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358584892,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":400,"tdur":340,"tts":1073842},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358584898,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":368,"tdur":306,"tts":1073849},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358585270,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":20,"tdur":19,"tts":1074161},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358585298,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1074189},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358585318,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":246,"tdur":245,"tts":1074209},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358585325,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":237,"tdur":236,"tts":1074216},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358585357,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":151},"dur":36,"tdur":34,"tts":1074248},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358585465,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1074357,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358585471,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":180},"dur":88,"tdur":87,"tts":1074362},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358585474,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":84,"tdur":83,"tts":1074365},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358585570,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":12,"tdur":11,"tts":1074461},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358585598,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":392,"tdur":333,"tts":1074489},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358585604,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":352,"tdur":294,"tts":1074494},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358585958,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":29,"tdur":28,"tts":1074791},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358585997,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":28,"tdur":27,"tts":1074830},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358586008,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":15,"tdur":14,"tts":1074841},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358586050,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":102,"tdur":101,"tts":1074883},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358586060,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":91,"tdur":90,"tts":1074893},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358586091,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":53,"tdur":51,"tts":1074924},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358586155,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":2529,"tdur":1839,"tts":1074988},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358586160,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":2522,"tdur":1832,"tts":1074992},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358588660,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":217},"dur":18,"tdur":16,"tts":1076804},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358588706,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1076849},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358588714,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":344,"tdur":268,"tts":1076857},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358588720,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":329,"tdur":252,"tts":1076864},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358589051,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":6,"tdur":6,"tts":1077118},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358589064,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":15,"tdur":15,"tts":1077131},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358589082,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":197,"tdur":96,"tts":1077149},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358589087,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":183,"tdur":82,"tts":1077154},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358589271,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":7,"tdur":6,"tts":1077238},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358589285,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":459,"tdur":385,"tts":1077251},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358589287,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":208,"tdur":133,"tts":1077253},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358589499,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":243,"tdur":241,"tts":1077392},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358589547,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":217},"dur":37,"tdur":37,"tts":1077439},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358589656,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1077550,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358589663,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":181},"dur":75,"tdur":75,"tts":1077555},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358589666,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":71,"tdur":71,"tts":1077558},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358589750,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1077643},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358589773,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":368,"tdur":320,"tts":1077666},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358589779,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":324,"tdur":276,"tts":1077672},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358590105,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":32,"tdur":30,"tts":1077952},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358590148,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":144,"tdur":144,"tts":1077994},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358590158,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":134,"tdur":132,"tts":1078005},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358590191,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":69,"tdur":67,"tts":1078038},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358590303,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":11638,"tdur":2085,"tts":1078149},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358590308,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":11630,"tdur":2077,"tts":1078154},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358601886,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":42},"dur":47,"tdur":43,"tts":1080182},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358601948,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":7,"tdur":6,"tts":1080242},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358601977,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":372,"tdur":320,"tts":1080271},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358601986,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":335,"tdur":284,"tts":1080279},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358602323,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":12,"tdur":11,"tts":1080566},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358602354,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":4,"tts":1080598},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358602376,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":269,"tdur":268,"tts":1080619},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358602384,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":258,"tdur":257,"tts":1080627},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358602420,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":42},"dur":41,"tdur":40,"tts":1080663},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358602536,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1080780,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358602543,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":182},"dur":95,"tdur":95,"tts":1080786},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358602547,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":90,"tdur":89,"tts":1080790},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358602651,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":6,"tts":1080894},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358602675,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":428,"tdur":343,"tts":1080919},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358602682,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":384,"tdur":301,"tts":1080925},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358603069,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":31,"tdur":29,"tts":1081230},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358603109,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":28,"tdur":26,"tts":1081271},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358603119,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":16,"tdur":15,"tts":1081280},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358603158,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":128,"tdur":127,"tts":1081319},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358603167,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":116,"tdur":115,"tts":1081328},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358603194,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":69,"tdur":66,"tts":1081356},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358603292,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":3276,"tdur":2541,"tts":1081453},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358603305,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":3260,"tdur":2525,"tts":1081466},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358606514,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":104},"dur":46,"tdur":43,"tts":1083942},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358606595,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":11,"tdur":8,"tts":1084023},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358606610,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":343,"tdur":263,"tts":1084037},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358606619,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":316,"tdur":234,"tts":1084046},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358606937,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":15,"tdur":13,"tts":1084285},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358606986,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":33,"tdur":31,"tts":1084334},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358607023,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":334,"tdur":302,"tts":1084371},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358607034,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":321,"tdur":289,"tts":1084382},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358607086,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":104},"dur":50,"tdur":48,"tts":1084434},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358607249,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1084568,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358607258,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":183},"dur":92,"tdur":91,"tts":1084575},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358607263,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":85,"tdur":84,"tts":1084580},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358607386,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":34,"tdur":32,"tts":1084704},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358607425,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":949,"tdur":873,"tts":1084743},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358607434,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":908,"tdur":832,"tts":1084752},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358608344,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":27,"tdur":26,"tts":1085587},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358608406,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":8,"tdur":6,"tts":1085650},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358608418,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":29,"tdur":28,"tts":1085661},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358608427,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":18,"tdur":16,"tts":1085671},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358608466,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":139,"tdur":137,"tts":1085710},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358608476,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":126,"tdur":125,"tts":1085719},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358608504,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":67,"tdur":64,"tts":1085748},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358610176,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":7743,"tdur":1538,"tts":1085930},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358610192,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":7724,"tdur":1521,"tts":1085945},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358617893,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":134},"dur":20,"tdur":17,"tts":1087445},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358617925,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1087475},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358617954,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":447,"tdur":375,"tts":1087504},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358617961,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":414,"tdur":341,"tts":1087511},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358618379,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":20,"tdur":19,"tts":1087858},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358618407,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1087886},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358618427,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":297,"tdur":232,"tts":1087906},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358618433,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":265,"tdur":199,"tts":1087912},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358618702,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":19,"tts":1088117},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358618730,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":516,"tdur":454,"tts":1088145},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358618736,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":241,"tdur":178,"tts":1088151},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358618981,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":263,"tdur":262,"tts":1088335},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358619050,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":134},"dur":37,"tdur":36,"tts":1088404},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358619160,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1088514,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358619166,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":184},"dur":75,"tdur":75,"tts":1088519},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358619169,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":71,"tdur":70,"tts":1088522},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358619268,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1088622},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358619277,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":407,"tdur":318,"tts":1088630},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358619282,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":385,"tdur":296,"tts":1088635},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358619669,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":13,"tdur":13,"tts":1088934},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358619696,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":72,"tdur":71,"tts":1088962},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358619702,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":65,"tdur":65,"tts":1088967},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358619727,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":29,"tdur":29,"tts":1088992},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358619772,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":13941,"tdur":561,"tts":1089037},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358619777,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":13934,"tdur":551,"tts":1089043},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358633727,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":579,"tdur":579,"tts":1089612},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358633735,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":570,"tdur":570,"tts":1089620},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358634294,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":229},"dur":9,"tdur":8,"tts":1090180},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358634309,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1090194},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358634320,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":405,"tdur":341,"tts":1090205},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358634323,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":375,"tdur":311,"tts":1090208},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358634702,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":20,"tdur":19,"tts":1090525},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358634731,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1090553},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358634751,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":263,"tdur":211,"tts":1090573},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358634757,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":230,"tdur":178,"tts":1090579},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358634991,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":19,"tts":1090763},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358635020,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":310,"tdur":261,"tts":1090791},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358635026,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":179,"tdur":129,"tts":1090797},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358635207,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":122,"tdur":122,"tts":1090929},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358635234,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":229},"dur":18,"tdur":18,"tts":1090956},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358635287,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1091010,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358635290,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":185},"dur":37,"tdur":37,"tts":1091012},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358635291,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":36,"tdur":34,"tts":1091014},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358635341,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1091063},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358635344,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":349,"tdur":302,"tts":1091067},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358607642,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":89,"tdur":86,"tts":61318},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358608325,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":26,"tdur":25,"tts":61453},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358610107,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":61,"tdur":59,"tts":61538},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358610503,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":34,"tdur":32,"tts":61646},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358610708,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":24,"tdur":22,"tts":61724},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358610733,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":14,"tdur":13,"tts":61748},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358611157,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":25,"tdur":25,"tts":61807},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358611990,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":45,"tdur":33,"tts":61876},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358612229,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":40,"tdur":38,"tts":61949},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358612527,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":31,"tdur":30,"tts":62036},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358612704,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":33,"tdur":33,"tts":62106},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358612739,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":14,"tdur":13,"tts":62141},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358613045,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":17,"tts":62192},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358613848,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":30,"tdur":29,"tts":62254},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358614144,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":41,"tdur":40,"tts":62323},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358614355,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":32,"tdur":31,"tts":62423},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358614389,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":7,"tdur":7,"tts":62456},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358615264,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":28,"tdur":27,"tts":62508},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358616396,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":32,"tdur":31,"tts":62581},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358616665,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":28,"tdur":26,"tts":62653},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358616824,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":20,"tts":62727},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358616846,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":4,"tts":62749},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358669985,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":42,"tdur":41,"tts":62792},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358670465,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":24,"tdur":22,"tts":62886},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358672099,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":57,"tdur":54,"tts":62971},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358672457,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":30,"tdur":28,"tts":63069},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358672639,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":25,"tdur":24,"tts":63140},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358672665,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":6,"tdur":5,"tts":63166},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358673627,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":21,"tts":63212},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358674581,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":25,"tdur":24,"tts":63277},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358674854,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":26,"tdur":25,"tts":63339},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358675039,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":10,"tdur":9,"tts":63376},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358675050,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":30,"tdur":23,"tts":63387},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358675400,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":20,"tts":63449},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358676343,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":27,"tdur":26,"tts":63485},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358676572,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":20,"tdur":19,"tts":63522},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358676734,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":33,"tdur":32,"tts":63585},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358676769,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":6,"tdur":6,"tts":63620},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358677013,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":14,"tdur":13,"tts":63657},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358677983,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":18,"tts":63695},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358678163,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":27,"tdur":26,"tts":63755},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358678297,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":15,"tdur":14,"tts":63806},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358678314,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":6,"tdur":6,"tts":63822},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358735500,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":47,"tdur":44,"tts":63893},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358735831,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":23,"tdur":22,"tts":63975},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358737467,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":52,"tdur":49,"tts":64063},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358737707,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":25,"tdur":24,"tts":64191},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358737973,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":23,"tdur":22,"tts":64255},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358738116,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":23,"tdur":22,"tts":64314},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358738140,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":5,"tts":64337},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358738402,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":18,"tts":64379},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358739229,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":20,"tts":64438},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358739465,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":20,"tts":64498},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358739617,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":23,"tdur":22,"tts":64560},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358739641,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":5,"tts":64583},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358739921,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":17,"tts":64626},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358740752,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":23,"tdur":22,"tts":64679},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358740979,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":23,"tdur":22,"tts":64747},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358741121,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":17,"tts":64790},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358741140,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":4,"tdur":4,"tts":64808},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358741391,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":13,"tdur":12,"tts":64834},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358742201,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":15,"tdur":14,"tts":64869},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358742382,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":15,"tdur":14,"tts":64910},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358742486,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":11,"tdur":10,"tts":64954},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359909481,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":60202,"tdur":122,"tts":113047},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359972277,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":53,"tdur":51,"tts":113345},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359972348,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":677,"tdur":388,"tts":113415},{"cat":"cc","pid":25863,"tid":25871,"ts":531359972354,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":363,"tdur":196,"tts":113421},{"cat":"cc","pid":25863,"tid":25871,"ts":531359972403,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":26,"tdur":26,"tts":113469},{"cat":"cc","pid":25863,"tid":25871,"ts":531359972720,"ph":"X","name":"Display::Draw","args":{},"dur":302,"tdur":179,"tts":113621},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359972731,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":113633,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359972744,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":46,"tdur":44,"tts":113646},{"cat":"cc","pid":25863,"tid":25871,"ts":531359972752,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":14,"tdur":12,"tts":113654},{"cat":"cc","pid":25863,"tid":25871,"ts":531359972767,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":18,"tdur":18,"tts":113668},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359972791,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":213,"tdur":88,"tts":113692},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359975562,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":44,"tdur":29,"tts":113960},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359975613,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":628,"tdur":318,"tts":114009},{"cat":"cc","pid":25863,"tid":25871,"ts":531359975615,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":320,"tdur":132,"tts":114011},{"cat":"cc","pid":25863,"tid":25871,"ts":531359975629,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":9,"tdur":9,"tts":114025},{"cat":"cc","pid":25863,"tid":25871,"ts":531359975938,"ph":"X","name":"Display::Draw","args":{},"dur":301,"tdur":177,"tts":114147},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359975947,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":114155,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359975956,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":33,"tdur":32,"tts":114165},{"cat":"cc","pid":25863,"tid":25871,"ts":531359975961,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":11,"tdur":10,"tts":114170},{"cat":"cc","pid":25863,"tid":25871,"ts":531359975973,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":12,"tdur":11,"tts":114182},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359975989,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":230,"tdur":106,"tts":114198},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359979730,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":33,"tdur":30,"tts":114474},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359979778,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":496,"tdur":330,"tts":114520},{"cat":"cc","pid":25863,"tid":25871,"ts":531359979782,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":284,"tdur":183,"tts":114525},{"cat":"cc","pid":25863,"tid":25871,"ts":531359979815,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":24,"tdur":23,"tts":114557},{"cat":"cc","pid":25863,"tid":25871,"ts":531359980068,"ph":"X","name":"Display::Draw","args":{},"dur":203,"tdur":135,"tts":114712},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359980078,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":114721,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359980087,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":33,"tdur":31,"tts":114731},{"cat":"cc","pid":25863,"tid":25871,"ts":531359980092,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":11,"tdur":10,"tts":114735},{"cat":"cc","pid":25863,"tid":25871,"ts":531359980104,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":12,"tdur":12,"tts":114747},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359980120,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":138,"tdur":69,"tts":114764},{"cat":"mojo","pid":25863,"tid":25871,"ts":531359982797,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":32,"tdur":29,"tts":115002},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531359982844,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":80027,"tdur":381,"tts":115048},{"cat":"cc","pid":25863,"tid":25871,"ts":531359982849,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":283,"tdur":164,"tts":115052},{"cat":"cc","pid":25863,"tid":25871,"ts":531359982882,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":23,"tdur":23,"tts":115085},{"cat":"cc","pid":25863,"tid":25871,"ts":531359983134,"ph":"X","name":"Display::Draw","args":{},"dur":79734,"tdur":206,"tts":115220},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531359983144,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":115230,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531359983153,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":32,"tdur":31,"tts":115239},{"cat":"cc","pid":25863,"tid":25871,"ts":531359983158,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":11,"tdur":10,"tts":115244},{"cat":"cc","pid":25863,"tid":25871,"ts":531359983170,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":12,"tdur":12,"tts":115255},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531359983186,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":79667,"tdur":138,"tts":115272},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360064487,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":24,"tdur":23,"tts":115520},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360064518,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":366,"tdur":199,"tts":115550},{"cat":"cc","pid":25863,"tid":25871,"ts":531360064521,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":174,"tdur":94,"tts":115553},{"cat":"cc","pid":25863,"tid":25871,"ts":531360064544,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":11,"tdur":11,"tts":115576},{"cat":"cc","pid":25863,"tid":25871,"ts":531360064696,"ph":"X","name":"Display::Draw","args":{},"dur":187,"tdur":99,"tts":115649},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360064701,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":115654,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360064706,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":21,"tdur":21,"tts":115659},{"cat":"cc","pid":25863,"tid":25871,"ts":531360064710,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":6,"tdur":5,"tts":115663},{"cat":"cc","pid":25863,"tid":25871,"ts":531360064716,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":9,"tdur":9,"tts":115669},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360064727,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":148,"tdur":60,"tts":115680},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360066325,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":16,"tdur":14,"tts":115829},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360066348,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":508,"tdur":277,"tts":115850},{"cat":"cc","pid":25863,"tid":25871,"ts":531360066350,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":290,"tdur":171,"tts":115852},{"cat":"cc","pid":25863,"tid":25871,"ts":531360066383,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":24,"tdur":22,"tts":115886},{"cat":"cc","pid":25863,"tid":25871,"ts":531360066642,"ph":"X","name":"Display::Draw","args":{},"dur":213,"tdur":99,"tts":116027},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360066651,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":116037,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360066669,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":14,"tdur":14,"tts":116054},{"cat":"cc","pid":25863,"tid":25871,"ts":531360066671,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":5,"tts":116056},{"cat":"cc","pid":25863,"tid":25871,"ts":531360066676,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":5,"tts":116061},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360066683,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":164,"tdur":49,"tts":116068},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360067912,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":14,"tdur":13,"tts":116177},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360067934,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":177,"tdur":102,"tts":116199},{"cat":"cc","pid":25863,"tid":25871,"ts":531360067936,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":118,"tdur":57,"tts":116201},{"cat":"cc","pid":25863,"tid":25871,"ts":531360067958,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":16,"tdur":15,"tts":116223},{"cat":"cc","pid":25863,"tid":25871,"ts":531360068055,"ph":"X","name":"Display::Draw","args":{},"dur":55,"tdur":40,"tts":116259},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360068058,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":116262,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360068062,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":12,"tdur":12,"tts":116266},{"cat":"cc","pid":25863,"tid":25871,"ts":531360068063,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":4,"tts":116267},{"cat":"cc","pid":25863,"tid":25871,"ts":531360068068,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":5,"tts":116272},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360068075,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":29,"tdur":15,"tts":116279},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360069052,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":11,"tdur":10,"tts":116344},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360069068,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":155,"tdur":128,"tts":116360},{"cat":"cc","pid":25863,"tid":25871,"ts":531360069070,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":69,"tdur":50,"tts":116362},{"cat":"cc","pid":25863,"tid":25871,"ts":531360069082,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":9,"tdur":7,"tts":116375},{"cat":"cc","pid":25863,"tid":25871,"ts":531360069140,"ph":"X","name":"Display::Draw","args":{},"dur":82,"tdur":73,"tts":116414},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360069144,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":116418,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360069148,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":45,"tdur":44,"tts":116422},{"cat":"cc","pid":25863,"tid":25871,"ts":531360069150,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":4,"tts":116424},{"cat":"cc","pid":25863,"tid":25871,"ts":531360069155,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":37,"tdur":35,"tts":116429},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360069193,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":24,"tdur":15,"tts":116467},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360070244,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":11,"tdur":11,"tts":116530},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360070260,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":82879,"tdur":275,"tts":116546},{"cat":"cc","pid":25863,"tid":25871,"ts":531360070262,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":145,"tdur":70,"tts":116548},{"cat":"cc","pid":25863,"tid":25871,"ts":531360070276,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":8,"tdur":8,"tts":116562},{"cat":"cc","pid":25863,"tid":25871,"ts":531360070408,"ph":"X","name":"Display::Draw","args":{},"dur":82730,"tdur":199,"tts":116620},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360070416,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":116628,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360070425,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":30,"tdur":30,"tts":116637},{"cat":"cc","pid":25863,"tid":25871,"ts":531360070430,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":19,"tdur":18,"tts":116642},{"cat":"cc","pid":25863,"tid":25871,"ts":531360070449,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":4,"tts":116661},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360070455,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":82672,"tdur":142,"tts":116667},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360154420,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":16,"tdur":14,"tts":116920},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360154442,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":350,"tdur":209,"tts":116941},{"cat":"cc","pid":25863,"tid":25871,"ts":531360154444,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":184,"tdur":92,"tts":116943},{"cat":"cc","pid":25863,"tid":25871,"ts":531360154459,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":10,"tdur":9,"tts":116959},{"cat":"cc","pid":25863,"tid":25871,"ts":531360154629,"ph":"X","name":"Display::Draw","args":{},"dur":150,"tdur":100,"tts":117037},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360154633,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":117041,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360154639,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":28,"tdur":28,"tts":117047},{"cat":"cc","pid":25863,"tid":25871,"ts":531360154642,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":6,"tts":117049},{"cat":"cc","pid":25863,"tid":25871,"ts":531360154648,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":18,"tdur":17,"tts":117056},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360154668,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":103,"tdur":53,"tts":117076},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360155934,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":18,"tdur":17,"tts":117230},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360155958,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":359,"tdur":192,"tts":117254},{"cat":"cc","pid":25863,"tid":25871,"ts":531360155960,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":196,"tdur":90,"tts":117256},{"cat":"cc","pid":25863,"tid":25871,"ts":531360155974,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":8,"tdur":7,"tts":117270},{"cat":"cc","pid":25863,"tid":25871,"ts":531360156158,"ph":"X","name":"Display::Draw","args":{},"dur":157,"tdur":96,"tts":117348},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360156162,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":117352,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360156168,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":16,"tdur":16,"tts":117358},{"cat":"cc","pid":25863,"tid":25871,"ts":531360156170,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":6,"tdur":5,"tts":117360},{"cat":"cc","pid":25863,"tid":25871,"ts":531360156176,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":6,"tts":117366},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360156184,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":122,"tdur":60,"tts":117374},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360157653,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":20,"tdur":17,"tts":117535},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360157683,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":327,"tdur":208,"tts":117564},{"cat":"cc","pid":25863,"tid":25871,"ts":531360157687,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":166,"tdur":106,"tts":117568},{"cat":"cc","pid":25863,"tid":25871,"ts":531360157715,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":13,"tdur":12,"tts":117596},{"cat":"cc","pid":25863,"tid":25871,"ts":531360157854,"ph":"X","name":"Display::Draw","args":{},"dur":155,"tdur":94,"tts":117676},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360157859,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":117681,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360157864,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":16,"tdur":16,"tts":117686},{"cat":"cc","pid":25863,"tid":25871,"ts":531360157866,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":6,"tdur":5,"tts":117688},{"cat":"cc","pid":25863,"tid":25871,"ts":531360157872,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":6,"tts":117694},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360157881,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":118,"tdur":57,"tts":117703},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360159315,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":17,"tdur":15,"tts":117861},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360159340,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":61329,"tdur":328,"tts":117884},{"cat":"cc","pid":25863,"tid":25871,"ts":531360159342,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":137,"tdur":96,"tts":117887},{"cat":"cc","pid":25863,"tid":25871,"ts":531360159359,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":14,"tdur":12,"tts":117904},{"cat":"cc","pid":25863,"tid":25871,"ts":531360159480,"ph":"X","name":"Display::Draw","args":{},"dur":61185,"tdur":223,"tts":117985},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360159485,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":117990,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360159490,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":28,"tdur":27,"tts":117995},{"cat":"cc","pid":25863,"tid":25871,"ts":531360159493,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":16,"tdur":15,"tts":117998},{"cat":"cc","pid":25863,"tid":25871,"ts":531360159509,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":7,"tdur":6,"tts":118014},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360159518,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":61128,"tdur":165,"tts":118023},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360223262,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":34,"tdur":31,"tts":118370},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360223311,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":677,"tdur":392,"tts":118418},{"cat":"cc","pid":25863,"tid":25871,"ts":531360223316,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":353,"tdur":191,"tts":118422},{"cat":"cc","pid":25863,"tid":25871,"ts":531360223374,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":24,"tdur":23,"tts":118480},{"cat":"cc","pid":25863,"tid":25871,"ts":531360223671,"ph":"X","name":"Display::Draw","args":{},"dur":314,"tdur":190,"tts":118617},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360223680,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":118626,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360223690,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":32,"tdur":31,"tts":118635},{"cat":"cc","pid":25863,"tid":25871,"ts":531360223695,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":10,"tdur":10,"tts":118640},{"cat":"cc","pid":25863,"tid":25871,"ts":531360223706,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":12,"tdur":12,"tts":118651},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360223723,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":243,"tdur":120,"tts":118668},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360227373,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":40,"tdur":37,"tts":118987},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360227434,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":649,"tdur":384,"tts":119048},{"cat":"cc","pid":25863,"tid":25871,"ts":531360227442,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":347,"tdur":183,"tts":119055},{"cat":"cc","pid":25863,"tid":25871,"ts":531360227489,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":25,"tdur":24,"tts":119102},{"cat":"cc","pid":25863,"tid":25871,"ts":531360227791,"ph":"X","name":"Display::Draw","args":{},"dur":289,"tdur":187,"tts":119242},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360227800,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":119251,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360227809,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":32,"tdur":31,"tts":119260},{"cat":"cc","pid":25863,"tid":25871,"ts":531360227814,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":11,"tdur":10,"tts":119265},{"cat":"cc","pid":25863,"tid":25871,"ts":531360227825,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":13,"tdur":12,"tts":119276},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360227842,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":220,"tdur":117,"tts":119293},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360231312,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":33,"tdur":30,"tts":119590},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360231360,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":626,"tdur":361,"tts":119636},{"cat":"cc","pid":25863,"tid":25871,"ts":531360231364,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":285,"tdur":159,"tts":119641},{"cat":"cc","pid":25863,"tid":25871,"ts":531360231397,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":24,"tdur":22,"tts":119674},{"cat":"cc","pid":25863,"tid":25871,"ts":531360231651,"ph":"X","name":"Display::Draw","args":{},"dur":332,"tdur":190,"tts":119804},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360231660,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":119814,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360231670,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":49,"tdur":48,"tts":119823},{"cat":"cc","pid":25863,"tid":25871,"ts":531360231675,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":27,"tdur":26,"tts":119828},{"cat":"cc","pid":25863,"tid":25871,"ts":531360231703,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":12,"tdur":12,"tts":119856},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360231719,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":249,"tdur":105,"tts":119873},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360234349,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":29,"tdur":27,"tts":120122},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360234391,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":53136,"tdur":369,"tts":120163},{"cat":"cc","pid":25863,"tid":25871,"ts":531360234395,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":291,"tdur":163,"tts":120168},{"cat":"cc","pid":25863,"tid":25871,"ts":531360234428,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":21,"tdur":19,"tts":120201},{"cat":"cc","pid":25863,"tid":25871,"ts":531360234688,"ph":"X","name":"Display::Draw","args":{},"dur":52838,"tdur":195,"tts":120335},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360234698,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":120344,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360234708,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":31,"tdur":30,"tts":120354},{"cat":"cc","pid":25863,"tid":25871,"ts":531360234712,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":10,"tdur":9,"tts":120359},{"cat":"cc","pid":25863,"tid":25871,"ts":531360234723,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":12,"tdur":11,"tts":120370},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360234739,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":52768,"tdur":125,"tts":120386},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360292114,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":16,"tdur":14,"tts":120681},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360292136,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":374,"tdur":198,"tts":120703},{"cat":"cc","pid":25863,"tid":25871,"ts":531360292138,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":203,"tdur":99,"tts":120705},{"cat":"cc","pid":25863,"tid":25871,"ts":531360292154,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":12,"tdur":11,"tts":120721},{"cat":"cc","pid":25863,"tid":25871,"ts":531360292342,"ph":"X","name":"Display::Draw","args":{},"dur":167,"tdur":93,"tts":120806},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360292347,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":120810,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360292352,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":16,"tdur":15,"tts":120816},{"cat":"cc","pid":25863,"tid":25871,"ts":531360292354,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":6,"tdur":5,"tts":120818},{"cat":"cc","pid":25863,"tid":25871,"ts":531360292360,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":7,"tdur":7,"tts":120823},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360292369,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":130,"tdur":58,"tts":120832},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360293701,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":14,"tdur":12,"tts":120982},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360293721,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":307,"tdur":207,"tts":121001},{"cat":"cc","pid":25863,"tid":25871,"ts":531360293723,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":157,"tdur":89,"tts":121003},{"cat":"cc","pid":25863,"tid":25871,"ts":531360293738,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":10,"tdur":10,"tts":121018},{"cat":"cc","pid":25863,"tid":25871,"ts":531360293881,"ph":"X","name":"Display::Draw","args":{},"dur":145,"tdur":112,"tts":121094},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360293885,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":121099,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360293890,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":15,"tdur":16,"tts":121103},{"cat":"cc","pid":25863,"tid":25871,"ts":531360293892,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":5,"tts":121105},{"cat":"cc","pid":25863,"tid":25871,"ts":531360293898,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":6,"tts":121111},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360293906,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":113,"tdur":79,"tts":121119},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360295160,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":18,"tdur":17,"tts":121296},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360295185,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":295,"tdur":224,"tts":121320},{"cat":"cc","pid":25863,"tid":25871,"ts":531360295198,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":129,"tdur":95,"tts":121333},{"cat":"cc","pid":25863,"tid":25871,"ts":531360295212,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":9,"tdur":9,"tts":121347},{"cat":"cc","pid":25863,"tid":25871,"ts":531360295328,"ph":"X","name":"Display::Draw","args":{},"dur":150,"tdur":112,"tts":121430},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360295332,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":121435,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360295337,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":16,"tdur":16,"tts":121439},{"cat":"cc","pid":25863,"tid":25871,"ts":531360295339,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":6,"tdur":5,"tts":121442},{"cat":"cc","pid":25863,"tid":25871,"ts":531360295345,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":6,"tts":121447},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360295353,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":118,"tdur":79,"tts":121456},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360296630,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":19,"tdur":17,"tts":121623},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360296655,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":57061,"tdur":252,"tts":121648},{"cat":"cc","pid":25863,"tid":25871,"ts":531360296657,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":145,"tdur":78,"tts":121650},{"cat":"cc","pid":25863,"tid":25871,"ts":531360296671,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":9,"tdur":8,"tts":121664},{"cat":"cc","pid":25863,"tid":25871,"ts":531360296803,"ph":"X","name":"Display::Draw","args":{},"dur":56911,"tdur":170,"tts":121729},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360296807,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":121733,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360296811,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":13,"tdur":14,"tts":121737},{"cat":"cc","pid":25863,"tid":25871,"ts":531360296813,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":4,"tdur":4,"tts":121739},{"cat":"cc","pid":25863,"tid":25871,"ts":531360296818,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":5,"tts":121744},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360296825,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":56879,"tdur":137,"tts":121751},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360354829,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":32,"tdur":31,"tts":121992},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360354869,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":357,"tdur":212,"tts":122032},{"cat":"cc","pid":25863,"tid":25871,"ts":531360354872,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":198,"tdur":94,"tts":122034},{"cat":"cc","pid":25863,"tid":25871,"ts":531360354889,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":11,"tdur":9,"tts":122052},{"cat":"cc","pid":25863,"tid":25871,"ts":531360355071,"ph":"X","name":"Display::Draw","args":{},"dur":153,"tdur":113,"tts":122130},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360355076,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":122134,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360355081,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":17,"tdur":16,"tts":122140},{"cat":"cc","pid":25863,"tid":25871,"ts":531360355084,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":5,"tts":122142},{"cat":"cc","pid":25863,"tid":25871,"ts":531360355090,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":6,"tts":122148},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360355098,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":117,"tdur":77,"tts":122156},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360356486,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":17,"tdur":16,"tts":122331},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360356511,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":347,"tdur":191,"tts":122355},{"cat":"cc","pid":25863,"tid":25871,"ts":531360356513,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":175,"tdur":94,"tts":122357},{"cat":"cc","pid":25863,"tid":25871,"ts":531360356530,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":12,"tdur":12,"tts":122374},{"cat":"cc","pid":25863,"tid":25871,"ts":531360356689,"ph":"X","name":"Display::Draw","args":{},"dur":167,"tdur":90,"tts":122454},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360356693,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":122458,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360356698,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":17,"tdur":16,"tts":122463},{"cat":"cc","pid":25863,"tid":25871,"ts":531360356701,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":5,"tts":122466},{"cat":"cc","pid":25863,"tid":25871,"ts":531360356707,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":6,"tts":122472},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360356715,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":132,"tdur":54,"tts":122480},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360358227,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":17,"tdur":16,"tts":122636},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360358251,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":307,"tdur":206,"tts":122660},{"cat":"cc","pid":25863,"tid":25871,"ts":531360358254,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":153,"tdur":97,"tts":122662},{"cat":"cc","pid":25863,"tid":25871,"ts":531360358271,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":12,"tdur":12,"tts":122680},{"cat":"cc","pid":25863,"tid":25871,"ts":531360358408,"ph":"X","name":"Display::Draw","args":{},"dur":148,"tdur":103,"tts":122761},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360358413,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":122766,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360358418,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":30,"tdur":30,"tts":122771},{"cat":"cc","pid":25863,"tid":25871,"ts":531360358421,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":5,"tts":122774},{"cat":"cc","pid":25863,"tid":25871,"ts":531360358427,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":20,"tdur":19,"tts":122780},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360358449,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":97,"tdur":52,"tts":122802},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360359787,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":15,"tdur":14,"tts":122920},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360359809,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":60727,"tdur":235,"tts":122941},{"cat":"cc","pid":25863,"tid":25871,"ts":531360359811,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":80,"tdur":60,"tts":122944},{"cat":"cc","pid":25863,"tid":25871,"ts":531360359828,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":12,"tdur":11,"tts":122961},{"cat":"cc","pid":25863,"tid":25871,"ts":531360359892,"ph":"X","name":"Display::Draw","args":{},"dur":60643,"tdur":170,"tts":123005},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360359896,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":123010,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360359901,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":16,"tdur":15,"tts":123015},{"cat":"cc","pid":25863,"tid":25871,"ts":531360359903,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":5,"tts":123017},{"cat":"cc","pid":25863,"tid":25871,"ts":531360359909,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":5,"tts":123023},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360359917,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":60608,"tdur":134,"tts":123031},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360422814,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":15,"tdur":15,"tts":123295},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360422836,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":397,"tdur":211,"tts":123317},{"cat":"cc","pid":25863,"tid":25871,"ts":531360422839,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":202,"tdur":105,"tts":123320},{"cat":"cc","pid":25863,"tid":25871,"ts":531360422855,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":11,"tdur":10,"tts":123336},{"cat":"cc","pid":25863,"tid":25871,"ts":531360423042,"ph":"X","name":"Display::Draw","args":{},"dur":189,"tdur":99,"tts":123427},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360423047,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":123432,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360423062,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":15,"tdur":15,"tts":123447},{"cat":"cc","pid":25863,"tid":25871,"ts":531360423064,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":6,"tdur":5,"tts":123449},{"cat":"cc","pid":25863,"tid":25871,"ts":531360423070,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":5,"tts":123455},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360423078,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":144,"tdur":54,"tts":123463},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360425077,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":17,"tdur":15,"tts":123610},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360425101,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":297,"tdur":186,"tts":123633},{"cat":"cc","pid":25863,"tid":25871,"ts":531360425104,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":145,"tdur":90,"tts":123635},{"cat":"cc","pid":25863,"tid":25871,"ts":531360425119,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":13,"tdur":12,"tts":123651},{"cat":"cc","pid":25863,"tid":25871,"ts":531360425250,"ph":"X","name":"Display::Draw","args":{},"dur":147,"tdur":91,"tts":123727},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360425255,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":123732,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360425259,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":15,"tdur":15,"tts":123736},{"cat":"cc","pid":25863,"tid":25871,"ts":531360425261,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":5,"tts":123738},{"cat":"cc","pid":25863,"tid":25871,"ts":531360425267,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":5,"tts":123744},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360425275,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":113,"tdur":56,"tts":123752},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360426631,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":17,"tdur":16,"tts":123903},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360426655,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":290,"tdur":183,"tts":123926},{"cat":"cc","pid":25863,"tid":25871,"ts":531360426657,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":144,"tdur":89,"tts":123928},{"cat":"cc","pid":25863,"tid":25871,"ts":531360426673,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":12,"tdur":11,"tts":123945},{"cat":"cc","pid":25863,"tid":25871,"ts":531360426802,"ph":"X","name":"Display::Draw","args":{},"dur":141,"tdur":88,"tts":124019},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360426806,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":124023,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360426811,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":15,"tdur":14,"tts":124028},{"cat":"cc","pid":25863,"tid":25871,"ts":531360426813,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":4,"tts":124030},{"cat":"cc","pid":25863,"tid":25871,"ts":531360426818,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":6,"tts":124035},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360426826,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":108,"tdur":55,"tts":124043},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360428053,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":14,"tdur":13,"tts":124163},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360428074,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":59087,"tdur":316,"tts":124183},{"cat":"cc","pid":25863,"tid":25871,"ts":531360428076,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":139,"tdur":86,"tts":124185},{"cat":"cc","pid":25863,"tid":25871,"ts":531360428092,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":10,"tdur":10,"tts":124201},{"cat":"cc","pid":25863,"tid":25871,"ts":531360428216,"ph":"X","name":"Display::Draw","args":{},"dur":58943,"tdur":225,"tts":124273},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360428220,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":124278,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360428225,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":15,"tdur":15,"tts":124282},{"cat":"cc","pid":25863,"tid":25871,"ts":531360428227,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":5,"tts":124284},{"cat":"cc","pid":25863,"tid":25871,"ts":531360428232,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":5,"tts":124290},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360428240,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":58892,"tdur":171,"tts":124298},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360489317,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":18,"tdur":16,"tts":124583},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360489342,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":366,"tdur":182,"tts":124607},{"cat":"cc","pid":25863,"tid":25871,"ts":531360489344,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":180,"tdur":91,"tts":124609},{"cat":"cc","pid":25863,"tid":25871,"ts":531360489361,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":11,"tdur":10,"tts":124626},{"cat":"cc","pid":25863,"tid":25871,"ts":531360489525,"ph":"X","name":"Display::Draw","args":{},"dur":181,"tdur":86,"tts":124702},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360489529,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":124707,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360489534,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":16,"tdur":16,"tts":124711},{"cat":"cc","pid":25863,"tid":25871,"ts":531360489536,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":6,"tdur":4,"tts":124714},{"cat":"cc","pid":25863,"tid":25871,"ts":531360489542,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":6,"tts":124719},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360489550,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":147,"tdur":50,"tts":124728},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360491272,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":16,"tdur":15,"tts":124874},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360491295,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":361,"tdur":194,"tts":124896},{"cat":"cc","pid":25863,"tid":25871,"ts":531360491297,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":184,"tdur":96,"tts":124898},{"cat":"cc","pid":25863,"tid":25871,"ts":531360491313,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":11,"tdur":11,"tts":124914},{"cat":"cc","pid":25863,"tid":25871,"ts":531360491482,"ph":"X","name":"Display::Draw","args":{},"dur":173,"tdur":92,"tts":124996},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360491487,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":125001,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360491492,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":15,"tdur":14,"tts":125006},{"cat":"cc","pid":25863,"tid":25871,"ts":531360491494,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":4,"tts":125008},{"cat":"cc","pid":25863,"tid":25871,"ts":531360491499,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":6,"tts":125013},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360491507,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":139,"tdur":58,"tts":125021},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360492886,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":16,"tdur":14,"tts":125172},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360492909,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":319,"tdur":205,"tts":125194},{"cat":"cc","pid":25863,"tid":25871,"ts":531360492911,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":153,"tdur":100,"tts":125196},{"cat":"cc","pid":25863,"tid":25871,"ts":531360492936,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":12,"tdur":12,"tts":125221},{"cat":"cc","pid":25863,"tid":25871,"ts":531360493065,"ph":"X","name":"Display::Draw","args":{},"dur":161,"tdur":99,"tts":125298},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360493069,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":125302,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360493074,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":24,"tdur":23,"tts":125307},{"cat":"cc","pid":25863,"tid":25871,"ts":531360493076,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":5,"tts":125309},{"cat":"cc","pid":25863,"tid":25871,"ts":531360493082,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":14,"tdur":14,"tts":125314},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360493098,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":120,"tdur":57,"tts":125331},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360494403,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":13,"tdur":12,"tts":125451},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360494423,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":59300,"tdur":301,"tts":125470},{"cat":"cc","pid":25863,"tid":25871,"ts":531360494425,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":133,"tdur":98,"tts":125472},{"cat":"cc","pid":25863,"tid":25871,"ts":531360494449,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":11,"tdur":10,"tts":125497},{"cat":"cc","pid":25863,"tid":25871,"ts":531360494559,"ph":"X","name":"Display::Draw","args":{},"dur":59162,"tdur":197,"tts":125572},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360494563,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":125576,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360494568,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":15,"tdur":14,"tts":125581},{"cat":"cc","pid":25863,"tid":25871,"ts":531360494570,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":4,"tts":125583},{"cat":"cc","pid":25863,"tid":25871,"ts":531360494575,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":6,"tts":125588},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360494583,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":59130,"tdur":164,"tts":125596},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360555998,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":35,"tdur":25,"tts":125880},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360556040,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":641,"tdur":379,"tts":125913},{"cat":"cc","pid":25863,"tid":25871,"ts":531360556043,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":336,"tdur":184,"tts":125915},{"cat":"cc","pid":25863,"tid":25871,"ts":531360556086,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":24,"tdur":23,"tts":125959},{"cat":"cc","pid":25863,"tid":25871,"ts":531360556381,"ph":"X","name":"Display::Draw","args":{},"dur":297,"tdur":186,"tts":126103},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360556391,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":126112,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360556400,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":32,"tdur":30,"tts":126122},{"cat":"cc","pid":25863,"tid":25871,"ts":531360556405,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":11,"tdur":10,"tts":126126},{"cat":"cc","pid":25863,"tid":25871,"ts":531360556416,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":12,"tdur":11,"tts":126138},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360556433,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":226,"tdur":115,"tts":126154},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360559195,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":33,"tdur":30,"tts":126459},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360559243,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":600,"tdur":378,"tts":126505},{"cat":"cc","pid":25863,"tid":25871,"ts":531360559247,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":296,"tdur":174,"tts":126510},{"cat":"cc","pid":25863,"tid":25871,"ts":531360559281,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":23,"tdur":23,"tts":126543},{"cat":"cc","pid":25863,"tid":25871,"ts":531360559545,"ph":"X","name":"Display::Draw","args":{},"dur":295,"tdur":191,"tts":126688},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360559554,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":126697,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360559564,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":32,"tdur":31,"tts":126707},{"cat":"cc","pid":25863,"tid":25871,"ts":531360559568,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":11,"tdur":10,"tts":126712},{"cat":"cc","pid":25863,"tid":25871,"ts":531360559580,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":12,"tdur":11,"tts":126723},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360559596,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":226,"tdur":121,"tts":126740},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360562431,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":32,"tdur":30,"tts":127038},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360562478,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":578,"tdur":337,"tts":127084},{"cat":"cc","pid":25863,"tid":25871,"ts":531360562482,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":331,"tdur":174,"tts":127088},{"cat":"cc","pid":25863,"tid":25871,"ts":531360562515,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":24,"tdur":23,"tts":127121},{"cat":"cc","pid":25863,"tid":25871,"ts":531360562815,"ph":"X","name":"Display::Draw","args":{},"dur":238,"tdur":152,"tts":127266},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360562825,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":127275,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360562835,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":31,"tdur":31,"tts":127285},{"cat":"cc","pid":25863,"tid":25871,"ts":531360562839,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":10,"tdur":9,"tts":127290},{"cat":"cc","pid":25863,"tid":25871,"ts":531360562850,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":12,"tdur":11,"tts":127301},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360562866,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":168,"tdur":81,"tts":127317},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360565520,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":32,"tdur":30,"tts":127574},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360565567,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":55717,"tdur":386,"tts":127620},{"cat":"cc","pid":25863,"tid":25871,"ts":531360565572,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":331,"tdur":171,"tts":127625},{"cat":"cc","pid":25863,"tid":25871,"ts":531360565606,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":24,"tdur":23,"tts":127659},{"cat":"cc","pid":25863,"tid":25871,"ts":531360565905,"ph":"X","name":"Display::Draw","args":{},"dur":55378,"tdur":205,"tts":127800},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360565914,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":127810,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360565925,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":31,"tdur":30,"tts":127820},{"cat":"cc","pid":25863,"tid":25871,"ts":531360565929,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":10,"tdur":10,"tts":127824},{"cat":"cc","pid":25863,"tid":25871,"ts":531360565940,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":13,"tdur":12,"tts":127835},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360565957,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":55318,"tdur":144,"tts":127852},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360623319,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":14,"tdur":13,"tts":128086},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360623339,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":338,"tdur":175,"tts":128106},{"cat":"cc","pid":25863,"tid":25871,"ts":531360623341,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":173,"tdur":86,"tts":128108},{"cat":"cc","pid":25863,"tid":25871,"ts":531360623356,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":9,"tdur":9,"tts":128122},{"cat":"cc","pid":25863,"tid":25871,"ts":531360623515,"ph":"X","name":"Display::Draw","args":{},"dur":160,"tdur":83,"tts":128196},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360623519,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":128200,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360623523,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":13,"tdur":13,"tts":128204},{"cat":"cc","pid":25863,"tid":25871,"ts":531360623525,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":4,"tdur":4,"tts":128206},{"cat":"cc","pid":25863,"tid":25871,"ts":531360623530,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":4,"tts":128211},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360623537,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":131,"tdur":53,"tts":128218},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360624819,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":14,"tdur":13,"tts":128354},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360624839,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":252,"tdur":170,"tts":128374},{"cat":"cc","pid":25863,"tid":25871,"ts":531360624841,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":137,"tdur":87,"tts":128376},{"cat":"cc","pid":25863,"tid":25871,"ts":531360624855,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":19,"tdur":19,"tts":128389},{"cat":"cc","pid":25863,"tid":25871,"ts":531360624979,"ph":"X","name":"Display::Draw","args":{},"dur":111,"tdur":77,"tts":128465},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360624983,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":128468,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360624987,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":13,"tdur":13,"tts":128472},{"cat":"cc","pid":25863,"tid":25871,"ts":531360624988,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":4,"tts":128474},{"cat":"cc","pid":25863,"tid":25871,"ts":531360624993,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":5,"tts":128479},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360625001,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":81,"tdur":48,"tts":128486},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360626192,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":18,"tdur":17,"tts":128620},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360626217,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":249,"tdur":166,"tts":128644},{"cat":"cc","pid":25863,"tid":25871,"ts":531360626219,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":113,"tdur":79,"tts":128646},{"cat":"cc","pid":25863,"tid":25871,"ts":531360626233,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":8,"tdur":9,"tts":128660},{"cat":"cc","pid":25863,"tid":25871,"ts":531360626333,"ph":"X","name":"Display::Draw","args":{},"dur":132,"tdur":82,"tts":128727},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360626337,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":128731,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360626341,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":20,"tdur":20,"tts":128735},{"cat":"cc","pid":25863,"tid":25871,"ts":531360626343,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":4,"tdur":4,"tts":128737},{"cat":"cc","pid":25863,"tid":25871,"ts":531360626348,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":12,"tdur":11,"tts":128742},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360626362,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":95,"tdur":45,"tts":128756},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360627529,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":19,"tdur":17,"tts":128886},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360627554,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":59839,"tdur":299,"tts":128910},{"cat":"cc","pid":25863,"tid":25871,"ts":531360627556,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":105,"tdur":73,"tts":128912},{"cat":"cc","pid":25863,"tid":25871,"ts":531360627570,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":9,"tdur":9,"tts":128926},{"cat":"cc","pid":25863,"tid":25871,"ts":531360627661,"ph":"X","name":"Display::Draw","args":{},"dur":59730,"tdur":221,"tts":128986},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360627665,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":128990,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360627669,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":14,"tdur":14,"tts":128994},{"cat":"cc","pid":25863,"tid":25871,"ts":531360627671,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":5,"tts":128996},{"cat":"cc","pid":25863,"tid":25871,"ts":531360627676,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":5,"tts":129001},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360627683,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":59683,"tdur":173,"tts":129008},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360690807,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":34,"tdur":32,"tts":129342},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360690856,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":650,"tdur":366,"tts":129390},{"cat":"cc","pid":25863,"tid":25871,"ts":531360690861,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":333,"tdur":172,"tts":129395},{"cat":"cc","pid":25863,"tid":25871,"ts":531360690896,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":24,"tdur":23,"tts":129430},{"cat":"cc","pid":25863,"tid":25871,"ts":531360691196,"ph":"X","name":"Display::Draw","args":{},"dur":307,"tdur":182,"tts":129571},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360691205,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":129580,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360691215,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":34,"tdur":32,"tts":129590},{"cat":"cc","pid":25863,"tid":25871,"ts":531360691220,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":11,"tdur":11,"tts":129594},{"cat":"cc","pid":25863,"tid":25871,"ts":531360691232,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":13,"tdur":12,"tts":129606},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360691249,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":234,"tdur":108,"tts":129624},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360694074,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":33,"tdur":31,"tts":129935},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360694122,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":666,"tdur":370,"tts":129982},{"cat":"cc","pid":25863,"tid":25871,"ts":531360694127,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":329,"tdur":173,"tts":129987},{"cat":"cc","pid":25863,"tid":25871,"ts":531360694160,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":23,"tdur":22,"tts":130020},{"cat":"cc","pid":25863,"tid":25871,"ts":531360694458,"ph":"X","name":"Display::Draw","args":{},"dur":327,"tdur":185,"tts":130164},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360694467,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":130173,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360694477,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":31,"tdur":31,"tts":130183},{"cat":"cc","pid":25863,"tid":25871,"ts":531360694481,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":11,"tdur":10,"tts":130188},{"cat":"cc","pid":25863,"tid":25871,"ts":531360694493,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":12,"tdur":12,"tts":130199},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360694509,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":262,"tdur":118,"tts":130215},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360697386,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":34,"tdur":31,"tts":130508},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360697436,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":537,"tdur":344,"tts":130557},{"cat":"cc","pid":25863,"tid":25871,"ts":531360697441,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":310,"tdur":167,"tts":130562},{"cat":"cc","pid":25863,"tid":25871,"ts":531360697474,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":23,"tdur":22,"tts":130595},{"cat":"cc","pid":25863,"tid":25871,"ts":531360697753,"ph":"X","name":"Display::Draw","args":{},"dur":216,"tdur":165,"tts":130733},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360697763,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":130743,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360697773,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":31,"tdur":30,"tts":130753},{"cat":"cc","pid":25863,"tid":25871,"ts":531360697777,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":11,"tdur":10,"tts":130757},{"cat":"cc","pid":25863,"tid":25871,"ts":531360697789,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":12,"tdur":11,"tts":130769},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360697805,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":149,"tdur":96,"tts":130785},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360700356,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":15,"tdur":14,"tts":131019},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360700379,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":70951,"tdur":350,"tts":131041},{"cat":"cc","pid":25863,"tid":25871,"ts":531360700381,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":276,"tdur":134,"tts":131043},{"cat":"cc","pid":25863,"tid":25871,"ts":531360700397,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":12,"tdur":12,"tts":131059},{"cat":"cc","pid":25863,"tid":25871,"ts":531360700659,"ph":"X","name":"Display::Draw","args":{},"dur":70669,"tdur":208,"tts":131181},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360700680,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":131203,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360700686,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":26,"tdur":26,"tts":131208},{"cat":"cc","pid":25863,"tid":25871,"ts":531360700688,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":16,"tdur":16,"tts":131210},{"cat":"cc","pid":25863,"tid":25871,"ts":531360700704,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":5,"tts":131227},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360700713,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":70604,"tdur":143,"tts":131235},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360773920,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":32,"tdur":29,"tts":131528},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360773967,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":659,"tdur":350,"tts":131573},{"cat":"cc","pid":25863,"tid":25871,"ts":531360773972,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":336,"tdur":168,"tts":131578},{"cat":"cc","pid":25863,"tid":25871,"ts":531360774005,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":23,"tdur":22,"tts":131611},{"cat":"cc","pid":25863,"tid":25871,"ts":531360774310,"ph":"X","name":"Display::Draw","args":{},"dur":313,"tdur":170,"tts":131750},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360774319,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":131759,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360774329,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":32,"tdur":30,"tts":131769},{"cat":"cc","pid":25863,"tid":25871,"ts":531360774334,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":10,"tdur":10,"tts":131773},{"cat":"cc","pid":25863,"tid":25871,"ts":531360774345,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":12,"tdur":11,"tts":131785},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360774361,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":243,"tdur":99,"tts":131801},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360777201,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":32,"tdur":30,"tts":132077},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360777248,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":657,"tdur":369,"tts":132122},{"cat":"cc","pid":25863,"tid":25871,"ts":531360777253,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":338,"tdur":166,"tts":132127},{"cat":"cc","pid":25863,"tid":25871,"ts":531360777285,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":26,"tdur":25,"tts":132160},{"cat":"cc","pid":25863,"tid":25871,"ts":531360777593,"ph":"X","name":"Display::Draw","args":{},"dur":309,"tdur":191,"tts":132297},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360777603,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":132306,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360777612,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":32,"tdur":31,"tts":132316},{"cat":"cc","pid":25863,"tid":25871,"ts":531360777617,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":10,"tdur":9,"tts":132321},{"cat":"cc","pid":25863,"tid":25871,"ts":531360777628,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":12,"tdur":12,"tts":132332},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360777645,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":238,"tdur":119,"tts":132349},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360780552,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":33,"tdur":30,"tts":132642},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360780599,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":547,"tdur":319,"tts":132688},{"cat":"cc","pid":25863,"tid":25871,"ts":531360780604,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":287,"tdur":157,"tts":132692},{"cat":"cc","pid":25863,"tid":25871,"ts":531360780636,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":25,"tdur":24,"tts":132724},{"cat":"cc","pid":25863,"tid":25871,"ts":531360780893,"ph":"X","name":"Display::Draw","args":{},"dur":250,"tdur":153,"tts":132851},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360780901,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":132860,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360780910,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":31,"tdur":30,"tts":132869},{"cat":"cc","pid":25863,"tid":25871,"ts":531360780915,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":10,"tdur":10,"tts":132873},{"cat":"cc","pid":25863,"tid":25871,"ts":531360780926,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":12,"tdur":11,"tts":132885},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360780942,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":181,"tdur":83,"tts":132901},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360783652,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":32,"tdur":29,"tts":133179},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360783699,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":54303,"tdur":407,"tts":133224},{"cat":"cc","pid":25863,"tid":25871,"ts":531360783703,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":348,"tdur":177,"tts":133228},{"cat":"cc","pid":25863,"tid":25871,"ts":531360783736,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":23,"tdur":22,"tts":133261},{"cat":"cc","pid":25863,"tid":25871,"ts":531360784053,"ph":"X","name":"Display::Draw","args":{},"dur":53948,"tdur":221,"tts":133409},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360784063,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":133418,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360784073,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":50,"tdur":49,"tts":133429},{"cat":"cc","pid":25863,"tid":25871,"ts":531360784078,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":28,"tdur":27,"tts":133433},{"cat":"cc","pid":25863,"tid":25871,"ts":531360784106,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":13,"tdur":12,"tts":133462},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360784124,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":53869,"tdur":141,"tts":133480},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360840369,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":40,"tdur":38,"tts":133712},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360840415,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":303,"tdur":172,"tts":133757},{"cat":"cc","pid":25863,"tid":25871,"ts":531360840417,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":169,"tdur":83,"tts":133759},{"cat":"cc","pid":25863,"tid":25871,"ts":531360840431,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":10,"tdur":9,"tts":133773},{"cat":"cc","pid":25863,"tid":25871,"ts":531360840587,"ph":"X","name":"Display::Draw","args":{},"dur":130,"tdur":83,"tts":133844},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360840591,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":133848,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360840595,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":14,"tdur":13,"tts":133852},{"cat":"cc","pid":25863,"tid":25871,"ts":531360840597,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":4,"tts":133854},{"cat":"cc","pid":25863,"tid":25871,"ts":531360840602,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":6,"tdur":5,"tts":133859},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360840609,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":100,"tdur":53,"tts":133866},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360841733,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":18,"tdur":16,"tts":134002},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360841757,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":266,"tdur":155,"tts":134025},{"cat":"cc","pid":25863,"tid":25871,"ts":531360841759,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":126,"tdur":74,"tts":134027},{"cat":"cc","pid":25863,"tid":25871,"ts":531360841773,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":8,"tdur":8,"tts":134041},{"cat":"cc","pid":25863,"tid":25871,"ts":531360841885,"ph":"X","name":"Display::Draw","args":{},"dur":137,"tdur":76,"tts":134103},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360841889,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":134106,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360841893,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":14,"tdur":12,"tts":134111},{"cat":"cc","pid":25863,"tid":25871,"ts":531360841895,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":4,"tts":134113},{"cat":"cc","pid":25863,"tid":25871,"ts":531360841900,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":5,"tts":134117},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360841907,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":107,"tdur":46,"tts":134124},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360843081,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":13,"tdur":13,"tts":134254},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360843100,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":271,"tdur":147,"tts":134273},{"cat":"cc","pid":25863,"tid":25871,"ts":531360843112,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":155,"tdur":71,"tts":134285},{"cat":"cc","pid":25863,"tid":25871,"ts":531360843128,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":10,"tdur":9,"tts":134301},{"cat":"cc","pid":25863,"tid":25871,"ts":531360843267,"ph":"X","name":"Display::Draw","args":{},"dur":102,"tdur":61,"tts":134358},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360843271,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":134361,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360843275,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":12,"tdur":12,"tts":134365},{"cat":"cc","pid":25863,"tid":25871,"ts":531360843276,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":4,"tts":134367},{"cat":"cc","pid":25863,"tid":25871,"ts":531360843281,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":5,"tts":134371},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360843288,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":76,"tdur":36,"tts":134378},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360844470,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":13,"tdur":12,"tts":134491},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360844489,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":58630,"tdur":218,"tts":134509},{"cat":"cc","pid":25863,"tid":25871,"ts":531360844491,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":109,"tdur":78,"tts":134511},{"cat":"cc","pid":25863,"tid":25871,"ts":531360844504,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":10,"tdur":10,"tts":134524},{"cat":"cc","pid":25863,"tid":25871,"ts":531360844601,"ph":"X","name":"Display::Draw","args":{},"dur":58516,"tdur":135,"tts":134590},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360844605,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":134594,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360844609,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":12,"tdur":12,"tts":134598},{"cat":"cc","pid":25863,"tid":25871,"ts":531360844611,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":4,"tdur":4,"tts":134600},{"cat":"cc","pid":25863,"tid":25871,"ts":531360844615,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":5,"tdur":5,"tts":134604},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360844622,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":58486,"tdur":104,"tts":134611},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360905343,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":33,"tdur":30,"tts":134855},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360905390,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":626,"tdur":366,"tts":134901},{"cat":"cc","pid":25863,"tid":25871,"ts":531360905395,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":321,"tdur":164,"tts":134906},{"cat":"cc","pid":25863,"tid":25871,"ts":531360905428,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":24,"tdur":22,"tts":134939},{"cat":"cc","pid":25863,"tid":25871,"ts":531360905718,"ph":"X","name":"Display::Draw","args":{},"dur":295,"tdur":189,"tts":135074},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360905727,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":135084,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360905737,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":31,"tdur":30,"tts":135094},{"cat":"cc","pid":25863,"tid":25871,"ts":531360905742,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":10,"tdur":10,"tts":135098},{"cat":"cc","pid":25863,"tid":25871,"ts":531360905753,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":12,"tdur":11,"tts":135110},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360905769,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":224,"tdur":117,"tts":135126},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360908595,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":32,"tdur":30,"tts":135437},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360908642,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":614,"tdur":359,"tts":135483},{"cat":"cc","pid":25863,"tid":25871,"ts":531360908647,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":315,"tdur":161,"tts":135488},{"cat":"cc","pid":25863,"tid":25871,"ts":531360908679,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":23,"tdur":22,"tts":135520},{"cat":"cc","pid":25863,"tid":25871,"ts":531360908964,"ph":"X","name":"Display::Draw","args":{},"dur":289,"tdur":186,"tts":135653},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360908973,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":135662,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360908983,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":31,"tdur":30,"tts":135672},{"cat":"cc","pid":25863,"tid":25871,"ts":531360908988,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":10,"tdur":10,"tts":135676},{"cat":"cc","pid":25863,"tid":25871,"ts":531360908999,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":12,"tdur":12,"tts":135687},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360909015,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":219,"tdur":115,"tts":135704},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360911796,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":33,"tdur":30,"tts":135998},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360911843,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":569,"tdur":329,"tts":136044},{"cat":"cc","pid":25863,"tid":25871,"ts":531360911848,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":331,"tdur":165,"tts":136048},{"cat":"cc","pid":25863,"tid":25871,"ts":531360911881,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":23,"tdur":22,"tts":136081},{"cat":"cc","pid":25863,"tid":25871,"ts":531360912181,"ph":"X","name":"Display::Draw","args":{},"dur":228,"tdur":153,"tts":136217},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360912191,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":136227,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360912201,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":31,"tdur":30,"tts":136237},{"cat":"cc","pid":25863,"tid":25871,"ts":531360912205,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":11,"tdur":10,"tts":136241},{"cat":"cc","pid":25863,"tid":25871,"ts":531360912217,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":12,"tdur":11,"tts":136253},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360912233,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":158,"tdur":82,"tts":136269},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360916133,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":16,"tdur":14,"tts":136483},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360916155,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":55065,"tdur":322,"tts":136505},{"cat":"cc","pid":25863,"tid":25871,"ts":531360916158,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":193,"tdur":121,"tts":136507},{"cat":"cc","pid":25863,"tid":25871,"ts":531360916173,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":12,"tdur":11,"tts":136523},{"cat":"cc","pid":25863,"tid":25871,"ts":531360916354,"ph":"X","name":"Display::Draw","args":{},"dur":54865,"tdur":194,"tts":136632},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360916363,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":136641,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360916386,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":24,"tdur":23,"tts":136664},{"cat":"cc","pid":25863,"tid":25871,"ts":531360916388,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":5,"tdur":5,"tts":136666},{"cat":"cc","pid":25863,"tid":25871,"ts":531360916394,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":14,"tdur":13,"tts":136672},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360916410,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":54800,"tdur":128,"tts":136688},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360973045,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":33,"tdur":31,"tts":136958},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360973093,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":603,"tdur":337,"tts":137004},{"cat":"cc","pid":25863,"tid":25871,"ts":531360973098,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":298,"tdur":162,"tts":137009},{"cat":"cc","pid":25863,"tid":25871,"ts":531360973130,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":24,"tdur":23,"tts":137042},{"cat":"cc","pid":25863,"tid":25871,"ts":531360973398,"ph":"X","name":"Display::Draw","args":{},"dur":294,"tdur":162,"tts":137175},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360973408,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":137184,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360973439,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":32,"tdur":32,"tts":137215},{"cat":"cc","pid":25863,"tid":25871,"ts":531360973444,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":11,"tdur":11,"tts":137220},{"cat":"cc","pid":25863,"tid":25871,"ts":531360973456,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":12,"tdur":11,"tts":137232},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360973472,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":201,"tdur":70,"tts":137248},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360976119,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":32,"tdur":29,"tts":137490},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360976166,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":602,"tdur":353,"tts":137536},{"cat":"cc","pid":25863,"tid":25871,"ts":531360976171,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":334,"tdur":181,"tts":137541},{"cat":"cc","pid":25863,"tid":25871,"ts":531360976205,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":24,"tdur":23,"tts":137574},{"cat":"cc","pid":25863,"tid":25871,"ts":531360976508,"ph":"X","name":"Display::Draw","args":{},"dur":257,"tdur":159,"tts":137726},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360976517,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":137735,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360976527,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":31,"tdur":31,"tts":137745},{"cat":"cc","pid":25863,"tid":25871,"ts":531360976531,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":11,"tdur":9,"tts":137750},{"cat":"cc","pid":25863,"tid":25871,"ts":531360976542,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":13,"tdur":11,"tts":137761},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360976559,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":188,"tdur":89,"tts":137777},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360979304,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":35,"tdur":32,"tts":138055},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360979353,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":508,"tdur":300,"tts":138102},{"cat":"cc","pid":25863,"tid":25871,"ts":531360979358,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":330,"tdur":173,"tts":138107},{"cat":"cc","pid":25863,"tid":25871,"ts":531360979392,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":23,"tdur":22,"tts":138141},{"cat":"cc","pid":25863,"tid":25871,"ts":531360979690,"ph":"X","name":"Display::Draw","args":{},"dur":168,"tdur":116,"tts":138284},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360979699,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":138293,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360979709,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":32,"tdur":31,"tts":138303},{"cat":"cc","pid":25863,"tid":25871,"ts":531360979714,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":11,"tdur":10,"tts":138307},{"cat":"cc","pid":25863,"tid":25871,"ts":531360979725,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":13,"tdur":11,"tts":138319},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360979742,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":101,"tdur":49,"tts":138335},{"cat":"mojo","pid":25863,"tid":25871,"ts":531360981682,"ph":"X","name":"SurfacesImpl::SubmitFrame","args":{},"dur":16,"tdur":15,"tts":138522},{"cat":"toplevel","pid":25863,"tid":25871,"ts":531360981706,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/surfaces/surfaces_service_application.cc","src_func":"FrameSubmitted"},"dur":67126,"tdur":349,"tts":138545},{"cat":"cc","pid":25863,"tid":25871,"ts":531360981708,"ph":"X","name":"SurfaceAggregator::Aggregate","args":{},"dur":249,"tdur":136,"tts":138547},{"cat":"cc","pid":25863,"tid":25871,"ts":531360981724,"ph":"X","name":"ResourceProvider::DeleteResourceInternal","args":{},"dur":12,"tdur":11,"tts":138564},{"cat":"cc","pid":25863,"tid":25871,"ts":531360981959,"ph":"X","name":"Display::Draw","args":{},"dur":66869,"tdur":203,"tts":138687},{"cat":"benchmark","pid":25863,"tid":25871,"ts":531360981969,"ph":"I","name":"BenchmarkInstrumentation::DisplayRenderingStats","args":{"data":{"frame_count":1}},"tts":138696,"s":"t"},{"cat":"cc","pid":25863,"tid":25871,"ts":531360981979,"ph":"X","name":"DirectRenderer::DrawFrame","args":{},"dur":32,"tdur":31,"tts":138706},{"cat":"cc","pid":25863,"tid":25871,"ts":531360981984,"ph":"X","name":"GLRenderer::BeginDrawingFrame","args":{},"dur":10,"tdur":9,"tts":138711},{"cat":"cc","pid":25863,"tid":25871,"ts":531360981995,"ph":"X","name":"DirectRenderer::DrawRenderPass","args":{},"dur":12,"tdur":12,"tts":138722},{"cat":"cc,benchmark","pid":25863,"tid":25871,"ts":531360982011,"ph":"X","name":"GLRenderer::SwapBuffers","args":{},"dur":66804,"tdur":137,"tts":138739},{"cat":"__metadata","pid":25863,"tid":25871,"ts":0,"ph":"M","name":"overhead","args":{"average_overhead":0.0021929936305732484}},{"cat":"__metadata","pid":25863,"tid":0,"ts":0,"ph":"M","name":"num_cpus","args":{"number":32}},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358635347,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":312,"tdur":265,"tts":1091069},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358635661,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":29,"tdur":29,"tts":1091337},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358635715,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":124,"tdur":123,"tts":1091392},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358635725,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":113,"tdur":111,"tts":1091402},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358635769,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":58,"tdur":56,"tts":1091447},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358635842,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":16448,"tdur":2114,"tts":1091519},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358635848,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":16439,"tdur":2105,"tts":1091525},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358652266,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":36},"dur":18,"tdur":15,"tts":1093611},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358652311,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1093655},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358652319,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":506,"tdur":377,"tts":1093663},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358652325,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":474,"tdur":343,"tts":1093669},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358652803,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":20,"tdur":19,"tts":1094018},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358652843,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1094059},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358652851,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":250,"tdur":250,"tts":1094066},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358652857,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":242,"tdur":241,"tts":1094073},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358652905,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":36},"dur":38,"tdur":35,"tts":1094122},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358653016,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1094233,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358653022,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":186},"dur":74,"tdur":73,"tts":1094238},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358653025,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":70,"tdur":69,"tts":1094241},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358653121,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1094336},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358653129,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":397,"tdur":340,"tts":1094344},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358653133,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":360,"tdur":302,"tts":1094349},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358653495,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":28,"tdur":26,"tts":1094655},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358653550,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":32,"tdur":30,"tts":1094710},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358653562,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":18,"tdur":16,"tts":1094722},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358653587,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":107,"tdur":105,"tts":1094747},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358653596,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":97,"tdur":96,"tts":1094755},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358653626,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":60,"tdur":58,"tts":1094787},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358653703,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":15282,"tdur":2100,"tts":1094863},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358653708,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":15275,"tdur":2093,"tts":1094868},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358668960,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":26},"dur":19,"tdur":16,"tts":1096941},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358668991,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1096970},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358669014,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":492,"tdur":365,"tts":1096993},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358669021,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":459,"tdur":331,"tts":1097000},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358669484,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":20,"tdur":18,"tts":1097337},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358669513,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1097365},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358669533,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":234,"tdur":234,"tts":1097385},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358669539,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":226,"tdur":225,"tts":1097392},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358669572,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":26},"dur":36,"tdur":34,"tts":1097425},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358669681,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1097534,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358669687,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":187},"dur":75,"tdur":75,"tts":1097539},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358669690,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":71,"tdur":70,"tts":1097542},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358669772,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":25,"tdur":24,"tts":1097625},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358669813,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":397,"tdur":313,"tts":1097666},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358669819,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":373,"tdur":288,"tts":1097672},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358670195,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":13,"tdur":13,"tts":1097964},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358670214,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":4,"tts":1097983},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358670498,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":37,"tdur":36,"tts":1098055},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358670506,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":26,"tdur":24,"tts":1098063},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358670540,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":97,"tdur":96,"tts":1098097},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358670548,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":87,"tdur":85,"tts":1098106},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358670597,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":29,"tdur":28,"tts":1098154},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358672163,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":30109,"tdur":2126,"tts":1098256},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358672179,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":30090,"tdur":2108,"tts":1098271},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358702222,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":61},"dur":43,"tdur":40,"tts":1100335},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358702278,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":4,"tts":1100389},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358702308,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":511,"tdur":378,"tts":1100419},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358702315,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":478,"tdur":344,"tts":1100426},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358702797,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":18,"tts":1100776},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358702825,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1100803},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358702845,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":253,"tdur":253,"tts":1100823},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358702852,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":243,"tdur":243,"tts":1100830},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358702886,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":61},"dur":37,"tdur":36,"tts":1100865},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358702996,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1100975,"s":"t"},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358670594,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":16,"tdur":14,"tts":112146},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358672221,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":10,"tdur":8,"tts":112363},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358672533,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":112532},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358672700,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":112650},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358673657,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":112738},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358674660,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":112890},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358674928,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":113045},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358675050,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":113144},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358675083,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":113173},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358675449,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":113287},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358676403,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":113396},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358676600,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":113481},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358676775,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":113556},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358677037,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":113619},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358678033,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":113707},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358678198,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":113778},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358678320,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":113851},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358735584,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":114044},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358735894,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":114176},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358737594,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":10,"tts":114406},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358737781,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":114540},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358738043,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":114679},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358738184,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":5,"tts":114786},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358738460,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":114885},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358739277,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":2,"tts":114986},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358739511,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":2,"tts":115080},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358739649,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":115146},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358739946,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":115201},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358740781,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":115253},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358741009,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":115305},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358741153,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":115401},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358741412,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":115456},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358742249,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":115535},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358742405,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":115611},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358742499,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":115675},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358742516,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":1,"tts":115692},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358820236,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":115862},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358821442,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":116070},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358823157,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":116301},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358823437,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":4,"tts":116458},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358823592,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":116566},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358823842,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":116618},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358824679,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":4,"tts":116739},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358824920,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":116865},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358825067,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":116967},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358825953,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":117062},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358826702,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":117151},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358826899,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":117212},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358827043,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":117271},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358827316,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":117322},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358828083,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":117379},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358828260,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":117431},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358828369,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":117486},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358902029,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":117634},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358902572,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":3,"tts":117766},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358903358,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":4,"tts":117898},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358903591,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":118030},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358903901,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":118161},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358904066,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":3,"tts":118287},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358904078,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":1,"tts":118298},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358904410,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":118407},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358905137,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":118500},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358905342,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":118573},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358905479,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":118635},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358703002,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":188},"dur":90,"tdur":89,"tts":1100981},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358703012,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":79,"tdur":78,"tts":1100991},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358703103,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":4,"tts":1101082},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358703125,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":398,"tdur":337,"tts":1101103},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358703130,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":364,"tdur":301,"tts":1101109},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358703496,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":24,"tdur":23,"tts":1101413},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358703530,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":28,"tdur":27,"tts":1101448},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358703541,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":15,"tdur":15,"tts":1101458},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358703582,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":101,"tdur":100,"tts":1101500},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358703592,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":90,"tdur":89,"tts":1101510},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358703624,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":50,"tdur":49,"tts":1101542},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358703686,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":2539,"tdur":1801,"tts":1101603},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358703691,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":2532,"tdur":1794,"tts":1101608},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358706193,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":94},"dur":26,"tdur":24,"tts":1103374},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358706246,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":7,"tdur":5,"tts":1103427},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358706255,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":439,"tdur":336,"tts":1103435},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358706262,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":406,"tdur":303,"tts":1103441},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358706672,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":20,"tdur":18,"tts":1103750},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358706712,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":4,"tts":1103790},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358706720,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":293,"tdur":192,"tts":1103797},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358706725,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":261,"tdur":158,"tts":1103803},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358706990,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":21,"tdur":20,"tts":1103967},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358707032,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":489,"tdur":386,"tts":1104009},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358707039,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":235,"tdur":132,"tts":1104016},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358707279,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":240,"tdur":239,"tts":1104154},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358707318,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":94},"dur":37,"tdur":36,"tts":1104193},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358707435,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1104311,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358707441,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":189},"dur":74,"tdur":74,"tts":1104316},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358707444,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":70,"tdur":69,"tts":1104319},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358707527,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1104402},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358707551,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":385,"tdur":326,"tts":1104426},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358707557,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":350,"tdur":291,"tts":1104432},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358707909,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":24,"tdur":23,"tts":1104726},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358707943,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":172,"tdur":150,"tts":1104760},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358707954,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":160,"tdur":137,"tts":1104771},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358707985,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":119,"tdur":96,"tts":1104803},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358708124,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":9646,"tdur":1170,"tts":1104920},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358708128,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":9641,"tdur":1164,"tts":1104924},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358717751,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":201},"dur":16,"tdur":14,"tts":1106072},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358717773,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1106093},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358717786,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":356,"tdur":311,"tts":1106106},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358717789,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":339,"tdur":294,"tts":1106109},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358718131,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":9,"tdur":10,"tts":1106406},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358718145,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":3,"tts":1106420},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358718155,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":128,"tdur":127,"tts":1106431},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358718159,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":123,"tdur":122,"tts":1106435},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358718176,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":201},"dur":19,"tdur":18,"tts":1106452},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358718233,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1106509,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358718236,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":190},"dur":44,"tdur":43,"tts":1106512},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358718238,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":41,"tdur":40,"tts":1106514},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358718285,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1106561},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358718296,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":415,"tdur":343,"tts":1106572},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358718299,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":398,"tdur":326,"tts":1106575},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358718699,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":10,"tdur":10,"tts":1106904},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358718714,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":9,"tdur":9,"tts":1106919},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358718718,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":5,"tdur":4,"tts":1106923},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358718732,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":51,"tdur":51,"tts":1106937},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358718734,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":49,"tdur":48,"tts":1106939},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358718747,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":28,"tdur":28,"tts":1106952},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358718786,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":15773,"tdur":1340,"tts":1106991},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358718789,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":15769,"tdur":1336,"tts":1106994},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358734542,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":157},"dur":14,"tdur":12,"tts":1108316},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358734571,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1108343},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358734575,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":333,"tdur":284,"tts":1108347},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358734578,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":306,"tdur":256,"tts":1108350},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358734898,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":9,"tdur":9,"tts":1108621},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358734916,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1108640},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358734920,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":105,"tdur":77,"tts":1108643},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358734922,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":93,"tdur":64,"tts":1108646},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358735016,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":8,"tdur":7,"tts":1108712},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358735032,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":249,"tdur":205,"tts":1108728},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358735035,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":114,"tdur":70,"tts":1108731},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358735152,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":128,"tdur":127,"tts":1108805},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358735185,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":157},"dur":19,"tdur":18,"tts":1108838},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358735238,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1108891,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358735241,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":191},"dur":37,"tdur":37,"tts":1108894},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358735243,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":35,"tdur":35,"tts":1108895},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358735284,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":12,"tdur":11,"tts":1108937},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358735547,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1108972},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358735863,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":120,"tdur":97,"tts":1109004},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358735870,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":99,"tdur":77,"tts":1109010},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358735971,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":10,"tdur":9,"tts":1109090},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358735985,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":144,"tdur":132,"tts":1109104},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358735990,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":136,"tdur":123,"tts":1109109},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358736025,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":78,"tdur":76,"tts":1109134},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358737534,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":30804,"tdur":1170,"tts":1109311},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358737550,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":30785,"tdur":1152,"tts":1109325},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358768345,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":882,"tdur":881,"tts":1110489},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358768357,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":867,"tdur":867,"tts":1110501},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358769199,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":44},"dur":22,"tdur":20,"tts":1111344},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358769254,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1111398},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358769263,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":484,"tdur":355,"tts":1111407},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358769268,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":453,"tdur":323,"tts":1111412},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358769725,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":19,"tts":1111741},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358769765,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1111781},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358769773,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":245,"tdur":244,"tts":1111789},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358769779,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":237,"tdur":236,"tts":1111795},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358769813,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":44},"dur":37,"tdur":36,"tts":1111829},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358769924,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1111941,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358769930,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":192},"dur":83,"tdur":82,"tts":1111946},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358769933,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":79,"tdur":77,"tts":1111950},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358770036,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":4,"tts":1112053},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358770044,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":566,"tdur":429,"tts":1112060},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358770049,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":535,"tdur":396,"tts":1112065},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358770588,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":20,"tts":1112467},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358770629,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":19,"tdur":18,"tts":1112509},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358770636,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":11,"tdur":10,"tts":1112516},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358770652,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":95,"tdur":94,"tts":1112531},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358770656,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":89,"tdur":89,"tts":1112535},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358770690,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":44,"tdur":43,"tts":1112570},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358770758,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":14936,"tdur":1795,"tts":1112638},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358770763,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":14929,"tdur":1788,"tts":1112643},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358785662,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":188},"dur":26,"tdur":24,"tts":1114403},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358785700,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1114440},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358785722,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":838,"tdur":751,"tts":1114462},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358785728,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":809,"tdur":721,"tts":1114468},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358786541,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":17,"tdur":16,"tts":1115195},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358786565,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":4,"tts":1115219},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358786583,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":217,"tdur":216,"tts":1115237},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358786589,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":209,"tdur":208,"tts":1115243},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358786618,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":188},"dur":35,"tdur":33,"tts":1115273},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358786718,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1115372,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358786723,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":193},"dur":72,"tdur":71,"tts":1115377},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358786727,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":67,"tdur":66,"tts":1115381},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358786805,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1115459},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358786826,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":542,"tdur":423,"tts":1115480},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358786831,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":510,"tdur":390,"tts":1115485},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358787345,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":19,"tts":1115881},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358742498,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":17,"tdur":18,"tts":64965},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358820156,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":42,"tdur":29,"tts":65098},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358821306,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":56,"tdur":54,"tts":65170},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358823017,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":61,"tdur":59,"tts":65286},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358823374,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":23,"tdur":23,"tts":65385},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358823545,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":21,"tts":65447},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358823567,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":4,"tts":65469},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358823818,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":17,"tts":65507},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358824616,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":20,"tdur":19,"tts":65563},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358824859,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":19,"tts":65621},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358825026,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":16,"tdur":15,"tts":65675},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358825043,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":9,"tdur":8,"tts":65692},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358825909,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":17,"tdur":16,"tts":65738},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358826656,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":20,"tdur":19,"tts":65790},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358826868,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":21,"tts":65848},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358827014,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":21,"tts":65903},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358827037,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":5,"tts":65925},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358827292,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":17,"tdur":17,"tts":65965},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358828052,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":24,"tdur":23,"tts":66017},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358828231,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":21,"tts":66076},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358828351,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":11,"tdur":10,"tts":66119},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358828363,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":6,"tdur":6,"tts":66130},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358901948,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":36,"tdur":35,"tts":66175},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358902508,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":23,"tdur":21,"tts":66250},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358903293,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":19,"tts":66309},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358903514,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":23,"tdur":23,"tts":66367},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358903840,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":21,"tts":66427},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358904027,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":32,"tdur":21,"tts":66487},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358904060,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":12,"tdur":11,"tts":66510},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358904366,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":16,"tts":66559},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358905091,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":20,"tdur":19,"tts":66611},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358905313,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":21,"tts":66664},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358905451,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":20,"tts":66719},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358905473,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":6,"tdur":5,"tts":66741},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358905716,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":17,"tts":66782},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358906457,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":20,"tts":66834},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358906655,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":21,"tts":66889},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358906789,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":20,"tts":66944},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358906812,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":4,"tts":66966},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358907053,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":17,"tts":67005},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358907793,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":21,"tts":67058},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358907993,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":39,"tdur":29,"tts":67117},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358908166,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":12,"tdur":11,"tts":67169},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358908179,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":6,"tdur":5,"tts":67182},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358970837,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":37,"tdur":35,"tts":67228},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358971713,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":48,"tdur":47,"tts":67309},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358973979,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":47,"tdur":46,"tts":67412},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358974353,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":19,"tdur":18,"tts":67484},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358974511,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":10,"tdur":9,"tts":67509},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358974532,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":15,"tdur":13,"tts":67526},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358974926,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":19,"tdur":18,"tts":67577},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358975722,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":21,"tts":67633},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358975972,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":22,"tts":67691},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358976123,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":17,"tts":67749},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358976142,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":10,"tdur":10,"tts":67767},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358976455,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":19,"tdur":18,"tts":67816},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358977327,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":21,"tts":67872},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358977549,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":23,"tdur":22,"tts":67928},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358977689,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":17,"tts":67986},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358977708,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":12,"tdur":10,"tts":68005},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358977955,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":20,"tdur":18,"tts":68052},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358978829,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":24,"tdur":23,"tts":68108},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358979009,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":23,"tdur":22,"tts":68168},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358979124,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":17,"tts":68229},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358787374,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":25,"tdur":25,"tts":1115909},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358787388,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":10,"tdur":10,"tts":1115923},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358787415,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":97,"tdur":96,"tts":1115951},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358787420,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":90,"tdur":89,"tts":1115956},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358787443,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":53,"tdur":51,"tts":1115979},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358787516,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":14871,"tdur":2060,"tts":1116052},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358787523,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":14863,"tdur":2052,"tts":1116058},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358802372,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":158},"dur":11,"tdur":10,"tts":1118098},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358802401,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":3,"tts":1118126},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358802406,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":510,"tdur":382,"tts":1118131},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358802410,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":481,"tdur":351,"tts":1118135},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358802895,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":18,"tts":1118492},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358802934,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1118531},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358802942,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":240,"tdur":239,"tts":1118539},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358802948,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":232,"tdur":231,"tts":1118545},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358802982,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":158},"dur":36,"tdur":35,"tts":1118579},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358803090,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1118688,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358803097,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":194},"dur":80,"tdur":80,"tts":1118693},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358803100,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":76,"tdur":76,"tts":1118696},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358803201,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1118798},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358803209,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":506,"tdur":413,"tts":1118806},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358803214,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":474,"tdur":380,"tts":1118811},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358803692,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":20,"tts":1119197},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358803733,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":20,"tdur":19,"tts":1119238},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358803741,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":10,"tdur":10,"tts":1119246},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358803768,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":84,"tdur":83,"tts":1119273},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358803771,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":79,"tdur":78,"tts":1119276},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358803786,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":49,"tdur":48,"tts":1119291},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358803867,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":14575,"tdur":1711,"tts":1119373},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358803875,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":14565,"tdur":1702,"tts":1119380},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358818419,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":16},"dur":17,"tdur":15,"tts":1121064},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358818448,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":4,"tts":1121091},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358818470,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":741,"tdur":682,"tts":1121113},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358818476,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":711,"tdur":651,"tts":1121119},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358819191,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":17,"tdur":17,"tts":1121775},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358819216,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":3,"tts":1121801},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358819235,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":221,"tdur":172,"tts":1121820},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358819240,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":191,"tdur":141,"tts":1121825},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358819435,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":19,"tdur":18,"tts":1121972},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358819462,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":401,"tdur":362,"tts":1121999},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358819468,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":177,"tdur":138,"tts":1122005},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358819647,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":214,"tdur":214,"tts":1122145},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358819679,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":16},"dur":28,"tdur":26,"tts":1122178},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358819784,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1122283,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358819790,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":195},"dur":68,"tdur":68,"tts":1122288},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358819792,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":65,"tdur":64,"tts":1122291},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358819884,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":25,"tdur":24,"tts":1122383},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358820201,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1122451},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358821412,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":208,"tdur":185,"tts":1122548},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358821424,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":158,"tdur":135,"tts":1122559},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358821586,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":32,"tdur":31,"tts":1122700},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358821625,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":75,"tdur":75,"tts":1122738},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358821630,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":69,"tdur":68,"tts":1122743},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358821648,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":40,"tdur":40,"tts":1122761},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358823121,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":29139,"tdur":2149,"tts":1122934},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358823136,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":29121,"tdur":2132,"tts":1122948},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358852234,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":156},"dur":19,"tdur":16,"tts":1125060},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358852265,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":4,"tts":1125090},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358852296,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":424,"tdur":297,"tts":1125120},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358852303,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":391,"tdur":263,"tts":1125127},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358852698,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":18,"tts":1125396},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358852726,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":4,"tts":1125424},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358852747,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":250,"tdur":249,"tts":1125445},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358852754,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":240,"tdur":240,"tts":1125452},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358852790,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":156},"dur":41,"tdur":40,"tts":1125488},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358852904,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1125603,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358852911,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":196},"dur":80,"tdur":80,"tts":1125609},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358852914,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":76,"tdur":75,"tts":1125612},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358853002,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1125701},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358853024,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":493,"tdur":378,"tts":1125722},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358853029,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":477,"tdur":362,"tts":1125727},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358853508,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":8,"tdur":8,"tts":1126091},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358853520,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":8,"tdur":8,"tts":1126103},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358853523,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":4,"tdur":4,"tts":1126106},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358853534,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":81,"tdur":80,"tts":1126118},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358853536,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":77,"tdur":76,"tts":1126120},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358853546,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":52,"tdur":52,"tts":1126129},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358853619,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":14243,"tdur":1187,"tts":1126203},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358853627,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":14233,"tdur":1178,"tts":1126210},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358867845,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":188},"dur":13,"tdur":11,"tts":1127374},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358867890,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":7,"tdur":5,"tts":1127419},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358867899,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":967,"tdur":827,"tts":1127427},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358867904,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":929,"tdur":789,"tts":1127432},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358868835,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":28,"tdur":28,"tts":1128224},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358868884,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1128274},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358868892,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":341,"tdur":217,"tts":1128281},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358868897,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":309,"tdur":184,"tts":1128286},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358869210,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":21,"tdur":20,"tts":1128476},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358869261,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":557,"tdur":416,"tts":1128527},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358869265,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":319,"tdur":178,"tts":1128530},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358869588,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":227,"tdur":226,"tts":1128714},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358869629,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":188},"dur":36,"tdur":34,"tts":1128756},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358869729,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1128856,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358869736,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":197},"dur":76,"tdur":75,"tts":1128862},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358869739,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":72,"tdur":71,"tts":1128865},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358869833,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1128959},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358869845,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":485,"tdur":365,"tts":1128971},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358869848,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":460,"tdur":339,"tts":1128974},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358870322,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":8,"tdur":8,"tts":1129327},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358870333,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":42,"tdur":42,"tts":1129338},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358870335,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":39,"tdur":38,"tts":1129341},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358870343,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":25,"tdur":24,"tts":1129349},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358870384,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":13668,"tdur":815,"tts":1129390},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358870389,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":13662,"tdur":809,"tts":1129394},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358884037,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":43},"dur":12,"tdur":11,"tts":1130191},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358884055,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1130208},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358884065,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":935,"tdur":888,"tts":1130218},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358884068,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":921,"tdur":873,"tts":1130221},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358884990,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":9,"tdur":8,"tts":1131096},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358885003,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1131108},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358885011,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":106,"tdur":105,"tts":1131117},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358885014,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":102,"tdur":101,"tts":1131120},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358885029,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":43},"dur":15,"tdur":15,"tts":1131135},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358885076,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1131182,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358885078,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":198},"dur":37,"tdur":36,"tts":1131184},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358885080,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":34,"tdur":34,"tts":1131186},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358885119,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1131225},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358885128,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":545,"tdur":484,"tts":1131234},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358885130,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":534,"tdur":473,"tts":1131236},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358885665,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":7,"tdur":6,"tts":1131711},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358885675,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":8,"tdur":8,"tts":1131720},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358885677,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":5,"tdur":4,"tts":1131723},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358885688,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":38,"tdur":38,"tts":1131734},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358885690,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":36,"tdur":35,"tts":1131736},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358885697,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":23,"tdur":22,"tts":1131743},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358885728,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":15125,"tdur":896,"tts":1131774},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358885731,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":15120,"tdur":891,"tts":1131777},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358900835,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":10},"dur":14,"tdur":13,"tts":1132653},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358900863,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1132681},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358900870,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":381,"tdur":307,"tts":1132687},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358900873,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":366,"tdur":291,"tts":1132690},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358901241,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":9,"tdur":9,"tts":1132983},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358901259,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1133001},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358901262,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":179,"tdur":111,"tts":1133004},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358901264,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":166,"tdur":96,"tts":1133007},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358901432,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":8,"tdur":8,"tts":1133106},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358901449,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":221,"tdur":161,"tts":1133122},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358901451,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":150,"tdur":88,"tts":1133125},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358901602,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":67,"tdur":66,"tts":1133216},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358901673,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":102,"tdur":102,"tts":1133286},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358901676,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":98,"tdur":99,"tts":1133289},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358901688,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":10},"dur":16,"tdur":16,"tts":1133301},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358901737,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1133351,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358901739,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":199},"dur":34,"tdur":33,"tts":1133353},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358901741,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":32,"tdur":32,"tts":1133354},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358901784,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":19,"tdur":18,"tts":1133398},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358901987,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":3,"tts":1133441},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358902527,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":102,"tdur":70,"tts":1133461},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358902530,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":89,"tdur":57,"tts":1133464},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358902620,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":8,"tdur":7,"tts":1133523},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358902631,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":46,"tdur":46,"tts":1133533},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358902633,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":43,"tdur":43,"tts":1133536},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358902643,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":26,"tdur":26,"tts":1133546},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358903312,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":30671,"tdur":632,"tts":1133599},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358903316,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":30664,"tdur":626,"tts":1133602},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358933987,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":453,"tdur":452,"tts":1134236},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358933994,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":445,"tdur":445,"tts":1134243},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358934415,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":118},"dur":23,"tdur":21,"tts":1134665},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358934453,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1134702},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358934457,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":362,"tdur":277,"tts":1134705},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358934459,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":347,"tdur":261,"tts":1134708},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358934808,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":10,"tdur":9,"tts":1134972},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358934827,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1134990},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358934830,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":178,"tdur":113,"tts":1134993},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358934832,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":165,"tdur":98,"tts":1134996},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358934998,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":9,"tdur":8,"tts":1135097},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358935016,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":237,"tdur":174,"tts":1135114},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358935019,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":114,"tdur":51,"tts":1135117},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358935134,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":118,"tdur":117,"tts":1135170},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358935154,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":118},"dur":20,"tdur":19,"tts":1135190},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358935211,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1135247,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358935213,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":200},"dur":38,"tdur":37,"tts":1135249},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358935215,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":35,"tdur":34,"tts":1135251},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358935255,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1135291},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358935264,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":331,"tdur":263,"tts":1135300},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358935266,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":319,"tdur":251,"tts":1135302},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358935586,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":8,"tdur":7,"tts":1135555},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358935597,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":140,"tdur":140,"tts":1135565},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358935599,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":137,"tdur":136,"tts":1135568},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358935609,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":33,"tdur":32,"tts":1135578},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358935744,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":1297,"tdur":747,"tts":1135713},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358935747,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":1293,"tdur":743,"tts":1135716},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358937030,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":234},"dur":9,"tdur":8,"tts":1136450},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358937044,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1136463},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358937054,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":583,"tdur":521,"tts":1136473},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358937057,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":571,"tdur":509,"tts":1136476},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358937629,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":7,"tdur":6,"tts":1136987},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358937639,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":1,"tdur":1,"tts":1136996},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358937645,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":96,"tdur":95,"tts":1137003},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358937648,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":92,"tdur":91,"tts":1137006},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358937661,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":234},"dur":14,"tdur":14,"tts":1137018},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358937702,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1137060,"s":"t"},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358905741,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":13,"tdur":13,"tts":118686},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358906485,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":118750},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358906685,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":118801},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358906818,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":118861},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358907078,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":118912},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358907822,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":118961},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358908040,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":119012},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358908186,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":119091},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358970934,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":10,"tdur":8,"tts":119313},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358971839,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":119554},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358974097,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":8,"tdur":7,"tts":119781},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358974390,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":119903},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358974530,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":119994},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358974547,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":120010},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358974982,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":120141},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358975793,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":120281},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358976036,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":120413},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358976183,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":5,"tts":120532},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358976500,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":120633},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358977382,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":120735},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358977580,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":120810},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358977714,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":120878},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358977723,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":1,"tts":120887},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358977981,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":120938},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358978860,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":120991},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358979039,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":121043},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358979149,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":121111},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531358979161,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":1,"tts":121123},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359105502,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":121314},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359106255,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":3,"tts":121522},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359107688,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":121700},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359108065,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":3,"tts":121937},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359108620,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":122175},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359108875,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":7,"tdur":6,"tts":122352},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359108897,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":4,"tts":122373},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359109488,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":4,"tts":122490},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359111396,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":122741},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359111870,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":123013},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359112132,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":10,"tdur":8,"tts":123237},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359112769,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":123458},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359114573,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":123669},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359114982,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":8,"tdur":6,"tts":123875},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359115245,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":9,"tdur":7,"tts":124075},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359116395,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":124235},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359117384,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":21,"tdur":20,"tts":124385},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359117674,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":124476},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359117923,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":124600},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359186692,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":124814},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359187342,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":125100},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359189167,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":125368},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359189640,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":125637},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359189873,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":9,"tdur":7,"tts":125822},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359191813,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":126078},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359193608,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":126295},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359194125,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":126567},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359194396,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":10,"tts":126796},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359195082,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":127080},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359196915,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":127340},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359197379,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":8,"tts":127609},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359197649,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":10,"tts":127831},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359198228,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":128097},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359199817,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":128316},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359200044,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":9,"tdur":7,"tts":128463},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359200303,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":2,"tts":128602},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358937705,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":201},"dur":34,"tdur":34,"tts":1137062},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358937709,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":29,"tdur":28,"tts":1137067},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358937743,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":1,"tts":1137101},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358937752,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":357,"tdur":297,"tts":1137109},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358937754,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":346,"tdur":286,"tts":1137111},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358938101,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":7,"tdur":7,"tts":1137399},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358938111,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":8,"tdur":7,"tts":1137409},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358938114,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":4,"tdur":5,"tts":1137411},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358938124,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":38,"tdur":38,"tts":1137422},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358938126,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":35,"tdur":35,"tts":1137424},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358938136,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":20,"tdur":19,"tts":1137434},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358938164,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":12810,"tdur":1010,"tts":1137462},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358938167,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":12806,"tdur":1006,"tts":1137464},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358950957,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":127},"dur":13,"tdur":12,"tts":1138456},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358950985,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1138483},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358950989,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":383,"tdur":351,"tts":1138487},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358950992,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":367,"tdur":335,"tts":1138490},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358951361,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":10,"tdur":9,"tts":1138828},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358951380,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":1,"tts":1138847},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358951383,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":120,"tdur":119,"tts":1138850},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358951386,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":116,"tdur":116,"tts":1138853},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358951406,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":127},"dur":18,"tdur":17,"tts":1138873},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358951461,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1138927,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358951463,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":202},"dur":38,"tdur":37,"tts":1138930},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358951465,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":36,"tdur":36,"tts":1138931},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358951511,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":1,"tts":1138978},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358951514,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":361,"tdur":307,"tts":1138981},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358951516,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":350,"tdur":295,"tts":1138983},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358951867,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":7,"tdur":7,"tts":1139280},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358951901,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":21,"tdur":21,"tts":1139314},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358951908,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":13,"tdur":12,"tts":1139321},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358951925,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":139,"tdur":122,"tts":1139338},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358951929,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":134,"tdur":117,"tts":1139342},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358951952,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":103,"tdur":86,"tts":1139365},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358952071,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":16023,"tdur":1386,"tts":1139468},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358952075,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":16016,"tdur":1380,"tts":1139471},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358968062,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":18},"dur":24,"tdur":23,"tts":1140824},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358968112,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":3,"tts":1140874},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358968129,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":418,"tdur":360,"tts":1140891},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358968134,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":385,"tdur":327,"tts":1140896},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358968524,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":20,"tdur":19,"tts":1141229},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358968553,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1141258},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358968573,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":1459,"tdur":1356,"tts":1141278},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358968579,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":1426,"tdur":1322,"tts":1141284},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358970009,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":21,"tdur":19,"tts":1142612},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358970038,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":506,"tdur":402,"tts":1142640},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358970044,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":256,"tdur":150,"tts":1142647},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358970304,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":237,"tdur":237,"tts":1142803},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358970345,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":18},"dur":38,"tdur":37,"tts":1142844},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531358970457,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1142957,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358970463,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":203},"dur":75,"tdur":75,"tts":1142962},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358970466,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":71,"tdur":69,"tts":1142966},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358970566,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":34,"tdur":33,"tts":1143066},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358970905,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":19,"tdur":17,"tts":1143164},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358971802,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":286,"tdur":219,"tts":1143279},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358971828,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":233,"tdur":167,"tts":1143303},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358972065,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":19,"tts":1143476},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358972094,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":102,"tdur":102,"tts":1143504},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358972101,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":94,"tdur":93,"tts":1143511},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358972125,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":55,"tdur":53,"tts":1143536},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531358974059,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":28502,"tdur":1886,"tts":1143698},{"cat":"gpu","pid":25863,"tid":25870,"ts":531358974070,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":28488,"tdur":1875,"tts":1143707},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359002535,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":171},"dur":20,"tdur":17,"tts":1145561},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359002567,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1145591},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531358979144,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":17,"tdur":17,"tts":68248},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359105340,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":76,"tdur":75,"tts":68303},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359106138,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":42,"tdur":40,"tts":68420},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359107626,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":20,"tts":68512},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359107922,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":24,"tdur":23,"tts":68577},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359108486,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":48,"tts":68661},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359108820,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":39,"tdur":37,"tts":68790},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359108862,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":25,"tdur":24,"tts":68830},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359109430,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":44,"tdur":41,"tts":68921},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359111265,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":50,"tdur":47,"tts":69023},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359111738,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":48,"tts":69131},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359112047,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":48,"tts":69242},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359112100,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":12,"tdur":10,"tts":69294},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359112684,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":42,"tdur":39,"tts":69372},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359114446,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":50,"tdur":47,"tts":69477},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359114882,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":50,"tdur":47,"tts":69587},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359115160,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":41,"tdur":39,"tts":69695},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359115203,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":24,"tdur":23,"tts":69737},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359116348,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":20,"tts":69803},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359117289,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":50,"tdur":46,"tts":69890},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359117598,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":60,"tdur":58,"tts":69983},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359117864,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":42,"tdur":40,"tts":70084},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359117909,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":16,"tdur":15,"tts":70128},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359186618,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":33,"tdur":32,"tts":70221},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359187206,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":55,"tdur":53,"tts":70312},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359189026,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":61,"tdur":58,"tts":70433},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359189503,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":57,"tdur":55,"tts":70551},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359189790,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":52,"tdur":49,"tts":70668},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359189844,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":11,"tdur":10,"tts":70721},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359191694,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":42,"tdur":40,"tts":70799},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359193523,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":48,"tts":70899},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359193984,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":52,"tdur":50,"tts":71009},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359194284,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":40,"tdur":37,"tts":71123},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359194326,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":21,"tts":71163},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359194968,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":41,"tdur":39,"tts":71252},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359196789,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":48,"tts":71353},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359197250,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":49,"tts":71464},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359197530,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":52,"tdur":49,"tts":71574},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359197584,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":12,"tdur":10,"tts":71627},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359198110,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":42,"tdur":40,"tts":71702},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359199706,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":40,"tdur":37,"tts":71812},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359199920,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":50,"tdur":47,"tts":71918},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359200255,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":21,"tts":72021},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359200407,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":19,"tdur":17,"tts":72078},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359200427,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":5,"tts":72097},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359253051,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":23,"tdur":23,"tts":72137},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359253542,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":26,"tdur":25,"tts":72201},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359254502,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":62,"tdur":59,"tts":72291},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359254858,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":24,"tdur":24,"tts":72391},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359255041,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":21,"tts":72452},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359255063,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":4,"tts":72474},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359255356,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":17,"tts":72517},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359256146,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":23,"tdur":22,"tts":72569},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359256377,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":20,"tts":72628},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359256524,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":21,"tts":72687},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359256547,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":5,"tts":72709},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359256806,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":19,"tdur":18,"tts":72751},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359257582,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":21,"tts":72806},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359257790,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":23,"tdur":22,"tts":72861},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359257932,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":23,"tdur":21,"tts":72920},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359257956,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":4,"tts":72943},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359258218,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":19,"tdur":18,"tts":72985},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359258993,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":21,"tts":73041},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359259161,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":21,"tts":73097},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359002597,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":526,"tdur":397,"tts":1145621},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359002624,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":472,"tdur":343,"tts":1145648},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359003101,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":20,"tdur":19,"tts":1145997},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359003129,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1146025},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359003149,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":355,"tdur":226,"tts":1146045},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359003155,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":322,"tdur":192,"tts":1146051},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359003481,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":21,"tdur":19,"tts":1146249},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359003511,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":594,"tdur":458,"tts":1146278},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359003517,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":318,"tdur":199,"tts":1146284},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359003839,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":265,"tdur":246,"tts":1146489},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359003896,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":171},"dur":39,"tdur":38,"tts":1146546},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359004046,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1146678,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359004052,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":204},"dur":51,"tdur":50,"tts":1146684},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359004071,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":31,"tdur":31,"tts":1146702},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359004115,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1146746},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359004118,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":10680,"tdur":10547,"tts":1146749},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359004120,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":10667,"tdur":10533,"tts":1146751},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359014789,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":8,"tdur":8,"tts":1157287},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359014806,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":45,"tdur":45,"tts":1157304},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359014809,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":41,"tdur":41,"tts":1157307},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359014826,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":18,"tdur":18,"tts":1157324},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359014853,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":20702,"tdur":1692,"tts":1157351},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359014856,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20697,"tdur":1687,"tts":1157354},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359035534,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":226},"dur":16,"tdur":14,"tts":1159024},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359035571,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":3,"tts":1159060},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359035578,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":9938,"tdur":9789,"tts":1159066},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359035583,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":9923,"tdur":9774,"tts":1159071},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359045507,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":8,"tdur":7,"tts":1168847},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359045522,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1168862},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359045525,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":2892,"tdur":2762,"tts":1168865},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359045527,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":2881,"tdur":2751,"tts":1168867},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359048410,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":6,"tdur":7,"tts":1171620},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359048423,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":308,"tdur":249,"tts":1171634},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359048426,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":186,"tdur":128,"tts":1171636},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359048626,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":104,"tdur":104,"tts":1171779},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359048648,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":226},"dur":17,"tdur":16,"tts":1171801},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359048696,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1171849,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359048698,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":205},"dur":31,"tdur":30,"tts":1171851},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359048700,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":28,"tdur":28,"tts":1171853},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359048733,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1171886},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359048742,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":493,"tdur":374,"tts":1171895},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359048744,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":480,"tdur":361,"tts":1171897},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359049225,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":9,"tdur":8,"tts":1172260},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359049238,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":49,"tdur":49,"tts":1172272},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359049240,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":46,"tdur":45,"tts":1172275},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359049260,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":20,"tdur":19,"tts":1172295},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359049294,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":19040,"tdur":1447,"tts":1172329},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359049297,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":19036,"tdur":1443,"tts":1172332},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359068318,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":62},"dur":12,"tdur":12,"tts":1173761},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359068336,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1173779},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359068347,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":12967,"tdur":12835,"tts":1173790},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359068350,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":12941,"tdur":12808,"tts":1173793},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359081294,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":18,"tdur":16,"tts":1186606},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359081319,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":4,"tts":1186630},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359081336,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":3020,"tdur":2875,"tts":1186647},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359081341,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":3005,"tdur":2860,"tts":1186652},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359084348,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":7,"tdur":7,"tts":1189514},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359084358,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":374,"tdur":249,"tts":1189524},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359084360,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":256,"tdur":131,"tts":1189526},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359084619,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":112,"tdur":111,"tts":1189661},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359084649,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":62},"dur":16,"tdur":16,"tts":1189691},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359084696,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1189739,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359084699,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":206},"dur":31,"tdur":30,"tts":1189741},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359084700,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":29,"tdur":29,"tts":1189742},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359084740,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":12,"tdur":11,"tts":1189782},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359084753,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":455,"tdur":323,"tts":1189795},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359084755,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":431,"tdur":297,"tts":1189797},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359085200,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":8,"tdur":7,"tts":1190110},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359085214,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":43,"tdur":42,"tts":1190124},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359085217,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":39,"tdur":39,"tts":1190126},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359085231,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":19,"tdur":19,"tts":1190140},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359085258,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":17942,"tdur":2331,"tts":1190168},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359085261,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":17933,"tdur":2323,"tts":1190171},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359103152,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":217},"dur":36,"tdur":32,"tts":1192456},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359103230,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":7,"tdur":5,"tts":1192531},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359103241,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":826,"tdur":605,"tts":1192541},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359103250,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":739,"tdur":534,"tts":1192550},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359103995,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":69,"tdur":50,"tts":1193093},{"cat":"trace_event_overhead","pid":25863,"tid":25870,"ts":531359103995,"ph":"X","name":"overhead","args":{},"dur":52,"tdur":33,"tts":1193093},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359104086,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1193166},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359104094,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":422,"tdur":293,"tts":1193174},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359104107,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":380,"tdur":250,"tts":1193187},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359104491,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":22,"tdur":21,"tts":1193444},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359104534,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":581,"tdur":454,"tts":1193487},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359104541,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":289,"tdur":162,"tts":1193493},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359104834,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":279,"tdur":277,"tts":1193662},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359104886,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":217},"dur":46,"tdur":45,"tts":1193713},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359105022,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1193850,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359105028,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":207},"dur":82,"tdur":81,"tts":1193855},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359105033,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":75,"tdur":74,"tts":1193860},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359105121,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":33,"tdur":32,"tts":1193948},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359105479,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":23,"tdur":21,"tts":1194098},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359106230,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":353,"tdur":208,"tts":1194212},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359106253,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":301,"tdur":155,"tts":1194234},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359106558,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":23,"tdur":21,"tts":1194396},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359106590,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":114,"tdur":114,"tts":1194427},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359106597,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":105,"tdur":105,"tts":1194434},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359106641,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":47,"tdur":45,"tts":1194479},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359107673,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":27122,"tdur":1114,"tts":1194609},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359107679,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":27113,"tdur":1105,"tts":1194614},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359134802,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":924,"tdur":923,"tts":1195731},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359134814,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":910,"tdur":909,"tts":1195743},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359135702,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":81},"dur":19,"tdur":17,"tts":1196632},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359135753,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1196682},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359135761,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":368,"tdur":244,"tts":1196690},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359135767,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":320,"tdur":196,"tts":1196695},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359136091,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":37,"tdur":36,"tts":1196897},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359136136,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1196942},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359136140,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":260,"tdur":136,"tts":1196945},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359136142,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":237,"tdur":112,"tts":1196947},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359136381,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":17,"tdur":15,"tts":1197064},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359136415,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":479,"tdur":351,"tts":1197097},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359136421,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":223,"tdur":97,"tts":1197102},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359136647,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":245,"tdur":243,"tts":1197203},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359136701,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":81},"dur":38,"tdur":37,"tts":1197257},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359136814,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1197370,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359136820,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":208},"dur":69,"tdur":68,"tts":1197375},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359136823,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":65,"tdur":64,"tts":1197378},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359136899,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1197455},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359136920,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":446,"tdur":325,"tts":1197476},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359136925,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":433,"tdur":311,"tts":1197481},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359137359,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":7,"tdur":6,"tts":1197794},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359137368,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":45,"tdur":44,"tts":1197803},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359137371,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":41,"tdur":41,"tts":1197805},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359137385,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":21,"tdur":20,"tts":1197820},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359137419,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":14345,"tdur":1241,"tts":1197854},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359137422,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":14341,"tdur":1237,"tts":1197857},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359151750,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":26},"dur":11,"tdur":9,"tts":1199083},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359151767,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":11,"tdur":11,"tts":1199098},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359151787,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":1179,"tdur":1037,"tts":1199119},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359151791,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":1149,"tdur":1006,"tts":1199122},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359152944,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":20,"tdur":18,"tts":1200135},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359152972,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1200162},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359152992,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":248,"tdur":248,"tts":1200182},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359152999,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":239,"tdur":239,"tts":1200189},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359153046,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":26},"dur":37,"tdur":36,"tts":1200237},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359153156,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1200347,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359153162,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":209},"dur":74,"tdur":73,"tts":1200352},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359153165,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":69,"tdur":69,"tts":1200355},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359153246,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1200436},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359153267,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":597,"tdur":483,"tts":1200457},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359153272,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":565,"tdur":450,"tts":1200462},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359153841,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":19,"tts":1200918},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359153870,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":19,"tdur":18,"tts":1200947},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359153877,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":11,"tdur":10,"tts":1200954},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359153905,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":102,"tdur":101,"tts":1200982},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359153910,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":95,"tdur":94,"tts":1200987},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359153949,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":42,"tdur":40,"tts":1201027},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359154011,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":15192,"tdur":2044,"tts":1201088},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359154017,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":15183,"tdur":2035,"tts":1201094},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359169176,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":187},"dur":20,"tdur":17,"tts":1203108},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359169224,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1203154},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359169232,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":544,"tdur":453,"tts":1203161},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359169238,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":509,"tdur":418,"tts":1203167},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359169749,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":24,"tdur":23,"tts":1203588},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359169794,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1203633},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359169802,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":420,"tdur":287,"tts":1203640},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359169807,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":388,"tdur":255,"tts":1203645},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359170199,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":19,"tts":1203906},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359170241,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":550,"tdur":418,"tts":1203947},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359170247,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":304,"tdur":171,"tts":1203953},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359170555,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":234,"tdur":233,"tts":1204130},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359170595,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":187},"dur":37,"tdur":36,"tts":1204170},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359170705,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1204281,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359170712,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":210},"dur":73,"tdur":73,"tts":1204286},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359170715,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":69,"tdur":69,"tts":1204289},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359170797,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1204372},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359170821,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":439,"tdur":374,"tts":1204396},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359170826,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":407,"tdur":341,"tts":1204401},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359171237,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":20,"tts":1204748},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359171266,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":74,"tdur":73,"tts":1204777},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359171273,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":66,"tdur":66,"tts":1204784},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359171295,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":38,"tdur":36,"tts":1204807},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359171348,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":13727,"tdur":1573,"tts":1204859},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359171351,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":13721,"tdur":1568,"tts":1204862},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359185051,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":192},"dur":18,"tdur":16,"tts":1206410},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359185081,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1206439},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359185105,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":453,"tdur":344,"tts":1206463},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359185111,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":420,"tdur":311,"tts":1206469},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359185536,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":18,"tts":1206786},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359185563,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1206814},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359185583,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":277,"tdur":199,"tts":1206833},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359185589,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":244,"tdur":165,"tts":1206839},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359185838,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":20,"tts":1207010},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359185866,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":483,"tdur":403,"tts":1207039},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359185872,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":238,"tdur":156,"tts":1207045},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359186114,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":233,"tdur":232,"tts":1207208},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359186154,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":192},"dur":37,"tdur":36,"tts":1207248},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359186263,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1207357,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359186269,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":211},"dur":75,"tdur":73,"tts":1207363},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359186272,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":71,"tdur":69,"tts":1207366},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359186371,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":26,"tdur":24,"tts":1207465},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359186652,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":9,"tdur":7,"tts":1207524},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359187311,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":257,"tdur":199,"tts":1207621},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359187323,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":206,"tdur":148,"tts":1207632},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359187544,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":21,"tdur":20,"tts":1207797},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359187574,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":94,"tdur":93,"tts":1207827},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359187581,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":86,"tdur":85,"tts":1207834},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359187605,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":54,"tdur":53,"tts":1207858},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359189125,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":29610,"tdur":1989,"tts":1208011},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359189139,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":29594,"tdur":1972,"tts":1208025},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359218708,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":107},"dur":21,"tdur":18,"tts":1209975},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359218741,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1210006},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359218771,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":389,"tdur":325,"tts":1210036},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359218777,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":361,"tdur":295,"tts":1210043},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359219141,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":17,"tdur":16,"tts":1210343},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359219165,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":4,"tts":1210366},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359219182,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":216,"tdur":216,"tts":1210383},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359219188,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":208,"tdur":207,"tts":1210390},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359219219,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":107},"dur":36,"tdur":34,"tts":1210421},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359219319,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1210521,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359219325,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":212},"dur":68,"tdur":67,"tts":1210527},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359219328,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":64,"tdur":63,"tts":1210530},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359219403,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1210605},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359219423,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":320,"tdur":271,"tts":1210625},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359219428,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":307,"tdur":257,"tts":1210630},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359219736,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":7,"tdur":6,"tts":1210889},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359219745,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":8,"tdur":7,"tts":1210898},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359219748,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":4,"tdur":4,"tts":1210900},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359219758,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":39,"tdur":39,"tts":1210910},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359219760,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":36,"tdur":36,"tts":1210912},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359219768,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":22,"tdur":22,"tts":1210920},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359219799,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":1872,"tdur":1351,"tts":1210951},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359219801,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":1869,"tdur":1347,"tts":1210954},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359221661,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":130},"dur":8,"tdur":6,"tts":1212293},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359221679,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1212310},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359221682,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":408,"tdur":313,"tts":1212313},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359221684,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":380,"tdur":284,"tts":1212315},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359222068,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":19,"tts":1212605},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359222108,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1212645},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359222116,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":291,"tdur":191,"tts":1212653},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359222121,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":259,"tdur":157,"tts":1212659},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359222384,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":21,"tdur":19,"tts":1212823},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359222426,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":478,"tdur":404,"tts":1212864},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359222432,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":223,"tdur":147,"tts":1212870},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359222659,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":243,"tdur":242,"tts":1213023},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359222700,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":130},"dur":37,"tdur":36,"tts":1213064},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359222817,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1213182,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359222823,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":213},"dur":76,"tdur":75,"tts":1213187},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359222826,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":71,"tdur":71,"tts":1213190},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359222911,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1213275},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359222934,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":391,"tdur":346,"tts":1213298},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359222940,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":357,"tdur":311,"tts":1213304},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359223301,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":21,"tdur":19,"tts":1213622},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359223330,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":69,"tdur":69,"tts":1213650},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359223337,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":62,"tdur":61,"tts":1213657},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359223367,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":23,"tdur":22,"tts":1213687},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359223407,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":11857,"tdur":1698,"tts":1213727},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359223410,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":11851,"tdur":1692,"tts":1213730},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359235238,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":156},"dur":19,"tdur":17,"tts":1215401},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359235270,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1215432},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359235294,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":387,"tdur":328,"tts":1215456},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359235300,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":366,"tdur":306,"tts":1215462},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359235668,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":12,"tdur":11,"tts":1215771},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359235685,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1215788},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359235697,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":151,"tdur":151,"tts":1215800},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359200433,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":13,"tdur":14,"tts":128675},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359253114,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":6,"tts":128883},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359253615,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":4,"tts":129060},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359254644,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":129294},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359254923,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":129424},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359255101,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":129562},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359255398,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":3,"tts":129680},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359256206,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":129785},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359256432,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":129887},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359256554,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":129952},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359256831,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":130005},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359257612,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":130057},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359257819,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":130106},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359257961,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":130165},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359258243,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":130217},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359259022,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":1,"tts":130267},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359259189,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":130316},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359259325,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":130389},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359337141,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":130578},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359337743,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":130834},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359339449,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":8,"tts":131092},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359339723,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":3,"tts":131246},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359339864,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":131326},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359340150,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":131379},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359341020,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":3,"tts":131498},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359341260,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":131625},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359341414,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":131732},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359341710,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":131821},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359342461,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":131918},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359342636,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":131971},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359342761,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":132028},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359342769,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":1,"tts":132037},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359343047,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":132087},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359343618,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":132136},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359343798,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":132184},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359343947,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":132239},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359344035,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":132292},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359344085,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":132327},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359403289,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":4,"tts":132487},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359403694,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":132554},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359405444,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":132788},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359405968,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":133054},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359406261,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":133295},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359406937,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":133565},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359408770,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":8,"tts":133842},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359409236,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":134108},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359409509,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":9,"tdur":7,"tts":134343},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359410717,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":7,"tdur":5,"tts":134498},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359412622,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":8,"tts":134721},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359413005,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":8,"tdur":6,"tts":134912},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359413190,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":135077},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359413211,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":4,"tts":135097},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359413707,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":135214},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359415608,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":135461},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359416066,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":135750},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359416221,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":8,"tdur":6,"tts":135896},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359469860,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":136087},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359471323,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":136329},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359473132,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":136595},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359473431,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":136767},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359473551,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":4,"tts":136865},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359473802,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":136968},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359474571,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":137025},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359474734,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":137082},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359235701,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":146,"tdur":145,"tts":1215804},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359235727,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":156},"dur":21,"tdur":20,"tts":1215830},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359235792,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1215895,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359235796,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":214},"dur":49,"tdur":49,"tts":1215899},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359235798,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":47,"tdur":47,"tts":1215900},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359235852,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1215955},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359235865,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":918,"tdur":814,"tts":1215967},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359235868,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":839,"tdur":734,"tts":1215970},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359236731,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":49,"tdur":48,"tts":1216730},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359236798,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":19,"tdur":18,"tts":1216798},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359236806,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":10,"tdur":9,"tts":1216805},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359236834,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":95,"tdur":94,"tts":1216833},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359236839,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":88,"tdur":87,"tts":1216838},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359236862,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":51,"tdur":50,"tts":1216861},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359236933,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":14446,"tdur":1102,"tts":1216932},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359236939,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":14437,"tdur":1092,"tts":1216938},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359251400,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":563,"tdur":562,"tts":1218056},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359251412,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":550,"tdur":550,"tts":1218067},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359251949,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":14},"dur":12,"tdur":11,"tts":1218605},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359251965,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":1,"tts":1218621},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359251974,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":489,"tdur":352,"tts":1218629},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359251976,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":461,"tdur":321,"tts":1218632},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359252441,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":19,"tts":1218959},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359252469,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1218988},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359252489,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":233,"tdur":231,"tts":1219008},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359252496,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":224,"tdur":222,"tts":1219015},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359252529,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":14},"dur":36,"tdur":35,"tts":1219048},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359252638,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1219157,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359252644,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":215},"dur":73,"tdur":72,"tts":1219162},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359252647,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":68,"tdur":68,"tts":1219165},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359252727,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":46,"tdur":46,"tts":1219245},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359252790,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":433,"tdur":371,"tts":1219309},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359252796,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":397,"tdur":334,"tts":1219315},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359253198,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":22,"tdur":22,"tts":1219655},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359253229,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1219687},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359253599,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":17,"tdur":16,"tts":1219770},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359253606,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":9,"tdur":9,"tts":1219776},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359253617,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":57,"tdur":56,"tts":1219788},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359253620,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":53,"tdur":53,"tts":1219790},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359253644,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":23,"tdur":23,"tts":1219814},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359254600,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":31478,"tdur":1965,"tts":1219929},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359254615,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":31460,"tdur":1948,"tts":1219943},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359286044,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":123},"dur":28,"tdur":25,"tts":1221862},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359286084,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":4,"tts":1221901},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359286115,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":486,"tdur":359,"tts":1221931},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359286122,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":452,"tdur":324,"tts":1221938},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359286578,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":20,"tdur":18,"tts":1222269},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359286606,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1222296},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359286627,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":242,"tdur":242,"tts":1222316},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359286633,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":234,"tdur":233,"tts":1222323},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359286667,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":123},"dur":36,"tdur":35,"tts":1222357},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359286777,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1222468,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359286783,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":216},"dur":81,"tdur":80,"tts":1222473},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359286786,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":77,"tdur":76,"tts":1222476},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359286875,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":5,"tts":1222564},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359286895,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":479,"tdur":388,"tts":1222585},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359286900,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":452,"tdur":361,"tts":1222590},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359287355,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":17,"tdur":15,"tts":1222956},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359287378,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":19,"tdur":17,"tts":1222979},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359287384,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":12,"tdur":11,"tts":1222984},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359287410,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":91,"tdur":91,"tts":1223010},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359287415,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":85,"tdur":84,"tts":1223015},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359287434,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":51,"tdur":49,"tts":1223035},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359287506,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":2768,"tdur":1863,"tts":1223106},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359259297,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":20,"tts":73145},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359259319,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":6,"tdur":6,"tts":73166},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359337078,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":26,"tdur":25,"tts":73245},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359337616,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":53,"tdur":51,"tts":73335},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359339308,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":61,"tdur":59,"tts":73446},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359339671,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":24,"tdur":22,"tts":73548},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359339835,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":21,"tts":73607},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359339858,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":4,"tts":73630},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359340126,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":17,"tts":73672},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359340961,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":20,"tts":73725},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359341201,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":20,"tts":73782},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359341367,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":19,"tts":73843},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359341389,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":4,"tdur":4,"tts":73864},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359341668,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":17,"tts":73905},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359342408,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":19,"tts":73958},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359342608,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":20,"tts":74012},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359342737,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":16,"tts":74068},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359342756,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":10,"tdur":10,"tts":74085},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359343023,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":17,"tts":74129},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359343595,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":16,"tdur":16,"tts":74181},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359343770,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":21,"tts":74231},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359343924,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":16,"tdur":17,"tts":74276},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359344019,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":10,"tdur":9,"tts":74317},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359344066,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":12,"tdur":12,"tts":74349},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359403229,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":49,"tts":74424},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359403658,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":28,"tdur":27,"tts":74514},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359405306,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":62,"tdur":58,"tts":74609},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359405836,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":57,"tdur":55,"tts":74733},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359406152,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":40,"tdur":37,"tts":74846},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359406194,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":23,"tdur":21,"tts":74887},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359406818,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":43,"tdur":40,"tts":74974},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359408635,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":50,"tdur":48,"tts":75083},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359409110,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":50,"tdur":47,"tts":75199},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359409404,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":49,"tts":75306},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359409457,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":11,"tdur":10,"tts":75359},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359410657,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":44,"tdur":42,"tts":75435},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359412528,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":49,"tts":75548},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359412906,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":48,"tts":75658},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359413129,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":46,"tdur":43,"tts":75765},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359413178,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":25,"tdur":24,"tts":75812},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359413649,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":44,"tdur":41,"tts":75901},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359415481,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":52,"tdur":49,"tts":76009},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359415898,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":52,"tdur":50,"tts":76126},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359416160,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":44,"tdur":41,"tts":76237},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359416206,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":14,"tdur":12,"tts":76281},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359469806,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":45,"tdur":43,"tts":76366},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359471190,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":53,"tdur":51,"tts":76470},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359472997,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":62,"tdur":60,"tts":76583},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359473358,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":26,"tdur":25,"tts":76684},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359473486,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":17,"tdur":17,"tts":76748},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359473504,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":10,"tdur":10,"tts":76766},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359473758,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":19,"tdur":18,"tts":76814},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359474523,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":24,"tdur":23,"tts":76869},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359474702,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":25,"tdur":24,"tts":76929},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359474844,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":24,"tdur":23,"tts":76989},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359474869,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":6,"tdur":4,"tts":77014},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359475113,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":19,"tdur":18,"tts":77056},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359475921,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":21,"tts":77115},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359476136,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":17,"tdur":17,"tts":77160},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359476324,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":23,"tdur":21,"tts":77214},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359476348,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":4,"tdur":5,"tts":77236},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359476605,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":18,"tts":77278},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359477203,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":17,"tts":77333},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359477429,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":23,"tdur":22,"tts":77388},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359287512,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":2759,"tdur":1854,"tts":1223113},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359290248,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":176},"dur":19,"tdur":16,"tts":1224947},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359290296,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1224993},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359290304,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":370,"tdur":315,"tts":1225000},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359290310,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":342,"tdur":286,"tts":1225007},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359290655,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":17,"tdur":15,"tts":1225298},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359290689,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":4,"tts":1225331},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359290696,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":231,"tdur":232,"tts":1225337},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359290702,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":223,"tdur":223,"tts":1225344},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359290746,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":176},"dur":37,"tdur":35,"tts":1225389},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359290846,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1225489,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359290852,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":217},"dur":70,"tdur":70,"tts":1225494},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359290855,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":66,"tdur":65,"tts":1225497},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359290947,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1225589},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359290954,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":477,"tdur":361,"tts":1225596},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359290959,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":451,"tdur":333,"tts":1225601},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359291413,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":16,"tdur":15,"tts":1225939},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359291445,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":19,"tdur":18,"tts":1225971},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359291451,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":11,"tdur":11,"tts":1225977},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359291466,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":98,"tdur":97,"tts":1225992},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359291470,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":92,"tdur":91,"tts":1225996},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359291505,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":44,"tdur":42,"tts":1226031},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359291578,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":27634,"tdur":2012,"tts":1226105},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359291585,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":27625,"tdur":2003,"tts":1226111},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359319175,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":221},"dur":31,"tdur":27,"tts":1228083},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359319218,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1228124},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359319242,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":601,"tdur":467,"tts":1228147},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359319249,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":568,"tdur":433,"tts":1228154},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359319821,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":20,"tdur":18,"tts":1228593},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359319849,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1228621},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359319869,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":281,"tdur":263,"tts":1228641},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359319876,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":272,"tdur":255,"tts":1228647},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359319910,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":221},"dur":37,"tdur":35,"tts":1228682},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359320057,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1228813,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359320064,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":218},"dur":80,"tdur":80,"tts":1228819},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359320067,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":76,"tdur":75,"tts":1228822},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359320156,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1228911},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359320178,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":589,"tdur":474,"tts":1228933},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359320183,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":557,"tdur":440,"tts":1228939},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359320745,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":18,"tts":1229386},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359320773,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":19,"tdur":18,"tts":1229414},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359320780,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":11,"tdur":10,"tts":1229421},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359320808,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":98,"tdur":97,"tts":1229449},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359320814,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":90,"tdur":90,"tts":1229454},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359320838,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":52,"tdur":51,"tts":1229479},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359320910,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":14353,"tdur":1721,"tts":1229551},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359320917,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":14344,"tdur":1712,"tts":1229558},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359335238,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":121},"dur":19,"tdur":17,"tts":1231249},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359335285,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1231295},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359335293,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":837,"tdur":742,"tts":1231303},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359335299,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":805,"tdur":708,"tts":1231309},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359336108,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":20,"tdur":18,"tts":1232024},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359336148,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":4,"tts":1232064},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359336156,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":311,"tdur":256,"tts":1232071},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359336162,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":278,"tdur":222,"tts":1232077},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359336444,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":20,"tts":1232305},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359336486,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":347,"tdur":293,"tts":1232347},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359336492,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":140,"tdur":86,"tts":1232353},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359336633,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":198,"tdur":197,"tts":1232441},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359336648,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":121},"dur":31,"tdur":30,"tts":1232456},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359336752,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1232561,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359336759,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":219},"dur":69,"tdur":68,"tts":1232567},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359336762,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":65,"tdur":64,"tts":1232570},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359336839,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":24,"tdur":23,"tts":1232647},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359337104,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":7,"tdur":5,"tts":1232708},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359337660,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":188,"tdur":136,"tts":1232739},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359337666,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":170,"tdur":118,"tts":1232745},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359337838,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":9,"tdur":9,"tts":1232865},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359337850,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":90,"tdur":89,"tts":1232878},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359337853,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":85,"tdur":85,"tts":1232880},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359337862,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":62,"tdur":61,"tts":1232890},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359339413,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":29789,"tdur":2002,"tts":1233098},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359339428,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":29771,"tdur":1985,"tts":1233112},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359369176,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":9},"dur":20,"tdur":17,"tts":1235077},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359369207,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1235106},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359369237,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":498,"tdur":370,"tts":1235136},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359369244,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":464,"tdur":336,"tts":1235142},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359369713,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":19,"tts":1235484},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359369741,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1235512},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359369761,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":242,"tdur":240,"tts":1235533},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359369768,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":233,"tdur":231,"tts":1235540},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359369802,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":9},"dur":36,"tdur":35,"tts":1235574},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359369911,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1235683,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359369917,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":220},"dur":81,"tdur":79,"tts":1235689},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359369920,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":77,"tdur":75,"tts":1235692},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359370008,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1235780},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359370029,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":522,"tdur":404,"tts":1235800},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359370034,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":490,"tdur":372,"tts":1235805},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359370528,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":19,"tts":1236183},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359370556,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":19,"tdur":18,"tts":1236211},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359370563,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":11,"tdur":10,"tts":1236218},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359370591,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":96,"tdur":95,"tts":1236246},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359370596,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":89,"tdur":88,"tts":1236251},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359370618,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":53,"tdur":52,"tts":1236273},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359370691,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":2955,"tdur":1936,"tts":1236346},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359370698,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":2946,"tdur":1927,"tts":1236352},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359373607,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":3},"dur":33,"tdur":30,"tts":1238245},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359373667,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":4,"tts":1238304},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359373675,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":448,"tdur":326,"tts":1238312},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359373681,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":420,"tdur":297,"tts":1238318},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359374104,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":17,"tdur":16,"tts":1238620},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359374138,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":4,"tts":1238653},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359374144,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":219,"tdur":218,"tts":1238660},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359374150,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":211,"tdur":210,"tts":1238666},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359374181,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":3},"dur":36,"tdur":35,"tts":1238697},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359374281,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1238798,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359374288,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":221},"dur":70,"tdur":70,"tts":1238803},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359374291,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":66,"tdur":66,"tts":1238806},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359374381,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1238897},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359374388,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":418,"tdur":351,"tts":1238904},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359374393,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":387,"tdur":321,"tts":1238908},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359374781,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":23,"tdur":22,"tts":1239231},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359374820,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":20,"tdur":19,"tts":1239270},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359374827,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":12,"tdur":11,"tts":1239277},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359374843,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":97,"tdur":96,"tts":1239293},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359374847,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":91,"tdur":90,"tts":1239297},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359374883,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":42,"tdur":40,"tts":1239334},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359374955,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":10590,"tdur":1835,"tts":1239406},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359374962,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":10580,"tdur":1826,"tts":1239412},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359385504,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":150},"dur":34,"tdur":31,"tts":1241203},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359385551,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1241247},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359385574,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":400,"tdur":287,"tts":1241271},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359385580,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":381,"tdur":268,"tts":1241277},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359385963,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":9,"tdur":9,"tts":1241548},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359385976,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1241561},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359386002,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":225,"tdur":117,"tts":1241587},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359386008,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":206,"tdur":98,"tts":1241593},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359386216,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":9,"tdur":9,"tts":1241694},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359386229,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":479,"tdur":376,"tts":1241707},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359386261,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":207,"tdur":104,"tts":1241739},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359386470,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":236,"tdur":236,"tts":1241845},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359386527,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":150},"dur":37,"tdur":35,"tts":1241903},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359386629,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1242005,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359386635,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":222},"dur":68,"tdur":68,"tts":1242010},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359386638,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":64,"tdur":63,"tts":1242013},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359386728,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1242103},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359386735,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":409,"tdur":319,"tts":1242110},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359386740,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":391,"tdur":301,"tts":1242115},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359387133,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":10,"tdur":9,"tts":1242419},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359387168,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":105,"tdur":104,"tts":1242454},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359387175,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":97,"tdur":96,"tts":1242460},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359387209,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":54,"tdur":53,"tts":1242495},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359387275,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":13648,"tdur":737,"tts":1242561},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359387280,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":13640,"tdur":728,"tts":1242565},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359400944,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":864,"tdur":863,"tts":1243320},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359400956,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":850,"tdur":849,"tts":1243332},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359401782,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":204},"dur":20,"tdur":19,"tts":1244159},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359401813,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1244189},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359401833,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":425,"tdur":351,"tts":1244209},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359401839,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":393,"tdur":318,"tts":1244215},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359402236,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":19,"tts":1244539},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359402264,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":4,"tts":1244567},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359402283,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":257,"tdur":202,"tts":1244587},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359402289,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":224,"tdur":169,"tts":1244592},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359402517,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":21,"tdur":20,"tts":1244767},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359402546,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":476,"tdur":423,"tts":1244796},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359402552,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":214,"tdur":160,"tts":1244802},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359402770,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":250,"tdur":249,"tts":1244968},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359402825,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":204},"dur":38,"tdur":36,"tts":1245024},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359402936,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1245135,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359402942,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":223},"dur":74,"tdur":73,"tts":1245140},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359402945,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":70,"tdur":69,"tts":1245143},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359403044,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":25,"tdur":24,"tts":1245242},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359403280,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":3,"tts":1245298},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359403679,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":149,"tdur":122,"tts":1245319},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359403683,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":132,"tdur":106,"tts":1245322},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359403817,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":10,"tdur":9,"tts":1245431},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359403831,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":63,"tdur":63,"tts":1245444},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359403834,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":59,"tdur":58,"tts":1245448},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359403864,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":22,"tdur":22,"tts":1245477},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359405402,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":30469,"tdur":1995,"tts":1245594},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359405417,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":30452,"tdur":1980,"tts":1245607},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359435846,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":112},"dur":19,"tdur":17,"tts":1247566},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359435878,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1247596},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359435908,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":509,"tdur":366,"tts":1247626},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359435914,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":477,"tdur":331,"tts":1247633},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359436395,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":20,"tdur":19,"tts":1247970},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359436423,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1247998},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359436443,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":339,"tdur":213,"tts":1248018},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359436448,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":307,"tdur":179,"tts":1248024},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359436759,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":19,"tts":1248209},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359436788,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":560,"tdur":435,"tts":1248238},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359436794,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":297,"tdur":171,"tts":1248244},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359437095,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":250,"tdur":249,"tts":1248421},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359437150,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":112},"dur":38,"tdur":36,"tts":1248477},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359437261,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1248587,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359437267,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":224},"dur":75,"tdur":74,"tts":1248593},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359437270,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":71,"tdur":69,"tts":1248596},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359437370,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1248696},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359437378,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":537,"tdur":421,"tts":1248704},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359437383,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":505,"tdur":388,"tts":1248709},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359437892,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":21,"tdur":20,"tts":1249103},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359437933,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":124,"tdur":123,"tts":1249144},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359437969,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":86,"tdur":85,"tts":1249180},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359437999,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":43,"tdur":41,"tts":1249210},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359438061,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":2717,"tdur":1687,"tts":1249272},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359438068,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":2708,"tdur":1678,"tts":1249279},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359440755,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":18},"dur":19,"tdur":17,"tts":1250937},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359440793,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":4,"tts":1250974},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359440800,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":440,"tdur":303,"tts":1250980},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359440804,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":420,"tdur":282,"tts":1250985},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359441226,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":12,"tdur":11,"tts":1251270},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359441250,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":3,"tts":1251294},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359441255,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":156,"tdur":155,"tts":1251299},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359441259,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":151,"tdur":150,"tts":1251303},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359441282,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":18},"dur":25,"tdur":24,"tts":1251326},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359441353,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1251397,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359441358,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":225},"dur":50,"tdur":50,"tts":1251401},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359441360,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":47,"tdur":46,"tts":1251404},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359441424,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":3,"tts":1251468},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359441429,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":487,"tdur":368,"tts":1251473},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359441433,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":467,"tdur":348,"tts":1251477},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359441903,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":11,"tdur":11,"tts":1251829},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359441925,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":14,"tdur":12,"tts":1251852},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359441930,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":8,"tdur":7,"tts":1251856},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359441941,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":62,"tdur":62,"tts":1251867},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359441944,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":58,"tdur":57,"tts":1251870},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359441959,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":33,"tdur":33,"tts":1251885},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359442013,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":9721,"tdur":1418,"tts":1251939},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359442018,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":9714,"tdur":1411,"tts":1251944},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359451716,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":6},"dur":14,"tdur":12,"tts":1253340},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359451738,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":3,"tts":1253361},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359451755,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":401,"tdur":320,"tts":1253378},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359451760,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":378,"tdur":295,"tts":1253383},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359452141,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":14,"tdur":13,"tts":1253683},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359452160,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":3,"tts":1253702},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359452175,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":214,"tdur":171,"tts":1253716},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359452179,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":191,"tdur":147,"tts":1253720},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359452373,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":14,"tdur":14,"tts":1253871},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359452394,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":351,"tdur":308,"tts":1253892},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359452398,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":176,"tdur":133,"tts":1253896},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359452577,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":166,"tdur":165,"tts":1254034},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359452606,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":6},"dur":26,"tdur":25,"tts":1254063},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359452684,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1254140,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359452688,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":226},"dur":53,"tdur":52,"tts":1254144},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359452690,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":50,"tdur":49,"tts":1254146},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359452760,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":4,"tts":1254216},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359452766,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":399,"tdur":344,"tts":1254222},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359452769,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":377,"tdur":321,"tts":1254225},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359453148,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":15,"tdur":14,"tts":1254550},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359453177,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":74,"tdur":72,"tts":1254579},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359453183,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":67,"tdur":66,"tts":1254584},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359453215,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":28,"tdur":27,"tts":1254616},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359453266,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":14944,"tdur":1270,"tts":1254667},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359453271,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":14937,"tdur":1262,"tts":1254672},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359468186,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":6},"dur":18,"tdur":15,"tts":1255915},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359468232,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1255959},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359468240,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":443,"tdur":348,"tts":1255967},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359468246,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":410,"tdur":314,"tts":1255974},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359468660,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":20,"tdur":18,"tts":1256294},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359468701,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1256334},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359468708,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":300,"tdur":199,"tts":1256341},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359468713,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":268,"tdur":165,"tts":1256347},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359468985,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":21,"tdur":19,"tts":1256518},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359469026,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":528,"tdur":425,"tts":1256559},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359469033,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":252,"tdur":148,"tts":1256566},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359469289,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":263,"tdur":261,"tts":1256720},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359469358,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":6},"dur":37,"tdur":36,"tts":1256789},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359469468,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1256899,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359469474,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":227},"dur":74,"tdur":74,"tts":1256904},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359469477,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":70,"tdur":70,"tts":1256907},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359469561,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":24,"tdur":23,"tts":1256991},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359469891,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1257095},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359471291,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":259,"tdur":201,"tts":1257187},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359471303,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":220,"tdur":162,"tts":1257198},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359471527,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":21,"tdur":20,"tts":1257366},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359471557,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":105,"tdur":104,"tts":1257396},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359471564,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":96,"tdur":95,"tts":1257403},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359471598,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":48,"tdur":47,"tts":1257437},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359473102,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":29489,"tdur":2100,"tts":1257611},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359473117,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":29471,"tdur":2085,"tts":1257624},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359502560,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":76},"dur":25,"tdur":23,"tts":1259682},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359502597,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1259718},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359502627,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":386,"tdur":250,"tts":1259748},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359502633,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":354,"tdur":217,"tts":1259754},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359502992,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":18,"tts":1259978},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359503019,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1260005},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359503039,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":351,"tdur":220,"tts":1260025},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359503045,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":318,"tdur":186,"tts":1260031},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359503368,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":19,"tts":1260223},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359503396,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":551,"tdur":419,"tts":1260251},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359503402,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":304,"tdur":172,"tts":1260257},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359503711,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":233,"tdur":233,"tts":1260435},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359503751,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":76},"dur":37,"tdur":35,"tts":1260476},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359503861,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1260586,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359503867,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":228},"dur":74,"tdur":73,"tts":1260592},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359503870,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":70,"tdur":68,"tts":1260595},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359503968,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1260693},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359503977,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":1631,"tdur":1459,"tts":1260702},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359503982,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":1598,"tdur":1426,"tts":1260706},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359505584,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":21,"tdur":20,"tts":1262138},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359505626,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":103,"tdur":103,"tts":1262179},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359505633,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":95,"tdur":93,"tts":1262187},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359505656,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":52,"tdur":51,"tts":1262209},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359505734,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":13192,"tdur":1835,"tts":1262288},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359505740,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":13184,"tdur":1827,"tts":1262294},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359518901,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":56},"dur":19,"tdur":17,"tts":1264100},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359518948,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1264146},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359518956,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":615,"tdur":516,"tts":1264154},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359518962,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":582,"tdur":483,"tts":1264160},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359519549,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":18,"tts":1264649},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359519588,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1264688},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359519597,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":232,"tdur":232,"tts":1264696},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359519603,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":224,"tdur":223,"tts":1264703},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359519636,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":56},"dur":35,"tdur":34,"tts":1264736},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359519744,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1264844,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359519750,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":229},"dur":74,"tdur":73,"tts":1264850},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359519753,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":70,"tdur":69,"tts":1264853},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359519847,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1264947},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359519855,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":568,"tdur":452,"tts":1264955},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359519860,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":536,"tdur":419,"tts":1264960},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359520400,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":21,"tdur":20,"tts":1265385},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359520442,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":30,"tdur":30,"tts":1265427},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359520449,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":22,"tdur":10,"tts":1265434},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359520474,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":60,"tdur":59,"tts":1265459},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359520477,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":56,"tdur":55,"tts":1265462},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359520491,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":34,"tdur":33,"tts":1265476},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359520543,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":14854,"tdur":1620,"tts":1265528},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359520548,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":14847,"tdur":1612,"tts":1265533},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359535372,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":176},"dur":19,"tdur":16,"tts":1267126},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359474875,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":11,"tts":137144},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359475139,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":137209},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359475951,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":137262},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359476197,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":137358},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359476397,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":5,"tts":137509},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359476649,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":2,"tts":137594},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359477247,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":137670},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359477460,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":137742},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359477649,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":137794},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359477785,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":137856},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359553625,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":138078},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359553995,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":138233},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359554998,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":138452},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359555171,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":4,"tts":138546},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359555245,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":138610},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359555257,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":138621},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359555594,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":4,"tts":138747},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359556416,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":4,"tts":138882},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359556609,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":139009},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359556731,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":139103},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359556913,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":139164},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359557715,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":139241},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359557828,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":139295},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359557886,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":139349},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359557895,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":1,"tts":139358},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359558133,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":139426},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359559012,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":139500},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359559101,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":139561},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359559186,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":139625},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359620394,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":139792},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359621011,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":140059},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359622829,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":140319},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359623302,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":140587},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359623554,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":8,"tdur":7,"tts":140795},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359624321,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":8,"tts":141049},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359626135,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":8,"tts":141311},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359626617,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":141590},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359626895,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":9,"tdur":7,"tts":141807},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359627491,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":7,"tdur":5,"tts":141981},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359629259,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":7,"tdur":6,"tts":142125},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359629646,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":7,"tdur":5,"tts":142295},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359629933,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":8,"tdur":7,"tts":142480},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359630563,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":8,"tdur":6,"tts":142655},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359631983,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":7,"tdur":6,"tts":142820},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359632328,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":7,"tdur":5,"tts":142989},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359632526,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":143085},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359632734,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":143172},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359670834,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":10,"tdur":9,"tts":143375},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359671241,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":143516},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359672216,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":7,"tdur":5,"tts":143657},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359672733,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":10,"tdur":8,"tts":143918},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359673025,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":9,"tdur":7,"tts":144145},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359674394,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":7,"tdur":6,"tts":144325},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359676404,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":10,"tts":144633},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359676760,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":8,"tts":144847},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359677030,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":145039},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359677069,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":145077},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359677558,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":145237},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359679347,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":8,"tdur":5,"tts":145385},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359679565,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":145477},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359679619,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":145531},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359679691,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":145603},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359680810,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":4,"tts":145775},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359681788,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":146005},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359477607,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":35,"tdur":33,"tts":77449},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359477759,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":19,"tdur":18,"tts":77520},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359477779,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":6,"tdur":5,"tts":77539},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359553494,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":58,"tdur":56,"tts":77611},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359553923,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":27,"tdur":26,"tts":77710},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359554858,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":62,"tdur":59,"tts":77797},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359555144,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":20,"tdur":19,"tts":77868},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359555224,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":14,"tdur":13,"tts":77894},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359555249,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":8,"tdur":8,"tts":77915},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359555539,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":17,"tts":77960},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359556348,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":21,"tts":78014},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359556550,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":22,"tts":78073},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359556661,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":21,"tts":78133},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359556684,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":5,"tts":78155},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359556894,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":12,"tdur":11,"tts":78184},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359557670,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":15,"tdur":14,"tts":78218},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359557805,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":16,"tdur":15,"tts":78255},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359557867,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":12,"tdur":10,"tts":78292},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359557880,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":9,"tdur":9,"tts":78304},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359558096,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":11,"tdur":11,"tts":78336},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359558969,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":14,"tdur":13,"tts":78371},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359559077,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":16,"tdur":16,"tts":78407},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359559171,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":9,"tdur":9,"tts":78446},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359559181,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":5,"tts":78456},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359620261,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":60,"tdur":57,"tts":78525},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359620894,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":54,"tdur":52,"tts":78644},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359622689,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":68,"tdur":65,"tts":78765},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359623170,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":54,"tdur":51,"tts":78903},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359623478,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":42,"tdur":40,"tts":79017},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359623523,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":21,"tts":79060},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359624206,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":43,"tdur":40,"tts":79150},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359626006,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":48,"tts":79256},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359626490,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":52,"tdur":49,"tts":79369},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359626800,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":48,"tts":79487},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359626854,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":11,"tdur":10,"tts":79539},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359627408,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":42,"tdur":40,"tts":79614},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359629191,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":49,"tts":79720},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359629547,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":55,"tdur":52,"tts":79831},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359629859,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":40,"tdur":38,"tts":79945},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359629901,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":21,"tts":79986},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359630504,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":44,"tdur":41,"tts":80067},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359631911,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":40,"tdur":37,"tts":80171},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359632260,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":52,"tdur":49,"tts":80281},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359632496,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":23,"tdur":22,"tts":80369},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359632687,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":17,"tts":80430},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359632719,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":16,"tts":80462},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359670755,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":61,"tdur":59,"tts":80557},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359671187,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":24,"tdur":23,"tts":80656},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359672069,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":71,"tdur":69,"tts":80739},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359672579,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":72,"tdur":69,"tts":80869},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359672934,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":53,"tdur":51,"tts":81023},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359672990,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":21,"tts":81078},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359674321,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":58,"tdur":55,"tts":81161},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359676276,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":53,"tdur":51,"tts":81306},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359676695,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":48,"tdur":45,"tts":81399},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359676961,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":50,"tts":81465},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359677030,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":12,"tdur":11,"tts":81529},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359677523,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":21,"tts":81556},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359679287,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":49,"tdur":48,"tts":81591},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359679542,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":19,"tdur":18,"tts":81649},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359679609,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":11,"tdur":11,"tts":81675},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359679645,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":39,"tdur":38,"tts":81694},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359680749,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":20,"tdur":19,"tts":81772},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359681655,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":48,"tts":81859},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359535403,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":12,"tdur":11,"tts":1267155},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359535434,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":493,"tdur":389,"tts":1267186},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359535441,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":472,"tdur":367,"tts":1267193},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359535915,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":10,"tdur":10,"tts":1267563},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359535930,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1267578},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359535940,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":218,"tdur":210,"tts":1267588},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359535944,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":212,"tdur":204,"tts":1267592},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359535966,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":176},"dur":19,"tdur":19,"tts":1267614},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359536068,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1267709,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359536075,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":230},"dur":78,"tdur":78,"tts":1267715},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359536078,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":74,"tdur":73,"tts":1267718},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359536164,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1267804},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359536186,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":599,"tdur":480,"tts":1267826},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359536191,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":566,"tdur":447,"tts":1267831},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359536762,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":20,"tts":1268284},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359536791,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":20,"tdur":18,"tts":1268314},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359536798,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":11,"tdur":10,"tts":1268321},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359536826,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":99,"tdur":98,"tts":1268349},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359536831,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":93,"tdur":91,"tts":1268354},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359536854,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":56,"tdur":55,"tts":1268376},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359536930,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":14527,"tdur":888,"tts":1268452},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359536936,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":14518,"tdur":876,"tts":1268459},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359551478,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":888,"tdur":872,"tts":1269361},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359551508,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":855,"tdur":839,"tts":1269391},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359552334,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":50},"dur":26,"tdur":25,"tts":1270202},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359552371,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1270239},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359552392,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":607,"tdur":500,"tts":1270259},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359552398,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":573,"tdur":466,"tts":1270265},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359552973,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":24,"tdur":23,"tts":1270734},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359553006,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1270767},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359553026,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":234,"tdur":234,"tts":1270787},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359553033,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":225,"tdur":224,"tts":1270794},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359553066,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":50},"dur":36,"tdur":35,"tts":1270827},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359553175,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1270936,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359553181,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":231},"dur":74,"tdur":73,"tts":1270942},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359553184,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":70,"tdur":69,"tts":1270945},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359553266,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":23,"tdur":22,"tts":1271027},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359553305,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":479,"tdur":416,"tts":1271066},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359553311,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":460,"tdur":397,"tts":1271071},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359553773,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":10,"tdur":9,"tts":1271471},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359553787,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1271485},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359553953,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":17,"tdur":16,"tts":1271520},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359553960,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":9,"tdur":9,"tts":1271526},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359553972,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":49,"tdur":48,"tts":1271538},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359553974,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":46,"tdur":45,"tts":1271540},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359553985,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":28,"tdur":27,"tts":1271551},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359554959,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":30983,"tdur":1984,"tts":1271676},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359554984,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":30955,"tdur":1956,"tts":1271701},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359585916,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":76},"dur":20,"tdur":17,"tts":1273637},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359585948,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1273667},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359585978,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":511,"tdur":378,"tts":1273697},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359585985,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":478,"tdur":344,"tts":1273704},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359586467,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":19,"tts":1274054},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359586495,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1274082},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359586515,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":239,"tdur":239,"tts":1274102},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359586521,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":231,"tdur":230,"tts":1274108},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359586553,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":76},"dur":37,"tdur":35,"tts":1274141},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359586662,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1274250,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359586668,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":232},"dur":81,"tdur":81,"tts":1274255},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359586671,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":77,"tdur":76,"tts":1274258},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359586760,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1274347},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359586780,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":541,"tdur":420,"tts":1274368},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359586786,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":508,"tdur":387,"tts":1274373},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359587299,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":19,"tts":1274766},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359587327,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":45,"tdur":45,"tts":1274794},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359587358,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":13,"tdur":11,"tts":1274826},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359587390,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":97,"tdur":96,"tts":1274857},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359587395,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":90,"tdur":90,"tts":1274862},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359587427,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":45,"tdur":43,"tts":1274895},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359587491,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":3092,"tdur":1895,"tts":1274959},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359587498,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":3083,"tdur":1886,"tts":1274965},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359590557,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":166},"dur":20,"tdur":17,"tts":1276830},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359590605,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":4,"tts":1276877},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359590613,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":461,"tdur":334,"tts":1276885},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359590619,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":433,"tdur":305,"tts":1276891},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359591056,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":16,"tdur":16,"tts":1277201},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359591089,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1277235},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359591097,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":219,"tdur":219,"tts":1277242},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359591102,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":212,"tdur":211,"tts":1277248},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359591133,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":166},"dur":36,"tdur":35,"tts":1277279},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359591234,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1277380,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359591240,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":233},"dur":71,"tdur":70,"tts":1277386},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359591243,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":67,"tdur":65,"tts":1277389},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359591335,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1277480},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359591342,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":574,"tdur":424,"tts":1277488},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359591347,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":542,"tdur":392,"tts":1277492},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359591893,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":19,"tts":1277891},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359591934,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":20,"tdur":20,"tts":1277931},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359591941,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":12,"tdur":11,"tts":1277938},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359591957,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":137,"tdur":117,"tts":1277954},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359591962,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":130,"tdur":110,"tts":1277959},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359591985,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":92,"tdur":71,"tts":1277983},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359592110,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":9949,"tdur":1689,"tts":1278089},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359592119,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":9938,"tdur":1679,"tts":1278097},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359602026,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":65},"dur":27,"tdur":25,"tts":1279747},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359602065,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1279785},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359602089,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":358,"tdur":283,"tts":1279809},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359602095,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":326,"tdur":262,"tts":1279815},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359602423,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":10,"tdur":9,"tts":1280081},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359602452,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1280110},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359602470,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":169,"tdur":117,"tts":1280127},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359602475,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":151,"tdur":98,"tts":1280132},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359602628,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":10,"tdur":9,"tts":1280233},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359602656,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":355,"tdur":303,"tts":1280261},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359602661,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":131,"tdur":78,"tts":1280267},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359602794,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":215,"tdur":214,"tts":1280348},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359602831,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":65},"dur":37,"tdur":35,"tts":1280385},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359602932,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1280486,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359602938,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":234},"dur":69,"tdur":67,"tts":1280492},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359602941,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":64,"tdur":63,"tts":1280495},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359603031,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1280584},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359603038,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":347,"tdur":283,"tts":1280592},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359603043,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":329,"tdur":266,"tts":1280596},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359603374,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":10,"tdur":10,"tts":1280864},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359603409,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":109,"tdur":108,"tts":1280900},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359603416,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":101,"tdur":101,"tts":1280906},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359603438,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":56,"tdur":55,"tts":1280929},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359603521,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":15483,"tdur":1844,"tts":1281011},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359603525,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":15476,"tdur":1836,"tts":1281016},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359618978,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":106},"dur":20,"tdur":17,"tts":1282832},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359619025,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1282877},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359619033,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":385,"tdur":311,"tts":1282885},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359619039,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":357,"tdur":283,"tts":1282891},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359619399,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":16,"tdur":15,"tts":1283179},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359619432,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1283211},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359619439,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":215,"tdur":155,"tts":1283218},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359619444,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":189,"tdur":129,"tts":1283223},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359619636,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":16,"tdur":15,"tts":1283356},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359619668,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":405,"tdur":330,"tts":1283388},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359619679,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":153,"tdur":94,"tts":1283399},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359619834,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":238,"tdur":220,"tts":1283497},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359619869,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":106},"dur":37,"tdur":35,"tts":1283532},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359619970,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1283633,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359619976,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":235},"dur":95,"tdur":77,"tts":1283638},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359619979,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":91,"tdur":73,"tts":1283641},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359620076,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":11,"tdur":11,"tts":1283721},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359620321,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1283782},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359620937,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":265,"tdur":137,"tts":1283822},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359620943,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":237,"tdur":108,"tts":1283829},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359621183,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":17,"tdur":16,"tts":1283941},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359621206,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":92,"tdur":92,"tts":1283964},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359621212,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":84,"tdur":83,"tts":1283971},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359621234,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":49,"tdur":48,"tts":1283992},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359622737,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":29987,"tdur":2014,"tts":1284103},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359622746,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":29975,"tdur":2002,"tts":1284112},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359652698,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":184},"dur":19,"tdur":16,"tts":1286094},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359652730,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1286124},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359652760,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":376,"tdur":246,"tts":1286154},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359652766,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":344,"tdur":213,"tts":1286160},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359653114,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":18,"tts":1286380},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359653142,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1286407},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359653162,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":287,"tdur":159,"tts":1286427},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359653168,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":260,"tdur":131,"tts":1286433},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359653431,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":16,"tdur":15,"tts":1286568},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359653454,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":459,"tdur":323,"tts":1286591},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359653458,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":230,"tdur":92,"tts":1286596},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359653691,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":221,"tdur":220,"tts":1286692},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359653726,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":184},"dur":37,"tdur":36,"tts":1286727},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359653835,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1286837,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359653841,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":236},"dur":68,"tdur":67,"tts":1286842},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359653844,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":64,"tdur":63,"tts":1286845},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359653933,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1286934},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359653941,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":472,"tdur":342,"tts":1286942},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359653945,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":447,"tdur":316,"tts":1286946},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359654395,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":16,"tdur":16,"tts":1287266},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359654426,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":101,"tdur":100,"tts":1287298},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359654432,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":94,"tdur":92,"tts":1287304},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359654470,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":42,"tdur":40,"tts":1287342},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359654532,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":2285,"tdur":1247,"tts":1287403},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359654538,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":2277,"tdur":1238,"tts":1287410},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359656801,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":182},"dur":12,"tdur":11,"tts":1288635},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359656830,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":3,"tts":1288664},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359656836,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":408,"tdur":275,"tts":1288669},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359656839,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":388,"tdur":254,"tts":1288673},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359657230,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":12,"tdur":12,"tts":1288931},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359657255,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":3,"tts":1288956},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359657260,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":159,"tdur":159,"tts":1288961},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359657264,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":154,"tdur":153,"tts":1288965},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359657294,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":182},"dur":24,"tdur":23,"tts":1288995},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359657364,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1289066,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359657368,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":237},"dur":48,"tdur":47,"tts":1289069},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359657370,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":45,"tdur":45,"tts":1289071},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359657431,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":3,"tts":1289132},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359657436,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":526,"tdur":384,"tts":1289137},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359657439,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":506,"tdur":364,"tts":1289140},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359657948,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":12,"tdur":12,"tts":1289507},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359657973,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":13,"tdur":12,"tts":1289533},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359657978,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":7,"tdur":6,"tts":1289538},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359657987,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":69,"tdur":68,"tts":1289547},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359657990,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":65,"tdur":64,"tts":1289550},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359658016,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":30,"tdur":29,"tts":1289576},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359658065,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":2883,"tdur":1840,"tts":1289625},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359658070,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":2875,"tdur":1833,"tts":1289629},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359660924,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":7},"dur":18,"tdur":16,"tts":1291443},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359660954,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1291472},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359660978,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":491,"tdur":347,"tts":1291496},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359660984,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":458,"tdur":313,"tts":1291502},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359661446,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":20,"tdur":18,"tts":1291822},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359661475,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1291850},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359661495,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":343,"tdur":215,"tts":1291870},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359661501,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":311,"tdur":182,"tts":1291876},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359661816,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":19,"tdur":19,"tts":1292064},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359661843,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":557,"tdur":428,"tts":1292091},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359661850,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":291,"tdur":163,"tts":1292097},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359662145,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":253,"tdur":252,"tts":1292265},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359662184,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":7},"dur":54,"tdur":53,"tts":1292304},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359662314,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1292435,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359662321,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":238},"dur":74,"tdur":74,"tts":1292440},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359662324,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":69,"tdur":68,"tts":1292444},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359662422,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1292542},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359662430,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":480,"tdur":341,"tts":1292550},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359662435,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":445,"tdur":306,"tts":1292555},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359662884,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":23,"tdur":21,"tts":1292867},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359662930,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":103,"tdur":101,"tts":1292913},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359662940,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":91,"tdur":89,"tts":1292923},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359662968,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":49,"tdur":48,"tts":1292950},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359663038,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":5121,"tdur":812,"tts":1293020},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359663045,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":5111,"tdur":800,"tts":1293027},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359668179,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":828,"tdur":827,"tts":1293853},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359668190,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":815,"tdur":814,"tts":1293864},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359668981,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":189},"dur":21,"tdur":19,"tts":1294656},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359669012,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":3,"tts":1294686},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359669031,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":500,"tdur":355,"tts":1294705},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359669037,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":471,"tdur":325,"tts":1294710},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359669512,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":17,"tdur":16,"tts":1295041},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359669537,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":4,"tts":1295065},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359669555,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":357,"tdur":211,"tts":1295084},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359669560,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":328,"tdur":180,"tts":1295089},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359669891,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":19,"tdur":17,"tts":1295275},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359669918,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":564,"tdur":417,"tts":1295301},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359669923,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":317,"tdur":169,"tts":1295307},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359670244,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":235,"tdur":235,"tts":1295481},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359670295,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":189},"dur":35,"tdur":34,"tts":1295532},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359670396,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1295634,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359670402,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":239},"dur":75,"tdur":74,"tts":1295639},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359670405,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":70,"tdur":69,"tts":1295642},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359670502,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":24,"tdur":23,"tts":1295739},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359670883,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":7,"tdur":6,"tts":1295871},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359671239,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":150,"tdur":115,"tts":1295934},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359671245,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":132,"tdur":98,"tts":1295939},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359671379,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":9,"tdur":8,"tts":1296040},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359671392,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":48,"tdur":48,"tts":1296052},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359671395,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":44,"tdur":44,"tts":1296055},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359671413,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":20,"tdur":20,"tts":1296073},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359672179,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":29726,"tdur":1394,"tts":1296202},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359672208,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":29695,"tdur":1365,"tts":1296229},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359701873,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":142},"dur":28,"tdur":26,"tts":1297565},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359701909,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":3,"tts":1297600},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359701928,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":296,"tdur":207,"tts":1297619},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359701932,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":275,"tdur":186,"tts":1297623},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359702210,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":12,"tdur":12,"tts":1297813},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359702227,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1297831},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359702240,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":206,"tdur":86,"tts":1297844},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359702244,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":194,"tdur":74,"tts":1297847},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359702439,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":6,"tdur":6,"tts":1297923},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359702448,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":340,"tdur":218,"tts":1297932},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359682060,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":71,"tdur":68,"tts":82001},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359682320,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":51,"tts":82112},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359682374,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":10,"tdur":10,"tts":82166},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359751593,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":32,"tdur":30,"tts":82218},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359752209,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":25,"tdur":24,"tts":82291},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359753958,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":27,"tdur":27,"tts":82351},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359754211,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":24,"tdur":22,"tts":82412},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359754342,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":20,"tts":82472},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359754364,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":10,"tdur":10,"tts":82493},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359754685,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":17,"tts":82540},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359756137,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":23,"tdur":22,"tts":82595},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359756350,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":20,"tts":82652},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359756483,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":16,"tdur":16,"tts":82710},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359756500,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":10,"tdur":9,"tts":82728},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359756821,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":16,"tts":82776},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359758052,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":16,"tdur":15,"tts":82831},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359758167,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":20,"tts":82882},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359758370,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":20,"tts":82941},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359758486,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":22,"tts":82998},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359758509,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":6,"tdur":5,"tts":83021},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359758742,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":17,"tts":83060},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359760109,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":25,"tdur":24,"tts":83113},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359760292,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":22,"tts":83174},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359760406,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":17,"tdur":15,"tts":83234},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359760424,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":6,"tdur":5,"tts":83251},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359831002,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":74,"tdur":72,"tts":83293},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359831932,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":107,"tdur":81,"tts":83438},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359834089,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":73,"tdur":71,"tts":83594},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359834631,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":48,"tts":83718},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359834896,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":35,"tdur":32,"tts":83831},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359834933,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":37,"tdur":36,"tts":83866},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359835583,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":55,"tdur":52,"tts":83963},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359836790,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":58,"tdur":56,"tts":84077},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359837134,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":59,"tdur":57,"tts":84196},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359837381,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":19,"tdur":19,"tts":84296},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359837402,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":10,"tdur":10,"tts":84317},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359837769,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":19,"tts":84367},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359838650,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":58,"tdur":57,"tts":84426},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359838955,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":42,"tdur":41,"tts":84515},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359839201,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":18,"tts":84584},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359839220,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":6,"tdur":6,"tts":84603},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359839547,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":8,"tdur":7,"tts":84616},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359840407,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":34,"tdur":33,"tts":84630},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359840738,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":64,"tdur":63,"tts":84703},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359841035,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":17,"tdur":16,"tts":84794},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359841053,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":5,"tts":84811},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359903033,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":42,"tdur":40,"tts":84886},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359903434,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":26,"tdur":25,"tts":84966},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359904718,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":57,"tdur":54,"tts":85042},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359905053,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":25,"tdur":24,"tts":85133},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359905215,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":23,"tdur":22,"tts":85198},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359905240,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":4,"tts":85222},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359905534,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":20,"tdur":18,"tts":85266},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359906323,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":23,"tdur":22,"tts":85324},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359906537,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":24,"tdur":22,"tts":85384},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359906668,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":17,"tdur":17,"tts":85442},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359906686,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":13,"tdur":13,"tts":85460},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359906945,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":19,"tdur":18,"tts":85511},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359907567,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":17,"tts":85571},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359907756,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":24,"tdur":22,"tts":85626},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359907967,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":23,"tdur":22,"tts":85686},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359908137,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":23,"tdur":22,"tts":85745},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359908162,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":5,"tts":85769},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359908419,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":20,"tdur":18,"tts":85813},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359682214,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":21,"tdur":19,"tts":146235},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359682446,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":10,"tts":146420},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359751668,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":146604},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359752273,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":3,"tts":146745},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359753994,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":3,"tts":146843},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359754248,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":146904},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359754369,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":146993},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359754378,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":1,"tts":147002},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359754710,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":147071},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359756196,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":147191},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359756411,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":147318},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359756536,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":147421},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359756876,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":3,"tts":147549},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359758108,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":3,"tts":147677},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359758226,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":147760},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359758431,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":4,"tts":147860},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359758516,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":147916},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359758766,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":147968},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359760140,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":148018},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359760353,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":148103},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359760446,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":2,"tts":148173},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359831149,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":4,"tts":148355},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359832045,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":148526},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359834258,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":148790},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359834752,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":9,"tdur":8,"tts":149019},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359835027,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":10,"tdur":8,"tts":149249},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359835715,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":9,"tdur":8,"tts":149519},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359836923,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":5,"tts":149740},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359837282,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":10,"tdur":8,"tts":149966},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359837432,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":4,"tts":150100},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359837817,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":150234},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359838760,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":7,"tdur":5,"tts":150361},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359839063,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":7,"tdur":5,"tts":150521},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359839228,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":150617},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359839555,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":150680},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359840447,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":150755},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359840819,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":4,"tts":150866},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359841074,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":4,"tts":150994},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359903115,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":151208},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359903502,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":4,"tts":151351},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359904849,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":10,"tdur":8,"tts":151607},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359905119,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":151760},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359905287,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":5,"tts":151882},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359905597,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":152021},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359906386,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":152152},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359906568,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":152216},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359906692,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":152278},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359906703,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":152288},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359906970,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":152340},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359907592,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":152397},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359907819,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":152482},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359908029,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":152614},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359908168,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":152710},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359908445,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":152766},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359909238,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":152818},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359909420,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":2,"tts":152896},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359909498,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":152964},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359909525,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":152991},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359969696,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":4,"tts":153144},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359970803,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":3,"tts":153276},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359972147,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":153506},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359972709,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":153783},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359972965,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":9,"tdur":7,"tts":153978},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359973683,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":154238},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359702450,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":194,"tdur":71,"tts":1297934},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359702645,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":142,"tdur":142,"tts":1298007},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359702660,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":142},"dur":31,"tdur":30,"tts":1298022},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359702737,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1298100,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359702741,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":240},"dur":44,"tdur":44,"tts":1298103},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359702743,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":42,"tdur":41,"tts":1298105},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359702801,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":3,"tts":1298163},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359702806,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":457,"tdur":338,"tts":1298168},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359702809,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":441,"tdur":322,"tts":1298171},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359703252,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":10,"tdur":10,"tts":1298495},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359703272,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":59,"tdur":58,"tts":1298516},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359703276,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":54,"tdur":54,"tts":1298519},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359703289,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":32,"tdur":31,"tts":1298533},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359703334,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":14353,"tdur":740,"tts":1298578},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359703338,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":14348,"tdur":735,"tts":1298582},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359717675,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":36},"dur":9,"tdur":8,"tts":1299307},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359717697,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1299329},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359717701,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":413,"tdur":342,"tts":1299332},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359717704,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":400,"tdur":329,"tts":1299335},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359718106,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":7,"tdur":7,"tts":1299666},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359718120,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1299680},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359718123,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":98,"tdur":98,"tts":1299683},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359718125,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":95,"tdur":94,"tts":1299686},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359718140,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":36},"dur":16,"tdur":15,"tts":1299701},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359718185,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1299745,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359718187,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":241},"dur":32,"tdur":31,"tts":1299748},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359718189,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":30,"tdur":30,"tts":1299749},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359718229,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1299789},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359718232,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":409,"tdur":348,"tts":1299793},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359718234,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":398,"tdur":338,"tts":1299794},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359718633,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":7,"tdur":6,"tts":1300134},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359718647,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":9,"tdur":9,"tts":1300147},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359718649,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":6,"tdur":6,"tts":1300150},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359718657,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":43,"tdur":43,"tts":1300157},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359718659,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":40,"tdur":40,"tts":1300159},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359718674,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":19,"tdur":18,"tts":1300175},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359718706,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":15745,"tdur":757,"tts":1300207},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359718709,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":15741,"tdur":754,"tts":1300209},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359734439,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":88},"dur":10,"tdur":8,"tts":1300953},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359734454,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1300967},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359734464,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":363,"tdur":295,"tts":1300977},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359734467,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":351,"tdur":283,"tts":1300979},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359734819,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":7,"tdur":7,"tts":1301264},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359734829,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":1,"tts":1301274},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359734836,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":195,"tdur":128,"tts":1301281},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359734838,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":185,"tdur":117,"tts":1301283},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359735024,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":7,"tdur":6,"tts":1301402},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359735033,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":210,"tdur":144,"tts":1301411},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359735035,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":113,"tdur":48,"tts":1301413},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359735149,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":93,"tdur":93,"tts":1301462},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359735165,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":88},"dur":15,"tdur":15,"tts":1301478},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359735209,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1301522,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359735211,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":242},"dur":30,"tdur":29,"tts":1301524},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359735212,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":28,"tdur":28,"tts":1301525},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359735250,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1301563},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359735253,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":313,"tdur":261,"tts":1301566},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359735255,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":303,"tdur":250,"tts":1301568},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359735559,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":7,"tdur":6,"tts":1301820},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359735572,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":40,"tdur":39,"tts":1301833},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359735574,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":37,"tdur":37,"tts":1301835},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359735582,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":23,"tdur":22,"tts":1301843},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359735614,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":15342,"tdur":714,"tts":1301875},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359735616,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":15339,"tdur":711,"tts":1301877},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359750945,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":166},"dur":9,"tdur":8,"tts":1302579},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359750964,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":7,"tdur":7,"tts":1302597},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359750972,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":352,"tdur":323,"tts":1302605},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359750975,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":340,"tdur":310,"tts":1302608},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359751316,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":7,"tdur":7,"tts":1302920},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359751330,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1302934},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359751333,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":90,"tdur":90,"tts":1302937},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359751335,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":88,"tdur":88,"tts":1302939},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359751349,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":166},"dur":15,"tdur":14,"tts":1302953},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359751390,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1302994,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359751392,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":243},"dur":29,"tdur":28,"tts":1302997},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359751394,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":27,"tdur":27,"tts":1302998},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359751431,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":18,"tdur":18,"tts":1303035},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359751450,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":364,"tdur":312,"tts":1303055},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359751453,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":352,"tdur":302,"tts":1303057},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359751807,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":6,"tdur":7,"tts":1303360},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359751822,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1303376},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359752230,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":9,"tdur":8,"tts":1303395},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359752233,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":6,"tdur":5,"tts":1303398},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359752240,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":36,"tdur":35,"tts":1303405},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359752242,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":33,"tdur":32,"tts":1303407},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359752250,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":20,"tdur":19,"tts":1303414},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359753977,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":31809,"tdur":1692,"tts":1303459},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359753980,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":31803,"tdur":1686,"tts":1303462},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359785756,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":66},"dur":23,"tdur":19,"tts":1305125},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359785794,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":4,"tts":1305159},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359785819,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":447,"tdur":333,"tts":1305184},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359785825,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":418,"tdur":302,"tts":1305191},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359786247,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":18,"tdur":16,"tts":1305499},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359786271,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":3,"tts":1305522},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359786284,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":276,"tdur":176,"tts":1305536},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359786288,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":252,"tdur":151,"tts":1305540},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359786543,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":15,"tdur":15,"tts":1305695},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359786565,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":448,"tdur":348,"tts":1305717},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359786569,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":226,"tdur":127,"tts":1305721},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359786798,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":213,"tdur":212,"tts":1305852},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359786836,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":66},"dur":31,"tdur":31,"tts":1305889},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359786933,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1305987,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359786937,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":244},"dur":72,"tdur":70,"tts":1305991},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359786940,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":68,"tdur":67,"tts":1305993},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359787028,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":3,"tts":1306082},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359787034,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":723,"tdur":606,"tts":1306088},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359787038,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":698,"tdur":582,"tts":1306091},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359787739,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":16,"tdur":15,"tts":1306677},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359787769,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":96,"tdur":95,"tts":1306707},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359787775,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":89,"tdur":89,"tts":1306712},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359787794,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":58,"tdur":58,"tts":1306731},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359787869,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":2460,"tdur":1702,"tts":1306806},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359787873,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":2455,"tdur":1696,"tts":1306811},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359790294,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":14},"dur":32,"tdur":29,"tts":1308476},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359790338,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1308517},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359790342,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":623,"tdur":498,"tts":1308521},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359790344,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":599,"tdur":472,"tts":1308524},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359790946,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":17,"tdur":16,"tts":1309001},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359790980,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1309034},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359790987,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":275,"tdur":141,"tts":1309041},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359790992,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":249,"tdur":114,"tts":1309046},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359791244,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":16,"tdur":15,"tts":1309165},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359791275,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":450,"tdur":313,"tts":1309196},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359791280,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":228,"tdur":91,"tts":1309201},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359791511,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":212,"tdur":211,"tts":1309296},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359791545,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":14},"dur":36,"tdur":34,"tts":1309331},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359791645,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1309431,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359791651,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":245},"dur":69,"tdur":68,"tts":1309436},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359791654,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":65,"tdur":64,"tts":1309439},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359791731,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":28,"tdur":27,"tts":1309516},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359791775,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":354,"tdur":278,"tts":1309560},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359791780,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":340,"tdur":264,"tts":1309565},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359792121,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":7,"tdur":7,"tts":1309831},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359792131,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":60,"tdur":59,"tts":1309841},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359792133,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":57,"tdur":56,"tts":1309843},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359792150,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":32,"tdur":31,"tts":1309860},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359792200,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":9871,"tdur":685,"tts":1309910},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359792204,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":9865,"tdur":678,"tts":1309914},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359802074,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":565,"tdur":564,"tts":1310599},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359802080,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":558,"tdur":557,"tts":1310605},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359802622,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":114},"dur":14,"tdur":12,"tts":1311148},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359802650,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":3,"tts":1311175},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359802654,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":243,"tdur":199,"tts":1311179},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359802657,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":228,"tdur":185,"tts":1311182},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359802887,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":9,"tdur":8,"tts":1311369},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359802905,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1311387},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359802909,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":144,"tdur":143,"tts":1311391},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359802912,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":140,"tdur":139,"tts":1311394},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359802927,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":114},"dur":40,"tdur":39,"tts":1311409},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359803008,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1311490,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359803011,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":246},"dur":39,"tdur":39,"tts":1311493},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359803013,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":36,"tdur":36,"tts":1311495},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359803063,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":3,"tts":1311545},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359803067,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":358,"tdur":303,"tts":1311549},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359803070,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":332,"tdur":277,"tts":1311552},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359803404,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":8,"tdur":8,"tts":1311831},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359803433,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":10,"tdur":10,"tts":1311860},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359803436,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":6,"tdur":6,"tts":1311864},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359803444,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":52,"tdur":51,"tts":1311872},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359803447,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":48,"tdur":48,"tts":1311874},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359803465,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":23,"tdur":22,"tts":1311893},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359803504,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":14555,"tdur":988,"tts":1311932},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359803508,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":14550,"tdur":984,"tts":1311935},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359818046,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":44},"dur":10,"tdur":8,"tts":1312909},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359818062,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1312924},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359818073,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":9674,"tdur":9590,"tts":1312935},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359818077,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":9661,"tdur":9578,"tts":1312938},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359827739,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":7,"tdur":6,"tts":1322518},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359827749,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1322527},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359827756,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":2730,"tdur":2684,"tts":1322534},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359827758,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":2719,"tdur":2672,"tts":1322537},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359830478,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":7,"tdur":6,"tts":1325211},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359830488,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":321,"tdur":239,"tts":1325220},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359830490,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":209,"tdur":127,"tts":1325222},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359830714,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":94,"tdur":94,"tts":1325364},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359830733,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":44},"dur":15,"tdur":14,"tts":1325384},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359830775,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1325426,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359830778,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":247},"dur":29,"tdur":29,"tts":1325428},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359830779,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":27,"tdur":27,"tts":1325429},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359830817,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":18,"tdur":18,"tts":1325467},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359831072,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":7,"tdur":6,"tts":1325516},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359831986,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":227,"tdur":119,"tts":1325558},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359831993,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":199,"tdur":90,"tts":1325565},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359832206,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":6,"tdur":6,"tts":1325670},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359832215,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":41,"tdur":40,"tts":1325680},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359832218,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":37,"tdur":37,"tts":1325682},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359832225,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":21,"tdur":20,"tts":1325690},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359834196,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":18003,"tdur":1864,"tts":1325803},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359834211,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":17985,"tdur":1849,"tts":1325816},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359852173,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":70},"dur":20,"tdur":17,"tts":1327644},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359852205,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1327674},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359852234,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":8638,"tdur":8577,"tts":1327704},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359852241,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":8614,"tdur":8553,"tts":1327710},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359860857,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":14,"tdur":14,"tts":1336266},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359860876,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1336285},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359860886,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":2897,"tdur":2786,"tts":1336295},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359860889,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":2885,"tdur":2774,"tts":1336298},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359863775,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":8,"tdur":7,"tts":1339074},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359863785,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":323,"tdur":243,"tts":1339084},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359863787,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":190,"tdur":110,"tts":1339086},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359863979,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":128,"tdur":128,"tts":1339198},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359863994,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":70},"dur":36,"tdur":34,"tts":1339214},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359864066,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1339286,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359864070,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":248},"dur":35,"tdur":35,"tts":1339289},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359864071,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":34,"tdur":33,"tts":1339291},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359864118,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1339338},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359864122,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":373,"tdur":309,"tts":1339341},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359864124,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":362,"tdur":297,"tts":1339344},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359864488,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":6,"tdur":6,"tts":1339643},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359864501,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":56,"tdur":56,"tts":1339656},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359864503,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":53,"tdur":53,"tts":1339658},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359864512,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":37,"tdur":36,"tts":1339667},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359864559,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":3458,"tdur":945,"tts":1339714},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359864563,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":3453,"tdur":939,"tts":1339718},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359867986,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":152},"dur":12,"tdur":11,"tts":1340636},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359868027,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1340669},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359868031,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":10526,"tdur":10382,"tts":1340673},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359868033,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":10511,"tdur":10365,"tts":1340676},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359878546,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":10,"tdur":10,"tts":1351044},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359878567,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1351065},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359878571,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":2951,"tdur":2767,"tts":1351069},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359878573,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":2935,"tdur":2750,"tts":1351072},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359881510,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":11,"tdur":10,"tts":1353825},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359881531,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":469,"tdur":334,"tts":1353846},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359881535,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":339,"tdur":204,"tts":1353849},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359881876,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":122,"tdur":122,"tts":1354057},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359881896,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":152},"dur":20,"tdur":19,"tts":1354077},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359881954,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1354135,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359881957,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":249},"dur":40,"tdur":39,"tts":1354138},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359881959,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":37,"tdur":37,"tts":1354139},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359882003,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1354184},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359882015,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":524,"tdur":388,"tts":1354196},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359882018,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":507,"tdur":371,"tts":1354199},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359882527,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":11,"tdur":10,"tts":1354573},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359882542,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":54,"tdur":53,"tts":1354588},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359882546,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":49,"tdur":49,"tts":1354591},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359882558,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":30,"tdur":29,"tts":1354604},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359882606,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":2744,"tdur":1237,"tts":1354652},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359882610,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":2739,"tdur":1233,"tts":1354655},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359885336,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":253},"dur":11,"tdur":9,"tts":1355877},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359885353,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1355893},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359885365,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":370,"tdur":244,"tts":1355905},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359885369,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":353,"tdur":226,"tts":1355908},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359885724,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":10,"tdur":9,"tts":1356138},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359885738,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1356152},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359885748,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":125,"tdur":124,"tts":1356162},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359885752,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":120,"tdur":119,"tts":1356166},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359885770,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":253},"dur":19,"tdur":18,"tts":1356184},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359885827,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1356241,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359885831,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":250},"dur":39,"tdur":40,"tts":1356244},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359885832,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":38,"tdur":37,"tts":1356246},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359885876,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":3,"tts":1356289},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359885887,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":524,"tdur":384,"tts":1356300},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359885889,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":508,"tdur":366,"tts":1356303},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359886399,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":10,"tdur":9,"tts":1356673},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359886414,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":10,"tdur":10,"tts":1356687},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359886417,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":6,"tdur":5,"tts":1356691},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359886432,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":55,"tdur":54,"tts":1356706},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359886438,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":48,"tdur":47,"tts":1356712},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359886451,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":28,"tdur":26,"tts":1356725},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359886489,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":15591,"tdur":1669,"tts":1356763},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359886493,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":15584,"tdur":1663,"tts":1356766},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359902054,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":59},"dur":20,"tdur":17,"tts":1358409},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359902101,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1358454},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359902109,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":414,"tdur":356,"tts":1358462},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359902115,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":382,"tdur":323,"tts":1358468},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359902501,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":18,"tts":1358797},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359902541,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":4,"tts":1358837},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359902549,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":233,"tdur":231,"tts":1358845},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359902555,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":224,"tdur":223,"tts":1358851},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359902587,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":59},"dur":37,"tdur":34,"tts":1358884},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359902697,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1358993,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359902703,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":251},"dur":73,"tdur":72,"tts":1358999},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359902706,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":69,"tdur":68,"tts":1359002},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359902800,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":24,"tdur":23,"tts":1359096},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359902827,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":353,"tdur":302,"tts":1359122},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359902832,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":321,"tdur":268,"tts":1359128},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359903171,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":8,"tdur":8,"tts":1359415},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359903190,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1359434},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359903454,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":11,"tdur":10,"tts":1359453},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359903458,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":6,"tdur":6,"tts":1359457},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359903466,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":63,"tdur":62,"tts":1359465},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359903468,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":60,"tdur":59,"tts":1359467},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359903486,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":20,"tdur":20,"tts":1359485},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359904790,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":29876,"tdur":1134,"tts":1359587},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359904803,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":29861,"tdur":1120,"tts":1359599},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359934650,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":237},"dur":12,"tdur":10,"tts":1360706},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359934669,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":3,"tts":1360725},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359934687,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":291,"tdur":253,"tts":1360742},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359934690,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":275,"tdur":237,"tts":1360746},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359934967,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":9,"tdur":9,"tts":1360985},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359934980,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1360999},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359934990,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":135,"tdur":134,"tts":1361008},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359934994,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":130,"tdur":129,"tts":1361012},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359935012,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":237},"dur":22,"tdur":20,"tts":1361031},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359935072,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1361090,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359935075,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":252},"dur":47,"tdur":46,"tts":1361093},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359935077,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":44,"tdur":44,"tts":1361095},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359935127,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1361146},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359935138,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":337,"tdur":280,"tts":1361156},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359935141,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":323,"tdur":265,"tts":1361159},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359935466,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":8,"tdur":7,"tts":1361427},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359935478,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":9,"tdur":10,"tts":1361438},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359935481,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":6,"tdur":5,"tts":1361442},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359935495,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":57,"tdur":57,"tts":1361456},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359935498,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":53,"tdur":53,"tts":1361459},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359935508,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":32,"tdur":31,"tts":1361469},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359935555,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":1481,"tdur":977,"tts":1361515},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359935558,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":1476,"tdur":971,"tts":1361519},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359937022,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":30},"dur":11,"tdur":8,"tts":1362480},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359937046,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":3,"tts":1362503},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359937051,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":773,"tdur":740,"tts":1362508},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359937055,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":749,"tdur":716,"tts":1362511},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359937807,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":15,"tdur":14,"tts":1363232},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359937837,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":3,"tts":1363262},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359937844,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":168,"tdur":105,"tts":1363268},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359937848,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":152,"tdur":88,"tts":1363273},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359938002,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":9,"tdur":8,"tts":1363363},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359938020,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":291,"tdur":226,"tts":1363381},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359938023,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":133,"tdur":68,"tts":1363384},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359938159,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":150,"tdur":149,"tts":1363456},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359909201,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":30,"tdur":28,"tts":85857},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359909376,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":16,"tdur":15,"tts":85910},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359909486,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":9,"tdur":8,"tts":85932},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359909518,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":7,"tdur":6,"tts":85946},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359969621,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":34,"tdur":32,"tts":85991},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359970741,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":23,"tdur":22,"tts":86065},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359971974,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":95,"tdur":75,"tts":86145},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359972563,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":59,"tdur":57,"tts":86290},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359972873,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":41,"tdur":39,"tts":86410},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359972917,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":29,"tdur":28,"tts":86453},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359973567,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":42,"tdur":40,"tts":86548},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359975322,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":54,"tdur":50,"tts":86657},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359975798,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":50,"tdur":48,"tts":86777},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359976113,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":58,"tdur":56,"tts":86886},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359976174,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":11,"tdur":10,"tts":86946},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359977765,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":43,"tdur":40,"tts":87025},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359979555,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":52,"tdur":50,"tts":87132},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359979918,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":44,"tdur":41,"tts":87222},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359980186,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":17,"tdur":16,"tts":87282},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359980205,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":21,"tts":87301},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359980763,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":42,"tdur":39,"tts":87387},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359982567,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":50,"tdur":48,"tts":87494},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359982999,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":50,"tdur":47,"tts":87604},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359983293,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":42,"tdur":40,"tts":87711},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531359983338,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":11,"tdur":10,"tts":87755},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360062785,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":35,"tdur":33,"tts":87808},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360063291,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":23,"tdur":21,"tts":87884},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360064341,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":20,"tts":87943},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360064624,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":21,"tts":88000},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360064805,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":16,"tdur":16,"tts":88056},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360064822,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":10,"tdur":9,"tts":88073},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360065161,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":17,"tdur":16,"tts":88131},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360066054,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":56,"tdur":54,"tts":88184},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360066500,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":50,"tdur":47,"tts":88304},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360066750,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":47,"tdur":45,"tts":88388},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360066798,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":11,"tdur":11,"tts":88435},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360067039,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":19,"tdur":18,"tts":88471},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360067657,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":11,"tdur":10,"tts":88514},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360067856,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":16,"tdur":15,"tts":88548},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360068028,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":17,"tdur":16,"tts":88571},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360068089,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":12,"tdur":11,"tts":88593},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360068101,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":3,"tts":88606},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360068254,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":12,"tdur":11,"tts":88618},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360068999,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":12,"tdur":12,"tts":88635},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360069103,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":18,"tts":88655},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360069152,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":9,"tdur":9,"tts":88679},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360069201,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":13,"tdur":13,"tts":88694},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360069364,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":16,"tdur":16,"tts":88713},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360070149,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":33,"tdur":32,"tts":88741},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360070297,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":13,"tdur":12,"tts":88782},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360070455,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":8,"tdur":8,"tts":88799},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360070464,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":7,"tdur":7,"tts":88808},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360153064,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":32,"tdur":30,"tts":88883},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360153409,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":21,"tts":88951},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360154217,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":64,"tdur":61,"tts":89035},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360154547,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":27,"tdur":26,"tts":89141},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360154718,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":20,"tdur":19,"tts":89204},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360154739,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":5,"tts":89224},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360155051,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":17,"tdur":17,"tts":89265},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360155797,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":26,"tdur":25,"tts":89334},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360156074,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":27,"tdur":27,"tts":89400},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360156243,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":27,"tdur":26,"tts":89469},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360156271,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":6,"tdur":6,"tts":89497},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360156577,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":21,"tts":89545},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359938185,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":30},"dur":38,"tdur":37,"tts":1363482},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359938261,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1363558,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359938265,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":253},"dur":42,"tdur":42,"tts":1363562},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359938267,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":40,"tdur":39,"tts":1363564},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359938314,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":3,"tts":1363610},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359938326,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":341,"tdur":284,"tts":1363623},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359938329,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":325,"tdur":268,"tts":1363626},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359938656,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":10,"tdur":10,"tts":1363896},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359938669,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":61,"tdur":61,"tts":1363910},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359938673,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":56,"tdur":55,"tts":1363914},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359938696,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":25,"tdur":24,"tts":1363937},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359938739,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":12364,"tdur":650,"tts":1363980},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359938744,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":12356,"tdur":641,"tts":1363985},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359951111,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":771,"tdur":771,"tts":1364638},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359951121,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":760,"tdur":760,"tts":1364648},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359951865,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":90},"dur":14,"tdur":13,"tts":1365393},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359951896,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":4,"tts":1365423},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359951902,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":363,"tdur":253,"tts":1365430},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359951906,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":342,"tdur":233,"tts":1365434},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359952251,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":12,"tdur":12,"tts":1365670},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359952275,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":3,"tts":1365694},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359952280,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":168,"tdur":168,"tts":1365699},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359952284,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":163,"tdur":163,"tts":1365703},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359952315,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":90},"dur":26,"tdur":24,"tts":1365735},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359952386,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1365806,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359952390,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":254},"dur":55,"tdur":55,"tts":1365809},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359952393,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":51,"tdur":50,"tts":1365812},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359952460,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":4,"tts":1365879},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359952465,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":373,"tdur":304,"tts":1365885},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359952469,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":355,"tdur":287,"tts":1365888},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359952826,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":11,"tdur":11,"tts":1366177},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359952847,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":14,"tdur":13,"tts":1366199},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359952852,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":8,"tdur":7,"tts":1366204},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359952863,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":75,"tdur":74,"tts":1366215},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359952867,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":69,"tdur":68,"tts":1366218},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359952885,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":25,"tdur":25,"tts":1366236},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359952957,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":15818,"tdur":1438,"tts":1366309},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359952968,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":15806,"tdur":1425,"tts":1366320},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359968757,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":229},"dur":15,"tdur":13,"tts":1367730},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359968778,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1367750},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359968789,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":298,"tdur":233,"tts":1367760},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359968791,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":286,"tdur":219,"tts":1367763},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359969079,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":7,"tdur":7,"tts":1367985},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359969089,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":1,"tts":1367995},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359969096,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":130,"tdur":66,"tts":1368002},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359969098,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":120,"tdur":55,"tts":1368004},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359969219,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":7,"tdur":6,"tts":1368061},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359969228,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":217,"tdur":151,"tts":1368070},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359969230,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":113,"tdur":46,"tts":1368072},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359969344,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":100,"tdur":100,"tts":1368120},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359969364,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":229},"dur":17,"tdur":17,"tts":1368140},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531359969411,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1368187,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359969413,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":255},"dur":30,"tdur":30,"tts":1368189},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359969414,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":29,"tdur":28,"tts":1368190},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359969453,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":19,"tdur":18,"tts":1368229},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359969654,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1368266},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359970760,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":145,"tdur":123,"tts":1368283},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359970763,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":132,"tdur":110,"tts":1368286},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359970896,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":8,"tdur":8,"tts":1368398},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359970906,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":40,"tdur":40,"tts":1368408},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359970909,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":37,"tdur":36,"tts":1368411},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359970918,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":22,"tdur":21,"tts":1368420},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531359972079,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":30386,"tdur":1901,"tts":1368540},{"cat":"gpu","pid":25863,"tid":25870,"ts":531359972094,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":30370,"tdur":1886,"tts":1368554},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359975459,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":33,"tdur":31,"tts":154504},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359975931,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":154825},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359976254,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":155094},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359977879,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":155359},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359979654,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":10,"tdur":8,"tts":155577},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359980045,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":8,"tdur":6,"tts":155768},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359980204,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":8,"tdur":6,"tts":155886},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359980229,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":3,"tts":155910},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359980846,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":7,"tdur":6,"tts":156093},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359982666,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":7,"tdur":5,"tts":156272},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359983098,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":7,"tdur":6,"tts":156456},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531359983379,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":8,"tdur":6,"tts":156651},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360062829,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":156793},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360063357,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":156938},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360064417,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":157077},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360064685,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":4,"tts":157203},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360064863,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":157340},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360065202,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":157453},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360066150,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":19,"tdur":17,"tts":157568},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360066610,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":8,"tdur":6,"tts":157748},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360066799,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":157909},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360066813,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":1,"tts":157923},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360067094,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":158017},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360067684,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":158117},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360067918,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":3,"tts":158249},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360068053,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":158352},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360068106,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":158406},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360068269,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":158457},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360069021,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":158509},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360069127,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":158562},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360069164,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":158599},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360069219,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":1,"tts":158646},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360069386,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":158695},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360070199,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":20,"tdur":6,"tts":158792},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360070313,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":158857},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360070464,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":3,"tts":158922},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360070473,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":158932},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360153140,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":159142},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360153473,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":159284},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360154356,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":22,"tdur":20,"tts":159497},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360154630,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":4,"tts":159677},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360154803,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":159818},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360155091,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":159922},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360155860,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":160023},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360156111,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":160141},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360156278,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":160224},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360156607,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":160288},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360157552,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":160349},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360157811,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":160411},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360157972,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":160486},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360158294,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":160549},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360159217,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":3,"tts":160610},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360159434,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":160675},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360159561,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":160748},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360220626,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":160939},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360221219,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":161143},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360223160,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":161400},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360223665,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":161671},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360224036,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":13,"tdur":11,"tts":161958},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360225429,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":162235},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360226825,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":162502},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360227271,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":162775},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360227785,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":163048},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360228068,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":9,"tdur":7,"tts":163258},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360002445,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":193},"dur":16,"tdur":15,"tts":1370422},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360002468,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":2,"tts":1370445},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360002486,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":279,"tdur":254,"tts":1370463},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360002490,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":261,"tdur":236,"tts":1370467},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360002753,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":10,"tdur":10,"tts":1370706},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360002768,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":3,"tts":1370721},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360002781,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":10483,"tdur":10405,"tts":1370734},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360002785,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":10466,"tdur":10386,"tts":1370738},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360013252,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":11,"tdur":10,"tts":1381127},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360013268,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":2885,"tdur":2810,"tts":1381143},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360013271,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":2722,"tdur":2656,"tts":1381146},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360015995,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":157,"tdur":147,"tts":1383805},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360016035,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":193},"dur":22,"tdur":21,"tts":1383836},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360016104,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1383905,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360016108,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":256},"dur":42,"tdur":42,"tts":1383908},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360016110,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":39,"tdur":38,"tts":1383911},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360016164,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":3,"tts":1383965},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360016169,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":516,"tdur":393,"tts":1383970},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360016173,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":500,"tdur":377,"tts":1383973},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360016675,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":9,"tdur":9,"tts":1384352},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360016694,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":58,"tdur":57,"tts":1384372},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360016698,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":53,"tdur":52,"tts":1384376},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360016719,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":23,"tdur":22,"tts":1384397},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360016755,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":2146,"tdur":1194,"tts":1384433},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360016760,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":2140,"tdur":1189,"tts":1384437},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360018886,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":49},"dur":12,"tdur":10,"tts":1385613},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360018912,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1385639},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360018917,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":10295,"tdur":10148,"tts":1385643},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360018920,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":10279,"tdur":10130,"tts":1385647},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360029201,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":10,"tdur":9,"tts":1395780},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360029220,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1395799},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360029224,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":114,"tdur":114,"tts":1395803},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360029226,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":111,"tdur":110,"tts":1395806},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360029243,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":49},"dur":17,"tdur":17,"tts":1395822},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360029297,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1395876,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360029300,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":257},"dur":36,"tdur":35,"tts":1395879},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360029301,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":34,"tdur":34,"tts":1395880},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360029346,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1395925},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360029350,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":3069,"tdur":2880,"tts":1395929},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360029352,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":3057,"tdur":2868,"tts":1395931},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360032411,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":7,"tdur":7,"tts":1398801},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360032425,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":9,"tdur":8,"tts":1398816},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360032428,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":6,"tdur":5,"tts":1398818},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360032435,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":44,"tdur":44,"tts":1398825},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360032437,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":42,"tdur":41,"tts":1398827},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360032447,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":25,"tdur":25,"tts":1398837},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360032486,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":2271,"tdur":902,"tts":1398876},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360032489,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":2267,"tdur":898,"tts":1398879},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360034747,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":16},"dur":8,"tdur":8,"tts":1399768},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360034760,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1399781},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360034769,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":10594,"tdur":10447,"tts":1399790},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360034772,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":10580,"tdur":10433,"tts":1399793},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360045353,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":9,"tdur":8,"tts":1410228},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360045365,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1410240},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360045374,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":2985,"tdur":2786,"tts":1410248},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360045376,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":2970,"tdur":2770,"tts":1410251},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360048348,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":10,"tdur":10,"tts":1413023},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360048362,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":452,"tdur":320,"tts":1413038},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360048365,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":332,"tdur":201,"tts":1413040},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360048698,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":115,"tdur":113,"tts":1413244},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360048718,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":16},"dur":18,"tdur":17,"tts":1413263},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360048771,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1413316,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360048774,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":258},"dur":37,"tdur":37,"tts":1413319},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360048776,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":35,"tdur":34,"tts":1413321},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360048824,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":7,"tdur":7,"tts":1413369},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360048832,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":506,"tdur":368,"tts":1413377},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360048835,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":490,"tdur":352,"tts":1413380},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360049327,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":10,"tdur":10,"tts":1413734},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360049347,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":48,"tdur":48,"tts":1413754},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360049350,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":44,"tdur":43,"tts":1413757},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360049361,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":26,"tdur":25,"tts":1413769},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360049397,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":2737,"tdur":1346,"tts":1413804},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360049400,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":2733,"tdur":1342,"tts":1413807},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360052120,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":166},"dur":11,"tdur":10,"tts":1415137},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360052145,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1415162},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360052149,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":10334,"tdur":10202,"tts":1415166},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360052152,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":10318,"tdur":10185,"tts":1415169},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360062472,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":10,"tdur":9,"tts":1425357},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360062492,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1425377},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360062496,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":118,"tdur":118,"tts":1425381},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360062499,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":114,"tdur":114,"tts":1425384},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360062515,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":166},"dur":19,"tdur":18,"tts":1425400},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360062570,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1425456,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360062574,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":259},"dur":38,"tdur":37,"tts":1425459},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360062575,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":36,"tdur":36,"tts":1425460},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360062623,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":18,"tdur":16,"tts":1425509},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360062642,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":2891,"tdur":2815,"tts":1425527},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360062645,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":2876,"tdur":2800,"tts":1425530},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360065523,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":9,"tdur":8,"tts":1428332},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360065543,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1428352},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360065547,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":8,"tdur":7,"tts":1428356},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360065550,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":4,"tdur":4,"tts":1428359},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360065558,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":42,"tdur":41,"tts":1428368},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360065560,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":39,"tdur":39,"tts":1428369},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360065570,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":24,"tdur":23,"tts":1428379},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360065602,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":2566,"tdur":1147,"tts":1428411},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360065605,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":2562,"tdur":1142,"tts":1428414},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360068155,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":187},"dur":10,"tdur":10,"tts":1429545},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360068181,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":3,"tts":1429571},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360068186,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":311,"tdur":247,"tts":1429576},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360068189,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":297,"tdur":232,"tts":1429579},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360068488,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":8,"tdur":7,"tts":1429814},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360068505,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1429831},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360068509,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":128,"tdur":82,"tts":1429835},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360068512,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":115,"tdur":69,"tts":1429837},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360068628,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":9,"tdur":8,"tts":1429908},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360068645,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":292,"tdur":168,"tts":1429925},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360068647,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":178,"tdur":54,"tts":1429927},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360068826,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":110,"tdur":109,"tts":1429983},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360068844,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":187},"dur":18,"tdur":17,"tts":1430001},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360068894,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1430051,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360068897,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":260},"dur":37,"tdur":38,"tts":1430053},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360068899,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":35,"tdur":35,"tts":1430055},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360068940,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":3,"tts":1430096},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360068950,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":359,"tdur":316,"tts":1430107},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360068953,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":346,"tdur":303,"tts":1430110},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360069300,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":8,"tdur":7,"tts":1430415},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360069312,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":43,"tdur":43,"tts":1430426},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360069315,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":39,"tdur":39,"tts":1430429},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360069324,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":23,"tdur":22,"tts":1430439},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360069363,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":15239,"tdur":778,"tts":1430477},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360069369,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":15231,"tdur":771,"tts":1430483},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360084590,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":3},"dur":9,"tdur":7,"tts":1431245},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360084604,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1431257},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360084616,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":425,"tdur":399,"tts":1431270},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360084619,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":413,"tdur":388,"tts":1431272},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360085033,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":7,"tdur":6,"tts":1431662},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360085043,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1431671},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360085050,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":281,"tdur":258,"tts":1431679},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360085056,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":266,"tdur":243,"tts":1431685},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360085323,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":7,"tdur":6,"tts":1431930},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360085333,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":166,"tdur":145,"tts":1431939},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360085335,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":70,"tdur":48,"tts":1431942},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360085406,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":92,"tdur":92,"tts":1431992},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360085421,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":3},"dur":15,"tdur":15,"tts":1432007},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360085464,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1432051,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360085467,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":261},"dur":30,"tdur":29,"tts":1432053},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360085468,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":28,"tdur":28,"tts":1432054},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360085507,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1432093},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360085510,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":395,"tdur":274,"tts":1432096},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360085512,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":384,"tdur":262,"tts":1432098},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360085897,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":7,"tdur":7,"tts":1432362},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360085911,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":38,"tdur":38,"tts":1432376},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360085913,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":36,"tdur":35,"tts":1432378},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360085922,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":21,"tdur":20,"tts":1432387},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360085951,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":31580,"tdur":361,"tts":1432416},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360085954,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":31576,"tdur":357,"tts":1432419},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360117539,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":542,"tdur":535,"tts":1432785},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360117543,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":535,"tdur":529,"tts":1432789},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360118058,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":102},"dur":17,"tdur":16,"tts":1433299},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360118086,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1433326},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360118106,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":1135,"tdur":1033,"tts":1433346},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360118112,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":1120,"tdur":1018,"tts":1433352},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360119233,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":7,"tdur":6,"tts":1434372},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360119242,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":1,"tts":1434381},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360119249,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":204,"tdur":203,"tts":1434388},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360119252,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":200,"tdur":199,"tts":1434390},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360119281,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":102},"dur":34,"tdur":32,"tts":1434420},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360119376,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1434516,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360119382,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":262},"dur":67,"tdur":66,"tts":1434521},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360119386,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":61,"tdur":61,"tts":1434524},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360119459,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1434597},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360119479,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":436,"tdur":369,"tts":1434617},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360119484,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":422,"tdur":355,"tts":1434622},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360119908,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":6,"tdur":7,"tts":1434978},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360119917,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":7,"tdur":7,"tts":1434988},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360119919,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":5,"tdur":4,"tts":1434990},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360119929,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":42,"tdur":41,"tts":1435000},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360119931,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":39,"tdur":38,"tts":1435002},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360119939,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":25,"tdur":24,"tts":1435010},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360119972,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":15115,"tdur":1054,"tts":1435043},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360119975,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":15110,"tdur":1049,"tts":1435046},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360135065,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":231},"dur":17,"tdur":15,"tts":1436077},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360135106,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1436117},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360135113,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":874,"tdur":785,"tts":1436124},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360135119,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":859,"tdur":770,"tts":1436130},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360135980,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":6,"tdur":6,"tts":1436902},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360135993,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1436915},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360135996,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":309,"tdur":208,"tts":1436918},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360135998,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":286,"tdur":185,"tts":1436920},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360136287,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":16,"tdur":15,"tts":1437109},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360136319,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":266,"tdur":177,"tts":1437141},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360136324,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":185,"tdur":95,"tts":1437146},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360136512,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":71,"tdur":71,"tts":1437245},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360136590,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":208,"tdur":208,"tts":1437323},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360136596,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":200,"tdur":199,"tts":1437330},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360136619,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":231},"dur":33,"tdur":31,"tts":1437353},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360136714,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1437448,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360136720,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":263},"dur":73,"tdur":72,"tts":1437454},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360136723,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":69,"tdur":68,"tts":1437457},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360136816,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1437550},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360136824,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":365,"tdur":294,"tts":1437557},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360136828,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":353,"tdur":280,"tts":1437562},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360137182,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":6,"tdur":6,"tts":1437844},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360137195,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":53,"tdur":52,"tts":1437857},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360137197,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":50,"tdur":50,"tts":1437859},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360137224,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":17,"tdur":17,"tts":1437886},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360137249,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":14515,"tdur":1167,"tts":1437912},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360137252,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":14510,"tdur":1162,"tts":1437914},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360151741,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":217},"dur":18,"tdur":16,"tts":1439057},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360151782,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1439098},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360151790,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":420,"tdur":318,"tts":1439105},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360151795,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":394,"tdur":290,"tts":1439111},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360152192,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":16,"tdur":15,"tts":1439406},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360152224,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1439438},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360152231,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":208,"tdur":143,"tts":1439445},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360152236,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":182,"tdur":117,"tts":1439450},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360152421,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":16,"tdur":15,"tts":1439571},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360152453,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":369,"tdur":308,"tts":1439603},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360152458,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":156,"tdur":94,"tts":1439608},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360152617,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":203,"tdur":203,"tts":1439706},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360152649,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":217},"dur":35,"tdur":34,"tts":1439739},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360152746,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1439837,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360152752,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":264},"dur":66,"tdur":65,"tts":1439842},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360152755,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":61,"tdur":60,"tts":1439845},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360152828,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":21,"tdur":21,"tts":1439917},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360153098,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":3,"tts":1439978},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360153428,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":128,"tdur":62,"tts":1439999},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360153431,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":116,"tdur":50,"tts":1440002},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360153548,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":7,"tdur":6,"tts":1440054},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360153558,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":36,"tdur":36,"tts":1440063},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360153560,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":33,"tdur":34,"tts":1440065},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360153568,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":20,"tdur":20,"tts":1440073},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360154266,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":31931,"tdur":1998,"tts":1440133},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360154275,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":31920,"tdur":1987,"tts":1440142},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360186172,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":199},"dur":19,"tdur":16,"tts":1442109},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360186203,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1442138},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360186233,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":496,"tdur":368,"tts":1442168},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360186240,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":464,"tdur":335,"tts":1442174},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360186708,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":18,"tts":1442515},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360186736,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":4,"tts":1442543},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360186755,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":233,"tdur":233,"tts":1442562},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360186762,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":224,"tdur":224,"tts":1442569},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360186795,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":199},"dur":36,"tdur":35,"tts":1442602},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360186903,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1442711,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360186910,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":265},"dur":73,"tdur":73,"tts":1442717},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360186913,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":69,"tdur":68,"tts":1442720},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360186994,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1442801},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360187015,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":361,"tdur":297,"tts":1442822},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360187020,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":348,"tdur":283,"tts":1442827},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360187369,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":6,"tdur":7,"tts":1443111},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360187378,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":7,"tdur":7,"tts":1443121},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360187380,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":5,"tdur":4,"tts":1443123},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360187391,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":51,"tdur":52,"tts":1443133},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360187393,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":49,"tdur":49,"tts":1443135},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360187414,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":22,"tdur":21,"tts":1443157},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360187444,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":2802,"tdur":1932,"tts":1443187},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360187447,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":2796,"tdur":1927,"tts":1443190},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360190220,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":48},"dur":20,"tdur":17,"tts":1445096},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360190267,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":4,"tts":1445142},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360190275,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":455,"tdur":326,"tts":1445149},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360190281,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":427,"tdur":298,"tts":1445155},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360190711,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":17,"tdur":16,"tts":1445457},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360190744,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1445490},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360190751,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":239,"tdur":239,"tts":1445497},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360190757,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":231,"tdur":230,"tts":1445503},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360157502,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":42,"tdur":41,"tts":89607},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360157775,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":28,"tdur":26,"tts":89691},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360157937,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":27,"tdur":26,"tts":89761},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360157965,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":7,"tdur":7,"tts":89789},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360158263,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":23,"tdur":22,"tts":89838},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360159180,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":27,"tdur":27,"tts":89902},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360159404,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":20,"tdur":19,"tts":89957},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360159537,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":16,"tdur":15,"tts":89999},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360159554,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":7,"tdur":6,"tts":90016},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360220550,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":60,"tdur":58,"tts":90046},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360221135,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":68,"tdur":66,"tts":90129},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360223015,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":72,"tdur":69,"tts":90259},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360223530,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":56,"tdur":54,"tts":90396},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360223859,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":48,"tts":90516},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360223912,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":11,"tdur":10,"tts":90568},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360225310,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":42,"tdur":40,"tts":90644},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360226711,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":40,"tdur":37,"tts":90753},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360227134,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":52,"tdur":49,"tts":90859},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360227652,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":49,"tts":90981},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360227956,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":81,"tdur":61,"tts":91092},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360228040,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":12,"tdur":11,"tts":91157},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360229287,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":43,"tdur":41,"tts":91238},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360231083,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":49,"tdur":48,"tts":91344},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360231520,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":50,"tdur":48,"tts":91454},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360231834,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":41,"tdur":39,"tts":91567},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360231878,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":20,"tts":91609},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360232445,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":41,"tdur":39,"tts":91690},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360234217,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":53,"tdur":50,"tts":91797},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360234550,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":50,"tdur":48,"tts":91916},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360234776,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":41,"tdur":38,"tts":92031},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360234819,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":13,"tdur":11,"tts":92073},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360287445,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":38,"tdur":37,"tts":92173},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360289834,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":64,"tdur":62,"tts":92277},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360291845,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":73,"tdur":70,"tts":92408},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360292253,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":30,"tdur":28,"tts":92533},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360292439,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":35,"tdur":34,"tts":92597},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360292475,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":6,"tdur":6,"tts":92632},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360292769,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":17,"tts":92675},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360293561,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":24,"tdur":24,"tts":92734},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360293802,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":27,"tdur":25,"tts":92807},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360293954,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":15,"tdur":15,"tts":92856},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360293970,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":5,"tts":92872},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360294258,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":12,"tdur":11,"tts":92901},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360295031,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":29,"tdur":28,"tts":92933},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360295247,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":17,"tdur":16,"tts":92984},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360295402,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":19,"tdur":17,"tts":93024},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360295422,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":5,"tts":93042},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360295697,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":11,"tdur":11,"tts":93068},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360296485,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":27,"tdur":26,"tts":93104},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360296740,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":15,"tdur":15,"tts":93153},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360296882,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":25,"tdur":24,"tts":93190},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360296908,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":6,"tts":93215},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360353627,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":61,"tdur":60,"tts":93250},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360354019,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":26,"tdur":25,"tts":93352},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360354716,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":43,"tdur":42,"tts":93415},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360354980,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":36,"tdur":35,"tts":93486},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360355147,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":20,"tdur":19,"tts":93544},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360355168,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":4,"tts":93565},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360355477,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":13,"tdur":12,"tts":93593},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360356357,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":20,"tdur":19,"tts":93634},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360356615,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":17,"tts":93683},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360356793,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":18,"tts":93726},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360356812,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":6,"tdur":5,"tts":93745},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360357119,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":14,"tdur":13,"tts":93776},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360190786,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":48},"dur":53,"tdur":52,"tts":1445532},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360190902,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1445649,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360190908,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":266},"dur":77,"tdur":75,"tts":1445655},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360190911,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":73,"tdur":71,"tts":1445658},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360191009,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1445755},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360191017,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":500,"tdur":370,"tts":1445763},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360191022,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":473,"tdur":343,"tts":1445768},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360191498,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":17,"tdur":15,"tts":1446116},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360191531,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":19,"tdur":19,"tts":1446148},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360191537,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":12,"tdur":11,"tts":1446154},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360191552,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":94,"tdur":92,"tts":1446170},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360191557,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":87,"tdur":86,"tts":1446174},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360191590,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":41,"tdur":39,"tts":1446208},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360191660,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":10591,"tdur":1712,"tts":1446277},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360191667,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":10581,"tdur":1702,"tts":1446284},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360202224,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":246},"dur":21,"tdur":18,"tts":1447965},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360202257,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1447996},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360202280,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":423,"tdur":359,"tts":1448019},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360202287,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":389,"tdur":324,"tts":1448026},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360202680,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":20,"tdur":19,"tts":1448356},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360202709,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1448385},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360202729,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":248,"tdur":247,"tts":1448405},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360202736,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":239,"tdur":238,"tts":1448412},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360202783,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":246},"dur":37,"tdur":36,"tts":1448459},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360202893,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1448569,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360202899,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":267},"dur":74,"tdur":73,"tts":1448575},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360202902,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":70,"tdur":68,"tts":1448578},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360202983,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1448659},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360203003,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":425,"tdur":365,"tts":1448679},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360203009,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":392,"tdur":332,"tts":1448684},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360203405,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":20,"tts":1449022},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360203433,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":29,"tdur":27,"tts":1449051},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360203455,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":6,"tdur":6,"tts":1449072},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360203470,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":83,"tdur":82,"tts":1449087},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360203473,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":78,"tdur":77,"tts":1449090},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360203485,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":51,"tdur":50,"tts":1449102},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360203558,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":15647,"tdur":1887,"tts":1449175},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360203565,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":15637,"tdur":1878,"tts":1449182},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360219178,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":46},"dur":21,"tdur":18,"tts":1451038},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360219226,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1451084},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360219234,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":446,"tdur":371,"tts":1451092},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360219240,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":414,"tdur":338,"tts":1451098},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360219657,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":20,"tdur":19,"tts":1451442},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360219698,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1451482},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360219705,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":219,"tdur":158,"tts":1451489},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360219711,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":192,"tdur":130,"tts":1451495},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360219906,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":16,"tdur":15,"tts":1451630},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360219938,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":404,"tdur":349,"tts":1451662},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360219943,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":147,"tdur":92,"tts":1451667},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360220091,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":249,"tdur":248,"tts":1451761},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360220152,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":46},"dur":38,"tdur":37,"tts":1451822},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360220261,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1451932,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360220268,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":268},"dur":69,"tdur":69,"tts":1451937},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360220271,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":65,"tdur":65,"tts":1451940},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360220348,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":23,"tdur":22,"tts":1452018},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360220610,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":9,"tdur":7,"tts":1452096},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360221173,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":305,"tdur":177,"tts":1452159},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360221184,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":271,"tdur":143,"tts":1452169},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360221458,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":18,"tdur":17,"tts":1452317},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360221483,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":98,"tdur":97,"tts":1452342},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360221489,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":90,"tdur":89,"tts":1452348},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360221524,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":41,"tdur":39,"tts":1452384},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360223081,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":30895,"tdur":3100,"tts":1452507},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360223098,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":30873,"tdur":3081,"tts":1452522},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360229371,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":29,"tdur":27,"tts":163443},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360231210,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":8,"tts":163679},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360231614,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":8,"tdur":6,"tts":163878},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360231918,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":9,"tdur":7,"tts":164082},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360232522,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":8,"tdur":6,"tts":164274},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360234312,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":7,"tdur":6,"tts":164451},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360234651,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":7,"tdur":6,"tts":164639},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360234862,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":8,"tdur":6,"tts":164826},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360287526,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":165060},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360289962,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":165289},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360291998,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":48,"tdur":28,"tts":165564},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360292330,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":165756},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360292521,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":165891},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360292825,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":4,"tts":166038},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360293630,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":166187},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360293837,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":2,"tts":166263},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360293977,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":166339},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360294277,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":166408},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360295068,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":166459},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360295271,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":166516},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360295429,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":166593},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360295715,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":1,"tts":166661},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360296558,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":4,"tts":166751},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360296797,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":166895},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360296915,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":166996},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360353700,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":167181},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360354082,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":167316},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360354799,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":167446},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360355073,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":167610},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360355177,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":167694},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360355507,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":4,"tts":167811},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360356427,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":167961},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360356650,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":4,"tts":168089},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360356821,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":7,"tdur":5,"tts":168211},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360357169,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":168329},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360358138,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":168435},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360358393,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":168553},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360358499,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":168624},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360358511,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":168636},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360358768,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":168688},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360359749,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":168748},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360359874,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":168811},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360359911,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":168847},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360359945,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":168882},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360420537,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":4,"tts":169078},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360421106,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":8,"tts":169323},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360422729,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":169584},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360423034,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":169770},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360423197,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":4,"tts":169889},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360424083,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":170005},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360424985,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":170111},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360425252,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":4,"tts":170219},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360425391,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":170326},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360425699,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":170428},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360426537,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":170487},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360426760,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":170544},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360426907,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":170611},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360427177,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":170677},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360428028,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":170734},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360428175,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":170792},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360428300,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":170860},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360487167,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":171031},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360487607,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":171173},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360488974,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":171443},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360253910,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":62},"dur":54,"tdur":51,"tts":1455544},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360253984,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":4,"tts":1455617},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360254014,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":531,"tdur":394,"tts":1455647},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360254021,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":491,"tdur":354,"tts":1455653},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360254516,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":26,"tdur":26,"tts":1456013},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360254550,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":8,"tdur":6,"tts":1456048},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360254573,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":297,"tdur":297,"tts":1456070},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360254580,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":288,"tdur":288,"tts":1456077},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360254650,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":62},"dur":50,"tdur":48,"tts":1456148},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360254786,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1456284,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360254792,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":269},"dur":73,"tdur":72,"tts":1456289},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360254795,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":69,"tdur":68,"tts":1456292},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360254881,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1456378},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360254902,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":537,"tdur":381,"tts":1456399},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360254907,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":505,"tdur":348,"tts":1456405},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360255416,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":19,"tts":1456759},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360255445,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":19,"tdur":18,"tts":1456787},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360255452,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":11,"tdur":10,"tts":1456794},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360255480,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":110,"tdur":109,"tts":1456822},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360255485,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":103,"tdur":102,"tts":1456827},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360255525,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":46,"tdur":44,"tts":1456868},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360255594,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":2094,"tdur":1126,"tts":1456936},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360255601,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":2084,"tdur":1115,"tts":1456943},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360257709,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":889,"tdur":889,"tts":1458083},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360257720,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":876,"tdur":875,"tts":1458095},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360258577,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":55},"dur":16,"tdur":15,"tts":1458952},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360258604,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1458978},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360258624,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":473,"tdur":339,"tts":1458998},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360258630,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":445,"tdur":311,"tts":1459004},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360259078,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":17,"tdur":15,"tts":1459320},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360259101,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1459342},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360259117,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":223,"tdur":221,"tts":1459359},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360259124,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":214,"tdur":214,"tts":1459365},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360259154,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":55},"dur":36,"tdur":35,"tts":1459395},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360259253,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1459495,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360259259,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":270},"dur":76,"tdur":76,"tts":1459500},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360259262,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":72,"tdur":71,"tts":1459503},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360259345,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1459586},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360259365,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":476,"tdur":342,"tts":1459606},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360259370,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":450,"tdur":314,"tts":1459612},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360259823,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":16,"tdur":15,"tts":1459931},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360259846,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":19,"tdur":17,"tts":1459954},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360259852,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":11,"tdur":10,"tts":1459960},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360259876,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":95,"tdur":94,"tts":1459984},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360259881,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":88,"tdur":87,"tts":1459989},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360259907,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":49,"tdur":48,"tts":1460014},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360259975,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":8904,"tdur":1674,"tts":1460083},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360259982,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":8894,"tdur":1664,"tts":1460090},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360268838,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":112},"dur":35,"tdur":31,"tts":1461719},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360268900,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1461779},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360268909,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":474,"tdur":407,"tts":1461787},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360268914,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":443,"tdur":374,"tts":1461793},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360269362,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":18,"tts":1462173},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360269401,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1462213},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360269409,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":265,"tdur":213,"tts":1462221},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360269415,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":232,"tdur":181,"tts":1462226},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360269651,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":19,"tts":1462413},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360269692,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":473,"tdur":424,"tts":1462453},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360269698,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":217,"tdur":166,"tts":1462460},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360269919,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":244,"tdur":243,"tts":1462632},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360269970,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":112},"dur":38,"tdur":37,"tts":1462683},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360270080,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1462794,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360270086,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":271},"dur":74,"tdur":73,"tts":1462799},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360270089,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":69,"tdur":68,"tts":1462802},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360270172,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":15,"tdur":15,"tts":1462884},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360270206,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":419,"tdur":301,"tts":1462919},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360270211,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":392,"tdur":273,"tts":1462924},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360270606,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":17,"tdur":17,"tts":1463201},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360270629,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":99,"tdur":98,"tts":1463225},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360270635,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":91,"tdur":90,"tts":1463231},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360270671,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":41,"tdur":40,"tts":1463267},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360270744,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":15079,"tdur":1720,"tts":1463339},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360270751,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":15069,"tdur":1711,"tts":1463346},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360285779,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":115},"dur":37,"tdur":35,"tts":1465018},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360285829,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1465066},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360285852,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":452,"tdur":348,"tts":1465089},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360285858,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":420,"tdur":314,"tts":1465096},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360286282,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":20,"tdur":19,"tts":1465416},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360286310,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":4,"tts":1465444},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360286329,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":310,"tdur":207,"tts":1465463},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360286335,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":278,"tdur":173,"tts":1465469},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360286617,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":19,"tts":1465648},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360286645,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":525,"tdur":419,"tts":1465676},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360286651,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":259,"tdur":151,"tts":1465682},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360286914,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":253,"tdur":252,"tts":1465840},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360286975,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":115},"dur":38,"tdur":36,"tts":1465901},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360287085,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1466011,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360287091,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":272},"dur":73,"tdur":73,"tts":1466016},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360287094,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":69,"tdur":69,"tts":1466019},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360287192,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":32,"tdur":32,"tts":1466117},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360287487,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1466191},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360289901,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":317,"tdur":209,"tts":1466253},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360289914,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":277,"tdur":169,"tts":1466265},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360290195,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":19,"tts":1466440},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360290223,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":123,"tdur":122,"tts":1466468},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360290230,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":114,"tdur":112,"tts":1466475},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360290253,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":76,"tdur":75,"tts":1466498},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360291909,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":27764,"tdur":2091,"tts":1466659},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360291925,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":27745,"tdur":2074,"tts":1466674},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360319641,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":239},"dur":25,"tdur":23,"tts":1468721},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360319679,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1468757},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360319708,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":507,"tdur":380,"tts":1468786},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360319714,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":475,"tdur":347,"tts":1468793},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360320193,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":18,"tts":1469146},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360320220,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1469173},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360320240,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":232,"tdur":232,"tts":1469192},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360320247,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":223,"tdur":222,"tts":1469199},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360320279,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":239},"dur":37,"tdur":35,"tts":1469232},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360320388,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1469341,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360320394,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":273},"dur":73,"tdur":72,"tts":1469346},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360320397,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":69,"tdur":68,"tts":1469349},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360320477,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1469430},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360320498,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":382,"tdur":317,"tts":1469451},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360320504,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":368,"tdur":303,"tts":1469456},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360320873,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":7,"tdur":6,"tts":1469761},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360320882,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":8,"tdur":7,"tts":1469770},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360320885,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":4,"tdur":5,"tts":1469772},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360320895,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":111,"tdur":110,"tts":1469783},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360320897,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":108,"tdur":107,"tts":1469785},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360320931,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":51,"tdur":50,"tts":1469819},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360321007,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":2493,"tdur":1717,"tts":1469895},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360321010,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":2487,"tdur":1712,"tts":1469898},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360323464,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":245},"dur":29,"tdur":27,"tts":1471579},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360323520,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":4,"tts":1471634},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360323528,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":368,"tdur":270,"tts":1471642},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360323535,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":352,"tdur":255,"tts":1471648},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360323888,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":7,"tdur":6,"tts":1471905},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360323902,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":1,"tts":1471919},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360323905,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":282,"tdur":255,"tts":1471922},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360323911,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":274,"tdur":247,"tts":1471928},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360323951,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":245},"dur":36,"tdur":35,"tts":1471968},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360324099,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1472091,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360324106,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":274},"dur":76,"tdur":75,"tts":1472097},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360324109,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":72,"tdur":71,"tts":1472100},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360324206,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1472197},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360324214,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":417,"tdur":350,"tts":1472205},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360324218,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":391,"tdur":324,"tts":1472209},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360324612,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":17,"tdur":16,"tts":1472537},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360324645,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":19,"tdur":18,"tts":1472570},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360324651,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":11,"tdur":11,"tts":1472576},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360324666,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":76,"tdur":76,"tts":1472591},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360324670,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":72,"tdur":71,"tts":1472595},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360324691,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":45,"tdur":44,"tts":1472616},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360324749,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":11400,"tdur":1855,"tts":1472673},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360324752,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":11394,"tdur":1849,"tts":1472676},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360336112,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":19},"dur":31,"tdur":28,"tts":1474493},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360336155,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1474534},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360336179,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":517,"tdur":374,"tts":1474558},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360336186,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":484,"tdur":341,"tts":1474565},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360336674,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":20,"tdur":18,"tts":1474912},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360336702,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1474939},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360336722,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":230,"tdur":229,"tts":1474959},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360336728,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":222,"tdur":221,"tts":1474965},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360336759,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":19},"dur":37,"tdur":35,"tts":1474997},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360336868,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1475106,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360336874,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":275},"dur":73,"tdur":72,"tts":1475111},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360336877,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":69,"tdur":68,"tts":1475114},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360336957,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1475194},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360336978,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":458,"tdur":365,"tts":1475215},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360336983,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":426,"tdur":333,"tts":1475220},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360337413,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":19,"tts":1475559},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360337442,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":19,"tdur":19,"tts":1475587},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360337449,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":11,"tdur":10,"tts":1475594},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360337485,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":64,"tdur":64,"tts":1475630},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360337488,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":60,"tdur":58,"tts":1475634},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360337504,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":35,"tdur":33,"tts":1475650},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360337552,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":15115,"tdur":1957,"tts":1475697},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360337556,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":15108,"tdur":1949,"tts":1475702},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360352630,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":162},"dur":30,"tdur":28,"tts":1477619},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360352688,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1477676},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360352696,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":451,"tdur":372,"tts":1477684},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360352702,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":419,"tdur":339,"tts":1477690},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360353125,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":18,"tts":1478035},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360353165,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1478075},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360353173,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":236,"tdur":236,"tts":1478083},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360353179,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":228,"tdur":227,"tts":1478089},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360353211,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":162},"dur":36,"tdur":34,"tts":1478121},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360353318,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1478229,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360353325,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":276},"dur":79,"tdur":79,"tts":1478235},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360353328,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":75,"tdur":74,"tts":1478238},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360353428,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":23,"tdur":22,"tts":1478338},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360353454,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":382,"tdur":317,"tts":1478364},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360353459,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":366,"tdur":300,"tts":1478369},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360353827,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":8,"tdur":8,"tts":1478672},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360353847,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1478692},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360354047,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":18,"tdur":18,"tts":1478719},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360354054,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":10,"tdur":9,"tts":1478726},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360354067,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":42,"tdur":42,"tts":1478739},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360354069,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":39,"tdur":39,"tts":1478741},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360354079,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":23,"tdur":22,"tts":1478752},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360354753,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":30642,"tdur":1029,"tts":1478809},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360354761,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":30631,"tdur":1017,"tts":1478816},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360358078,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":29,"tdur":29,"tts":93817},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360358334,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":18,"tts":93871},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360358486,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":10,"tdur":9,"tts":93896},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360358497,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":12,"tdur":11,"tts":93907},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360358758,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":9,"tdur":9,"tts":93925},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360359728,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":16,"tdur":15,"tts":93941},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360359853,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":16,"tdur":15,"tts":93964},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360359902,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":8,"tdur":8,"tts":93986},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360359937,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":8,"tdur":8,"tts":94002},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360420448,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":50,"tts":94069},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360420973,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":61,"tdur":59,"tts":94182},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360422583,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":73,"tdur":69,"tts":94306},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360422948,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":27,"tdur":26,"tts":94426},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360423149,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":20,"tdur":18,"tts":94492},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360423170,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":10,"tdur":9,"tts":94512},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360424032,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":19,"tts":94562},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360424950,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":26,"tdur":24,"tts":94621},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360425175,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":24,"tdur":22,"tts":94685},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360425327,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":24,"tdur":23,"tts":94746},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360425353,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":4,"tts":94771},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360425652,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":20,"tdur":19,"tts":94813},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360426505,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":24,"tdur":24,"tts":94872},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360426728,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":24,"tdur":24,"tts":94936},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360426874,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":25,"tdur":24,"tts":94997},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360426901,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":6,"tts":95022},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360427143,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":20,"tdur":20,"tts":95064},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360427985,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":35,"tdur":27,"tts":95107},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360428141,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":27,"tdur":26,"tts":95170},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360428277,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":15,"tdur":14,"tts":95221},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360428293,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":5,"tts":95236},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360487030,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":61,"tdur":59,"tts":95269},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360487469,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":65,"tdur":63,"tts":95379},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360488843,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":59,"tdur":56,"tts":95511},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360489182,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":27,"tdur":27,"tts":95613},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360489448,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":26,"tdur":25,"tts":95678},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360489641,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":26,"tdur":24,"tts":95743},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360489668,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":6,"tdur":6,"tts":95768},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360490244,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":20,"tdur":19,"tts":95816},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360491146,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":24,"tdur":23,"tts":95876},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360491400,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":24,"tdur":23,"tts":95938},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360491584,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":24,"tdur":23,"tts":96001},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360491609,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":4,"tts":96026},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360491926,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":21,"tts":96067},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360492790,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":25,"tdur":23,"tts":96127},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360492989,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":25,"tdur":24,"tts":96187},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360493148,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":20,"tdur":19,"tts":96248},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360493169,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":12,"tdur":11,"tts":96269},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360493451,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":14,"tdur":13,"tts":96307},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360494311,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":17,"tdur":16,"tts":96345},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360494489,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":17,"tdur":17,"tts":96386},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360494620,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":16,"tdur":16,"tts":96427},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360494637,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":4,"tts":96444},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360553619,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":74,"tdur":73,"tts":96481},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360554093,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":62,"tdur":60,"tts":96577},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360555784,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":83,"tdur":82,"tts":96664},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360556238,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":49,"tts":96814},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360556552,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":52,"tdur":50,"tts":96925},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360556607,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":11,"tdur":10,"tts":96979},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360557199,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":42,"tdur":40,"tts":97056},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360558967,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":52,"tdur":49,"tts":97166},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360559399,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":53,"tdur":50,"tts":97278},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360559709,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":52,"tdur":50,"tts":97388},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360559764,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":12,"tdur":11,"tts":97442},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360560410,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":41,"tdur":39,"tts":97524},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360385402,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":886,"tdur":885,"tts":1479846},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360385419,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":867,"tdur":866,"tts":1479863},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360386259,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":51},"dur":24,"tdur":22,"tts":1480703},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360386314,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1480757},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360386322,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":499,"tdur":364,"tts":1480765},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360386327,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":468,"tdur":331,"tts":1480771},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360386799,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":20,"tdur":18,"tts":1481108},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360386839,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1481147},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360386847,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":231,"tdur":231,"tts":1481155},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360386853,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":223,"tdur":223,"tts":1481161},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360386885,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":51},"dur":36,"tdur":35,"tts":1481193},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360386994,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1481303,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360387000,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":277},"dur":74,"tdur":73,"tts":1481308},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360387003,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":69,"tdur":69,"tts":1481311},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360387097,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1481405},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360387104,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":356,"tdur":293,"tts":1481413},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360387109,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":340,"tdur":277,"tts":1481417},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360387451,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":8,"tdur":8,"tts":1481697},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360387467,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":10,"tdur":9,"tts":1481713},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360387471,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":6,"tdur":5,"tts":1481717},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360387479,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":103,"tdur":103,"tts":1481724},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360387495,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":85,"tdur":84,"tts":1481741},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360387514,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":52,"tdur":51,"tts":1481760},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360387608,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":2967,"tdur":2025,"tts":1481854},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360387612,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":2961,"tdur":2018,"tts":1481858},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360390544,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":173},"dur":25,"tdur":22,"tts":1483850},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360390581,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1483885},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360390604,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":428,"tdur":330,"tts":1483908},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360390611,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":399,"tdur":300,"tts":1483915},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360391013,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":17,"tdur":16,"tts":1484220},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360391037,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":4,"tts":1484243},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360391053,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":220,"tdur":220,"tts":1484259},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360391059,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":212,"tdur":211,"tts":1484266},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360391090,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":173},"dur":34,"tdur":33,"tts":1484297},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360391186,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1484394,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360391192,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":278},"dur":76,"tdur":75,"tts":1484399},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360391196,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":71,"tdur":71,"tts":1484402},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360391279,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1484486},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360391299,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":488,"tdur":352,"tts":1484506},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360391304,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":462,"tdur":326,"tts":1484511},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360391769,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":16,"tdur":15,"tts":1484841},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360391791,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":16,"tdur":15,"tts":1484863},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360391797,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":9,"tdur":8,"tts":1484869},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360391819,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":88,"tdur":87,"tts":1484891},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360391824,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":81,"tdur":80,"tts":1484896},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360391844,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":48,"tdur":47,"tts":1484916},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360391911,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":10614,"tdur":1830,"tts":1484983},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360391918,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":10604,"tdur":1820,"tts":1484990},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360402491,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":11},"dur":28,"tdur":24,"tts":1486782},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360402546,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1486835},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360402554,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":396,"tdur":326,"tts":1486843},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360402560,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":368,"tdur":298,"tts":1486849},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360402931,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":17,"tdur":16,"tts":1487151},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360402965,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":4,"tts":1487185},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360402972,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":158,"tdur":106,"tts":1487191},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360402976,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":143,"tdur":90,"tts":1487196},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360403121,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":8,"tdur":8,"tts":1487288},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360403153,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":346,"tdur":295,"tts":1487320},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360403158,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":126,"tdur":74,"tts":1487326},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360403285,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":212,"tdur":211,"tts":1487402},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360403320,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":11},"dur":37,"tdur":36,"tts":1487437},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360403420,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1487538,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360403427,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":279},"dur":67,"tdur":66,"tts":1487544},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360403430,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":63,"tdur":62,"tts":1487547},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360403504,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":13,"tdur":12,"tts":1487621},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360403532,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":322,"tdur":261,"tts":1487649},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360403537,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":306,"tdur":244,"tts":1487654},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360403844,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":9,"tdur":8,"tts":1487901},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360403856,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":105,"tdur":104,"tts":1487912},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360403873,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":86,"tdur":85,"tts":1487929},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360403896,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":49,"tdur":49,"tts":1487952},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360403985,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":14862,"tdur":1540,"tts":1488041},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360403989,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":14856,"tdur":1534,"tts":1488045},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360418815,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":89},"dur":26,"tdur":23,"tts":1489552},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360418853,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1489588},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360418876,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":464,"tdur":353,"tts":1489611},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360418883,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":431,"tdur":319,"tts":1489618},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360419318,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":18,"tts":1489943},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360419346,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1489971},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360419366,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":310,"tdur":206,"tts":1489990},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360419371,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":278,"tdur":172,"tts":1489996},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360419653,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":21,"tdur":19,"tts":1490174},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360419683,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":525,"tdur":413,"tts":1490203},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360419689,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":251,"tdur":151,"tts":1490209},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360419944,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":261,"tdur":248,"tts":1490366},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360419982,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":89},"dur":68,"tdur":53,"tts":1490405},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360420123,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1490533,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360420129,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":280},"dur":73,"tdur":72,"tts":1490538},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360420132,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":69,"tdur":68,"tts":1490541},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360420230,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":23,"tdur":22,"tts":1490639},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360420505,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1490702},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360421040,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":318,"tdur":211,"tts":1490764},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360421053,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":277,"tdur":170,"tts":1490777},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360421334,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":21,"tdur":20,"tts":1490953},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360421363,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":69,"tdur":68,"tts":1490982},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360421370,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":61,"tdur":60,"tts":1490989},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360421399,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":25,"tdur":25,"tts":1491017},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360422651,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":30213,"tdur":2010,"tts":1491107},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360422668,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":30193,"tdur":1991,"tts":1491123},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360452834,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":55},"dur":23,"tdur":20,"tts":1493090},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360452870,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1493124},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360452900,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":516,"tdur":377,"tts":1493154},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360452906,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":483,"tdur":343,"tts":1493160},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360453394,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":19,"tts":1493509},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360453422,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1493537},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360453442,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":343,"tdur":210,"tts":1493558},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360453448,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":311,"tdur":177,"tts":1493563},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360453763,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":19,"tts":1493746},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360453791,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":545,"tdur":415,"tts":1493774},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360453797,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":302,"tdur":172,"tts":1493780},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360454103,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":231,"tdur":229,"tts":1493958},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360454142,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":55},"dur":38,"tdur":36,"tts":1493997},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360454251,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1494106,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360454257,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":281},"dur":74,"tdur":73,"tts":1494111},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360454260,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":70,"tdur":69,"tts":1494114},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360454358,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1494212},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360454366,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":467,"tdur":379,"tts":1494220},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360454371,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":435,"tdur":346,"tts":1494225},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360454810,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":21,"tdur":19,"tts":1494577},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360454851,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":78,"tdur":77,"tts":1494618},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360454858,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":69,"tdur":68,"tts":1494625},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360454890,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":30,"tdur":28,"tts":1494657},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360454931,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":2570,"tdur":1820,"tts":1494698},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360454935,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":2563,"tdur":1815,"tts":1494701},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360457465,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":130},"dur":29,"tdur":27,"tts":1496485},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360457522,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1496540},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360457530,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":249,"tdur":140,"tts":1496548},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360457536,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":228,"tdur":118,"tts":1496554},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360457765,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":13,"tdur":12,"tts":1496675},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360457806,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1496715},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360457814,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":216,"tdur":215,"tts":1496723},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360457820,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":208,"tdur":207,"tts":1496729},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360457850,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":130},"dur":36,"tdur":35,"tts":1496759},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360457950,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1496860,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360457956,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":282},"dur":69,"tdur":67,"tts":1496866},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360457959,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":65,"tdur":63,"tts":1496869},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360458048,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1496958},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360458056,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":424,"tdur":339,"tts":1496965},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360458060,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":408,"tdur":322,"tts":1496970},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360458470,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":9,"tdur":8,"tts":1497295},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360458488,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":27,"tdur":26,"tts":1497313},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360458491,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":23,"tdur":22,"tts":1497316},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360458518,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":91,"tdur":91,"tts":1497343},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360458523,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":85,"tdur":84,"tts":1497348},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360458544,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":50,"tdur":49,"tts":1497369},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360458624,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":11091,"tdur":2004,"tts":1497449},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360458631,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":11081,"tdur":1995,"tts":1497456},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360469685,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":115},"dur":24,"tdur":21,"tts":1499426},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360469721,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1499460},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360469744,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":447,"tdur":313,"tts":1499484},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360469751,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":418,"tdur":285,"tts":1499490},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360470172,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":17,"tdur":15,"tts":1499780},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360470195,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":4,"tts":1499802},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360470212,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":217,"tdur":216,"tts":1499819},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360470218,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":209,"tdur":207,"tts":1499826},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360470248,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":115},"dur":36,"tdur":34,"tts":1499856},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360470347,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1499955,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360470353,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":283},"dur":71,"tdur":70,"tts":1499960},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360470356,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":67,"tdur":66,"tts":1499963},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360470434,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1500041},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360470454,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":496,"tdur":365,"tts":1500061},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360470459,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":470,"tdur":337,"tts":1500067},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360470932,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":16,"tdur":15,"tts":1500409},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360470954,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":18,"tdur":17,"tts":1500431},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360470959,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":11,"tdur":11,"tts":1500436},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360470984,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":89,"tdur":88,"tts":1500461},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360470989,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":82,"tdur":81,"tts":1500466},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360471010,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":48,"tdur":47,"tts":1500487},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360471077,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":14999,"tdur":1744,"tts":1500554},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360471083,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":14990,"tdur":1735,"tts":1500560},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360486042,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":20},"dur":27,"tdur":25,"tts":1502266},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360486097,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":4,"tts":1502321},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360486106,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":496,"tdur":367,"tts":1502329},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360486112,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":464,"tdur":334,"tts":1502335},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360486580,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":18,"tts":1502675},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360486620,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1502714},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360486627,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":239,"tdur":238,"tts":1502722},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360486633,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":231,"tdur":230,"tts":1502728},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360486665,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":20},"dur":37,"tdur":36,"tts":1502760},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360486775,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1502870,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360486780,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":284},"dur":81,"tdur":80,"tts":1502875},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360486784,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":76,"tdur":75,"tts":1502878},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360486885,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":23,"tdur":22,"tts":1502980},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360486911,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":441,"tdur":366,"tts":1503005},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360486916,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":403,"tdur":326,"tts":1503011},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360487321,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":28,"tdur":28,"tts":1503340},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360487376,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1503396},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360487540,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":40,"tdur":38,"tts":1503468},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360487556,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":21,"tdur":19,"tts":1503484},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360487584,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":104,"tdur":102,"tts":1503512},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360487590,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":96,"tdur":95,"tts":1503517},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360487616,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":56,"tdur":54,"tts":1503544},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360488911,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":12777,"tdur":837,"tts":1503687},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360488937,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":12748,"tdur":808,"tts":1503712},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360501695,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":919,"tdur":918,"tts":1504532},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360501706,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":906,"tdur":906,"tts":1504542},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360502592,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":169},"dur":17,"tdur":15,"tts":1505430},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360502640,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1505477},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360502649,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":465,"tdur":335,"tts":1505485},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360502655,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":437,"tdur":307,"tts":1505491},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360503096,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":16,"tdur":16,"tts":1505802},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360503128,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1505835},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360503136,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":223,"tdur":222,"tts":1505843},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360503142,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":215,"tdur":215,"tts":1505848},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360503177,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":169},"dur":36,"tdur":34,"tts":1505885},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360503278,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1505985,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360503284,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":285},"dur":70,"tdur":69,"tts":1505991},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360503287,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":66,"tdur":64,"tts":1505994},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360503377,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1506084},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360503384,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":440,"tdur":345,"tts":1506091},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360503389,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":424,"tdur":329,"tts":1506096},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360503814,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":9,"tdur":8,"tts":1506427},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360503831,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":9,"tdur":9,"tts":1506444},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360503834,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":6,"tdur":5,"tts":1506447},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360503841,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":61,"tdur":61,"tts":1506454},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360503844,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":57,"tdur":58,"tts":1506456},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360503854,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":40,"tdur":39,"tts":1506467},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360503910,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":15087,"tdur":1525,"tts":1506523},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360503914,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":15080,"tdur":1519,"tts":1506527},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360518963,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":125},"dur":28,"tdur":25,"tts":1508017},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360519003,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1508055},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360519026,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":458,"tdur":349,"tts":1508079},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360519033,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":425,"tdur":316,"tts":1508085},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360519462,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":20,"tdur":18,"tts":1508407},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360519490,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1508435},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360519510,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":239,"tdur":238,"tts":1508455},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360519517,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":230,"tdur":229,"tts":1508462},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360519549,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":125},"dur":36,"tdur":35,"tts":1508494},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360519658,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1508603,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360519664,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":286},"dur":80,"tdur":80,"tts":1508608},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360519667,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":76,"tdur":76,"tts":1508611},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360519755,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1508699},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360519775,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":477,"tdur":379,"tts":1508720},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360519780,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":445,"tdur":345,"tts":1508725},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360520229,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":21,"tdur":20,"tts":1509076},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360520259,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":29,"tdur":28,"tts":1509106},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360520266,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":21,"tdur":20,"tts":1509113},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360520296,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":50,"tdur":49,"tts":1509143},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360520298,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":47,"tdur":46,"tts":1509145},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360520311,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":27,"tdur":27,"tts":1509158},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360520348,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":15615,"tdur":1725,"tts":1509195},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360520351,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":15609,"tdur":1719,"tts":1509198},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360535937,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":47},"dur":20,"tdur":16,"tts":1510897},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360535984,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1510942},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360535992,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":493,"tdur":371,"tts":1510950},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360535998,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":461,"tdur":338,"tts":1510956},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360536463,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":18,"tts":1511300},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360536503,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1511340},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360536511,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":308,"tdur":202,"tts":1511348},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360536516,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":276,"tdur":169,"tts":1511353},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360536797,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":19,"tts":1511528},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360536838,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":522,"tdur":423,"tts":1511569},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360536844,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":248,"tdur":147,"tts":1511576},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360537096,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":261,"tdur":260,"tts":1511729},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360537134,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":47},"dur":37,"tdur":36,"tts":1511767},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360537250,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1511883,"s":"t"},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360489252,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":21,"tdur":19,"tts":171613},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360489483,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":4,"tts":171738},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360489676,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":171855},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360490272,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":171917},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360491221,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":172061},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360491469,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":4,"tts":172204},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360491634,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":4,"tts":172322},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360491955,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":172385},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360492840,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":172460},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360493021,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":172522},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360493175,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":172591},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360493185,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":172601},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360493473,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":172657},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360494336,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":172712},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360494514,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":172769},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360494643,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":172838},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360553718,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":173021},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360554171,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":13,"tdur":11,"tts":173198},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360555883,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":173418},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360556376,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":173684},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360556686,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":13,"tdur":10,"tts":173940},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360557314,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":8,"tts":174219},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360559035,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":8,"tdur":6,"tts":174384},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360559468,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":8,"tdur":6,"tts":174537},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360559776,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":7,"tdur":6,"tts":174710},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360560523,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":174976},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360562331,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":175249},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360562804,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":8,"tts":175523},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360562970,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":8,"tdur":6,"tts":175673},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360562993,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":175696},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360563622,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":175953},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360565474,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":176217},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360565863,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":176460},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360566039,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":7,"tdur":6,"tts":176626},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360566068,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":176655},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360621293,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":176875},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360621842,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":8,"tts":177091},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360622935,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":177299},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360623247,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":4,"tts":177452},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360623502,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":177585},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360623657,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":177692},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360623946,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":177765},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360624731,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":177817},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360624942,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":177868},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360625057,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":177925},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360625355,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":178000},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360626139,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":178078},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360626311,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":178150},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360626421,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":178228},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360626720,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":178326},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360627476,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":178421},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360627627,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":178473},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360627738,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":178533},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360687368,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":20,"tdur":18,"tts":178729},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360688800,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":178931},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360690651,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":8,"tts":179144},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360691191,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":179416},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360691508,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":13,"tdur":10,"tts":179654},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360692074,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":179896},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360693986,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":8,"tts":180167},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360694442,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":180435},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360694686,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":7,"tdur":6,"tts":180634},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360694708,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":180656},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360695342,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":7,"tdur":5,"tts":180806},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360537256,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":287},"dur":97,"tdur":96,"tts":1511889},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360537282,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":70,"tdur":69,"tts":1511915},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360537366,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1511999},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360537389,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":450,"tdur":373,"tts":1512022},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360537395,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":416,"tdur":338,"tts":1512028},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360537815,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":22,"tdur":20,"tts":1512373},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360537845,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":77,"tdur":77,"tts":1512402},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360537852,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":70,"tdur":69,"tts":1512409},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360537875,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":39,"tdur":26,"tts":1512444},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360537931,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":14681,"tdur":1709,"tts":1512488},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360537935,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":14674,"tdur":1702,"tts":1512492},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360552587,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":93},"dur":19,"tdur":16,"tts":1514174},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360552618,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1514204},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360552642,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":509,"tdur":371,"tts":1514227},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360552649,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":476,"tdur":337,"tts":1514234},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360553129,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":18,"tts":1514577},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360553156,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":3,"tts":1514605},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360553176,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":237,"tdur":237,"tts":1514624},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360553183,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":228,"tdur":228,"tts":1514631},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360553213,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":93},"dur":37,"tdur":35,"tts":1514662},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360553321,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1514770,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360553328,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":288},"dur":80,"tdur":80,"tts":1514776},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360553331,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":76,"tdur":75,"tts":1514779},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360553418,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":23,"tdur":21,"tts":1514867},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360553457,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":409,"tdur":334,"tts":1514905},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360553462,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":373,"tdur":296,"tts":1514911},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360553837,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":27,"tdur":26,"tts":1515210},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360553872,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":3,"tts":1515245},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360554135,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":33,"tdur":30,"tts":1515302},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360554147,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":19,"tdur":17,"tts":1515313},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360554172,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":112,"tdur":111,"tts":1515338},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360554186,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":97,"tdur":95,"tts":1515352},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360554227,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":42,"tdur":40,"tts":1515393},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360555824,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":30177,"tdur":1840,"tts":1515500},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360555836,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":30162,"tdur":1826,"tts":1515511},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360585976,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":109},"dur":19,"tdur":16,"tts":1517318},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360586007,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1517347},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360586036,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":512,"tdur":376,"tts":1517376},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360586043,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":479,"tdur":343,"tts":1517383},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360586526,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":18,"tts":1517732},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360586554,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":4,"tts":1517759},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360586574,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":247,"tdur":247,"tts":1517779},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360586581,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":238,"tdur":238,"tts":1517786},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360586627,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":109},"dur":37,"tdur":36,"tts":1517832},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360586737,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1517942,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360586743,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":289},"dur":73,"tdur":73,"tts":1517948},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360586746,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":69,"tdur":68,"tts":1517951},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360586827,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1518032},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360586848,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":445,"tdur":380,"tts":1518053},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360586853,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":413,"tdur":347,"tts":1518058},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360587270,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":19,"tts":1518411},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360587299,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":19,"tdur":19,"tts":1518440},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360587306,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":11,"tdur":10,"tts":1518447},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360587334,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":60,"tdur":60,"tts":1518475},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360587350,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":44,"tdur":43,"tts":1518491},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360587367,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":21,"tdur":20,"tts":1518508},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360587396,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":2477,"tdur":1726,"tts":1518537},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360587399,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":2471,"tdur":1720,"tts":1518540},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360589840,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":145},"dur":26,"tdur":24,"tts":1520232},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360589893,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1520284},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360589902,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":408,"tdur":313,"tts":1520293},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360589908,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":380,"tdur":285,"tts":1520299},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360590292,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":16,"tdur":15,"tts":1520589},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360590325,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":4,"tts":1520622},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360562179,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":70,"tdur":68,"tts":97631},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360562669,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":53,"tdur":50,"tts":97765},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360562900,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":50,"tdur":48,"tts":97877},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360562953,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":26,"tdur":26,"tts":97928},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360563502,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":44,"tdur":41,"tts":98020},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360565343,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":54,"tdur":52,"tts":98128},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360565763,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":53,"tdur":51,"tts":98248},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360565975,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":31,"tdur":28,"tts":98360},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360566039,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":21,"tts":98404},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360621186,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":66,"tdur":63,"tts":98488},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360621709,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":62,"tdur":60,"tts":98617},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360622863,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":57,"tdur":54,"tts":98708},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360623182,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":24,"tdur":22,"tts":98806},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360623442,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":21,"tts":98864},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360623610,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":21,"tts":98925},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360623632,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":5,"tts":98947},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360623920,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":19,"tdur":17,"tts":98988},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360624703,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":22,"tdur":21,"tts":99044},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360624912,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":23,"tdur":22,"tts":99101},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360625035,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":15,"tdur":15,"tts":99147},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360625051,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":4,"tts":99163},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360625314,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":12,"tdur":11,"tts":99192},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360626093,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":14,"tdur":13,"tts":99228},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360626270,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":14,"tdur":13,"tts":99265},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360626402,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":12,"tdur":10,"tts":99300},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360626415,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":8,"tdur":8,"tts":99311},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360626677,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":13,"tdur":13,"tts":99342},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360627430,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":14,"tdur":14,"tts":99379},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360627605,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":15,"tdur":14,"tts":99414},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360627719,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":12,"tdur":11,"tts":99451},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360627731,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":4,"tts":99463},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360687263,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":82,"tdur":80,"tts":99496},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360688725,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":59,"tdur":58,"tts":99606},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360690557,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":72,"tdur":70,"tts":99692},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360691055,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":49,"tts":99833},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360691383,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":54,"tdur":51,"tts":99951},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360691440,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":12,"tdur":10,"tts":100007},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360692028,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":35,"tdur":32,"tts":100087},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360693840,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":49,"tts":100181},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360694312,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":49,"tts":100297},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360694629,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":41,"tdur":39,"tts":100408},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360694673,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":24,"tdur":23,"tts":100451},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360695261,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":44,"tdur":42,"tts":100539},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360697157,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":49,"tts":100645},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360697614,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":48,"tts":100757},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360697827,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":31,"tdur":29,"tts":100867},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360697864,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":29,"tdur":29,"tts":100902},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360698373,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":43,"tdur":41,"tts":100999},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360700049,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":39,"tdur":37,"tts":101119},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360700213,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":52,"tdur":50,"tts":101223},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360700520,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":52,"tdur":50,"tts":101353},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360700726,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":15,"tdur":13,"tts":101445},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360700794,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":24,"tdur":22,"tts":101498},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360771237,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":48,"tts":101597},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360771940,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":23,"tdur":23,"tts":101673},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360773677,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":84,"tdur":81,"tts":101757},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360774164,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":57,"tdur":54,"tts":101909},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360774474,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":42,"tdur":39,"tts":102024},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360774519,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":28,"tdur":27,"tts":102067},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360775119,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":43,"tdur":41,"tts":102164},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360777020,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":52,"tdur":50,"tts":102274},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360777457,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":48,"tts":102397},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360777778,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":49,"tts":102507},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360777832,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":11,"tdur":11,"tts":102559},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360590332,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":245,"tdur":244,"tts":1520629},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360590355,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":220,"tdur":219,"tts":1520652},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360590390,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":145},"dur":37,"tdur":34,"tts":1520688},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360590490,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1520788,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360590496,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":290},"dur":76,"tdur":75,"tts":1520793},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360590499,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":72,"tdur":71,"tts":1520796},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360590596,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1520893},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360590603,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":393,"tdur":337,"tts":1520900},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360590608,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":366,"tdur":309,"tts":1520905},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360590977,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":17,"tdur":15,"tts":1521219},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360591010,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":19,"tdur":18,"tts":1521251},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360591016,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":12,"tdur":10,"tts":1521258},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360591032,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":71,"tdur":70,"tts":1521273},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360591036,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":66,"tdur":65,"tts":1521277},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360591079,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":17,"tdur":17,"tts":1521320},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360591109,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":11726,"tdur":1766,"tts":1521350},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360591111,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":11721,"tdur":1761,"tts":1521352},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360602804,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":94},"dur":25,"tdur":22,"tts":1523087},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360602840,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1523122},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360602864,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":517,"tdur":372,"tts":1523146},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360602871,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":484,"tdur":338,"tts":1523153},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360603359,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":19,"tts":1523497},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360603387,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":4,"tts":1523525},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360603406,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":364,"tdur":223,"tts":1523544},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360603412,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":331,"tdur":190,"tts":1523550},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360603747,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":19,"tts":1523746},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360603776,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":543,"tdur":409,"tts":1523775},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360603782,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":295,"tdur":160,"tts":1523781},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360604079,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":237,"tdur":236,"tts":1523945},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360604123,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":94},"dur":37,"tdur":36,"tts":1523989},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360604233,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1524099,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360604239,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":291},"dur":74,"tdur":73,"tts":1524105},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360604242,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":70,"tdur":69,"tts":1524108},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360604340,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1524206},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360604349,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":533,"tdur":406,"tts":1524214},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360604353,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":502,"tdur":373,"tts":1524219},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360604859,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":21,"tdur":19,"tts":1524598},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360604900,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":109,"tdur":108,"tts":1524639},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360604907,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":100,"tdur":99,"tts":1524646},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360604946,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":48,"tdur":45,"tts":1524686},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360605014,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":14381,"tdur":1713,"tts":1524752},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360605020,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":14372,"tdur":1703,"tts":1524759},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360619362,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":102},"dur":26,"tdur":23,"tts":1526435},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360619416,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1526487},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360619424,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":517,"tdur":372,"tts":1526495},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360619430,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":486,"tdur":339,"tts":1526501},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360619920,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":18,"tts":1526846},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360619959,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":4,"tts":1526886},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360619967,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":405,"tdur":224,"tts":1526893},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360619972,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":373,"tdur":191,"tts":1526898},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360620349,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":21,"tdur":20,"tts":1527095},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360620390,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":567,"tdur":432,"tts":1527136},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360620397,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":307,"tdur":172,"tts":1527142},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360620708,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":246,"tdur":245,"tts":1527320},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360620762,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":102},"dur":37,"tdur":36,"tts":1527374},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360620871,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1527484,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360620877,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":292},"dur":74,"tdur":73,"tts":1527489},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360620880,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":70,"tdur":69,"tts":1527492},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360620963,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":24,"tdur":23,"tts":1527575},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360621258,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1527646},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360621775,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":302,"tdur":196,"tts":1527705},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360621789,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":261,"tdur":155,"tts":1527718},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360622054,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":19,"tts":1527879},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360622083,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":72,"tdur":71,"tts":1527908},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360622090,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":64,"tdur":63,"tts":1527915},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360622125,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":20,"tdur":19,"tts":1527950},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360622915,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":12019,"tdur":865,"tts":1528021},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360622928,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":12003,"tdur":849,"tts":1528034},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360634941,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":883,"tdur":883,"tts":1528894},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360634952,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":870,"tdur":869,"tts":1528905},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360635796,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":78},"dur":23,"tdur":21,"tts":1529750},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360635850,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1529803},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360635857,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":474,"tdur":310,"tts":1529811},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360635863,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":446,"tdur":282,"tts":1529817},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360636313,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":16,"tdur":15,"tts":1530104},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360636347,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1530137},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360636354,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":219,"tdur":219,"tts":1530144},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360636359,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":212,"tdur":211,"tts":1530150},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360636388,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":78},"dur":34,"tdur":33,"tts":1530178},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360636492,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1530284,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360636498,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":293},"dur":71,"tdur":69,"tts":1530289},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360636501,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":66,"tdur":65,"tts":1530292},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360636592,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1530383},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360636600,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":421,"tdur":332,"tts":1530390},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360636604,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":408,"tdur":318,"tts":1530395},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360637013,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":7,"tdur":6,"tts":1530715},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360637026,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":8,"tdur":7,"tts":1530728},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360637029,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":4,"tdur":4,"tts":1530731},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360637035,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":55,"tdur":54,"tts":1530737},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360637037,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":52,"tdur":52,"tts":1530738},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360637050,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":31,"tdur":30,"tts":1530752},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360637098,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":15221,"tdur":1368,"tts":1530800},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360637102,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":15215,"tdur":1363,"tts":1530803},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360652286,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":205},"dur":27,"tdur":25,"tts":1532137},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360652325,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1532175},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360652349,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":512,"tdur":372,"tts":1532199},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360652356,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":479,"tdur":339,"tts":1532205},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360652839,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":17,"tts":1532551},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360652866,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1532578},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360652886,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":240,"tdur":240,"tts":1532597},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360652893,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":231,"tdur":231,"tts":1532604},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360652925,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":205},"dur":37,"tdur":35,"tts":1532637},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360653034,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1532746,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360653040,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":294},"dur":81,"tdur":80,"tts":1532752},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360653043,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":77,"tdur":75,"tts":1532755},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360653132,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1532843},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360653152,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":495,"tdur":369,"tts":1532864},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360653158,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":478,"tdur":353,"tts":1532869},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360653638,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":8,"tdur":8,"tts":1533224},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360653650,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":7,"tdur":7,"tts":1533236},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360653652,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":5,"tdur":4,"tts":1533239},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360653664,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":98,"tdur":97,"tts":1533250},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360653666,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":94,"tdur":93,"tts":1533252},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360653698,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":48,"tdur":46,"tts":1533285},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360653766,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":15197,"tdur":1396,"tts":1533352},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360653773,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":15187,"tdur":1387,"tts":1533359},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360668930,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":54},"dur":26,"tdur":23,"tts":1534719},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360668983,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1534770},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360668992,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":355,"tdur":291,"tts":1534778},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360668998,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":334,"tdur":269,"tts":1534784},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360669334,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":12,"tdur":11,"tts":1535056},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360669358,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":3,"tts":1535080},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360669363,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":175,"tdur":116,"tts":1535085},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360669367,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":156,"tdur":96,"tts":1535089},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360669525,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":12,"tdur":11,"tts":1535189},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360669549,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":466,"tdur":408,"tts":1535213},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360669553,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":141,"tdur":83,"tts":1535216},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360669696,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":316,"tdur":315,"tts":1535303},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360669736,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":54},"dur":73,"tdur":71,"tts":1535343},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360669900,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1535508,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360669909,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":295},"dur":100,"tdur":99,"tts":1535516},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360669914,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":93,"tdur":91,"tts":1535521},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360670022,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1535629},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360670045,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":406,"tdur":329,"tts":1535652},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360670050,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":390,"tdur":313,"tts":1535657},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360670442,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":8,"tdur":8,"tts":1535972},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360670453,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":80,"tdur":80,"tts":1535983},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360670455,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":76,"tdur":75,"tts":1535986},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360670464,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":53,"tdur":52,"tts":1535995},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360670550,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":15565,"tdur":1794,"tts":1536080},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360670557,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":15556,"tdur":1784,"tts":1536088},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360686083,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":13},"dur":26,"tdur":23,"tts":1537845},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360686121,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1537881},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360686145,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":642,"tdur":452,"tts":1537905},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360686151,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":623,"tdur":433,"tts":1537911},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360686776,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":10,"tdur":9,"tts":1538347},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360686790,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1538361},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360686817,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":240,"tdur":239,"tts":1538388},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360686824,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":231,"tdur":230,"tts":1538395},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360686857,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":13},"dur":37,"tdur":35,"tts":1538429},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360686966,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1538538,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360686973,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":296},"dur":79,"tdur":79,"tts":1538543},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360686976,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":74,"tdur":74,"tts":1538546},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360687062,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":23,"tdur":22,"tts":1538633},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360687101,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":495,"tdur":417,"tts":1538672},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360687107,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":471,"tdur":393,"tts":1538678},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360687581,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":13,"tdur":13,"tts":1539075},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360687600,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":3,"tts":1539094},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360688775,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":36,"tdur":34,"tts":1539148},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360688789,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":18,"tts":1539161},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360688817,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":106,"tdur":105,"tts":1539189},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360688829,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":92,"tdur":91,"tts":1539201},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360688855,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":53,"tdur":50,"tts":1539228},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360690599,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":28685,"tdur":1731,"tts":1539347},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360690612,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":28669,"tdur":1716,"tts":1539360},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360719258,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":52},"dur":20,"tdur":17,"tts":1541055},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360719290,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1541085},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360719320,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":464,"tdur":359,"tts":1541115},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360719327,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":430,"tdur":324,"tts":1541122},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360719761,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":20,"tdur":20,"tts":1541452},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360719789,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1541481},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360719809,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":277,"tdur":261,"tts":1541501},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360719816,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":268,"tdur":253,"tts":1541507},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360719848,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":52},"dur":36,"tdur":35,"tts":1541540},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360719956,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1541648,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360719962,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":297},"dur":119,"tdur":103,"tts":1541654},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360719965,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":115,"tdur":98,"tts":1541657},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360720092,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1541769},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360720114,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":362,"tdur":295,"tts":1541791},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360720120,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":347,"tdur":281,"tts":1541796},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360720468,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":7,"tdur":6,"tts":1542079},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360720477,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":8,"tdur":7,"tts":1542088},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360720480,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":4,"tdur":4,"tts":1542090},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360720490,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":111,"tdur":110,"tts":1542101},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360720492,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":108,"tdur":94,"tts":1542116},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360720528,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":53,"tdur":52,"tts":1542139},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360720603,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":15482,"tdur":1698,"tts":1542213},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360720606,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":15478,"tdur":1694,"tts":1542216},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360736073,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":23},"dur":9,"tdur":8,"tts":1543900},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360736110,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1543936},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360736118,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":1020,"tdur":869,"tts":1543945},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360736125,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":978,"tdur":827,"tts":1543951},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360697281,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":32,"tdur":29,"tts":181050},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360697711,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":181300},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360697869,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":8,"tdur":6,"tts":181451},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360697894,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":181476},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360698436,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":181623},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360700130,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":5,"tts":181762},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360700322,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":5,"tts":181867},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360700615,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":182050},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360700784,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":7,"tdur":6,"tts":182192},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360700824,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":182231},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360771337,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":6,"tts":182447},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360771979,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":4,"tts":182569},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360773818,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":8,"tdur":6,"tts":182799},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360774269,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":10,"tts":183035},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360774561,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":9,"tdur":7,"tts":183240},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360775178,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":7,"tdur":6,"tts":183396},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360777147,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":183653},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360777587,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":183938},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360777917,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":10,"tts":184197},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360778584,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":8,"tts":184462},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360780438,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":184730},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360780925,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":185007},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360781159,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":185207},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360781727,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":8,"tts":185480},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360783545,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":185738},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360783981,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":185973},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360784209,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":8,"tdur":7,"tts":186164},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360838011,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":186398},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360838634,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":186619},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360840311,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":186846},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360840576,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":187003},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360840698,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":187105},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360840937,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":187207},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360841663,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":187286},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360841850,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":187336},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360841973,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":187398},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360841982,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":1,"tdur":2,"tts":187406},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360842245,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":187453},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360843022,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":187534},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360843258,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":187647},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360843338,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":187710},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360843347,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":1,"tts":187719},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360843592,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":187768},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360844213,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":187842},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360844383,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":187910},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360844561,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":187958},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360844669,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":2,"tts":188015},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360903126,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":188154},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360903655,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":188342},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360905241,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":188598},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360905712,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":188866},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360906020,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":189123},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360906678,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":189404},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360908492,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":189665},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360908958,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":189930},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360909237,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":9,"tdur":7,"tts":190168},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360909834,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":8,"tdur":6,"tts":190350},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360911665,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":7,"tdur":5,"tts":190544},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360912114,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":8,"tdur":6,"tts":190697},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360912321,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":4,"tts":190859},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360912341,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":190878},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360914163,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":191001},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360916059,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":20,"tdur":19,"tts":191179},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360916298,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":3,"tdur":3,"tts":191294},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360737107,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":29,"tdur":27,"tts":1544784},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360737157,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":4,"tts":1544834},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360737165,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":427,"tdur":288,"tts":1544841},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360737170,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":395,"tdur":255,"tts":1544846},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360737569,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":19,"tts":1545107},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360737610,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":506,"tdur":394,"tts":1545148},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360737617,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":260,"tdur":147,"tts":1545154},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360737881,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":233,"tdur":233,"tts":1545307},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360737921,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":23},"dur":37,"tdur":36,"tts":1545348},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360738031,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1545458,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360738037,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":298},"dur":74,"tdur":74,"tts":1545463},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360738040,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":70,"tdur":69,"tts":1545466},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360738123,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1545549},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360738146,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":536,"tdur":410,"tts":1545573},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360738151,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":504,"tdur":376,"tts":1545578},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360738659,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":21,"tdur":20,"tts":1545960},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360738688,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":96,"tdur":95,"tts":1545989},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360738695,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":87,"tdur":86,"tts":1545996},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360738716,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":52,"tdur":50,"tts":1546018},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360738803,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":14403,"tdur":2001,"tts":1546105},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360738810,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":14394,"tdur":1993,"tts":1546111},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360753172,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":42},"dur":28,"tdur":26,"tts":1548074},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360753212,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1548113},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360753236,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":511,"tdur":375,"tts":1548136},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360753242,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":479,"tdur":341,"tts":1548143},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360753725,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":20,"tdur":19,"tts":1548490},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360753753,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1548518},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360753773,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":343,"tdur":206,"tts":1548538},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360753778,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":325,"tdur":187,"tts":1548543},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360754105,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":10,"tdur":9,"tts":1548733},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360754119,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":465,"tdur":390,"tts":1548747},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360754122,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":217,"tdur":141,"tts":1548750},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360754343,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":238,"tdur":237,"tts":1548897},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360754389,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":42},"dur":38,"tdur":37,"tts":1548943},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360754499,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1549054,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360754505,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":299},"dur":73,"tdur":72,"tts":1549059},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360754508,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":69,"tdur":68,"tts":1549062},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360754606,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1549160},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360754614,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":455,"tdur":378,"tts":1549168},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360754619,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":423,"tdur":345,"tts":1549173},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360755046,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":19,"tts":1549524},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360755087,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":68,"tdur":67,"tts":1549565},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360755110,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":44,"tdur":44,"tts":1549587},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360755120,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":27,"tdur":26,"tts":1549598},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360755171,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":13503,"tdur":1000,"tts":1549649},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360755179,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":13492,"tdur":988,"tts":1549656},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360768694,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":962,"tdur":962,"tts":1550670},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360768706,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":948,"tdur":947,"tts":1550682},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360769611,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":217},"dur":39,"tdur":37,"tts":1551588},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360769662,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1551638},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360769683,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":367,"tdur":229,"tts":1551659},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360769689,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":335,"tdur":196,"tts":1551665},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360770028,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":18,"tts":1551867},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360770056,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":4,"tts":1551894},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360770075,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":353,"tdur":216,"tts":1551914},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360770081,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":319,"tdur":182,"tts":1551920},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360770404,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":22,"tdur":20,"tts":1552108},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360770434,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":542,"tdur":410,"tts":1552137},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360770440,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":299,"tdur":165,"tts":1552143},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360770743,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":231,"tdur":230,"tts":1552314},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360770781,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":217},"dur":37,"tdur":35,"tts":1552353},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360770890,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1552462,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360770896,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":300},"dur":74,"tdur":74,"tts":1552467},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360770899,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":70,"tdur":69,"tts":1552470},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360770998,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":30,"tdur":30,"tts":1552569},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360771296,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1552643},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360771964,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":288,"tdur":197,"tts":1552680},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360771969,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":264,"tdur":172,"tts":1552686},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360772236,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":14,"tdur":13,"tts":1552862},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360772256,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":66,"tdur":65,"tts":1552882},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360772261,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":59,"tdur":59,"tts":1552886},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360772277,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":34,"tdur":33,"tts":1552903},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360773757,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":29024,"tdur":1568,"tts":1553021},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360773768,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":29012,"tdur":1555,"tts":1553032},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360802760,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":183},"dur":17,"tdur":15,"tts":1554569},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360802785,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":3,"tts":1554593},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360802805,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":440,"tdur":292,"tts":1554613},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360802809,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":421,"tdur":273,"tts":1554617},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360803232,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":12,"tdur":11,"tts":1554893},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360803248,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1554909},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360803259,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":261,"tdur":119,"tts":1554920},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360803263,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":243,"tdur":101,"tts":1554924},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360803508,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":10,"tdur":10,"tts":1555028},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360803523,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":392,"tdur":244,"tts":1555042},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360803526,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":234,"tdur":85,"tts":1555046},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360803761,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":152,"tdur":152,"tts":1555133},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360803794,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":183},"dur":25,"tdur":24,"tts":1555166},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360803862,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1555234,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360803866,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":301},"dur":46,"tdur":46,"tts":1555237},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360803868,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":43,"tdur":43,"tts":1555239},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360803927,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":3,"tts":1555299},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360803933,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":388,"tdur":308,"tts":1555304},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360803936,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":376,"tdur":295,"tts":1555308},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360804313,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":7,"tdur":6,"tts":1555605},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360804327,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":95,"tdur":95,"tts":1555618},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360804329,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":92,"tdur":90,"tts":1555621},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360804365,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":42,"tdur":40,"tts":1555658},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360804427,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":2562,"tdur":1841,"tts":1555719},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360804434,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":2552,"tdur":1832,"tts":1555725},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360806964,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":132},"dur":18,"tdur":16,"tts":1557537},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360807010,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":4,"tts":1557582},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360807018,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":267,"tdur":180,"tts":1557590},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360807024,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":224,"tdur":138,"tts":1557596},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360807262,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":20,"tdur":19,"tts":1557749},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360807302,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":4,"tts":1557789},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360807311,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":230,"tdur":230,"tts":1557797},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360807317,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":222,"tdur":221,"tts":1557804},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360807350,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":132},"dur":35,"tdur":35,"tts":1557836},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360807457,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1557944,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360807463,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":302},"dur":73,"tdur":72,"tts":1557950},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360807466,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":69,"tdur":68,"tts":1557953},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360807560,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1558046},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360807567,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":409,"tdur":353,"tts":1558054},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360807572,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":377,"tdur":320,"tts":1558059},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360807953,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":21,"tdur":19,"tts":1558385},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360807995,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":62,"tdur":29,"tts":1558427},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360808047,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":9,"tdur":8,"tts":1558447},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360808059,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":63,"tdur":62,"tts":1558459},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360808062,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":58,"tdur":58,"tts":1558462},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360808075,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":37,"tdur":36,"tts":1558475},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360808131,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":10966,"tdur":1331,"tts":1558531},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360808136,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":10959,"tdur":1324,"tts":1558536},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360819082,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":244},"dur":11,"tdur":9,"tts":1559849},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360819100,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":3,"tts":1559865},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360819113,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":375,"tdur":318,"tts":1559878},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360819116,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":358,"tdur":299,"tts":1559882},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360819476,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":11,"tdur":10,"tts":1560185},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360819491,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1560200},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360778445,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":67,"tdur":64,"tts":102635},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360780308,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":53,"tdur":50,"tts":102778},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360780784,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":53,"tdur":51,"tts":102890},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360781025,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":49,"tts":103002},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360781080,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":11,"tdur":10,"tts":103055},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360781610,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":43,"tdur":41,"tts":103131},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360783415,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":52,"tdur":50,"tts":103234},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360783883,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":52,"tdur":50,"tts":103344},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360784162,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":35,"tdur":33,"tts":103457},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360784201,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":13,"tdur":12,"tts":103495},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360837916,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":49,"tdur":48,"tts":103570},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360838515,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":54,"tdur":51,"tts":103683},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360840180,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":62,"tdur":60,"tts":103804},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360840513,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":24,"tdur":23,"tts":103905},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360840640,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":17,"tdur":16,"tts":103962},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360840658,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":9,"tdur":9,"tts":103980},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360840871,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":17,"tdur":17,"tts":104005},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360841616,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":20,"tdur":19,"tts":104058},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360841822,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":20,"tts":104115},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360841949,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":16,"tts":104173},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360841968,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":10,"tdur":10,"tts":104190},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360842221,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":16,"tts":104237},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360842962,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":19,"tts":104287},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360843211,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":20,"tts":104344},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360843315,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":17,"tdur":16,"tts":104399},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360843333,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":10,"tdur":10,"tts":104416},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360843568,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":18,"tdur":17,"tts":104462},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360844175,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":11,"tdur":11,"tts":104503},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360844361,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":15,"tdur":14,"tts":104538},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360844540,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":15,"tdur":14,"tts":104575},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360844652,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":11,"tdur":10,"tts":104612},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360844664,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":5,"tdur":5,"tts":104623},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360903047,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":29,"tdur":27,"tts":104667},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360903564,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":54,"tdur":52,"tts":104759},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360905102,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":63,"tdur":61,"tts":104874},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360905582,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":48,"tts":105002},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360905887,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":49,"tts":105111},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360905941,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":11,"tdur":10,"tts":105164},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360906561,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":42,"tdur":40,"tts":105241},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360908365,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":49,"tts":105345},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360908831,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":50,"tdur":49,"tts":105459},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360909127,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":52,"tdur":50,"tts":105569},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360909182,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":11,"tdur":11,"tts":105622},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360909752,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":41,"tdur":40,"tts":105697},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360911561,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":50,"tdur":47,"tts":105806},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360911997,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":100,"tdur":75,"tts":105914},{"cat":"trace_event_overhead","pid":25863,"tid":25911,"ts":531360911997,"ph":"X","name":"overhead","args":{},"dur":53,"tdur":28,"tts":105914},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360912263,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":43,"tdur":41,"tts":106049},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360912310,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":23,"tdur":23,"tts":106094},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360914105,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":43,"tdur":41,"tts":106182},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360915949,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":82,"tdur":66,"tts":106289},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360916244,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":26,"tdur":25,"tts":106397},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360916435,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":53,"tdur":38,"tts":106473},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360916490,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":13,"tdur":12,"tts":106515},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360971158,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":26,"tdur":25,"tts":106653},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360971506,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":19,"tdur":17,"tts":106704},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360972835,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":47,"tdur":45,"tts":106780},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360973249,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":57,"tdur":55,"tts":106880},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360973571,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":40,"tdur":38,"tts":106991},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360973612,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":12,"tdur":11,"tts":107031},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360974159,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":42,"tdur":40,"tts":107105},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360975950,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":47,"tdur":45,"tts":107176},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360976356,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":49,"tts":107280},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360976593,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":40,"tdur":38,"tts":107400},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360819502,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":132,"tdur":132,"tts":1560210},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360819510,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":122,"tdur":123,"tts":1560218},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360819527,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":244},"dur":20,"tdur":19,"tts":1560236},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360819587,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1560296,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360819590,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":303},"dur":41,"tdur":40,"tts":1560299},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360819592,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":38,"tdur":38,"tts":1560300},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360819637,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1560345},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360819648,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":464,"tdur":371,"tts":1560356},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360819651,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":425,"tdur":332,"tts":1560359},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360820078,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":31,"tdur":29,"tts":1560694},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360820118,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":22,"tdur":21,"tts":1560734},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360820126,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":13,"tdur":11,"tts":1560742},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360820156,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":97,"tdur":97,"tts":1560772},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360820161,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":91,"tdur":90,"tts":1560777},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360820186,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":52,"tdur":50,"tts":1560802},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360820258,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":15638,"tdur":1726,"tts":1560874},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360820264,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":15629,"tdur":1717,"tts":1560880},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360835864,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":208},"dur":25,"tdur":23,"tts":1562570},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360835916,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1562621},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360835924,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":480,"tdur":356,"tts":1562629},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360835930,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":435,"tdur":310,"tts":1562635},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360836369,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":20,"tdur":19,"tts":1562951},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360836412,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1562993},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360836415,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":753,"tdur":648,"tts":1562997},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360836417,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":724,"tdur":618,"tts":1562999},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360837146,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":20,"tts":1563623},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360837187,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":502,"tdur":400,"tts":1563664},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360837193,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":250,"tdur":146,"tts":1563671},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360837447,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":239,"tdur":238,"tts":1563823},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360837493,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":208},"dur":38,"tdur":35,"tts":1563870},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360837603,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1563979,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360837609,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":304},"dur":74,"tdur":73,"tts":1563985},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360837612,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":70,"tdur":69,"tts":1563988},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360837695,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":24,"tdur":23,"tts":1564071},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360837996,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":4,"tts":1564163},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360838576,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":254,"tdur":166,"tts":1564212},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360838587,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":219,"tdur":119,"tts":1564222},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360838810,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":18,"tdur":18,"tts":1564358},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360838835,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":80,"tdur":79,"tts":1564384},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360838841,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":73,"tdur":72,"tts":1564390},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360838865,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":43,"tdur":42,"tts":1564414},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360840265,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":29346,"tdur":1908,"tts":1564533},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360840275,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":29334,"tdur":1896,"tts":1564542},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360869576,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":4},"dur":29,"tdur":26,"tts":1566408},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360869617,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1566447},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360869646,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":502,"tdur":368,"tts":1566477},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360869653,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":470,"tdur":335,"tts":1566483},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360870127,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":18,"tts":1566824},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360870155,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1566852},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360870175,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":351,"tdur":217,"tts":1566872},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360870180,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":320,"tdur":184,"tts":1566878},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360870504,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":20,"tdur":19,"tts":1567068},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360870532,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":549,"tdur":418,"tts":1567096},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360870538,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":294,"tdur":163,"tts":1567102},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360870836,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":242,"tdur":240,"tts":1567271},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360870876,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":4},"dur":36,"tdur":36,"tts":1567310},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360870984,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1567420,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360870990,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":305},"dur":83,"tdur":82,"tts":1567425},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360870993,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":79,"tdur":77,"tts":1567428},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360871110,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":9,"tdur":7,"tts":1567545},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360871122,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":513,"tdur":384,"tts":1567557},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360871130,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":478,"tdur":348,"tts":1567565},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360871612,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":21,"tdur":20,"tts":1567919},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360871653,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":123,"tdur":122,"tts":1567960},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360871660,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":114,"tdur":112,"tts":1567967},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360871718,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":42,"tdur":40,"tts":1568026},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360871781,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":3040,"tdur":1855,"tts":1568088},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360871787,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":3032,"tdur":1846,"tts":1568094},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360874782,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":223},"dur":33,"tdur":30,"tts":1569906},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360874842,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1569964},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360874850,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":409,"tdur":335,"tts":1569972},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360874856,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":381,"tdur":307,"tts":1569978},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360875241,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":16,"tdur":15,"tts":1570290},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360875274,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1570323},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360875281,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":239,"tdur":153,"tts":1570330},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360875286,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":213,"tdur":127,"tts":1570334},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360875502,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":16,"tdur":15,"tts":1570466},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360875534,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":389,"tdur":335,"tts":1570498},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360875540,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":171,"tdur":117,"tts":1570503},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360875714,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":207,"tdur":206,"tts":1570625},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360875745,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":223},"dur":36,"tdur":35,"tts":1570656},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360875845,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1570756,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360875851,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":306},"dur":68,"tdur":66,"tts":1570762},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360875854,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":63,"tdur":62,"tts":1570765},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360875930,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":4,"tts":1570840},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360875950,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":480,"tdur":346,"tts":1570861},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360875955,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":454,"tdur":319,"tts":1570866},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360876412,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":16,"tdur":15,"tts":1571190},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360876434,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":92,"tdur":91,"tts":1571212},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360876440,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":84,"tdur":83,"tts":1571218},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360876472,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":40,"tdur":39,"tts":1571250},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360876542,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":9518,"tdur":1586,"tts":1571320},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360876549,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":9508,"tdur":1577,"tts":1571327},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360886037,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":57},"dur":17,"tdur":14,"tts":1572886},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360886065,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1572912},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360886086,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":414,"tdur":316,"tts":1572933},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360886092,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":374,"tdur":276,"tts":1572939},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360886481,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":17,"tdur":15,"tts":1573232},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360886505,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":4,"tdur":4,"tts":1573255},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360886521,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":225,"tdur":159,"tts":1573271},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360886526,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":199,"tdur":133,"tts":1573276},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360886728,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":16,"tdur":15,"tts":1573413},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360886750,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":369,"tdur":312,"tts":1573435},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360886755,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":138,"tdur":81,"tts":1573440},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360886895,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":223,"tdur":222,"tts":1573523},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360886943,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":57},"dur":36,"tdur":35,"tts":1573572},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360887042,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1573671,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360887048,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":307},"dur":67,"tdur":66,"tts":1573677},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360887051,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":63,"tdur":61,"tts":1573680},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360887138,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1573767},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360887145,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":373,"tdur":286,"tts":1573774},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360887150,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":354,"tdur":269,"tts":1573778},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360887506,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":10,"tdur":10,"tts":1574049},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360887543,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":104,"tdur":103,"tts":1574087},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360887550,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":82,"tdur":82,"tts":1574093},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360887568,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":52,"tdur":51,"tts":1574111},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360887651,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":13774,"tdur":603,"tts":1574194},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360887655,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":13767,"tdur":594,"tts":1574199},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360901446,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":930,"tdur":929,"tts":1574819},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360901457,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":916,"tdur":916,"tts":1574830},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360902354,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":49},"dur":17,"tdur":15,"tts":1575728},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360902381,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1575754},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360902402,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":183,"tdur":123,"tts":1575775},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360902408,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":167,"tdur":107,"tts":1575781},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360902576,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":8,"tdur":7,"tts":1575890},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360902587,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":2,"tts":1575900},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360902595,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":116,"tdur":90,"tts":1575908},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360902597,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":86,"tdur":60,"tts":1575910},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360902684,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":26,"tdur":25,"tts":1575972},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360902713,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":190,"tdur":165,"tts":1576001},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360902715,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":79,"tdur":53,"tts":1576003},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360902795,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":107,"tdur":107,"tts":1576058},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360902817,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":49},"dur":16,"tdur":16,"tts":1576080},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360902865,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1576128,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360902868,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":308},"dur":33,"tdur":33,"tts":1576131},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360902869,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":32,"tdur":31,"tts":1576132},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360902912,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":11,"tdur":11,"tts":1576175},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360903076,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1576206},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360903607,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":153,"tdur":97,"tts":1576234},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360903613,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":138,"tdur":81,"tts":1576240},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360903752,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":7,"tdur":7,"tts":1576323},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360903762,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":45,"tdur":45,"tts":1576333},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360903764,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":42,"tdur":41,"tts":1576336},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360903780,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":19,"tdur":19,"tts":1576351},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360905149,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":31727,"tdur":2266,"tts":1576412},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360905157,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":31716,"tdur":2255,"tts":1576420},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360936845,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":251},"dur":25,"tdur":23,"tts":1578649},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360936882,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1578685},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360936912,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":435,"tdur":302,"tts":1578715},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360936918,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":402,"tdur":268,"tts":1578721},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360937324,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":20,"tdur":19,"tts":1578995},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360937353,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1579024},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360937373,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":232,"tdur":231,"tts":1579044},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360937380,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":223,"tdur":222,"tts":1579051},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360937413,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":251},"dur":36,"tdur":35,"tts":1579084},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360937521,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1579192,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360937527,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":309},"dur":73,"tdur":73,"tts":1579198},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360937530,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":69,"tdur":68,"tts":1579201},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360937611,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1579282},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360937631,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":484,"tdur":351,"tts":1579302},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360937636,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":457,"tdur":324,"tts":1579307},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360938096,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":17,"tdur":15,"tts":1579636},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360938119,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":17,"tdur":17,"tts":1579658},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360938125,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":10,"tdur":9,"tts":1579664},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360938160,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":47,"tdur":47,"tts":1579699},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360938163,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":43,"tdur":43,"tts":1579702},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360938174,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":26,"tdur":25,"tts":1579713},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360938209,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":2490,"tdur":1379,"tts":1579748},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360938228,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":2469,"tdur":1358,"tts":1579767},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360940679,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":214},"dur":16,"tdur":13,"tts":1581109},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360940713,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":3,"tts":1581141},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360940718,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":475,"tdur":337,"tts":1581146},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360940722,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":454,"tdur":316,"tts":1581150},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360941179,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":12,"tdur":11,"tts":1581470},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360941204,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1581495},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360941209,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":150,"tdur":150,"tts":1581499},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360941213,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":145,"tdur":145,"tts":1581503},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360941233,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":214},"dur":23,"tdur":22,"tts":1581524},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360941302,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1581593,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360941306,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":310},"dur":50,"tdur":49,"tts":1581597},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360941308,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":48,"tdur":46,"tts":1581599},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360941371,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1581662},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360941376,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":549,"tdur":389,"tts":1581667},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360941379,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":529,"tdur":369,"tts":1581670},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360941911,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":13,"tdur":12,"tts":1582043},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360941937,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":12,"tdur":12,"tts":1582068},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360941941,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":7,"tdur":6,"tts":1582073},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360941950,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":60,"tdur":59,"tts":1582082},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360941953,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":56,"tdur":55,"tts":1582085},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360941967,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":33,"tdur":33,"tts":1582098},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360942019,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":10522,"tdur":1588,"tts":1582151},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360942024,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":10516,"tdur":1583,"tts":1582155},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360916526,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":28,"tdur":27,"tts":191474},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360971233,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":191723},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360971557,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":191871},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360972941,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":10,"tts":192088},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360973373,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":192311},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360973618,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":4,"tdur":3,"tts":192487},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360973628,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":1,"tts":192497},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360974212,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":2,"tdur":2,"tts":192586},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360976021,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":192761},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360976481,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":192995},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360976639,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":193140},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360976710,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":193203},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360977396,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":193455},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360979027,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":11,"tdur":9,"tts":193719},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360979180,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":8,"tdur":5,"tts":193856},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360979677,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":12,"tdur":9,"tts":194115},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360979752,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":4,"tts":194189},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360979831,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":4,"tts":194262},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360980608,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":5,"tdur":5,"tts":194444},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360981626,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":4,"tts":194685},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360981922,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":8,"tdur":6,"tts":194824},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531360982164,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":8,"tdur":6,"tts":194951},{"cat":"toplevel","pid":25863,"tid":25873,"ts":531361048867,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"AddRequest"},"dur":6,"tdur":5,"tts":195251},{"cat":"__metadata","pid":25863,"tid":25873,"ts":0,"ph":"M","name":"overhead","args":{"average_overhead":0.0033425034387895465}},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360952521,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":221},"dur":17,"tdur":16,"tts":1583720},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360952544,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1583743},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360952570,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":417,"tdur":356,"tts":1583769},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360952577,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":383,"tdur":322,"tts":1583776},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360952964,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":20,"tdur":18,"tts":1584104},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360952993,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1584132},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360953013,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":260,"tdur":205,"tts":1584152},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360953019,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":227,"tdur":171,"tts":1584158},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360953250,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":21,"tdur":19,"tts":1584335},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360953279,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":373,"tdur":318,"tts":1584364},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360953285,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":143,"tdur":89,"tts":1584370},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360953430,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":220,"tdur":219,"tts":1584461},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360953461,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":221},"dur":38,"tdur":37,"tts":1584492},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360953572,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1584603,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360953578,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":311},"dur":69,"tdur":68,"tts":1584609},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360953581,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":65,"tdur":64,"tts":1584612},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360953674,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1584705},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360953681,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":329,"tdur":267,"tts":1584712},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360953686,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":313,"tdur":251,"tts":1584717},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360954001,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":8,"tdur":8,"tts":1584970},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360954016,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":105,"tdur":92,"tts":1584998},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360954035,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":85,"tdur":83,"tts":1585005},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360954055,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":50,"tdur":49,"tts":1585025},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360954139,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":15354,"tdur":1608,"tts":1585108},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360954143,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":15348,"tdur":1601,"tts":1585112},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360969460,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":190},"dur":27,"tdur":24,"tts":1586685},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360969515,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1586738},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360969523,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":501,"tdur":368,"tts":1586746},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360969529,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":469,"tdur":335,"tts":1586752},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360970002,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":19,"tdur":18,"tts":1587093},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360970041,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1587132},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360970049,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":306,"tdur":219,"tts":1587140},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360970054,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":273,"tdur":186,"tts":1587145},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360970331,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":21,"tdur":19,"tts":1587337},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360970373,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":495,"tdur":423,"tts":1587378},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360970379,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":238,"tdur":165,"tts":1587384},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360970621,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":245,"tdur":244,"tts":1587555},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360970672,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":190},"dur":38,"tdur":36,"tts":1587606},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531360970783,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1587717,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360970789,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":312},"dur":74,"tdur":73,"tts":1587722},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360970792,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":69,"tdur":69,"tts":1587725},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360970875,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":23,"tdur":23,"tts":1587808},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360971195,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":4,"tts":1587882},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360971572,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":209,"tdur":137,"tts":1587954},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360971577,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":191,"tdur":119,"tts":1587959},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360971770,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":10,"tdur":9,"tts":1588080},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360971784,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":54,"tdur":54,"tts":1588094},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360971787,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":50,"tdur":50,"tts":1588097},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360971797,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":27,"tdur":25,"tts":1588108},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531360972908,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":30417,"tdur":1901,"tts":1588206},{"cat":"gpu","pid":25863,"tid":25870,"ts":531360972915,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":30407,"tdur":1893,"tts":1588211},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361003295,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":49},"dur":20,"tdur":17,"tts":1590079},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361003331,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":4,"tts":1590114},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361003362,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":530,"tdur":388,"tts":1590144},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361003368,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":495,"tdur":351,"tts":1590151},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361003867,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":22,"tdur":19,"tts":1590510},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361003900,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1590540},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361003920,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":366,"tdur":241,"tts":1590561},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361003926,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":333,"tdur":208,"tts":1590566},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361004263,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":21,"tdur":20,"tts":1590780},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361004293,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":561,"tdur":421,"tts":1590810},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361004301,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":294,"tdur":153,"tts":1590818},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361004603,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":248,"tdur":247,"tts":1590982},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361004646,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":49},"dur":37,"tdur":36,"tts":1591024},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360976636,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":57,"tdur":57,"tts":107441},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360977277,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":43,"tdur":41,"tts":107562},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360978918,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":40,"tdur":38,"tts":107670},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360979095,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":42,"tdur":40,"tts":107741},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360979546,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":53,"tdur":50,"tts":107845},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360979733,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":17,"tdur":16,"tts":107914},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360979795,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":30,"tdur":29,"tts":107943},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360980545,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":21,"tdur":20,"tts":108013},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360981489,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":51,"tdur":48,"tts":108095},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360981820,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":52,"tdur":49,"tts":108206},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360982095,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":53,"tdur":53,"tts":108294},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531360982151,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":11,"tdur":10,"tts":108350},{"cat":"toplevel","pid":25863,"tid":25911,"ts":531361048750,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"dur":31,"tdur":30,"tts":108399},{"cat":"__metadata","pid":25863,"tid":25911,"ts":0,"ph":"M","name":"overhead","args":{"average_overhead":0.0037748815165876775}},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531361004760,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1591139,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361004772,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":313},"dur":76,"tdur":74,"tts":1591151},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361004776,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":71,"tdur":70,"tts":1591154},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361004876,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1591254},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361004884,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":546,"tdur":414,"tts":1591262},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361004889,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":511,"tdur":378,"tts":1591267},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361005404,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":23,"tdur":22,"tts":1591651},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361005448,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":107,"tdur":106,"tts":1591695},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361005456,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":97,"tdur":97,"tts":1591702},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361005482,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":57,"tdur":56,"tts":1591729},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361005559,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":3065,"tdur":1992,"tts":1591806},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361005568,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":3053,"tdur":1980,"tts":1591815},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361008587,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":30},"dur":30,"tdur":28,"tts":1593763},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361008645,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":5,"tts":1593820},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361008654,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":360,"tdur":225,"tts":1593828},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361008659,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":334,"tdur":197,"tts":1593834},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361008996,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":16,"tdur":15,"tts":1594036},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361009028,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1594068},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361009036,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":303,"tdur":163,"tts":1594075},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361009040,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":278,"tdur":136,"tts":1594080},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361009321,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":16,"tdur":16,"tts":1594220},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361009353,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":435,"tdur":340,"tts":1594253},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361009358,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":214,"tdur":119,"tts":1594258},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361009575,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":211,"tdur":210,"tts":1594381},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361009609,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":30},"dur":36,"tdur":35,"tts":1594415},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531361009709,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1594516,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361009715,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":314},"dur":68,"tdur":67,"tts":1594521},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361009718,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":64,"tdur":63,"tts":1594524},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361009793,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":5,"tts":1594599},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361009814,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":467,"tdur":329,"tts":1594620},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361009819,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":442,"tdur":303,"tts":1594625},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361010264,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":15,"tdur":15,"tts":1594932},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361010286,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":111,"tdur":110,"tts":1594955},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361010292,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":103,"tdur":102,"tts":1594961},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361010313,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":69,"tdur":67,"tts":1594982},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361010413,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":8196,"tdur":800,"tts":1595082},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361010420,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":8187,"tdur":789,"tts":1595089},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361018615,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":860,"tdur":858,"tts":1595889},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361018625,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":848,"tdur":848,"tts":1595898},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361019454,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":61},"dur":16,"tdur":13,"tts":1596729},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361019493,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1596767},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361019500,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":446,"tdur":304,"tts":1596774},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361019506,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":419,"tdur":278,"tts":1596779},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361019928,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":16,"tdur":15,"tts":1597061},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361019960,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":5,"tdur":4,"tts":1597093},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361019967,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":334,"tdur":179,"tts":1597100},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361019972,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":307,"tdur":152,"tts":1597105},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361020282,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":17,"tdur":16,"tts":1597261},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361020315,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":490,"tdur":352,"tts":1597294},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361020320,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":248,"tdur":110,"tts":1597299},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361020571,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":232,"tdur":230,"tts":1597414},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361020603,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":61},"dur":35,"tdur":34,"tts":1597446},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531361020711,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1597554,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361020719,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":315},"dur":80,"tdur":80,"tts":1597561},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361020724,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":74,"tdur":73,"tts":1597566},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361020811,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":6,"tdur":4,"tts":1597654},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361020833,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":497,"tdur":366,"tts":1597675},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361020838,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":470,"tdur":339,"tts":1597680},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361021311,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":17,"tdur":15,"tts":1598024},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361021334,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":89,"tdur":88,"tts":1598046},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361021340,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":81,"tdur":80,"tts":1598052},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361021360,"ph":"X","name":"GLES2DecoderImpl::HandleTexImage2D","args":{"width":320,"height":640},"dur":48,"tdur":47,"tts":1598072},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361021438,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":26735,"tdur":1907,"tts":1598151},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361021445,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":26726,"tdur":1898,"tts":1598158},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361048152,"ph":"X","name":"GLES2DecoderImpl::DoProduceTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000","mailbox[0]":35},"dur":17,"tdur":16,"tts":1600038},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361048177,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":3,"tdur":2,"tts":1600063},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361048189,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":286,"tdur":170,"tts":1600074},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361048192,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":271,"tdur":154,"tts":1600077},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361048464,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":10,"tdur":9,"tts":1600234},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361048477,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"InsertSyncPoint"},"dur":2,"tdur":1,"tts":1600247},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361048486,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":110,"tdur":110,"tts":1600255},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361048489,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000"},"dur":106,"tdur":106,"tts":1600258},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361048505,"ph":"X","name":"GLES2DecoderImpl::DoConsumeTextureCHROMIUM","args":{"context":"GroupMarkerNotSet(crbug.com/242999)!:90BB3BFC167F0000","mailbox[0]":35},"dur":17,"tdur":16,"tts":1600275},{"cat":"test_gpu","pid":25863,"tid":25870,"ts":531361048557,"ph":"I","name":"SwapBuffersLatency","args":{"GLImpl":1,"width":320},"tts":1600327,"s":"t"},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361048560,"ph":"X","name":"GLES2DecoderImpl::DoSwapBuffers","args":{"offscreen":false,"frame":316},"dur":34,"tdur":34,"tts":1600329},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361048561,"ph":"X","name":"NativeViewGLSurfaceGLX:RealSwapBuffers","args":{"width":320,"height":640},"dur":32,"tdur":32,"tts":1600330},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361048598,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"MakeProgress"},"dur":16,"tdur":15,"tts":1600368},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361048621,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/services/gles2/command_buffer_impl.cc","src_func":"Flush"},"dur":378,"tdur":302,"tts":1600390},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361048623,"ph":"X","name":"GLContextGLX::MakeCurrent","args":{},"dur":365,"tdur":289,"tts":1600392},{"cat":"gpu","pid":25863,"tid":25870,"ts":531361048989,"ph":"X","name":"GpuScheduler:PutChanged","args":{"decoder":"GroupMarkerNotSet(crbug.com/242999)!:B01953FC167F0000"},"dur":9,"tdur":8,"tts":1600683},{"cat":"toplevel","pid":25863,"tid":25870,"ts":531361049002,"ph":"X","name":"MessageLoop::RunTask","args":{"src_file":"../../mojo/common/handle_watcher.cc","src_func":"RemoveAndNotify"},"tdur":0,"tts":1600696},{"cat":"__metadata","pid":25863,"tid":25870,"ts":0,"ph":"M","name":"overhead","args":{"average_overhead":0.0038832684824902726}},{"cat":"__metadata","pid":25863,"tid":0,"ts":0,"ph":"M","name":"num_cpus","args":{"number":32}},{"cat":"__metadata","pid":25863,"tid":25873,"ts":0,"ph":"M","name":"thread_name","args":{"name":"handle-watcher-thread"}},{"cat":"__metadata","pid":25863,"tid":25911,"ts":0,"ph":"M","name":"thread_name","args":{"name":"gpu_command_buffer_control"}}]}
\ No newline at end of file
diff --git a/testing/android/junit/java/src/org/chromium/testing/local/GtestFilter.java b/testing/android/junit/java/src/org/chromium/testing/local/GtestFilter.java
index 68dcbb8..d5527aa 100644
--- a/testing/android/junit/java/src/org/chromium/testing/local/GtestFilter.java
+++ b/testing/android/junit/java/src/org/chromium/testing/local/GtestFilter.java
@@ -9,6 +9,7 @@
import java.util.HashSet;
import java.util.Set;
+import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
@@ -24,6 +25,7 @@
private static final Pattern ASTERISK = Pattern.compile("\\*");
private static final Pattern COLON = Pattern.compile(":");
private static final Pattern DASH = Pattern.compile("-");
+ private static final Pattern DOLLAR = Pattern.compile("\\$");
private static final Pattern PERIOD = Pattern.compile("\\.");
/**
@@ -39,7 +41,8 @@
for (String f : filterStrings) {
if (f.isEmpty()) continue;
- String sanitized = PERIOD.matcher(f).replaceAll("\\\\.");
+ String sanitized = PERIOD.matcher(f).replaceAll(Matcher.quoteReplacement("\\."));
+ sanitized = DOLLAR.matcher(sanitized).replaceAll(Matcher.quoteReplacement("\\$"));
sanitized = ASTERISK.matcher(sanitized).replaceAll(".*");
int negIndex = sanitized.indexOf('-');
if (negIndex == 0) {
diff --git a/testing/android/junit/javatests/src/org/chromium/testing/local/GtestFilterTest.java b/testing/android/junit/javatests/src/org/chromium/testing/local/GtestFilterTest.java
index 7b0e0f5..a19b379 100644
--- a/testing/android/junit/javatests/src/org/chromium/testing/local/GtestFilterTest.java
+++ b/testing/android/junit/javatests/src/org/chromium/testing/local/GtestFilterTest.java
@@ -17,102 +17,108 @@
@RunWith(BlockJUnit4ClassRunner.class)
public class GtestFilterTest {
+ private class TestClass {}
+ private class OtherTestClass {}
+
@Test
public void testDescription() {
- Filter filterUnderTest = new GtestFilter("TestClass.*");
- Assert.assertEquals("gtest-filter: TestClass.*", filterUnderTest.describe());
+ Filter filterUnderTest = new GtestFilter(TestClass.class.getName() + ".*");
+ Assert.assertEquals("gtest-filter: " + TestClass.class.getName() + ".*",
+ filterUnderTest.describe());
}
@Test
public void testNoFilter() {
Filter filterUnderTest = new GtestFilter("");
Assert.assertTrue(filterUnderTest.shouldRun(
- Description.createTestDescription("TestClass", "testMethod")));
+ Description.createTestDescription(TestClass.class, "testMethod")));
Assert.assertTrue(filterUnderTest.shouldRun(
- Description.createTestDescription("TestClass", "otherTestMethod")));
+ Description.createTestDescription(TestClass.class, "otherTestMethod")));
Assert.assertTrue(filterUnderTest.shouldRun(
- Description.createTestDescription("OtherTestClass", "testMethod")));
+ Description.createTestDescription(OtherTestClass.class, "testMethod")));
}
@Test
public void testPositiveFilterExplicit() {
- Filter filterUnderTest = new GtestFilter("TestClass.testMethod");
+ Filter filterUnderTest = new GtestFilter(TestClass.class.getName() + ".testMethod");
Assert.assertTrue(filterUnderTest.shouldRun(
- Description.createTestDescription("TestClass", "testMethod")));
+ Description.createTestDescription(TestClass.class, "testMethod")));
Assert.assertFalse(filterUnderTest.shouldRun(
- Description.createTestDescription("TestClass", "otherTestMethod")));
+ Description.createTestDescription(TestClass.class, "otherTestMethod")));
Assert.assertFalse(filterUnderTest.shouldRun(
- Description.createTestDescription("OtherTestClass", "testMethod")));
+ Description.createTestDescription(OtherTestClass.class, "testMethod")));
}
@Test
public void testPositiveFilterClassRegex() {
- Filter filterUnderTest = new GtestFilter("TestClass.*");
+ Filter filterUnderTest = new GtestFilter(TestClass.class.getName() + ".*");
Assert.assertTrue(filterUnderTest.shouldRun(
- Description.createTestDescription("TestClass", "testMethod")));
+ Description.createTestDescription(TestClass.class, "testMethod")));
Assert.assertTrue(filterUnderTest.shouldRun(
- Description.createTestDescription("TestClass", "otherTestMethod")));
+ Description.createTestDescription(TestClass.class, "otherTestMethod")));
Assert.assertFalse(filterUnderTest.shouldRun(
- Description.createTestDescription("OtherTestClass", "testMethod")));
+ Description.createTestDescription(OtherTestClass.class, "testMethod")));
}
@Test
public void testNegativeFilterExplicit() {
- Filter filterUnderTest = new GtestFilter("-TestClass.testMethod");
+ Filter filterUnderTest = new GtestFilter("-" + TestClass.class.getName() + ".testMethod");
Assert.assertFalse(filterUnderTest.shouldRun(
- Description.createTestDescription("TestClass", "testMethod")));
+ Description.createTestDescription(TestClass.class, "testMethod")));
Assert.assertTrue(filterUnderTest.shouldRun(
- Description.createTestDescription("TestClass", "otherTestMethod")));
+ Description.createTestDescription(TestClass.class, "otherTestMethod")));
Assert.assertTrue(filterUnderTest.shouldRun(
- Description.createTestDescription("OtherTestClass", "testMethod")));
+ Description.createTestDescription(OtherTestClass.class, "testMethod")));
}
@Test
public void testNegativeFilterClassRegex() {
- Filter filterUnderTest = new GtestFilter("-TestClass.*");
+ Filter filterUnderTest = new GtestFilter("-" + TestClass.class.getName() + ".*");
Assert.assertFalse(filterUnderTest.shouldRun(
- Description.createTestDescription("TestClass", "testMethod")));
+ Description.createTestDescription(TestClass.class, "testMethod")));
Assert.assertFalse(filterUnderTest.shouldRun(
- Description.createTestDescription("TestClass", "otherTestMethod")));
+ Description.createTestDescription(TestClass.class, "otherTestMethod")));
Assert.assertTrue(filterUnderTest.shouldRun(
- Description.createTestDescription("OtherTestClass", "testMethod")));
+ Description.createTestDescription(OtherTestClass.class, "testMethod")));
}
@Test
public void testPositiveAndNegativeFilter() {
- Filter filterUnderTest = new GtestFilter("TestClass.*-TestClass.testMethod");
+ Filter filterUnderTest = new GtestFilter(TestClass.class.getName() + ".*"
+ + "-" + TestClass.class.getName() + ".testMethod");
Assert.assertFalse(filterUnderTest.shouldRun(
- Description.createTestDescription("TestClass", "testMethod")));
+ Description.createTestDescription(TestClass.class, "testMethod")));
Assert.assertTrue(filterUnderTest.shouldRun(
- Description.createTestDescription("TestClass", "otherTestMethod")));
+ Description.createTestDescription(TestClass.class, "otherTestMethod")));
Assert.assertFalse(filterUnderTest.shouldRun(
- Description.createTestDescription("OtherTestClass", "testMethod")));
+ Description.createTestDescription(OtherTestClass.class, "testMethod")));
}
@Test
public void testMultiplePositiveFilters() {
Filter filterUnderTest = new GtestFilter(
- "TestClass.otherTestMethod:OtherTestClass.otherTestMethod");
+ TestClass.class.getName() + ".otherTestMethod:"
+ + OtherTestClass.class.getName() + ".otherTestMethod");
Assert.assertFalse(filterUnderTest.shouldRun(
- Description.createTestDescription("TestClass", "testMethod")));
+ Description.createTestDescription(TestClass.class, "testMethod")));
Assert.assertTrue(filterUnderTest.shouldRun(
- Description.createTestDescription("TestClass", "otherTestMethod")));
+ Description.createTestDescription(TestClass.class, "otherTestMethod")));
Assert.assertFalse(filterUnderTest.shouldRun(
- Description.createTestDescription("OtherTestClass", "testMethod")));
+ Description.createTestDescription(OtherTestClass.class, "testMethod")));
Assert.assertTrue(filterUnderTest.shouldRun(
- Description.createTestDescription("OtherTestClass", "otherTestMethod")));
+ Description.createTestDescription(OtherTestClass.class, "otherTestMethod")));
}
@Test
public void testMultipleFiltersPositiveAndNegative() {
- Filter filterUnderTest = new GtestFilter("TestClass.*:-TestClass.testMethod");
+ Filter filterUnderTest = new GtestFilter(TestClass.class.getName() + ".*:"
+ + "-" + TestClass.class.getName() + ".testMethod");
Assert.assertFalse(filterUnderTest.shouldRun(
- Description.createTestDescription("TestClass", "testMethod")));
+ Description.createTestDescription(TestClass.class, "testMethod")));
Assert.assertTrue(filterUnderTest.shouldRun(
- Description.createTestDescription("TestClass", "otherTestMethod")));
+ Description.createTestDescription(TestClass.class, "otherTestMethod")));
Assert.assertFalse(filterUnderTest.shouldRun(
- Description.createTestDescription("OtherTestClass", "testMethod")));
+ Description.createTestDescription(OtherTestClass.class, "testMethod")));
}
-
}
diff --git a/testing/android/junit/javatests/src/org/chromium/testing/local/GtestLoggerTest.java b/testing/android/junit/javatests/src/org/chromium/testing/local/GtestLoggerTest.java
index 2bb3040..0520901 100644
--- a/testing/android/junit/javatests/src/org/chromium/testing/local/GtestLoggerTest.java
+++ b/testing/android/junit/javatests/src/org/chromium/testing/local/GtestLoggerTest.java
@@ -114,9 +114,9 @@
Set<Description> failures = new TreeSet<Description>(new DescriptionComparator());
failures.add(Description.createTestDescription(
- "GtestLoggerTest", "testTestRunFinishedNoFailures"));
+ GtestLoggerTest.class, "testTestRunFinishedNoFailures"));
failures.add(Description.createTestDescription(
- "GtestLoggerTest", "testTestRunFinishedWithFailures"));
+ GtestLoggerTest.class, "testTestRunFinishedWithFailures"));
loggerUnderTest.testRunFinished(1232, failures, 4312);
Assert.assertEquals(
@@ -124,8 +124,10 @@
+ "[==========] 1234 tests ran. (4312 ms total)\n"
+ "[ PASSED ] 1232 tests.\n"
+ "[ FAILED ] 2 tests.\n"
- + "[ FAILED ] GtestLoggerTest.testTestRunFinishedNoFailures\n"
- + "[ FAILED ] GtestLoggerTest.testTestRunFinishedWithFailures\n"
+ + "[ FAILED ] org.chromium.testing.local.GtestLoggerTest"
+ + ".testTestRunFinishedNoFailures\n"
+ + "[ FAILED ] org.chromium.testing.local.GtestLoggerTest"
+ + ".testTestRunFinishedWithFailures\n"
+ "\n",
actual.toString());
}
diff --git a/testing/android/junit/javatests/src/org/chromium/testing/local/RunnerFilterTest.java b/testing/android/junit/javatests/src/org/chromium/testing/local/RunnerFilterTest.java
index 9a73be7..9f54bfa 100644
--- a/testing/android/junit/javatests/src/org/chromium/testing/local/RunnerFilterTest.java
+++ b/testing/android/junit/javatests/src/org/chromium/testing/local/RunnerFilterTest.java
@@ -18,6 +18,8 @@
@RunWith(BlockJUnit4ClassRunner.class)
public class RunnerFilterTest {
+ private class FakeTestClass {}
+
@Test
public void testDescription() {
Filter filterUnderTest = new RunnerFilter(BlockJUnit4ClassRunner.class);
@@ -50,7 +52,7 @@
public void testClassNotFound() {
Filter filterUnderTest = new RunnerFilter(BlockJUnit4ClassRunner.class);
Assert.assertFalse(filterUnderTest.shouldRun(
- Description.createTestDescription("FakeTestClass", "fakeTestMethod")));
+ Description.createTestDescription(FakeTestClass.class, "fakeTestMethod")));
}
}
diff --git a/testing/chromoting/browser_test_commands_linux.txt b/testing/chromoting/browser_test_commands_linux.txt
index 3b6a61b..2c3d462 100644
--- a/testing/chromoting/browser_test_commands_linux.txt
+++ b/testing/chromoting/browser_test_commands_linux.txt
@@ -1,6 +1,6 @@
-/usr/bin/python ../xvfb.py $(PROD_DIR) $(PROD_DIR)/browser_tests --gtest_filter=RemoteDesktopBrowserTest.MANUAL_Launch --run-manual --ui-test-action-timeout=100000 --webapp-unpacked=$(PROD_DIR)/remoting/remoting.webapp --extension-name=Chromoting
-/usr/bin/python ../xvfb.py $(PROD_DIR) $(PROD_DIR)/browser_tests --gtest_filter=RemoteDesktopBrowserTest.MANUAL_Auth --run-manual --ui-test-action-timeout=100000 --webapp-unpacked=$(PROD_DIR)/remoting/remoting.webapp --extension-name=Chromoting --accounts-file=../../remoting/tools/internal/test_accounts.json --account-type=gmail
-/usr/bin/python ../xvfb.py $(PROD_DIR) $(PROD_DIR)/browser_tests --gtest_filter=RemoteDesktopBrowserTest.MANUAL_Auth --run-manual --ui-test-action-timeout=100000 --webapp-unpacked=$(PROD_DIR)/remoting/remoting.webapp --extension-name=Chromoting --accounts-file=../../remoting/tools/internal/test_accounts.json --account-type=gafyd
-/usr/bin/python ../xvfb.py $(PROD_DIR) $(PROD_DIR)/browser_tests --gtest_filter=RemoteDesktopBrowserTest.MANUAL_Auth --run-manual --ui-test-action-timeout=100000 --webapp-unpacked=$(PROD_DIR)/remoting/remoting.webapp --extension-name=Chromoting --accounts-file=../../remoting/tools/internal/test_accounts.json --account-type=non-gmail
-/usr/bin/python ../xvfb.py $(PROD_DIR) $(PROD_DIR)/browser_tests --gtest_filter=RemoteDesktopBrowserTest.MANUAL_Launch --run-manual --ui-test-action-timeout=100000 --webapp-unpacked=$(PROD_DIR)/remoting/remoting.webapp.v2 --extension-name=Chromoting
-/usr/bin/python ../xvfb.py $(PROD_DIR) $(PROD_DIR)/browser_tests --gtest_filter=RemoteDesktopBrowserTest.MANUAL_Auth --run-manual --ui-test-action-timeout=20000 --webapp-unpacked=$(PROD_DIR)/remoting/remoting.webapp.v2 --extension-name=Chromoting --accounts-file=../../remoting/tools/internal/test_accounts.json --account-type=gmail
+/usr/bin/python ../xvfb.py #PROD_DIR# #PROD_DIR#/browser_tests --gtest_filter=RemoteDesktopBrowserTest.MANUAL_Launch --run-manual --ui-test-action-timeout=100000 --webapp-unpacked=#PROD_DIR#/remoting/remoting.webapp --extension-name=Chromoting
+/usr/bin/python ../xvfb.py #PROD_DIR# #PROD_DIR#/browser_tests --gtest_filter=RemoteDesktopBrowserTest.MANUAL_Auth --run-manual --ui-test-action-timeout=100000 --webapp-unpacked=#PROD_DIR#/remoting/remoting.webapp --extension-name=Chromoting --accounts-file=../../remoting/tools/internal/test_accounts.json --account-type=gmail
+/usr/bin/python ../xvfb.py #PROD_DIR# #PROD_DIR#/browser_tests --gtest_filter=RemoteDesktopBrowserTest.MANUAL_Auth --run-manual --ui-test-action-timeout=100000 --webapp-unpacked=#PROD_DIR#/remoting/remoting.webapp --extension-name=Chromoting --accounts-file=../../remoting/tools/internal/test_accounts.json --account-type=gafyd
+/usr/bin/python ../xvfb.py #PROD_DIR# #PROD_DIR#/browser_tests --gtest_filter=RemoteDesktopBrowserTest.MANUAL_Auth --run-manual --ui-test-action-timeout=100000 --webapp-unpacked=#PROD_DIR#/remoting/remoting.webapp --extension-name=Chromoting --accounts-file=../../remoting/tools/internal/test_accounts.json --account-type=non-gmail
+/usr/bin/python ../xvfb.py #PROD_DIR# #PROD_DIR#/browser_tests --gtest_filter=RemoteDesktopBrowserTest.MANUAL_Launch --run-manual --ui-test-action-timeout=100000 --webapp-unpacked=#PROD_DIR#/remoting/remoting.webapp.v2 --extension-name=Chromoting
+/usr/bin/python ../xvfb.py #PROD_DIR# #PROD_DIR#/browser_tests --gtest_filter=RemoteDesktopBrowserTest.MANUAL_Auth --run-manual --ui-test-action-timeout=20000 --webapp-unpacked=#PROD_DIR#/remoting/remoting.webapp.v2 --extension-name=Chromoting --accounts-file=../../remoting/tools/internal/test_accounts.json --account-type=gmail
diff --git a/testing/chromoting/browser_tests_launcher.py b/testing/chromoting/browser_tests_launcher.py
index 8f4bba1..4347287 100644
--- a/testing/chromoting/browser_tests_launcher.py
+++ b/testing/chromoting/browser_tests_launcher.py
@@ -5,36 +5,112 @@
"""Utility script to launch browser-tests on the Chromoting bot."""
import argparse
+import hashlib
+import os
+from os.path import expanduser
+import shutil
+import socket
import subprocess
-PROD_DIR_ID = '$(PROD_DIR)'
+BROWSER_TEST_ID = 'browser_tests'
+PROD_DIR_ID = '#PROD_DIR#'
+HOST_HASH_VALUE = hashlib.md5(socket.gethostname()).hexdigest()
+SUCCESS_INDICATOR = 'SUCCESS: all tests passed.'
+NATIVE_MESSAGING_DIR = 'NativeMessagingHosts'
+CRD_ID = 'chrome-remote-desktop' # Used in a few file/folder names
def LaunchCommand(command):
-
cmd_line = [command]
try:
p = subprocess.Popen(cmd_line, stdout=subprocess.PIPE, shell=True)
results, err = p.communicate()
- if 'SUCCESS: all tests passed.' not in results:
- raise Exception('Test failed\n%s\n%s' % (results, err))
+ # Check that the test passed.
+ if SUCCESS_INDICATOR not in results:
+ raise Exception(
+ 'Test failed. Command:%s\nResults:%s\nError:%s\n' %
+ (command, results, err))
except subprocess.CalledProcessError, e:
raise Exception('Exception %s running command %s' % (e, command))
else:
print results
-def main():
+def InitialiseTestMachineForLinux(cfg_file, manifest_file, user_profile_dir):
+ """Sets up a Linux machine for connect-to-host browser-tests.
+ Copy over me2me host-config and manifest files to expected locations.
+ By default, the Linux me2me host expects the host-config file to be under
+ $HOME/.config/chrome-remote-desktop
+ Its name is expected to have a hash that is specific to a machine.
+
+ When a user launches the remoting web-app, the native-message host process is
+ started. For this to work, the manifest file for me2me host is expected to be
+ in a specific folder under the user-profile dir.
+
+ This function performs both the above tasks.
+
+ TODO(anandc):
+ Once we have Linux machines in the swarming lab already installed with the
+ me2me host, this function should also perform the step of starting the host.
+ That is gated on this CL: https://chromereviews.googleplex.com/123957013/, and
+ then having base images in the chrome-labs be updated with it.
+
+ Args:
+ cfg_file: location of test account's host-config file.
+ manifest_file: location of me2me host manifest file.
+ user_profile_dir: user-profile-dir to be used by the connect-to-host tests.
+ """
+
+ # First get home directory on current machine.
+ home_dir = expanduser('~')
+ default_config_file_location = os.path.join(home_dir, '.config', CRD_ID)
+ if os.path.exists(default_config_file_location):
+ shutil.rmtree(default_config_file_location)
+ os.makedirs(default_config_file_location)
+
+ # Copy over test host-config to expected location, with expected file-name.
+ # The file-name should contain a hash-value that is machine-specific.
+ default_config_file_name = 'host#%s.json' % HOST_HASH_VALUE
+ config_file_src = os.path.join(os.getcwd(), cfg_file)
+ shutil.copyfile(
+ config_file_src,
+ os.path.join(default_config_file_location, default_config_file_name))
+
+ # Next, create a user-profile dir, and place the me2me manifest.json file in
+ # the expected location for native-messating-host to work properly.
+ native_messaging_folder = os.path.join(user_profile_dir, NATIVE_MESSAGING_DIR)
+
+ if os.path.exists(native_messaging_folder):
+ shutil.rmtree(native_messaging_folder)
+ os.makedirs(native_messaging_folder)
+
+ manifest_file_src = os.path.join(os.getcwd(), manifest_file)
+ manifest_file_dest = (
+ os.path.join(native_messaging_folder, os.path.basename(manifest_file)))
+ shutil.copyfile(manifest_file_src, manifest_file_dest)
+
+
+def main():
parser = argparse.ArgumentParser()
- parser.add_argument('-f', '--file',
+ parser.add_argument('-f', '--commands_file',
help='path to file listing commands to be launched.')
parser.add_argument('-p', '--prod_dir',
help='path to folder having product and test binaries.')
+ parser.add_argument('-c', '--cfg_file',
+ help='path to test host config file.')
+ parser.add_argument('-m', '--manifest_file',
+ help='path to me2me host manifest file.')
+ parser.add_argument(
+ '-u', '--user_profile_dir',
+ help='path to user-profile-dir, used by connect-to-host tests.')
args = parser.parse_args()
- with open(args.file) as f:
+ InitialiseTestMachineForLinux(args.cfg_file, args.manifest_file,
+ args.user_profile_dir)
+
+ with open(args.commands_file) as f:
for line in f:
# Replace the PROD_DIR value in the command-line with
# the passed in value.
diff --git a/testing/chromoting/chromoting_integration_tests.isolate b/testing/chromoting/chromoting_integration_tests.isolate
index cdfd8c4..88fe162 100644
--- a/testing/chromoting/chromoting_integration_tests.isolate
+++ b/testing/chromoting/chromoting_integration_tests.isolate
@@ -7,10 +7,16 @@
'variables': {
'command': [
'./browser_tests_launcher.py',
- '-f',
+ '--commands_file',
'./browser_test_commands_linux.txt',
- '-p',
+ '--prod_dir',
'<(PRODUCT_DIR)',
+ '--cfg_file',
+ '../../remoting/tools/internal/test-account-host-config.json',
+ '--manifest_file',
+ '<(PRODUCT_DIR)/remoting/com.google.chrome.remote_desktop.json',
+ '--user_profile_dir',
+ '/tmp/chromoting_test_profile',
],
'files': [
'../xvfb.py',
@@ -19,6 +25,8 @@
'<(PRODUCT_DIR)/libffmpegsumo.so',
'<(PRODUCT_DIR)/libosmesa.so',
'<(PRODUCT_DIR)/nacl_irt_x86_64.nexe',
+ '../../remoting/tools/internal/test-account-host-config.json',
+ '<(PRODUCT_DIR)/remoting/com.google.chrome.remote_desktop.json',
],
},
}],
@@ -37,7 +45,7 @@
'<(PRODUCT_DIR)/remoting/remoting.webapp/',
'<(PRODUCT_DIR)/remoting/remoting.webapp.v2/',
'<(PRODUCT_DIR)/resources.pak',
- '../../remoting/tools/internal/test_accounts.json',
+ '../../remoting/tools/internal/test_accounts.json',
],
'read_only': 1,
},
@@ -83,5 +91,6 @@
],
'includes': [
'../../base/base.isolate',
+ '../../gin/v8.isolate',
],
-}
\ No newline at end of file
+}
diff --git a/testing/chromoting/integration_tests.gyp b/testing/chromoting/integration_tests.gyp
index 78c1368..2588d24 100644
--- a/testing/chromoting/integration_tests.gyp
+++ b/testing/chromoting/integration_tests.gyp
@@ -26,7 +26,7 @@
'../../remoting/remoting.gyp:remoting_me2me_host_archive',
],
}], # OS=="linux"
- ],
+ ],
},
],
}],
diff --git a/third_party/boringssl/BUILD.gn b/third_party/boringssl/BUILD.gn
index ccd8424..88676ad 100644
--- a/third_party/boringssl/BUILD.gn
+++ b/third_party/boringssl/BUILD.gn
@@ -7,9 +7,7 @@
include_dirs = []
include_dirs += [ "src/include" ]
if (is_component_build) {
- defines = [
- "BORINGSSL_SHARED_LIBRARY",
- ]
+ defines = [ "BORINGSSL_SHARED_LIBRARY" ]
}
}
@@ -19,11 +17,11 @@
}
# The list of BoringSSL files is kept in boringssl.gypi.
-gypi_values = exec_script(
- "//build/gypi_to_gn.py",
- [ rebase_path("//third_party/boringssl/boringssl.gypi") ],
- "scope",
- [ "//third_party/boringssl/boringssl.gypi" ])
+gypi_values =
+ exec_script("//build/gypi_to_gn.py",
+ [ rebase_path("//third_party/boringssl/boringssl.gypi") ],
+ "scope",
+ [ "//third_party/boringssl/boringssl.gypi" ])
# Windows' assembly is built with Yasm. The other platforms use the platform
# assembler.
@@ -49,9 +47,7 @@
"BORINGSSL_NO_STATIC_INITIALIZER",
]
if (is_component_build) {
- defines += [
- "BORINGSSL_SHARED_LIBRARY",
- ]
+ defines += [ "BORINGSSL_SHARED_LIBRARY" ]
}
configs -= [ "//build/config/compiler:chromium_code" ]
@@ -60,6 +56,7 @@
# Also gets the include dirs from :openssl_config
include_dirs = [
"src/include",
+
# This is for arm_arch.h, which is needed by some asm files. Since the
# asm files are generated and kept in a different directory, they
# cannot use relative paths to find this file.
@@ -69,7 +66,7 @@
if (is_win) {
# TODO(davidben): Fix size_t truncations in BoringSSL.
# https://crbug.com/429039
- cflags += [ "/wd4267"]
+ cflags += [ "/wd4267" ]
}
if (cpu_arch == "x64") {
diff --git a/third_party/brotli/BUILD.gn b/third_party/brotli/BUILD.gn
index 73fb5b9..fa856ee 100644
--- a/third_party/brotli/BUILD.gn
+++ b/third_party/brotli/BUILD.gn
@@ -42,7 +42,9 @@
configs -= [ "//build/config/compiler:chromium_code" ]
configs += [ "//build/config/compiler:no_chromium_code" ]
- deps = [ ":brotli" ]
+ deps = [
+ ":brotli",
+ ]
include_dirs = [
"src/brotli/dec",
diff --git a/third_party/cython/cython_compiler.gypi b/third_party/cython/cython_compiler.gypi
deleted file mode 100644
index ca974a2..0000000
--- a/third_party/cython/cython_compiler.gypi
+++ /dev/null
@@ -1,64 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-{
- 'variables': {
- 'python_flags': '<(DEPTH)/third_party/cython/python_flags.py',
- },
- 'conditions': [
- ['OS=="mac"', {
- 'variables': {
- 'module_prefix': '',
- 'module_suffix': '.so',
- },
- }, {
- 'variables': {
- 'module_prefix': '<(SHARED_LIB_PREFIX)',
- 'module_suffix': '<(SHARED_LIB_SUFFIX)',
- },
- }],
- ],
- 'type': 'loadable_module',
- 'rules': [
- {
- 'rule_name': '<(_target_name)_cython_compiler',
- 'extension': 'pyx',
- 'variables': {
- 'cython_compiler': '<(DEPTH)/third_party/cython/src/cython.py',
- },
- 'inputs': [
- '<(cython_compiler)',
- ],
- 'outputs': [
- '<(SHARED_INTERMEDIATE_DIR)/cython/<(python_base_module)/<(RULE_INPUT_ROOT).cc',
- ],
- 'action': [
- 'python', '<(cython_compiler)',
- '--cplus',
- '-I<(DEPTH)',
- '-o', '<@(_outputs)',
- '<(RULE_INPUT_PATH)',
- ],
- 'message': 'Generating C++ source from <(RULE_INPUT_PATH)',
- 'process_outputs_as_sources': 1,
- }
- ],
- 'include_dirs': [
- '<!@(python <(python_flags) --includes)',
- '<(DEPTH)',
- ],
- 'libraries': [
- '<!@(python <(python_flags) --libraries)',
- ],
- 'cflags': [
- '-Wno-unused-function',
- ],
- 'xcode_settings': {
- 'WARNING_CFLAGS': [ '-Wno-unused-function' ],
- },
- 'library_dirs': [
- '<!@(python <(python_flags) --library_dirs)',
- ],
- 'hard_dependency': 1,
-}
diff --git a/third_party/cython/python_flags.py b/third_party/cython/python_flags.py
index b10aece..492c9a9 100644
--- a/third_party/cython/python_flags.py
+++ b/third_party/cython/python_flags.py
@@ -16,9 +16,6 @@
"""
parser = argparse.ArgumentParser(
description='Retrieves compilation options for python modules.')
- parser.add_argument('--gn',
- help='Returns all values in a format suitable for gn',
- action='store_true')
parser.add_argument('--libraries', help='Returns libraries',
action='store_true')
parser.add_argument('--includes', help='Returns includes',
@@ -36,11 +33,6 @@
libraries = b.get_libraries(ext)
if sys.platform == 'darwin':
libraries.append('python%s' % sys.version[:3])
- if not opts.gn and sys.platform in ['darwin', 'linux2']:
- # In case of GYP output for darwin and linux prefix all
- # libraries (if there are any) so the result can be used as a
- # compiler argument. GN handles platform-appropriate prefixing itself.
- libraries = ['-l%s' % library for library in libraries]
result.extend(libraries)
if opts.includes:
result = result + b.include_dirs
@@ -48,11 +40,8 @@
if sys.platform == 'darwin':
result.append('%s/lib' % sysconfig.get_config_vars('prefix')[0])
- if opts.gn:
- for x in result:
- print x
- else:
- print ''.join(['"%s"' % x for x in result])
+ for x in result:
+ print x
if __name__ == '__main__':
main()
diff --git a/third_party/cython/rules.gni b/third_party/cython/rules.gni
index efd9ca3..cea1e36 100644
--- a/third_party/cython/rules.gni
+++ b/third_party/cython/rules.gni
@@ -2,20 +2,78 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-template("python_binary_module") {
+template("python_binary_module_sources") {
# Only available on linux for now.
assert(is_linux)
assert(defined(invoker.sources))
- assert(defined(invoker.python_base_module))
cython_root = "//third_party/cython"
cython_script = "$cython_root/src/cython.py"
cython_output = "${target_out_dir}/${target_name}.cc"
generator_target_name = target_name + "_cython_compiler"
- shared_library_name = target_name + "_shared_library"
config_name = target_name + "_python_config"
+ target_visibility = [ ":$target_name" ]
+
+ action(generator_target_name) {
+ visibility = target_visibility
+ script = cython_script
+ sources = invoker.sources
+ outputs = [ cython_output ]
+ args = [
+ "--cplus",
+ "-I",
+ rebase_path("//", root_build_dir),
+ "-o",
+ rebase_path(cython_output, root_build_dir),
+ ] + rebase_path(sources, root_build_dir)
+ }
+
+ config(config_name) {
+ visibility = target_visibility
+ python_flags = "//third_party/cython/python_flags.py"
+ include_dirs = exec_script(python_flags, [ "--includes" ], "list lines")
+ libs = exec_script(python_flags, [ "--libraries" ], "list lines")
+ lib_dirs = exec_script(python_flags, [ "--library_dirs" ], "list lines")
+ if (!is_win) {
+ # Generated code includes static utility functions that often go unused.
+ cflags = [ "-Wno-unused-function" ]
+ }
+ }
+
+ source_set(target_name) {
+ deps = [
+ ":$generator_target_name",
+ ]
+ if (defined(invoker.visibility)) {
+ visibility = invoker.visibility
+ }
+ if (defined(invoker.deps)) {
+ deps += invoker.deps
+ }
+ if (defined(invoker.datadeps)) {
+ datadeps = invoker.datadeps
+ }
+ sources = [
+ cython_output,
+ ]
+ if (defined(invoker.additional_sources)) {
+ sources += invoker.additional_sources
+ }
+ all_dependent_configs = [ ":$config_name" ]
+ }
+}
+
+template("python_binary_module") {
+ # Only available on linux for now.
+ assert(is_linux)
+ assert(defined(invoker.sources))
+ assert(defined(invoker.python_base_module))
+
+ sources_target_name = target_name + "_cython_sources"
+ shared_library_name = target_name + "_shared_library"
+
if (is_linux) {
shared_library_prefix = "lib"
shared_library_suffix = ".so"
@@ -23,47 +81,20 @@
}
target_visibility = [
- ":$generator_target_name",
+ ":$sources_target_name",
":$shared_library_name",
":$target_name",
]
- action(generator_target_name) {
+ python_binary_module_sources(sources_target_name) {
visibility = target_visibility
- script = cython_script
sources = invoker.sources
- outputs = [ cython_output ]
- args = [
- "--cplus",
- "-I", rebase_path("//", root_build_dir),
- "-o", rebase_path(cython_output, root_build_dir),
- ] + rebase_path(sources, root_build_dir)
- }
-
- config(config_name) {
- visibility = target_visibility
- python_flags = "//third_party/cython/python_flags.py"
- include_dirs = exec_script(python_flags,
- [ "--gn", "--includes" ],
- "list lines")
- libs = exec_script(python_flags,
- [ "--gn", "--libraries" ],
- "list lines")
- lib_dirs = exec_script(python_flags,
- [ "--gn", "--library_dirs" ],
- "list lines")
- if (!is_win) {
- # Generated code includes static utility functions that often go unused.
- cflags = [
- "-Wno-unused-function",
- ]
- }
}
shared_library(shared_library_name) {
visibility = target_visibility
deps = [
- ":$generator_target_name",
+ ":$sources_target_name",
]
if (defined(invoker.deps)) {
deps += invoker.deps
@@ -71,11 +102,9 @@
if (defined(invoker.datadeps)) {
datadeps = invoker.datadeps
}
- sources = [ cython_output ]
if (defined(invoker.additional_sources)) {
- sources += invoker.additional_sources
+ sources = invoker.additional_sources
}
- configs += [ ":$config_name" ]
if (defined(invoker.configs)) {
configs += invoker.configs
}
@@ -84,13 +113,12 @@
copy(target_name) {
python_base_module = invoker.python_base_module
sources = [
- "$root_out_dir/${shared_library_prefix}${shared_library_name}${shared_library_suffix}"
+ "$root_out_dir/${shared_library_prefix}${shared_library_name}${shared_library_suffix}",
]
- outputs = [
- "$root_out_dir/python/$python_base_module/${target_name}${python_module_suffix}"
- ]
+ outputs =
+ [ "$root_out_dir/python/$python_base_module/${target_name}${python_module_suffix}" ]
deps = [
- ":$shared_library_name"
+ ":$shared_library_name",
]
}
}
diff --git a/third_party/freetype2/BUILD.gn b/third_party/freetype2/BUILD.gn
index 18ef5f5..fe3d921 100644
--- a/third_party/freetype2/BUILD.gn
+++ b/third_party/freetype2/BUILD.gn
@@ -5,7 +5,10 @@
assert(is_linux, "This file should only be depended on from Linux.")
config("freetype2_config") {
- include_dirs = [ "include", "src/include" ]
+ include_dirs = [
+ "include",
+ "src/include",
+ ]
}
shared_library("freetype2") {
@@ -56,7 +59,6 @@
defines = [
"FT_CONFIG_OPTION_SYSTEM_ZLIB",
"FT2_BUILD_LIBRARY",
-
"FT_CONFIG_CONFIG_H=<ftconfig.h>", # See comments in README.chromium.
"FT_CONFIG_MODULES_H=<ftmodule.h>", # See comments in README.chromium.
]
@@ -64,7 +66,7 @@
configs -= [ "//build/config/compiler:chromium_code" ]
configs += [ "//build/config/compiler:no_chromium_code" ]
configs += [ ":freetype2_config" ]
-
+
public_configs = [ ":freetype2_config" ]
libs = [ "z" ]
diff --git a/third_party/harfbuzz-ng/BUILD.gn b/third_party/harfbuzz-ng/BUILD.gn
index 195c5c8..a1b25eb 100644
--- a/third_party/harfbuzz-ng/BUILD.gn
+++ b/third_party/harfbuzz-ng/BUILD.gn
@@ -28,10 +28,12 @@
# Use the system harfbuzz for newer versions of pangoft, and not for older
# ones. pangoft links to the system harfbuzz starting with 1.31.0, which
# causes duplicate symbols when we link our own version.
- use_system_harfbuzz = exec_script(
- pkg_config_script,
- pkg_config_args + [ "--atleast-version=1.31.0", "pangoft2" ],
- "value")
+ use_system_harfbuzz = exec_script(pkg_config_script,
+ pkg_config_args + [
+ "--atleast-version=1.31.0",
+ "pangoft2",
+ ],
+ "value")
} else {
use_system_harfbuzz = false
}
@@ -45,7 +47,6 @@
group("harfbuzz-ng") {
public_configs = [ ":harfbuzz_pkgconfig" ]
}
-
} else {
config("harfbuzz-ng_config") {
include_dirs = [ "src" ]
diff --git a/third_party/iccjpeg/BUILD.gn b/third_party/iccjpeg/BUILD.gn
index 86bdd73..4c4a995 100644
--- a/third_party/iccjpeg/BUILD.gn
+++ b/third_party/iccjpeg/BUILD.gn
@@ -9,9 +9,11 @@
source_set("iccjpeg") {
sources = [
"iccjpeg.c",
- "iccjpeg.h"
+ "iccjpeg.h",
]
public_configs = [ ":iccjpeg_config" ]
- deps = [ "//third_party:jpeg" ]
+ deps = [
+ "//third_party:jpeg",
+ ]
}
diff --git a/third_party/khronos/GLES3/gl3.h b/third_party/khronos/GLES3/gl3.h
new file mode 100644
index 0000000..d98d8c6
--- /dev/null
+++ b/third_party/khronos/GLES3/gl3.h
@@ -0,0 +1,939 @@
+#ifndef __gl3_h_
+#define __gl3_h_ 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+** Copyright (c) 2013-2014 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** "Materials"), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+/*
+** This header is generated from the Khronos OpenGL / OpenGL ES XML
+** API Registry. The current version of the Registry, generator scripts
+** used to make the header, and the header can be found at
+** http://www.opengl.org/registry/
+**
+** Khronos $Revision: 28985 $ on $Date: 2014-11-18 18:42:43 -0800 (Tue, 18 Nov 2014) $
+*/
+
+#include <GLES3/gl3platform.h>
+
+/* Generated on date 20141118 */
+
+/* Generated C header for:
+ * API: gles2
+ * Profile: common
+ * Versions considered: 2\.[0-9]|3.0
+ * Versions emitted: .*
+ * Default extensions included: None
+ * Additional extensions included: _nomatch_^
+ * Extensions removed: _nomatch_^
+ */
+
+#ifndef GL_ES_VERSION_2_0
+#define GL_ES_VERSION_2_0 1
+#include <KHR/khrplatform.h>
+typedef khronos_int8_t GLbyte;
+typedef khronos_float_t GLclampf;
+typedef khronos_int32_t GLfixed;
+typedef short GLshort;
+typedef unsigned short GLushort;
+typedef void GLvoid;
+typedef struct __GLsync *GLsync;
+typedef khronos_int64_t GLint64;
+typedef khronos_uint64_t GLuint64;
+typedef unsigned int GLenum;
+typedef unsigned int GLuint;
+typedef char GLchar;
+typedef khronos_float_t GLfloat;
+typedef khronos_ssize_t GLsizeiptr;
+typedef khronos_intptr_t GLintptr;
+typedef unsigned int GLbitfield;
+typedef int GLint;
+typedef unsigned char GLboolean;
+typedef int GLsizei;
+typedef khronos_uint8_t GLubyte;
+#define GL_DEPTH_BUFFER_BIT 0x00000100
+#define GL_STENCIL_BUFFER_BIT 0x00000400
+#define GL_COLOR_BUFFER_BIT 0x00004000
+#define GL_FALSE 0
+#define GL_TRUE 1
+#define GL_POINTS 0x0000
+#define GL_LINES 0x0001
+#define GL_LINE_LOOP 0x0002
+#define GL_LINE_STRIP 0x0003
+#define GL_TRIANGLES 0x0004
+#define GL_TRIANGLE_STRIP 0x0005
+#define GL_TRIANGLE_FAN 0x0006
+#define GL_ZERO 0
+#define GL_ONE 1
+#define GL_SRC_COLOR 0x0300
+#define GL_ONE_MINUS_SRC_COLOR 0x0301
+#define GL_SRC_ALPHA 0x0302
+#define GL_ONE_MINUS_SRC_ALPHA 0x0303
+#define GL_DST_ALPHA 0x0304
+#define GL_ONE_MINUS_DST_ALPHA 0x0305
+#define GL_DST_COLOR 0x0306
+#define GL_ONE_MINUS_DST_COLOR 0x0307
+#define GL_SRC_ALPHA_SATURATE 0x0308
+#define GL_FUNC_ADD 0x8006
+#define GL_BLEND_EQUATION 0x8009
+#define GL_BLEND_EQUATION_RGB 0x8009
+#define GL_BLEND_EQUATION_ALPHA 0x883D
+#define GL_FUNC_SUBTRACT 0x800A
+#define GL_FUNC_REVERSE_SUBTRACT 0x800B
+#define GL_BLEND_DST_RGB 0x80C8
+#define GL_BLEND_SRC_RGB 0x80C9
+#define GL_BLEND_DST_ALPHA 0x80CA
+#define GL_BLEND_SRC_ALPHA 0x80CB
+#define GL_CONSTANT_COLOR 0x8001
+#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002
+#define GL_CONSTANT_ALPHA 0x8003
+#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004
+#define GL_BLEND_COLOR 0x8005
+#define GL_ARRAY_BUFFER 0x8892
+#define GL_ELEMENT_ARRAY_BUFFER 0x8893
+#define GL_ARRAY_BUFFER_BINDING 0x8894
+#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895
+#define GL_STREAM_DRAW 0x88E0
+#define GL_STATIC_DRAW 0x88E4
+#define GL_DYNAMIC_DRAW 0x88E8
+#define GL_BUFFER_SIZE 0x8764
+#define GL_BUFFER_USAGE 0x8765
+#define GL_CURRENT_VERTEX_ATTRIB 0x8626
+#define GL_FRONT 0x0404
+#define GL_BACK 0x0405
+#define GL_FRONT_AND_BACK 0x0408
+#define GL_TEXTURE_2D 0x0DE1
+#define GL_CULL_FACE 0x0B44
+#define GL_BLEND 0x0BE2
+#define GL_DITHER 0x0BD0
+#define GL_STENCIL_TEST 0x0B90
+#define GL_DEPTH_TEST 0x0B71
+#define GL_SCISSOR_TEST 0x0C11
+#define GL_POLYGON_OFFSET_FILL 0x8037
+#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E
+#define GL_SAMPLE_COVERAGE 0x80A0
+#define GL_NO_ERROR 0
+#define GL_INVALID_ENUM 0x0500
+#define GL_INVALID_VALUE 0x0501
+#define GL_INVALID_OPERATION 0x0502
+#define GL_OUT_OF_MEMORY 0x0505
+#define GL_CW 0x0900
+#define GL_CCW 0x0901
+#define GL_LINE_WIDTH 0x0B21
+#define GL_ALIASED_POINT_SIZE_RANGE 0x846D
+#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E
+#define GL_CULL_FACE_MODE 0x0B45
+#define GL_FRONT_FACE 0x0B46
+#define GL_DEPTH_RANGE 0x0B70
+#define GL_DEPTH_WRITEMASK 0x0B72
+#define GL_DEPTH_CLEAR_VALUE 0x0B73
+#define GL_DEPTH_FUNC 0x0B74
+#define GL_STENCIL_CLEAR_VALUE 0x0B91
+#define GL_STENCIL_FUNC 0x0B92
+#define GL_STENCIL_FAIL 0x0B94
+#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95
+#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96
+#define GL_STENCIL_REF 0x0B97
+#define GL_STENCIL_VALUE_MASK 0x0B93
+#define GL_STENCIL_WRITEMASK 0x0B98
+#define GL_STENCIL_BACK_FUNC 0x8800
+#define GL_STENCIL_BACK_FAIL 0x8801
+#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802
+#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803
+#define GL_STENCIL_BACK_REF 0x8CA3
+#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4
+#define GL_STENCIL_BACK_WRITEMASK 0x8CA5
+#define GL_VIEWPORT 0x0BA2
+#define GL_SCISSOR_BOX 0x0C10
+#define GL_COLOR_CLEAR_VALUE 0x0C22
+#define GL_COLOR_WRITEMASK 0x0C23
+#define GL_UNPACK_ALIGNMENT 0x0CF5
+#define GL_PACK_ALIGNMENT 0x0D05
+#define GL_MAX_TEXTURE_SIZE 0x0D33
+#define GL_MAX_VIEWPORT_DIMS 0x0D3A
+#define GL_SUBPIXEL_BITS 0x0D50
+#define GL_RED_BITS 0x0D52
+#define GL_GREEN_BITS 0x0D53
+#define GL_BLUE_BITS 0x0D54
+#define GL_ALPHA_BITS 0x0D55
+#define GL_DEPTH_BITS 0x0D56
+#define GL_STENCIL_BITS 0x0D57
+#define GL_POLYGON_OFFSET_UNITS 0x2A00
+#define GL_POLYGON_OFFSET_FACTOR 0x8038
+#define GL_TEXTURE_BINDING_2D 0x8069
+#define GL_SAMPLE_BUFFERS 0x80A8
+#define GL_SAMPLES 0x80A9
+#define GL_SAMPLE_COVERAGE_VALUE 0x80AA
+#define GL_SAMPLE_COVERAGE_INVERT 0x80AB
+#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2
+#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3
+#define GL_DONT_CARE 0x1100
+#define GL_FASTEST 0x1101
+#define GL_NICEST 0x1102
+#define GL_GENERATE_MIPMAP_HINT 0x8192
+#define GL_BYTE 0x1400
+#define GL_UNSIGNED_BYTE 0x1401
+#define GL_SHORT 0x1402
+#define GL_UNSIGNED_SHORT 0x1403
+#define GL_INT 0x1404
+#define GL_UNSIGNED_INT 0x1405
+#define GL_FLOAT 0x1406
+#define GL_FIXED 0x140C
+#define GL_DEPTH_COMPONENT 0x1902
+#define GL_ALPHA 0x1906
+#define GL_RGB 0x1907
+#define GL_RGBA 0x1908
+#define GL_LUMINANCE 0x1909
+#define GL_LUMINANCE_ALPHA 0x190A
+#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033
+#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034
+#define GL_UNSIGNED_SHORT_5_6_5 0x8363
+#define GL_FRAGMENT_SHADER 0x8B30
+#define GL_VERTEX_SHADER 0x8B31
+#define GL_MAX_VERTEX_ATTRIBS 0x8869
+#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB
+#define GL_MAX_VARYING_VECTORS 0x8DFC
+#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D
+#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C
+#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872
+#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD
+#define GL_SHADER_TYPE 0x8B4F
+#define GL_DELETE_STATUS 0x8B80
+#define GL_LINK_STATUS 0x8B82
+#define GL_VALIDATE_STATUS 0x8B83
+#define GL_ATTACHED_SHADERS 0x8B85
+#define GL_ACTIVE_UNIFORMS 0x8B86
+#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87
+#define GL_ACTIVE_ATTRIBUTES 0x8B89
+#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A
+#define GL_SHADING_LANGUAGE_VERSION 0x8B8C
+#define GL_CURRENT_PROGRAM 0x8B8D
+#define GL_NEVER 0x0200
+#define GL_LESS 0x0201
+#define GL_EQUAL 0x0202
+#define GL_LEQUAL 0x0203
+#define GL_GREATER 0x0204
+#define GL_NOTEQUAL 0x0205
+#define GL_GEQUAL 0x0206
+#define GL_ALWAYS 0x0207
+#define GL_KEEP 0x1E00
+#define GL_REPLACE 0x1E01
+#define GL_INCR 0x1E02
+#define GL_DECR 0x1E03
+#define GL_INVERT 0x150A
+#define GL_INCR_WRAP 0x8507
+#define GL_DECR_WRAP 0x8508
+#define GL_VENDOR 0x1F00
+#define GL_RENDERER 0x1F01
+#define GL_VERSION 0x1F02
+#define GL_EXTENSIONS 0x1F03
+#define GL_NEAREST 0x2600
+#define GL_LINEAR 0x2601
+#define GL_NEAREST_MIPMAP_NEAREST 0x2700
+#define GL_LINEAR_MIPMAP_NEAREST 0x2701
+#define GL_NEAREST_MIPMAP_LINEAR 0x2702
+#define GL_LINEAR_MIPMAP_LINEAR 0x2703
+#define GL_TEXTURE_MAG_FILTER 0x2800
+#define GL_TEXTURE_MIN_FILTER 0x2801
+#define GL_TEXTURE_WRAP_S 0x2802
+#define GL_TEXTURE_WRAP_T 0x2803
+#define GL_TEXTURE 0x1702
+#define GL_TEXTURE_CUBE_MAP 0x8513
+#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A
+#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C
+#define GL_TEXTURE0 0x84C0
+#define GL_TEXTURE1 0x84C1
+#define GL_TEXTURE2 0x84C2
+#define GL_TEXTURE3 0x84C3
+#define GL_TEXTURE4 0x84C4
+#define GL_TEXTURE5 0x84C5
+#define GL_TEXTURE6 0x84C6
+#define GL_TEXTURE7 0x84C7
+#define GL_TEXTURE8 0x84C8
+#define GL_TEXTURE9 0x84C9
+#define GL_TEXTURE10 0x84CA
+#define GL_TEXTURE11 0x84CB
+#define GL_TEXTURE12 0x84CC
+#define GL_TEXTURE13 0x84CD
+#define GL_TEXTURE14 0x84CE
+#define GL_TEXTURE15 0x84CF
+#define GL_TEXTURE16 0x84D0
+#define GL_TEXTURE17 0x84D1
+#define GL_TEXTURE18 0x84D2
+#define GL_TEXTURE19 0x84D3
+#define GL_TEXTURE20 0x84D4
+#define GL_TEXTURE21 0x84D5
+#define GL_TEXTURE22 0x84D6
+#define GL_TEXTURE23 0x84D7
+#define GL_TEXTURE24 0x84D8
+#define GL_TEXTURE25 0x84D9
+#define GL_TEXTURE26 0x84DA
+#define GL_TEXTURE27 0x84DB
+#define GL_TEXTURE28 0x84DC
+#define GL_TEXTURE29 0x84DD
+#define GL_TEXTURE30 0x84DE
+#define GL_TEXTURE31 0x84DF
+#define GL_ACTIVE_TEXTURE 0x84E0
+#define GL_REPEAT 0x2901
+#define GL_CLAMP_TO_EDGE 0x812F
+#define GL_MIRRORED_REPEAT 0x8370
+#define GL_FLOAT_VEC2 0x8B50
+#define GL_FLOAT_VEC3 0x8B51
+#define GL_FLOAT_VEC4 0x8B52
+#define GL_INT_VEC2 0x8B53
+#define GL_INT_VEC3 0x8B54
+#define GL_INT_VEC4 0x8B55
+#define GL_BOOL 0x8B56
+#define GL_BOOL_VEC2 0x8B57
+#define GL_BOOL_VEC3 0x8B58
+#define GL_BOOL_VEC4 0x8B59
+#define GL_FLOAT_MAT2 0x8B5A
+#define GL_FLOAT_MAT3 0x8B5B
+#define GL_FLOAT_MAT4 0x8B5C
+#define GL_SAMPLER_2D 0x8B5E
+#define GL_SAMPLER_CUBE 0x8B60
+#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622
+#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623
+#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624
+#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625
+#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A
+#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645
+#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F
+#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A
+#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B
+#define GL_COMPILE_STATUS 0x8B81
+#define GL_INFO_LOG_LENGTH 0x8B84
+#define GL_SHADER_SOURCE_LENGTH 0x8B88
+#define GL_SHADER_COMPILER 0x8DFA
+#define GL_SHADER_BINARY_FORMATS 0x8DF8
+#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9
+#define GL_LOW_FLOAT 0x8DF0
+#define GL_MEDIUM_FLOAT 0x8DF1
+#define GL_HIGH_FLOAT 0x8DF2
+#define GL_LOW_INT 0x8DF3
+#define GL_MEDIUM_INT 0x8DF4
+#define GL_HIGH_INT 0x8DF5
+#define GL_FRAMEBUFFER 0x8D40
+#define GL_RENDERBUFFER 0x8D41
+#define GL_RGBA4 0x8056
+#define GL_RGB5_A1 0x8057
+#define GL_RGB565 0x8D62
+#define GL_DEPTH_COMPONENT16 0x81A5
+#define GL_STENCIL_INDEX8 0x8D48
+#define GL_RENDERBUFFER_WIDTH 0x8D42
+#define GL_RENDERBUFFER_HEIGHT 0x8D43
+#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44
+#define GL_RENDERBUFFER_RED_SIZE 0x8D50
+#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51
+#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52
+#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53
+#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54
+#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3
+#define GL_COLOR_ATTACHMENT0 0x8CE0
+#define GL_DEPTH_ATTACHMENT 0x8D00
+#define GL_STENCIL_ATTACHMENT 0x8D20
+#define GL_NONE 0
+#define GL_FRAMEBUFFER_COMPLETE 0x8CD5
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7
+#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9
+#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD
+#define GL_FRAMEBUFFER_BINDING 0x8CA6
+#define GL_RENDERBUFFER_BINDING 0x8CA7
+#define GL_MAX_RENDERBUFFER_SIZE 0x84E8
+#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506
+GL_APICALL void GL_APIENTRY glActiveTexture (GLenum texture);
+GL_APICALL void GL_APIENTRY glAttachShader (GLuint program, GLuint shader);
+GL_APICALL void GL_APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name);
+GL_APICALL void GL_APIENTRY glBindBuffer (GLenum target, GLuint buffer);
+GL_APICALL void GL_APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer);
+GL_APICALL void GL_APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer);
+GL_APICALL void GL_APIENTRY glBindTexture (GLenum target, GLuint texture);
+GL_APICALL void GL_APIENTRY glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+GL_APICALL void GL_APIENTRY glBlendEquation (GLenum mode);
+GL_APICALL void GL_APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha);
+GL_APICALL void GL_APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor);
+GL_APICALL void GL_APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+GL_APICALL void GL_APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage);
+GL_APICALL void GL_APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
+GL_APICALL GLenum GL_APIENTRY glCheckFramebufferStatus (GLenum target);
+GL_APICALL void GL_APIENTRY glClear (GLbitfield mask);
+GL_APICALL void GL_APIENTRY glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+GL_APICALL void GL_APIENTRY glClearDepthf (GLfloat d);
+GL_APICALL void GL_APIENTRY glClearStencil (GLint s);
+GL_APICALL void GL_APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+GL_APICALL void GL_APIENTRY glCompileShader (GLuint shader);
+GL_APICALL void GL_APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+GL_APICALL void GL_APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL GLuint GL_APIENTRY glCreateProgram (void);
+GL_APICALL GLuint GL_APIENTRY glCreateShader (GLenum type);
+GL_APICALL void GL_APIENTRY glCullFace (GLenum mode);
+GL_APICALL void GL_APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers);
+GL_APICALL void GL_APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers);
+GL_APICALL void GL_APIENTRY glDeleteProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers);
+GL_APICALL void GL_APIENTRY glDeleteShader (GLuint shader);
+GL_APICALL void GL_APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures);
+GL_APICALL void GL_APIENTRY glDepthFunc (GLenum func);
+GL_APICALL void GL_APIENTRY glDepthMask (GLboolean flag);
+GL_APICALL void GL_APIENTRY glDepthRangef (GLfloat n, GLfloat f);
+GL_APICALL void GL_APIENTRY glDetachShader (GLuint program, GLuint shader);
+GL_APICALL void GL_APIENTRY glDisable (GLenum cap);
+GL_APICALL void GL_APIENTRY glDisableVertexAttribArray (GLuint index);
+GL_APICALL void GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count);
+GL_APICALL void GL_APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices);
+GL_APICALL void GL_APIENTRY glEnable (GLenum cap);
+GL_APICALL void GL_APIENTRY glEnableVertexAttribArray (GLuint index);
+GL_APICALL void GL_APIENTRY glFinish (void);
+GL_APICALL void GL_APIENTRY glFlush (void);
+GL_APICALL void GL_APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+GL_APICALL void GL_APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+GL_APICALL void GL_APIENTRY glFrontFace (GLenum mode);
+GL_APICALL void GL_APIENTRY glGenBuffers (GLsizei n, GLuint *buffers);
+GL_APICALL void GL_APIENTRY glGenerateMipmap (GLenum target);
+GL_APICALL void GL_APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers);
+GL_APICALL void GL_APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers);
+GL_APICALL void GL_APIENTRY glGenTextures (GLsizei n, GLuint *textures);
+GL_APICALL void GL_APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+GL_APICALL void GL_APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+GL_APICALL void GL_APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
+GL_APICALL GLint GL_APIENTRY glGetAttribLocation (GLuint program, const GLchar *name);
+GL_APICALL void GL_APIENTRY glGetBooleanv (GLenum pname, GLboolean *data);
+GL_APICALL void GL_APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL GLenum GL_APIENTRY glGetError (void);
+GL_APICALL void GL_APIENTRY glGetFloatv (GLenum pname, GLfloat *data);
+GL_APICALL void GL_APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetIntegerv (GLenum pname, GLint *data);
+GL_APICALL void GL_APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+GL_APICALL void GL_APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+GL_APICALL void GL_APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
+GL_APICALL void GL_APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+GL_APICALL const GLubyte *GL_APIENTRY glGetString (GLenum name);
+GL_APICALL void GL_APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params);
+GL_APICALL GLint GL_APIENTRY glGetUniformLocation (GLuint program, const GLchar *name);
+GL_APICALL void GL_APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void **pointer);
+GL_APICALL void GL_APIENTRY glHint (GLenum target, GLenum mode);
+GL_APICALL GLboolean GL_APIENTRY glIsBuffer (GLuint buffer);
+GL_APICALL GLboolean GL_APIENTRY glIsEnabled (GLenum cap);
+GL_APICALL GLboolean GL_APIENTRY glIsFramebuffer (GLuint framebuffer);
+GL_APICALL GLboolean GL_APIENTRY glIsProgram (GLuint program);
+GL_APICALL GLboolean GL_APIENTRY glIsRenderbuffer (GLuint renderbuffer);
+GL_APICALL GLboolean GL_APIENTRY glIsShader (GLuint shader);
+GL_APICALL GLboolean GL_APIENTRY glIsTexture (GLuint texture);
+GL_APICALL void GL_APIENTRY glLineWidth (GLfloat width);
+GL_APICALL void GL_APIENTRY glLinkProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glPixelStorei (GLenum pname, GLint param);
+GL_APICALL void GL_APIENTRY glPolygonOffset (GLfloat factor, GLfloat units);
+GL_APICALL void GL_APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
+GL_APICALL void GL_APIENTRY glReleaseShaderCompiler (void);
+GL_APICALL void GL_APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glSampleCoverage (GLfloat value, GLboolean invert);
+GL_APICALL void GL_APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length);
+GL_APICALL void GL_APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
+GL_APICALL void GL_APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilMask (GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass);
+GL_APICALL void GL_APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+GL_APICALL void GL_APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param);
+GL_APICALL void GL_APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params);
+GL_APICALL void GL_APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param);
+GL_APICALL void GL_APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params);
+GL_APICALL void GL_APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glUniform1f (GLint location, GLfloat v0);
+GL_APICALL void GL_APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform1i (GLint location, GLint v0);
+GL_APICALL void GL_APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1);
+GL_APICALL void GL_APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform2i (GLint location, GLint v0, GLint v1);
+GL_APICALL void GL_APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+GL_APICALL void GL_APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2);
+GL_APICALL void GL_APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+GL_APICALL void GL_APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+GL_APICALL void GL_APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUseProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glValidateProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glVertexAttrib1f (GLuint index, GLfloat x);
+GL_APICALL void GL_APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y);
+GL_APICALL void GL_APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z);
+GL_APICALL void GL_APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+GL_APICALL void GL_APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
+GL_APICALL void GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);
+#endif /* GL_ES_VERSION_2_0 */
+
+#ifndef GL_ES_VERSION_3_0
+#define GL_ES_VERSION_3_0 1
+typedef unsigned short GLhalf;
+#define GL_READ_BUFFER 0x0C02
+#define GL_UNPACK_ROW_LENGTH 0x0CF2
+#define GL_UNPACK_SKIP_ROWS 0x0CF3
+#define GL_UNPACK_SKIP_PIXELS 0x0CF4
+#define GL_PACK_ROW_LENGTH 0x0D02
+#define GL_PACK_SKIP_ROWS 0x0D03
+#define GL_PACK_SKIP_PIXELS 0x0D04
+#define GL_COLOR 0x1800
+#define GL_DEPTH 0x1801
+#define GL_STENCIL 0x1802
+#define GL_RED 0x1903
+#define GL_RGB8 0x8051
+#define GL_RGBA8 0x8058
+#define GL_RGB10_A2 0x8059
+#define GL_TEXTURE_BINDING_3D 0x806A
+#define GL_UNPACK_SKIP_IMAGES 0x806D
+#define GL_UNPACK_IMAGE_HEIGHT 0x806E
+#define GL_TEXTURE_3D 0x806F
+#define GL_TEXTURE_WRAP_R 0x8072
+#define GL_MAX_3D_TEXTURE_SIZE 0x8073
+#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368
+#define GL_MAX_ELEMENTS_VERTICES 0x80E8
+#define GL_MAX_ELEMENTS_INDICES 0x80E9
+#define GL_TEXTURE_MIN_LOD 0x813A
+#define GL_TEXTURE_MAX_LOD 0x813B
+#define GL_TEXTURE_BASE_LEVEL 0x813C
+#define GL_TEXTURE_MAX_LEVEL 0x813D
+#define GL_MIN 0x8007
+#define GL_MAX 0x8008
+#define GL_DEPTH_COMPONENT24 0x81A6
+#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD
+#define GL_TEXTURE_COMPARE_MODE 0x884C
+#define GL_TEXTURE_COMPARE_FUNC 0x884D
+#define GL_CURRENT_QUERY 0x8865
+#define GL_QUERY_RESULT 0x8866
+#define GL_QUERY_RESULT_AVAILABLE 0x8867
+#define GL_BUFFER_MAPPED 0x88BC
+#define GL_BUFFER_MAP_POINTER 0x88BD
+#define GL_STREAM_READ 0x88E1
+#define GL_STREAM_COPY 0x88E2
+#define GL_STATIC_READ 0x88E5
+#define GL_STATIC_COPY 0x88E6
+#define GL_DYNAMIC_READ 0x88E9
+#define GL_DYNAMIC_COPY 0x88EA
+#define GL_MAX_DRAW_BUFFERS 0x8824
+#define GL_DRAW_BUFFER0 0x8825
+#define GL_DRAW_BUFFER1 0x8826
+#define GL_DRAW_BUFFER2 0x8827
+#define GL_DRAW_BUFFER3 0x8828
+#define GL_DRAW_BUFFER4 0x8829
+#define GL_DRAW_BUFFER5 0x882A
+#define GL_DRAW_BUFFER6 0x882B
+#define GL_DRAW_BUFFER7 0x882C
+#define GL_DRAW_BUFFER8 0x882D
+#define GL_DRAW_BUFFER9 0x882E
+#define GL_DRAW_BUFFER10 0x882F
+#define GL_DRAW_BUFFER11 0x8830
+#define GL_DRAW_BUFFER12 0x8831
+#define GL_DRAW_BUFFER13 0x8832
+#define GL_DRAW_BUFFER14 0x8833
+#define GL_DRAW_BUFFER15 0x8834
+#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49
+#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A
+#define GL_SAMPLER_3D 0x8B5F
+#define GL_SAMPLER_2D_SHADOW 0x8B62
+#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B
+#define GL_PIXEL_PACK_BUFFER 0x88EB
+#define GL_PIXEL_UNPACK_BUFFER 0x88EC
+#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED
+#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF
+#define GL_FLOAT_MAT2x3 0x8B65
+#define GL_FLOAT_MAT2x4 0x8B66
+#define GL_FLOAT_MAT3x2 0x8B67
+#define GL_FLOAT_MAT3x4 0x8B68
+#define GL_FLOAT_MAT4x2 0x8B69
+#define GL_FLOAT_MAT4x3 0x8B6A
+#define GL_SRGB 0x8C40
+#define GL_SRGB8 0x8C41
+#define GL_SRGB8_ALPHA8 0x8C43
+#define GL_COMPARE_REF_TO_TEXTURE 0x884E
+#define GL_MAJOR_VERSION 0x821B
+#define GL_MINOR_VERSION 0x821C
+#define GL_NUM_EXTENSIONS 0x821D
+#define GL_RGBA32F 0x8814
+#define GL_RGB32F 0x8815
+#define GL_RGBA16F 0x881A
+#define GL_RGB16F 0x881B
+#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD
+#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF
+#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904
+#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905
+#define GL_MAX_VARYING_COMPONENTS 0x8B4B
+#define GL_TEXTURE_2D_ARRAY 0x8C1A
+#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D
+#define GL_R11F_G11F_B10F 0x8C3A
+#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B
+#define GL_RGB9_E5 0x8C3D
+#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E
+#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76
+#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80
+#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83
+#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84
+#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85
+#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88
+#define GL_RASTERIZER_DISCARD 0x8C89
+#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B
+#define GL_INTERLEAVED_ATTRIBS 0x8C8C
+#define GL_SEPARATE_ATTRIBS 0x8C8D
+#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E
+#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F
+#define GL_RGBA32UI 0x8D70
+#define GL_RGB32UI 0x8D71
+#define GL_RGBA16UI 0x8D76
+#define GL_RGB16UI 0x8D77
+#define GL_RGBA8UI 0x8D7C
+#define GL_RGB8UI 0x8D7D
+#define GL_RGBA32I 0x8D82
+#define GL_RGB32I 0x8D83
+#define GL_RGBA16I 0x8D88
+#define GL_RGB16I 0x8D89
+#define GL_RGBA8I 0x8D8E
+#define GL_RGB8I 0x8D8F
+#define GL_RED_INTEGER 0x8D94
+#define GL_RGB_INTEGER 0x8D98
+#define GL_RGBA_INTEGER 0x8D99
+#define GL_SAMPLER_2D_ARRAY 0x8DC1
+#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4
+#define GL_SAMPLER_CUBE_SHADOW 0x8DC5
+#define GL_UNSIGNED_INT_VEC2 0x8DC6
+#define GL_UNSIGNED_INT_VEC3 0x8DC7
+#define GL_UNSIGNED_INT_VEC4 0x8DC8
+#define GL_INT_SAMPLER_2D 0x8DCA
+#define GL_INT_SAMPLER_3D 0x8DCB
+#define GL_INT_SAMPLER_CUBE 0x8DCC
+#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF
+#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2
+#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3
+#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4
+#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7
+#define GL_BUFFER_ACCESS_FLAGS 0x911F
+#define GL_BUFFER_MAP_LENGTH 0x9120
+#define GL_BUFFER_MAP_OFFSET 0x9121
+#define GL_DEPTH_COMPONENT32F 0x8CAC
+#define GL_DEPTH32F_STENCIL8 0x8CAD
+#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD
+#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210
+#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211
+#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212
+#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213
+#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214
+#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215
+#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216
+#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217
+#define GL_FRAMEBUFFER_DEFAULT 0x8218
+#define GL_FRAMEBUFFER_UNDEFINED 0x8219
+#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A
+#define GL_DEPTH_STENCIL 0x84F9
+#define GL_UNSIGNED_INT_24_8 0x84FA
+#define GL_DEPTH24_STENCIL8 0x88F0
+#define GL_UNSIGNED_NORMALIZED 0x8C17
+#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6
+#define GL_READ_FRAMEBUFFER 0x8CA8
+#define GL_DRAW_FRAMEBUFFER 0x8CA9
+#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA
+#define GL_RENDERBUFFER_SAMPLES 0x8CAB
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4
+#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF
+#define GL_COLOR_ATTACHMENT1 0x8CE1
+#define GL_COLOR_ATTACHMENT2 0x8CE2
+#define GL_COLOR_ATTACHMENT3 0x8CE3
+#define GL_COLOR_ATTACHMENT4 0x8CE4
+#define GL_COLOR_ATTACHMENT5 0x8CE5
+#define GL_COLOR_ATTACHMENT6 0x8CE6
+#define GL_COLOR_ATTACHMENT7 0x8CE7
+#define GL_COLOR_ATTACHMENT8 0x8CE8
+#define GL_COLOR_ATTACHMENT9 0x8CE9
+#define GL_COLOR_ATTACHMENT10 0x8CEA
+#define GL_COLOR_ATTACHMENT11 0x8CEB
+#define GL_COLOR_ATTACHMENT12 0x8CEC
+#define GL_COLOR_ATTACHMENT13 0x8CED
+#define GL_COLOR_ATTACHMENT14 0x8CEE
+#define GL_COLOR_ATTACHMENT15 0x8CEF
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56
+#define GL_MAX_SAMPLES 0x8D57
+#define GL_HALF_FLOAT 0x140B
+#define GL_MAP_READ_BIT 0x0001
+#define GL_MAP_WRITE_BIT 0x0002
+#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004
+#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008
+#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010
+#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020
+#define GL_RG 0x8227
+#define GL_RG_INTEGER 0x8228
+#define GL_R8 0x8229
+#define GL_RG8 0x822B
+#define GL_R16F 0x822D
+#define GL_R32F 0x822E
+#define GL_RG16F 0x822F
+#define GL_RG32F 0x8230
+#define GL_R8I 0x8231
+#define GL_R8UI 0x8232
+#define GL_R16I 0x8233
+#define GL_R16UI 0x8234
+#define GL_R32I 0x8235
+#define GL_R32UI 0x8236
+#define GL_RG8I 0x8237
+#define GL_RG8UI 0x8238
+#define GL_RG16I 0x8239
+#define GL_RG16UI 0x823A
+#define GL_RG32I 0x823B
+#define GL_RG32UI 0x823C
+#define GL_VERTEX_ARRAY_BINDING 0x85B5
+#define GL_R8_SNORM 0x8F94
+#define GL_RG8_SNORM 0x8F95
+#define GL_RGB8_SNORM 0x8F96
+#define GL_RGBA8_SNORM 0x8F97
+#define GL_SIGNED_NORMALIZED 0x8F9C
+#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69
+#define GL_COPY_READ_BUFFER 0x8F36
+#define GL_COPY_WRITE_BUFFER 0x8F37
+#define GL_COPY_READ_BUFFER_BINDING 0x8F36
+#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37
+#define GL_UNIFORM_BUFFER 0x8A11
+#define GL_UNIFORM_BUFFER_BINDING 0x8A28
+#define GL_UNIFORM_BUFFER_START 0x8A29
+#define GL_UNIFORM_BUFFER_SIZE 0x8A2A
+#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B
+#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D
+#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E
+#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F
+#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30
+#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31
+#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33
+#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34
+#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35
+#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36
+#define GL_UNIFORM_TYPE 0x8A37
+#define GL_UNIFORM_SIZE 0x8A38
+#define GL_UNIFORM_NAME_LENGTH 0x8A39
+#define GL_UNIFORM_BLOCK_INDEX 0x8A3A
+#define GL_UNIFORM_OFFSET 0x8A3B
+#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C
+#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D
+#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E
+#define GL_UNIFORM_BLOCK_BINDING 0x8A3F
+#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40
+#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41
+#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42
+#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46
+#define GL_INVALID_INDEX 0xFFFFFFFFu
+#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122
+#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125
+#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111
+#define GL_OBJECT_TYPE 0x9112
+#define GL_SYNC_CONDITION 0x9113
+#define GL_SYNC_STATUS 0x9114
+#define GL_SYNC_FLAGS 0x9115
+#define GL_SYNC_FENCE 0x9116
+#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117
+#define GL_UNSIGNALED 0x9118
+#define GL_SIGNALED 0x9119
+#define GL_ALREADY_SIGNALED 0x911A
+#define GL_TIMEOUT_EXPIRED 0x911B
+#define GL_CONDITION_SATISFIED 0x911C
+#define GL_WAIT_FAILED 0x911D
+#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001
+#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull
+#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE
+#define GL_ANY_SAMPLES_PASSED 0x8C2F
+#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A
+#define GL_SAMPLER_BINDING 0x8919
+#define GL_RGB10_A2UI 0x906F
+#define GL_TEXTURE_SWIZZLE_R 0x8E42
+#define GL_TEXTURE_SWIZZLE_G 0x8E43
+#define GL_TEXTURE_SWIZZLE_B 0x8E44
+#define GL_TEXTURE_SWIZZLE_A 0x8E45
+#define GL_GREEN 0x1904
+#define GL_BLUE 0x1905
+#define GL_INT_2_10_10_10_REV 0x8D9F
+#define GL_TRANSFORM_FEEDBACK 0x8E22
+#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23
+#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24
+#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25
+#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257
+#define GL_PROGRAM_BINARY_LENGTH 0x8741
+#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE
+#define GL_PROGRAM_BINARY_FORMATS 0x87FF
+#define GL_COMPRESSED_R11_EAC 0x9270
+#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271
+#define GL_COMPRESSED_RG11_EAC 0x9272
+#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273
+#define GL_COMPRESSED_RGB8_ETC2 0x9274
+#define GL_COMPRESSED_SRGB8_ETC2 0x9275
+#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276
+#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277
+#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278
+#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279
+#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F
+#define GL_MAX_ELEMENT_INDEX 0x8D6B
+#define GL_NUM_SAMPLE_COUNTS 0x9380
+#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF
+GL_APICALL void GL_APIENTRY glReadBuffer (GLenum src);
+GL_APICALL void GL_APIENTRY glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);
+GL_APICALL void GL_APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glGenQueries (GLsizei n, GLuint *ids);
+GL_APICALL void GL_APIENTRY glDeleteQueries (GLsizei n, const GLuint *ids);
+GL_APICALL GLboolean GL_APIENTRY glIsQuery (GLuint id);
+GL_APICALL void GL_APIENTRY glBeginQuery (GLenum target, GLuint id);
+GL_APICALL void GL_APIENTRY glEndQuery (GLenum target);
+GL_APICALL void GL_APIENTRY glGetQueryiv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params);
+GL_APICALL GLboolean GL_APIENTRY glUnmapBuffer (GLenum target);
+GL_APICALL void GL_APIENTRY glGetBufferPointerv (GLenum target, GLenum pname, void **params);
+GL_APICALL void GL_APIENTRY glDrawBuffers (GLsizei n, const GLenum *bufs);
+GL_APICALL void GL_APIENTRY glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+GL_APICALL void *GL_APIENTRY glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+GL_APICALL void GL_APIENTRY glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length);
+GL_APICALL void GL_APIENTRY glBindVertexArray (GLuint array);
+GL_APICALL void GL_APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays);
+GL_APICALL void GL_APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays);
+GL_APICALL GLboolean GL_APIENTRY glIsVertexArray (GLuint array);
+GL_APICALL void GL_APIENTRY glGetIntegeri_v (GLenum target, GLuint index, GLint *data);
+GL_APICALL void GL_APIENTRY glBeginTransformFeedback (GLenum primitiveMode);
+GL_APICALL void GL_APIENTRY glEndTransformFeedback (void);
+GL_APICALL void GL_APIENTRY glBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+GL_APICALL void GL_APIENTRY glBindBufferBase (GLenum target, GLuint index, GLuint buffer);
+GL_APICALL void GL_APIENTRY glTransformFeedbackVaryings (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode);
+GL_APICALL void GL_APIENTRY glGetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+GL_APICALL void GL_APIENTRY glVertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
+GL_APICALL void GL_APIENTRY glGetVertexAttribIiv (GLuint index, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetVertexAttribIuiv (GLuint index, GLenum pname, GLuint *params);
+GL_APICALL void GL_APIENTRY glVertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w);
+GL_APICALL void GL_APIENTRY glVertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+GL_APICALL void GL_APIENTRY glVertexAttribI4iv (GLuint index, const GLint *v);
+GL_APICALL void GL_APIENTRY glVertexAttribI4uiv (GLuint index, const GLuint *v);
+GL_APICALL void GL_APIENTRY glGetUniformuiv (GLuint program, GLint location, GLuint *params);
+GL_APICALL GLint GL_APIENTRY glGetFragDataLocation (GLuint program, const GLchar *name);
+GL_APICALL void GL_APIENTRY glUniform1ui (GLint location, GLuint v0);
+GL_APICALL void GL_APIENTRY glUniform2ui (GLint location, GLuint v0, GLuint v1);
+GL_APICALL void GL_APIENTRY glUniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2);
+GL_APICALL void GL_APIENTRY glUniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+GL_APICALL void GL_APIENTRY glUniform1uiv (GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glUniform2uiv (GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glUniform3uiv (GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glUniform4uiv (GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glClearBufferiv (GLenum buffer, GLint drawbuffer, const GLint *value);
+GL_APICALL void GL_APIENTRY glClearBufferuiv (GLenum buffer, GLint drawbuffer, const GLuint *value);
+GL_APICALL void GL_APIENTRY glClearBufferfv (GLenum buffer, GLint drawbuffer, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+GL_APICALL const GLubyte *GL_APIENTRY glGetStringi (GLenum name, GLuint index);
+GL_APICALL void GL_APIENTRY glCopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+GL_APICALL void GL_APIENTRY glGetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices);
+GL_APICALL void GL_APIENTRY glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+GL_APICALL GLuint GL_APIENTRY glGetUniformBlockIndex (GLuint program, const GLchar *uniformBlockName);
+GL_APICALL void GL_APIENTRY glGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+GL_APICALL void GL_APIENTRY glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+GL_APICALL void GL_APIENTRY glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+GL_APICALL void GL_APIENTRY glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount);
+GL_APICALL GLsync GL_APIENTRY glFenceSync (GLenum condition, GLbitfield flags);
+GL_APICALL GLboolean GL_APIENTRY glIsSync (GLsync sync);
+GL_APICALL void GL_APIENTRY glDeleteSync (GLsync sync);
+GL_APICALL GLenum GL_APIENTRY glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout);
+GL_APICALL void GL_APIENTRY glWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout);
+GL_APICALL void GL_APIENTRY glGetInteger64v (GLenum pname, GLint64 *data);
+GL_APICALL void GL_APIENTRY glGetSynciv (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+GL_APICALL void GL_APIENTRY glGetInteger64i_v (GLenum target, GLuint index, GLint64 *data);
+GL_APICALL void GL_APIENTRY glGetBufferParameteri64v (GLenum target, GLenum pname, GLint64 *params);
+GL_APICALL void GL_APIENTRY glGenSamplers (GLsizei count, GLuint *samplers);
+GL_APICALL void GL_APIENTRY glDeleteSamplers (GLsizei count, const GLuint *samplers);
+GL_APICALL GLboolean GL_APIENTRY glIsSampler (GLuint sampler);
+GL_APICALL void GL_APIENTRY glBindSampler (GLuint unit, GLuint sampler);
+GL_APICALL void GL_APIENTRY glSamplerParameteri (GLuint sampler, GLenum pname, GLint param);
+GL_APICALL void GL_APIENTRY glSamplerParameteriv (GLuint sampler, GLenum pname, const GLint *param);
+GL_APICALL void GL_APIENTRY glSamplerParameterf (GLuint sampler, GLenum pname, GLfloat param);
+GL_APICALL void GL_APIENTRY glSamplerParameterfv (GLuint sampler, GLenum pname, const GLfloat *param);
+GL_APICALL void GL_APIENTRY glGetSamplerParameteriv (GLuint sampler, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat *params);
+GL_APICALL void GL_APIENTRY glVertexAttribDivisor (GLuint index, GLuint divisor);
+GL_APICALL void GL_APIENTRY glBindTransformFeedback (GLenum target, GLuint id);
+GL_APICALL void GL_APIENTRY glDeleteTransformFeedbacks (GLsizei n, const GLuint *ids);
+GL_APICALL void GL_APIENTRY glGenTransformFeedbacks (GLsizei n, GLuint *ids);
+GL_APICALL GLboolean GL_APIENTRY glIsTransformFeedback (GLuint id);
+GL_APICALL void GL_APIENTRY glPauseTransformFeedback (void);
+GL_APICALL void GL_APIENTRY glResumeTransformFeedback (void);
+GL_APICALL void GL_APIENTRY glGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
+GL_APICALL void GL_APIENTRY glProgramBinary (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
+GL_APICALL void GL_APIENTRY glProgramParameteri (GLuint program, GLenum pname, GLint value);
+GL_APICALL void GL_APIENTRY glInvalidateFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments);
+GL_APICALL void GL_APIENTRY glInvalidateSubFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glTexStorage2D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glTexStorage3D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+GL_APICALL void GL_APIENTRY glGetInternalformativ (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
+#endif /* GL_ES_VERSION_3_0 */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/third_party/khronos/GLES3/gl31.h b/third_party/khronos/GLES3/gl31.h
new file mode 100644
index 0000000..89406bd
--- /dev/null
+++ b/third_party/khronos/GLES3/gl31.h
@@ -0,0 +1,1184 @@
+#ifndef __gl31_h_
+#define __gl31_h_ 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+** Copyright (c) 2013-2014 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** "Materials"), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+/*
+** This header is generated from the Khronos OpenGL / OpenGL ES XML
+** API Registry. The current version of the Registry, generator scripts
+** used to make the header, and the header can be found at
+** http://www.opengl.org/registry/
+**
+** Khronos $Revision$ on $Date$
+*/
+
+#include <GLES3/gl3platform.h>
+
+/* Generated on date 20141118 */
+
+/* Generated C header for:
+ * API: gles2
+ * Profile: common
+ * Versions considered: 2.[0-9]|3.[01]
+ * Versions emitted: .*
+ * Default extensions included: None
+ * Additional extensions included: _nomatch_^
+ * Extensions removed: _nomatch_^
+ */
+
+#ifndef GL_ES_VERSION_2_0
+#define GL_ES_VERSION_2_0 1
+#include <KHR/khrplatform.h>
+typedef khronos_int8_t GLbyte;
+typedef khronos_float_t GLclampf;
+typedef khronos_int32_t GLfixed;
+typedef short GLshort;
+typedef unsigned short GLushort;
+typedef void GLvoid;
+typedef struct __GLsync *GLsync;
+typedef khronos_int64_t GLint64;
+typedef khronos_uint64_t GLuint64;
+typedef unsigned int GLenum;
+typedef unsigned int GLuint;
+typedef char GLchar;
+typedef khronos_float_t GLfloat;
+typedef khronos_ssize_t GLsizeiptr;
+typedef khronos_intptr_t GLintptr;
+typedef unsigned int GLbitfield;
+typedef int GLint;
+typedef unsigned char GLboolean;
+typedef int GLsizei;
+typedef khronos_uint8_t GLubyte;
+#define GL_DEPTH_BUFFER_BIT 0x00000100
+#define GL_STENCIL_BUFFER_BIT 0x00000400
+#define GL_COLOR_BUFFER_BIT 0x00004000
+#define GL_FALSE 0
+#define GL_TRUE 1
+#define GL_POINTS 0x0000
+#define GL_LINES 0x0001
+#define GL_LINE_LOOP 0x0002
+#define GL_LINE_STRIP 0x0003
+#define GL_TRIANGLES 0x0004
+#define GL_TRIANGLE_STRIP 0x0005
+#define GL_TRIANGLE_FAN 0x0006
+#define GL_ZERO 0
+#define GL_ONE 1
+#define GL_SRC_COLOR 0x0300
+#define GL_ONE_MINUS_SRC_COLOR 0x0301
+#define GL_SRC_ALPHA 0x0302
+#define GL_ONE_MINUS_SRC_ALPHA 0x0303
+#define GL_DST_ALPHA 0x0304
+#define GL_ONE_MINUS_DST_ALPHA 0x0305
+#define GL_DST_COLOR 0x0306
+#define GL_ONE_MINUS_DST_COLOR 0x0307
+#define GL_SRC_ALPHA_SATURATE 0x0308
+#define GL_FUNC_ADD 0x8006
+#define GL_BLEND_EQUATION 0x8009
+#define GL_BLEND_EQUATION_RGB 0x8009
+#define GL_BLEND_EQUATION_ALPHA 0x883D
+#define GL_FUNC_SUBTRACT 0x800A
+#define GL_FUNC_REVERSE_SUBTRACT 0x800B
+#define GL_BLEND_DST_RGB 0x80C8
+#define GL_BLEND_SRC_RGB 0x80C9
+#define GL_BLEND_DST_ALPHA 0x80CA
+#define GL_BLEND_SRC_ALPHA 0x80CB
+#define GL_CONSTANT_COLOR 0x8001
+#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002
+#define GL_CONSTANT_ALPHA 0x8003
+#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004
+#define GL_BLEND_COLOR 0x8005
+#define GL_ARRAY_BUFFER 0x8892
+#define GL_ELEMENT_ARRAY_BUFFER 0x8893
+#define GL_ARRAY_BUFFER_BINDING 0x8894
+#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895
+#define GL_STREAM_DRAW 0x88E0
+#define GL_STATIC_DRAW 0x88E4
+#define GL_DYNAMIC_DRAW 0x88E8
+#define GL_BUFFER_SIZE 0x8764
+#define GL_BUFFER_USAGE 0x8765
+#define GL_CURRENT_VERTEX_ATTRIB 0x8626
+#define GL_FRONT 0x0404
+#define GL_BACK 0x0405
+#define GL_FRONT_AND_BACK 0x0408
+#define GL_TEXTURE_2D 0x0DE1
+#define GL_CULL_FACE 0x0B44
+#define GL_BLEND 0x0BE2
+#define GL_DITHER 0x0BD0
+#define GL_STENCIL_TEST 0x0B90
+#define GL_DEPTH_TEST 0x0B71
+#define GL_SCISSOR_TEST 0x0C11
+#define GL_POLYGON_OFFSET_FILL 0x8037
+#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E
+#define GL_SAMPLE_COVERAGE 0x80A0
+#define GL_NO_ERROR 0
+#define GL_INVALID_ENUM 0x0500
+#define GL_INVALID_VALUE 0x0501
+#define GL_INVALID_OPERATION 0x0502
+#define GL_OUT_OF_MEMORY 0x0505
+#define GL_CW 0x0900
+#define GL_CCW 0x0901
+#define GL_LINE_WIDTH 0x0B21
+#define GL_ALIASED_POINT_SIZE_RANGE 0x846D
+#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E
+#define GL_CULL_FACE_MODE 0x0B45
+#define GL_FRONT_FACE 0x0B46
+#define GL_DEPTH_RANGE 0x0B70
+#define GL_DEPTH_WRITEMASK 0x0B72
+#define GL_DEPTH_CLEAR_VALUE 0x0B73
+#define GL_DEPTH_FUNC 0x0B74
+#define GL_STENCIL_CLEAR_VALUE 0x0B91
+#define GL_STENCIL_FUNC 0x0B92
+#define GL_STENCIL_FAIL 0x0B94
+#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95
+#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96
+#define GL_STENCIL_REF 0x0B97
+#define GL_STENCIL_VALUE_MASK 0x0B93
+#define GL_STENCIL_WRITEMASK 0x0B98
+#define GL_STENCIL_BACK_FUNC 0x8800
+#define GL_STENCIL_BACK_FAIL 0x8801
+#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802
+#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803
+#define GL_STENCIL_BACK_REF 0x8CA3
+#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4
+#define GL_STENCIL_BACK_WRITEMASK 0x8CA5
+#define GL_VIEWPORT 0x0BA2
+#define GL_SCISSOR_BOX 0x0C10
+#define GL_COLOR_CLEAR_VALUE 0x0C22
+#define GL_COLOR_WRITEMASK 0x0C23
+#define GL_UNPACK_ALIGNMENT 0x0CF5
+#define GL_PACK_ALIGNMENT 0x0D05
+#define GL_MAX_TEXTURE_SIZE 0x0D33
+#define GL_MAX_VIEWPORT_DIMS 0x0D3A
+#define GL_SUBPIXEL_BITS 0x0D50
+#define GL_RED_BITS 0x0D52
+#define GL_GREEN_BITS 0x0D53
+#define GL_BLUE_BITS 0x0D54
+#define GL_ALPHA_BITS 0x0D55
+#define GL_DEPTH_BITS 0x0D56
+#define GL_STENCIL_BITS 0x0D57
+#define GL_POLYGON_OFFSET_UNITS 0x2A00
+#define GL_POLYGON_OFFSET_FACTOR 0x8038
+#define GL_TEXTURE_BINDING_2D 0x8069
+#define GL_SAMPLE_BUFFERS 0x80A8
+#define GL_SAMPLES 0x80A9
+#define GL_SAMPLE_COVERAGE_VALUE 0x80AA
+#define GL_SAMPLE_COVERAGE_INVERT 0x80AB
+#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2
+#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3
+#define GL_DONT_CARE 0x1100
+#define GL_FASTEST 0x1101
+#define GL_NICEST 0x1102
+#define GL_GENERATE_MIPMAP_HINT 0x8192
+#define GL_BYTE 0x1400
+#define GL_UNSIGNED_BYTE 0x1401
+#define GL_SHORT 0x1402
+#define GL_UNSIGNED_SHORT 0x1403
+#define GL_INT 0x1404
+#define GL_UNSIGNED_INT 0x1405
+#define GL_FLOAT 0x1406
+#define GL_FIXED 0x140C
+#define GL_DEPTH_COMPONENT 0x1902
+#define GL_ALPHA 0x1906
+#define GL_RGB 0x1907
+#define GL_RGBA 0x1908
+#define GL_LUMINANCE 0x1909
+#define GL_LUMINANCE_ALPHA 0x190A
+#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033
+#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034
+#define GL_UNSIGNED_SHORT_5_6_5 0x8363
+#define GL_FRAGMENT_SHADER 0x8B30
+#define GL_VERTEX_SHADER 0x8B31
+#define GL_MAX_VERTEX_ATTRIBS 0x8869
+#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB
+#define GL_MAX_VARYING_VECTORS 0x8DFC
+#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D
+#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C
+#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872
+#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD
+#define GL_SHADER_TYPE 0x8B4F
+#define GL_DELETE_STATUS 0x8B80
+#define GL_LINK_STATUS 0x8B82
+#define GL_VALIDATE_STATUS 0x8B83
+#define GL_ATTACHED_SHADERS 0x8B85
+#define GL_ACTIVE_UNIFORMS 0x8B86
+#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87
+#define GL_ACTIVE_ATTRIBUTES 0x8B89
+#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A
+#define GL_SHADING_LANGUAGE_VERSION 0x8B8C
+#define GL_CURRENT_PROGRAM 0x8B8D
+#define GL_NEVER 0x0200
+#define GL_LESS 0x0201
+#define GL_EQUAL 0x0202
+#define GL_LEQUAL 0x0203
+#define GL_GREATER 0x0204
+#define GL_NOTEQUAL 0x0205
+#define GL_GEQUAL 0x0206
+#define GL_ALWAYS 0x0207
+#define GL_KEEP 0x1E00
+#define GL_REPLACE 0x1E01
+#define GL_INCR 0x1E02
+#define GL_DECR 0x1E03
+#define GL_INVERT 0x150A
+#define GL_INCR_WRAP 0x8507
+#define GL_DECR_WRAP 0x8508
+#define GL_VENDOR 0x1F00
+#define GL_RENDERER 0x1F01
+#define GL_VERSION 0x1F02
+#define GL_EXTENSIONS 0x1F03
+#define GL_NEAREST 0x2600
+#define GL_LINEAR 0x2601
+#define GL_NEAREST_MIPMAP_NEAREST 0x2700
+#define GL_LINEAR_MIPMAP_NEAREST 0x2701
+#define GL_NEAREST_MIPMAP_LINEAR 0x2702
+#define GL_LINEAR_MIPMAP_LINEAR 0x2703
+#define GL_TEXTURE_MAG_FILTER 0x2800
+#define GL_TEXTURE_MIN_FILTER 0x2801
+#define GL_TEXTURE_WRAP_S 0x2802
+#define GL_TEXTURE_WRAP_T 0x2803
+#define GL_TEXTURE 0x1702
+#define GL_TEXTURE_CUBE_MAP 0x8513
+#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A
+#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C
+#define GL_TEXTURE0 0x84C0
+#define GL_TEXTURE1 0x84C1
+#define GL_TEXTURE2 0x84C2
+#define GL_TEXTURE3 0x84C3
+#define GL_TEXTURE4 0x84C4
+#define GL_TEXTURE5 0x84C5
+#define GL_TEXTURE6 0x84C6
+#define GL_TEXTURE7 0x84C7
+#define GL_TEXTURE8 0x84C8
+#define GL_TEXTURE9 0x84C9
+#define GL_TEXTURE10 0x84CA
+#define GL_TEXTURE11 0x84CB
+#define GL_TEXTURE12 0x84CC
+#define GL_TEXTURE13 0x84CD
+#define GL_TEXTURE14 0x84CE
+#define GL_TEXTURE15 0x84CF
+#define GL_TEXTURE16 0x84D0
+#define GL_TEXTURE17 0x84D1
+#define GL_TEXTURE18 0x84D2
+#define GL_TEXTURE19 0x84D3
+#define GL_TEXTURE20 0x84D4
+#define GL_TEXTURE21 0x84D5
+#define GL_TEXTURE22 0x84D6
+#define GL_TEXTURE23 0x84D7
+#define GL_TEXTURE24 0x84D8
+#define GL_TEXTURE25 0x84D9
+#define GL_TEXTURE26 0x84DA
+#define GL_TEXTURE27 0x84DB
+#define GL_TEXTURE28 0x84DC
+#define GL_TEXTURE29 0x84DD
+#define GL_TEXTURE30 0x84DE
+#define GL_TEXTURE31 0x84DF
+#define GL_ACTIVE_TEXTURE 0x84E0
+#define GL_REPEAT 0x2901
+#define GL_CLAMP_TO_EDGE 0x812F
+#define GL_MIRRORED_REPEAT 0x8370
+#define GL_FLOAT_VEC2 0x8B50
+#define GL_FLOAT_VEC3 0x8B51
+#define GL_FLOAT_VEC4 0x8B52
+#define GL_INT_VEC2 0x8B53
+#define GL_INT_VEC3 0x8B54
+#define GL_INT_VEC4 0x8B55
+#define GL_BOOL 0x8B56
+#define GL_BOOL_VEC2 0x8B57
+#define GL_BOOL_VEC3 0x8B58
+#define GL_BOOL_VEC4 0x8B59
+#define GL_FLOAT_MAT2 0x8B5A
+#define GL_FLOAT_MAT3 0x8B5B
+#define GL_FLOAT_MAT4 0x8B5C
+#define GL_SAMPLER_2D 0x8B5E
+#define GL_SAMPLER_CUBE 0x8B60
+#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622
+#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623
+#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624
+#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625
+#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A
+#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645
+#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F
+#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A
+#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B
+#define GL_COMPILE_STATUS 0x8B81
+#define GL_INFO_LOG_LENGTH 0x8B84
+#define GL_SHADER_SOURCE_LENGTH 0x8B88
+#define GL_SHADER_COMPILER 0x8DFA
+#define GL_SHADER_BINARY_FORMATS 0x8DF8
+#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9
+#define GL_LOW_FLOAT 0x8DF0
+#define GL_MEDIUM_FLOAT 0x8DF1
+#define GL_HIGH_FLOAT 0x8DF2
+#define GL_LOW_INT 0x8DF3
+#define GL_MEDIUM_INT 0x8DF4
+#define GL_HIGH_INT 0x8DF5
+#define GL_FRAMEBUFFER 0x8D40
+#define GL_RENDERBUFFER 0x8D41
+#define GL_RGBA4 0x8056
+#define GL_RGB5_A1 0x8057
+#define GL_RGB565 0x8D62
+#define GL_DEPTH_COMPONENT16 0x81A5
+#define GL_STENCIL_INDEX8 0x8D48
+#define GL_RENDERBUFFER_WIDTH 0x8D42
+#define GL_RENDERBUFFER_HEIGHT 0x8D43
+#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44
+#define GL_RENDERBUFFER_RED_SIZE 0x8D50
+#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51
+#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52
+#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53
+#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54
+#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3
+#define GL_COLOR_ATTACHMENT0 0x8CE0
+#define GL_DEPTH_ATTACHMENT 0x8D00
+#define GL_STENCIL_ATTACHMENT 0x8D20
+#define GL_NONE 0
+#define GL_FRAMEBUFFER_COMPLETE 0x8CD5
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7
+#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9
+#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD
+#define GL_FRAMEBUFFER_BINDING 0x8CA6
+#define GL_RENDERBUFFER_BINDING 0x8CA7
+#define GL_MAX_RENDERBUFFER_SIZE 0x84E8
+#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506
+GL_APICALL void GL_APIENTRY glActiveTexture (GLenum texture);
+GL_APICALL void GL_APIENTRY glAttachShader (GLuint program, GLuint shader);
+GL_APICALL void GL_APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name);
+GL_APICALL void GL_APIENTRY glBindBuffer (GLenum target, GLuint buffer);
+GL_APICALL void GL_APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer);
+GL_APICALL void GL_APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer);
+GL_APICALL void GL_APIENTRY glBindTexture (GLenum target, GLuint texture);
+GL_APICALL void GL_APIENTRY glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+GL_APICALL void GL_APIENTRY glBlendEquation (GLenum mode);
+GL_APICALL void GL_APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha);
+GL_APICALL void GL_APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor);
+GL_APICALL void GL_APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+GL_APICALL void GL_APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage);
+GL_APICALL void GL_APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
+GL_APICALL GLenum GL_APIENTRY glCheckFramebufferStatus (GLenum target);
+GL_APICALL void GL_APIENTRY glClear (GLbitfield mask);
+GL_APICALL void GL_APIENTRY glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+GL_APICALL void GL_APIENTRY glClearDepthf (GLfloat d);
+GL_APICALL void GL_APIENTRY glClearStencil (GLint s);
+GL_APICALL void GL_APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+GL_APICALL void GL_APIENTRY glCompileShader (GLuint shader);
+GL_APICALL void GL_APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+GL_APICALL void GL_APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL GLuint GL_APIENTRY glCreateProgram (void);
+GL_APICALL GLuint GL_APIENTRY glCreateShader (GLenum type);
+GL_APICALL void GL_APIENTRY glCullFace (GLenum mode);
+GL_APICALL void GL_APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers);
+GL_APICALL void GL_APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers);
+GL_APICALL void GL_APIENTRY glDeleteProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers);
+GL_APICALL void GL_APIENTRY glDeleteShader (GLuint shader);
+GL_APICALL void GL_APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures);
+GL_APICALL void GL_APIENTRY glDepthFunc (GLenum func);
+GL_APICALL void GL_APIENTRY glDepthMask (GLboolean flag);
+GL_APICALL void GL_APIENTRY glDepthRangef (GLfloat n, GLfloat f);
+GL_APICALL void GL_APIENTRY glDetachShader (GLuint program, GLuint shader);
+GL_APICALL void GL_APIENTRY glDisable (GLenum cap);
+GL_APICALL void GL_APIENTRY glDisableVertexAttribArray (GLuint index);
+GL_APICALL void GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count);
+GL_APICALL void GL_APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices);
+GL_APICALL void GL_APIENTRY glEnable (GLenum cap);
+GL_APICALL void GL_APIENTRY glEnableVertexAttribArray (GLuint index);
+GL_APICALL void GL_APIENTRY glFinish (void);
+GL_APICALL void GL_APIENTRY glFlush (void);
+GL_APICALL void GL_APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+GL_APICALL void GL_APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+GL_APICALL void GL_APIENTRY glFrontFace (GLenum mode);
+GL_APICALL void GL_APIENTRY glGenBuffers (GLsizei n, GLuint *buffers);
+GL_APICALL void GL_APIENTRY glGenerateMipmap (GLenum target);
+GL_APICALL void GL_APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers);
+GL_APICALL void GL_APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers);
+GL_APICALL void GL_APIENTRY glGenTextures (GLsizei n, GLuint *textures);
+GL_APICALL void GL_APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+GL_APICALL void GL_APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+GL_APICALL void GL_APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
+GL_APICALL GLint GL_APIENTRY glGetAttribLocation (GLuint program, const GLchar *name);
+GL_APICALL void GL_APIENTRY glGetBooleanv (GLenum pname, GLboolean *data);
+GL_APICALL void GL_APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL GLenum GL_APIENTRY glGetError (void);
+GL_APICALL void GL_APIENTRY glGetFloatv (GLenum pname, GLfloat *data);
+GL_APICALL void GL_APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetIntegerv (GLenum pname, GLint *data);
+GL_APICALL void GL_APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+GL_APICALL void GL_APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+GL_APICALL void GL_APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
+GL_APICALL void GL_APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+GL_APICALL const GLubyte *GL_APIENTRY glGetString (GLenum name);
+GL_APICALL void GL_APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params);
+GL_APICALL GLint GL_APIENTRY glGetUniformLocation (GLuint program, const GLchar *name);
+GL_APICALL void GL_APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void **pointer);
+GL_APICALL void GL_APIENTRY glHint (GLenum target, GLenum mode);
+GL_APICALL GLboolean GL_APIENTRY glIsBuffer (GLuint buffer);
+GL_APICALL GLboolean GL_APIENTRY glIsEnabled (GLenum cap);
+GL_APICALL GLboolean GL_APIENTRY glIsFramebuffer (GLuint framebuffer);
+GL_APICALL GLboolean GL_APIENTRY glIsProgram (GLuint program);
+GL_APICALL GLboolean GL_APIENTRY glIsRenderbuffer (GLuint renderbuffer);
+GL_APICALL GLboolean GL_APIENTRY glIsShader (GLuint shader);
+GL_APICALL GLboolean GL_APIENTRY glIsTexture (GLuint texture);
+GL_APICALL void GL_APIENTRY glLineWidth (GLfloat width);
+GL_APICALL void GL_APIENTRY glLinkProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glPixelStorei (GLenum pname, GLint param);
+GL_APICALL void GL_APIENTRY glPolygonOffset (GLfloat factor, GLfloat units);
+GL_APICALL void GL_APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
+GL_APICALL void GL_APIENTRY glReleaseShaderCompiler (void);
+GL_APICALL void GL_APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glSampleCoverage (GLfloat value, GLboolean invert);
+GL_APICALL void GL_APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length);
+GL_APICALL void GL_APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
+GL_APICALL void GL_APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilMask (GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass);
+GL_APICALL void GL_APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+GL_APICALL void GL_APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param);
+GL_APICALL void GL_APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params);
+GL_APICALL void GL_APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param);
+GL_APICALL void GL_APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params);
+GL_APICALL void GL_APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glUniform1f (GLint location, GLfloat v0);
+GL_APICALL void GL_APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform1i (GLint location, GLint v0);
+GL_APICALL void GL_APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1);
+GL_APICALL void GL_APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform2i (GLint location, GLint v0, GLint v1);
+GL_APICALL void GL_APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+GL_APICALL void GL_APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2);
+GL_APICALL void GL_APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+GL_APICALL void GL_APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+GL_APICALL void GL_APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUseProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glValidateProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glVertexAttrib1f (GLuint index, GLfloat x);
+GL_APICALL void GL_APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y);
+GL_APICALL void GL_APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z);
+GL_APICALL void GL_APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+GL_APICALL void GL_APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
+GL_APICALL void GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);
+#endif /* GL_ES_VERSION_2_0 */
+
+#ifndef GL_ES_VERSION_3_0
+#define GL_ES_VERSION_3_0 1
+typedef unsigned short GLhalf;
+#define GL_READ_BUFFER 0x0C02
+#define GL_UNPACK_ROW_LENGTH 0x0CF2
+#define GL_UNPACK_SKIP_ROWS 0x0CF3
+#define GL_UNPACK_SKIP_PIXELS 0x0CF4
+#define GL_PACK_ROW_LENGTH 0x0D02
+#define GL_PACK_SKIP_ROWS 0x0D03
+#define GL_PACK_SKIP_PIXELS 0x0D04
+#define GL_COLOR 0x1800
+#define GL_DEPTH 0x1801
+#define GL_STENCIL 0x1802
+#define GL_RED 0x1903
+#define GL_RGB8 0x8051
+#define GL_RGBA8 0x8058
+#define GL_RGB10_A2 0x8059
+#define GL_TEXTURE_BINDING_3D 0x806A
+#define GL_UNPACK_SKIP_IMAGES 0x806D
+#define GL_UNPACK_IMAGE_HEIGHT 0x806E
+#define GL_TEXTURE_3D 0x806F
+#define GL_TEXTURE_WRAP_R 0x8072
+#define GL_MAX_3D_TEXTURE_SIZE 0x8073
+#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368
+#define GL_MAX_ELEMENTS_VERTICES 0x80E8
+#define GL_MAX_ELEMENTS_INDICES 0x80E9
+#define GL_TEXTURE_MIN_LOD 0x813A
+#define GL_TEXTURE_MAX_LOD 0x813B
+#define GL_TEXTURE_BASE_LEVEL 0x813C
+#define GL_TEXTURE_MAX_LEVEL 0x813D
+#define GL_MIN 0x8007
+#define GL_MAX 0x8008
+#define GL_DEPTH_COMPONENT24 0x81A6
+#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD
+#define GL_TEXTURE_COMPARE_MODE 0x884C
+#define GL_TEXTURE_COMPARE_FUNC 0x884D
+#define GL_CURRENT_QUERY 0x8865
+#define GL_QUERY_RESULT 0x8866
+#define GL_QUERY_RESULT_AVAILABLE 0x8867
+#define GL_BUFFER_MAPPED 0x88BC
+#define GL_BUFFER_MAP_POINTER 0x88BD
+#define GL_STREAM_READ 0x88E1
+#define GL_STREAM_COPY 0x88E2
+#define GL_STATIC_READ 0x88E5
+#define GL_STATIC_COPY 0x88E6
+#define GL_DYNAMIC_READ 0x88E9
+#define GL_DYNAMIC_COPY 0x88EA
+#define GL_MAX_DRAW_BUFFERS 0x8824
+#define GL_DRAW_BUFFER0 0x8825
+#define GL_DRAW_BUFFER1 0x8826
+#define GL_DRAW_BUFFER2 0x8827
+#define GL_DRAW_BUFFER3 0x8828
+#define GL_DRAW_BUFFER4 0x8829
+#define GL_DRAW_BUFFER5 0x882A
+#define GL_DRAW_BUFFER6 0x882B
+#define GL_DRAW_BUFFER7 0x882C
+#define GL_DRAW_BUFFER8 0x882D
+#define GL_DRAW_BUFFER9 0x882E
+#define GL_DRAW_BUFFER10 0x882F
+#define GL_DRAW_BUFFER11 0x8830
+#define GL_DRAW_BUFFER12 0x8831
+#define GL_DRAW_BUFFER13 0x8832
+#define GL_DRAW_BUFFER14 0x8833
+#define GL_DRAW_BUFFER15 0x8834
+#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49
+#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A
+#define GL_SAMPLER_3D 0x8B5F
+#define GL_SAMPLER_2D_SHADOW 0x8B62
+#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B
+#define GL_PIXEL_PACK_BUFFER 0x88EB
+#define GL_PIXEL_UNPACK_BUFFER 0x88EC
+#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED
+#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF
+#define GL_FLOAT_MAT2x3 0x8B65
+#define GL_FLOAT_MAT2x4 0x8B66
+#define GL_FLOAT_MAT3x2 0x8B67
+#define GL_FLOAT_MAT3x4 0x8B68
+#define GL_FLOAT_MAT4x2 0x8B69
+#define GL_FLOAT_MAT4x3 0x8B6A
+#define GL_SRGB 0x8C40
+#define GL_SRGB8 0x8C41
+#define GL_SRGB8_ALPHA8 0x8C43
+#define GL_COMPARE_REF_TO_TEXTURE 0x884E
+#define GL_MAJOR_VERSION 0x821B
+#define GL_MINOR_VERSION 0x821C
+#define GL_NUM_EXTENSIONS 0x821D
+#define GL_RGBA32F 0x8814
+#define GL_RGB32F 0x8815
+#define GL_RGBA16F 0x881A
+#define GL_RGB16F 0x881B
+#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD
+#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF
+#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904
+#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905
+#define GL_MAX_VARYING_COMPONENTS 0x8B4B
+#define GL_TEXTURE_2D_ARRAY 0x8C1A
+#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D
+#define GL_R11F_G11F_B10F 0x8C3A
+#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B
+#define GL_RGB9_E5 0x8C3D
+#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E
+#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76
+#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80
+#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83
+#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84
+#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85
+#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88
+#define GL_RASTERIZER_DISCARD 0x8C89
+#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B
+#define GL_INTERLEAVED_ATTRIBS 0x8C8C
+#define GL_SEPARATE_ATTRIBS 0x8C8D
+#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E
+#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F
+#define GL_RGBA32UI 0x8D70
+#define GL_RGB32UI 0x8D71
+#define GL_RGBA16UI 0x8D76
+#define GL_RGB16UI 0x8D77
+#define GL_RGBA8UI 0x8D7C
+#define GL_RGB8UI 0x8D7D
+#define GL_RGBA32I 0x8D82
+#define GL_RGB32I 0x8D83
+#define GL_RGBA16I 0x8D88
+#define GL_RGB16I 0x8D89
+#define GL_RGBA8I 0x8D8E
+#define GL_RGB8I 0x8D8F
+#define GL_RED_INTEGER 0x8D94
+#define GL_RGB_INTEGER 0x8D98
+#define GL_RGBA_INTEGER 0x8D99
+#define GL_SAMPLER_2D_ARRAY 0x8DC1
+#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4
+#define GL_SAMPLER_CUBE_SHADOW 0x8DC5
+#define GL_UNSIGNED_INT_VEC2 0x8DC6
+#define GL_UNSIGNED_INT_VEC3 0x8DC7
+#define GL_UNSIGNED_INT_VEC4 0x8DC8
+#define GL_INT_SAMPLER_2D 0x8DCA
+#define GL_INT_SAMPLER_3D 0x8DCB
+#define GL_INT_SAMPLER_CUBE 0x8DCC
+#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF
+#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2
+#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3
+#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4
+#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7
+#define GL_BUFFER_ACCESS_FLAGS 0x911F
+#define GL_BUFFER_MAP_LENGTH 0x9120
+#define GL_BUFFER_MAP_OFFSET 0x9121
+#define GL_DEPTH_COMPONENT32F 0x8CAC
+#define GL_DEPTH32F_STENCIL8 0x8CAD
+#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD
+#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210
+#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211
+#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212
+#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213
+#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214
+#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215
+#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216
+#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217
+#define GL_FRAMEBUFFER_DEFAULT 0x8218
+#define GL_FRAMEBUFFER_UNDEFINED 0x8219
+#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A
+#define GL_DEPTH_STENCIL 0x84F9
+#define GL_UNSIGNED_INT_24_8 0x84FA
+#define GL_DEPTH24_STENCIL8 0x88F0
+#define GL_UNSIGNED_NORMALIZED 0x8C17
+#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6
+#define GL_READ_FRAMEBUFFER 0x8CA8
+#define GL_DRAW_FRAMEBUFFER 0x8CA9
+#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA
+#define GL_RENDERBUFFER_SAMPLES 0x8CAB
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4
+#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF
+#define GL_COLOR_ATTACHMENT1 0x8CE1
+#define GL_COLOR_ATTACHMENT2 0x8CE2
+#define GL_COLOR_ATTACHMENT3 0x8CE3
+#define GL_COLOR_ATTACHMENT4 0x8CE4
+#define GL_COLOR_ATTACHMENT5 0x8CE5
+#define GL_COLOR_ATTACHMENT6 0x8CE6
+#define GL_COLOR_ATTACHMENT7 0x8CE7
+#define GL_COLOR_ATTACHMENT8 0x8CE8
+#define GL_COLOR_ATTACHMENT9 0x8CE9
+#define GL_COLOR_ATTACHMENT10 0x8CEA
+#define GL_COLOR_ATTACHMENT11 0x8CEB
+#define GL_COLOR_ATTACHMENT12 0x8CEC
+#define GL_COLOR_ATTACHMENT13 0x8CED
+#define GL_COLOR_ATTACHMENT14 0x8CEE
+#define GL_COLOR_ATTACHMENT15 0x8CEF
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56
+#define GL_MAX_SAMPLES 0x8D57
+#define GL_HALF_FLOAT 0x140B
+#define GL_MAP_READ_BIT 0x0001
+#define GL_MAP_WRITE_BIT 0x0002
+#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004
+#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008
+#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010
+#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020
+#define GL_RG 0x8227
+#define GL_RG_INTEGER 0x8228
+#define GL_R8 0x8229
+#define GL_RG8 0x822B
+#define GL_R16F 0x822D
+#define GL_R32F 0x822E
+#define GL_RG16F 0x822F
+#define GL_RG32F 0x8230
+#define GL_R8I 0x8231
+#define GL_R8UI 0x8232
+#define GL_R16I 0x8233
+#define GL_R16UI 0x8234
+#define GL_R32I 0x8235
+#define GL_R32UI 0x8236
+#define GL_RG8I 0x8237
+#define GL_RG8UI 0x8238
+#define GL_RG16I 0x8239
+#define GL_RG16UI 0x823A
+#define GL_RG32I 0x823B
+#define GL_RG32UI 0x823C
+#define GL_VERTEX_ARRAY_BINDING 0x85B5
+#define GL_R8_SNORM 0x8F94
+#define GL_RG8_SNORM 0x8F95
+#define GL_RGB8_SNORM 0x8F96
+#define GL_RGBA8_SNORM 0x8F97
+#define GL_SIGNED_NORMALIZED 0x8F9C
+#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69
+#define GL_COPY_READ_BUFFER 0x8F36
+#define GL_COPY_WRITE_BUFFER 0x8F37
+#define GL_COPY_READ_BUFFER_BINDING 0x8F36
+#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37
+#define GL_UNIFORM_BUFFER 0x8A11
+#define GL_UNIFORM_BUFFER_BINDING 0x8A28
+#define GL_UNIFORM_BUFFER_START 0x8A29
+#define GL_UNIFORM_BUFFER_SIZE 0x8A2A
+#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B
+#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D
+#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E
+#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F
+#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30
+#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31
+#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33
+#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34
+#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35
+#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36
+#define GL_UNIFORM_TYPE 0x8A37
+#define GL_UNIFORM_SIZE 0x8A38
+#define GL_UNIFORM_NAME_LENGTH 0x8A39
+#define GL_UNIFORM_BLOCK_INDEX 0x8A3A
+#define GL_UNIFORM_OFFSET 0x8A3B
+#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C
+#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D
+#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E
+#define GL_UNIFORM_BLOCK_BINDING 0x8A3F
+#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40
+#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41
+#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42
+#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46
+#define GL_INVALID_INDEX 0xFFFFFFFFu
+#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122
+#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125
+#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111
+#define GL_OBJECT_TYPE 0x9112
+#define GL_SYNC_CONDITION 0x9113
+#define GL_SYNC_STATUS 0x9114
+#define GL_SYNC_FLAGS 0x9115
+#define GL_SYNC_FENCE 0x9116
+#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117
+#define GL_UNSIGNALED 0x9118
+#define GL_SIGNALED 0x9119
+#define GL_ALREADY_SIGNALED 0x911A
+#define GL_TIMEOUT_EXPIRED 0x911B
+#define GL_CONDITION_SATISFIED 0x911C
+#define GL_WAIT_FAILED 0x911D
+#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001
+#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull
+#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE
+#define GL_ANY_SAMPLES_PASSED 0x8C2F
+#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A
+#define GL_SAMPLER_BINDING 0x8919
+#define GL_RGB10_A2UI 0x906F
+#define GL_TEXTURE_SWIZZLE_R 0x8E42
+#define GL_TEXTURE_SWIZZLE_G 0x8E43
+#define GL_TEXTURE_SWIZZLE_B 0x8E44
+#define GL_TEXTURE_SWIZZLE_A 0x8E45
+#define GL_GREEN 0x1904
+#define GL_BLUE 0x1905
+#define GL_INT_2_10_10_10_REV 0x8D9F
+#define GL_TRANSFORM_FEEDBACK 0x8E22
+#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23
+#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24
+#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25
+#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257
+#define GL_PROGRAM_BINARY_LENGTH 0x8741
+#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE
+#define GL_PROGRAM_BINARY_FORMATS 0x87FF
+#define GL_COMPRESSED_R11_EAC 0x9270
+#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271
+#define GL_COMPRESSED_RG11_EAC 0x9272
+#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273
+#define GL_COMPRESSED_RGB8_ETC2 0x9274
+#define GL_COMPRESSED_SRGB8_ETC2 0x9275
+#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276
+#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277
+#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278
+#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279
+#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F
+#define GL_MAX_ELEMENT_INDEX 0x8D6B
+#define GL_NUM_SAMPLE_COUNTS 0x9380
+#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF
+GL_APICALL void GL_APIENTRY glReadBuffer (GLenum src);
+GL_APICALL void GL_APIENTRY glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);
+GL_APICALL void GL_APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glGenQueries (GLsizei n, GLuint *ids);
+GL_APICALL void GL_APIENTRY glDeleteQueries (GLsizei n, const GLuint *ids);
+GL_APICALL GLboolean GL_APIENTRY glIsQuery (GLuint id);
+GL_APICALL void GL_APIENTRY glBeginQuery (GLenum target, GLuint id);
+GL_APICALL void GL_APIENTRY glEndQuery (GLenum target);
+GL_APICALL void GL_APIENTRY glGetQueryiv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params);
+GL_APICALL GLboolean GL_APIENTRY glUnmapBuffer (GLenum target);
+GL_APICALL void GL_APIENTRY glGetBufferPointerv (GLenum target, GLenum pname, void **params);
+GL_APICALL void GL_APIENTRY glDrawBuffers (GLsizei n, const GLenum *bufs);
+GL_APICALL void GL_APIENTRY glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+GL_APICALL void *GL_APIENTRY glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+GL_APICALL void GL_APIENTRY glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length);
+GL_APICALL void GL_APIENTRY glBindVertexArray (GLuint array);
+GL_APICALL void GL_APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays);
+GL_APICALL void GL_APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays);
+GL_APICALL GLboolean GL_APIENTRY glIsVertexArray (GLuint array);
+GL_APICALL void GL_APIENTRY glGetIntegeri_v (GLenum target, GLuint index, GLint *data);
+GL_APICALL void GL_APIENTRY glBeginTransformFeedback (GLenum primitiveMode);
+GL_APICALL void GL_APIENTRY glEndTransformFeedback (void);
+GL_APICALL void GL_APIENTRY glBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+GL_APICALL void GL_APIENTRY glBindBufferBase (GLenum target, GLuint index, GLuint buffer);
+GL_APICALL void GL_APIENTRY glTransformFeedbackVaryings (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode);
+GL_APICALL void GL_APIENTRY glGetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+GL_APICALL void GL_APIENTRY glVertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
+GL_APICALL void GL_APIENTRY glGetVertexAttribIiv (GLuint index, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetVertexAttribIuiv (GLuint index, GLenum pname, GLuint *params);
+GL_APICALL void GL_APIENTRY glVertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w);
+GL_APICALL void GL_APIENTRY glVertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+GL_APICALL void GL_APIENTRY glVertexAttribI4iv (GLuint index, const GLint *v);
+GL_APICALL void GL_APIENTRY glVertexAttribI4uiv (GLuint index, const GLuint *v);
+GL_APICALL void GL_APIENTRY glGetUniformuiv (GLuint program, GLint location, GLuint *params);
+GL_APICALL GLint GL_APIENTRY glGetFragDataLocation (GLuint program, const GLchar *name);
+GL_APICALL void GL_APIENTRY glUniform1ui (GLint location, GLuint v0);
+GL_APICALL void GL_APIENTRY glUniform2ui (GLint location, GLuint v0, GLuint v1);
+GL_APICALL void GL_APIENTRY glUniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2);
+GL_APICALL void GL_APIENTRY glUniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+GL_APICALL void GL_APIENTRY glUniform1uiv (GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glUniform2uiv (GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glUniform3uiv (GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glUniform4uiv (GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glClearBufferiv (GLenum buffer, GLint drawbuffer, const GLint *value);
+GL_APICALL void GL_APIENTRY glClearBufferuiv (GLenum buffer, GLint drawbuffer, const GLuint *value);
+GL_APICALL void GL_APIENTRY glClearBufferfv (GLenum buffer, GLint drawbuffer, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+GL_APICALL const GLubyte *GL_APIENTRY glGetStringi (GLenum name, GLuint index);
+GL_APICALL void GL_APIENTRY glCopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+GL_APICALL void GL_APIENTRY glGetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices);
+GL_APICALL void GL_APIENTRY glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+GL_APICALL GLuint GL_APIENTRY glGetUniformBlockIndex (GLuint program, const GLchar *uniformBlockName);
+GL_APICALL void GL_APIENTRY glGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+GL_APICALL void GL_APIENTRY glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+GL_APICALL void GL_APIENTRY glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+GL_APICALL void GL_APIENTRY glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount);
+GL_APICALL GLsync GL_APIENTRY glFenceSync (GLenum condition, GLbitfield flags);
+GL_APICALL GLboolean GL_APIENTRY glIsSync (GLsync sync);
+GL_APICALL void GL_APIENTRY glDeleteSync (GLsync sync);
+GL_APICALL GLenum GL_APIENTRY glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout);
+GL_APICALL void GL_APIENTRY glWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout);
+GL_APICALL void GL_APIENTRY glGetInteger64v (GLenum pname, GLint64 *data);
+GL_APICALL void GL_APIENTRY glGetSynciv (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+GL_APICALL void GL_APIENTRY glGetInteger64i_v (GLenum target, GLuint index, GLint64 *data);
+GL_APICALL void GL_APIENTRY glGetBufferParameteri64v (GLenum target, GLenum pname, GLint64 *params);
+GL_APICALL void GL_APIENTRY glGenSamplers (GLsizei count, GLuint *samplers);
+GL_APICALL void GL_APIENTRY glDeleteSamplers (GLsizei count, const GLuint *samplers);
+GL_APICALL GLboolean GL_APIENTRY glIsSampler (GLuint sampler);
+GL_APICALL void GL_APIENTRY glBindSampler (GLuint unit, GLuint sampler);
+GL_APICALL void GL_APIENTRY glSamplerParameteri (GLuint sampler, GLenum pname, GLint param);
+GL_APICALL void GL_APIENTRY glSamplerParameteriv (GLuint sampler, GLenum pname, const GLint *param);
+GL_APICALL void GL_APIENTRY glSamplerParameterf (GLuint sampler, GLenum pname, GLfloat param);
+GL_APICALL void GL_APIENTRY glSamplerParameterfv (GLuint sampler, GLenum pname, const GLfloat *param);
+GL_APICALL void GL_APIENTRY glGetSamplerParameteriv (GLuint sampler, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat *params);
+GL_APICALL void GL_APIENTRY glVertexAttribDivisor (GLuint index, GLuint divisor);
+GL_APICALL void GL_APIENTRY glBindTransformFeedback (GLenum target, GLuint id);
+GL_APICALL void GL_APIENTRY glDeleteTransformFeedbacks (GLsizei n, const GLuint *ids);
+GL_APICALL void GL_APIENTRY glGenTransformFeedbacks (GLsizei n, GLuint *ids);
+GL_APICALL GLboolean GL_APIENTRY glIsTransformFeedback (GLuint id);
+GL_APICALL void GL_APIENTRY glPauseTransformFeedback (void);
+GL_APICALL void GL_APIENTRY glResumeTransformFeedback (void);
+GL_APICALL void GL_APIENTRY glGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
+GL_APICALL void GL_APIENTRY glProgramBinary (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
+GL_APICALL void GL_APIENTRY glProgramParameteri (GLuint program, GLenum pname, GLint value);
+GL_APICALL void GL_APIENTRY glInvalidateFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments);
+GL_APICALL void GL_APIENTRY glInvalidateSubFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glTexStorage2D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glTexStorage3D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+GL_APICALL void GL_APIENTRY glGetInternalformativ (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
+#endif /* GL_ES_VERSION_3_0 */
+
+#ifndef GL_ES_VERSION_3_1
+#define GL_ES_VERSION_3_1 1
+#define GL_COMPUTE_SHADER 0x91B9
+#define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB
+#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC
+#define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD
+#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262
+#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263
+#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264
+#define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265
+#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266
+#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB
+#define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE
+#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF
+#define GL_COMPUTE_WORK_GROUP_SIZE 0x8267
+#define GL_DISPATCH_INDIRECT_BUFFER 0x90EE
+#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF
+#define GL_COMPUTE_SHADER_BIT 0x00000020
+#define GL_DRAW_INDIRECT_BUFFER 0x8F3F
+#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43
+#define GL_MAX_UNIFORM_LOCATIONS 0x826E
+#define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310
+#define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311
+#define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313
+#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314
+#define GL_MAX_FRAMEBUFFER_WIDTH 0x9315
+#define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316
+#define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318
+#define GL_UNIFORM 0x92E1
+#define GL_UNIFORM_BLOCK 0x92E2
+#define GL_PROGRAM_INPUT 0x92E3
+#define GL_PROGRAM_OUTPUT 0x92E4
+#define GL_BUFFER_VARIABLE 0x92E5
+#define GL_SHADER_STORAGE_BLOCK 0x92E6
+#define GL_ATOMIC_COUNTER_BUFFER 0x92C0
+#define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4
+#define GL_ACTIVE_RESOURCES 0x92F5
+#define GL_MAX_NAME_LENGTH 0x92F6
+#define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7
+#define GL_NAME_LENGTH 0x92F9
+#define GL_TYPE 0x92FA
+#define GL_ARRAY_SIZE 0x92FB
+#define GL_OFFSET 0x92FC
+#define GL_BLOCK_INDEX 0x92FD
+#define GL_ARRAY_STRIDE 0x92FE
+#define GL_MATRIX_STRIDE 0x92FF
+#define GL_IS_ROW_MAJOR 0x9300
+#define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301
+#define GL_BUFFER_BINDING 0x9302
+#define GL_BUFFER_DATA_SIZE 0x9303
+#define GL_NUM_ACTIVE_VARIABLES 0x9304
+#define GL_ACTIVE_VARIABLES 0x9305
+#define GL_REFERENCED_BY_VERTEX_SHADER 0x9306
+#define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A
+#define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B
+#define GL_TOP_LEVEL_ARRAY_SIZE 0x930C
+#define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D
+#define GL_LOCATION 0x930E
+#define GL_VERTEX_SHADER_BIT 0x00000001
+#define GL_FRAGMENT_SHADER_BIT 0x00000002
+#define GL_ALL_SHADER_BITS 0xFFFFFFFF
+#define GL_PROGRAM_SEPARABLE 0x8258
+#define GL_ACTIVE_PROGRAM 0x8259
+#define GL_PROGRAM_PIPELINE_BINDING 0x825A
+#define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1
+#define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2
+#define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3
+#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC
+#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0
+#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1
+#define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2
+#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6
+#define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7
+#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8
+#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC
+#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9
+#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB
+#define GL_MAX_IMAGE_UNITS 0x8F38
+#define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA
+#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE
+#define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF
+#define GL_IMAGE_BINDING_NAME 0x8F3A
+#define GL_IMAGE_BINDING_LEVEL 0x8F3B
+#define GL_IMAGE_BINDING_LAYERED 0x8F3C
+#define GL_IMAGE_BINDING_LAYER 0x8F3D
+#define GL_IMAGE_BINDING_ACCESS 0x8F3E
+#define GL_IMAGE_BINDING_FORMAT 0x906E
+#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001
+#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002
+#define GL_UNIFORM_BARRIER_BIT 0x00000004
+#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008
+#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020
+#define GL_COMMAND_BARRIER_BIT 0x00000040
+#define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080
+#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100
+#define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200
+#define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400
+#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800
+#define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000
+#define GL_ALL_BARRIER_BITS 0xFFFFFFFF
+#define GL_IMAGE_2D 0x904D
+#define GL_IMAGE_3D 0x904E
+#define GL_IMAGE_CUBE 0x9050
+#define GL_IMAGE_2D_ARRAY 0x9053
+#define GL_INT_IMAGE_2D 0x9058
+#define GL_INT_IMAGE_3D 0x9059
+#define GL_INT_IMAGE_CUBE 0x905B
+#define GL_INT_IMAGE_2D_ARRAY 0x905E
+#define GL_UNSIGNED_INT_IMAGE_2D 0x9063
+#define GL_UNSIGNED_INT_IMAGE_3D 0x9064
+#define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066
+#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069
+#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7
+#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8
+#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9
+#define GL_READ_ONLY 0x88B8
+#define GL_WRITE_ONLY 0x88B9
+#define GL_READ_WRITE 0x88BA
+#define GL_SHADER_STORAGE_BUFFER 0x90D2
+#define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3
+#define GL_SHADER_STORAGE_BUFFER_START 0x90D4
+#define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5
+#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6
+#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA
+#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB
+#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC
+#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD
+#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE
+#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF
+#define GL_SHADER_STORAGE_BARRIER_BIT 0x00002000
+#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39
+#define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA
+#define GL_STENCIL_INDEX 0x1901
+#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E
+#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F
+#define GL_SAMPLE_POSITION 0x8E50
+#define GL_SAMPLE_MASK 0x8E51
+#define GL_SAMPLE_MASK_VALUE 0x8E52
+#define GL_TEXTURE_2D_MULTISAMPLE 0x9100
+#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59
+#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E
+#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F
+#define GL_MAX_INTEGER_SAMPLES 0x9110
+#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104
+#define GL_TEXTURE_SAMPLES 0x9106
+#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107
+#define GL_TEXTURE_WIDTH 0x1000
+#define GL_TEXTURE_HEIGHT 0x1001
+#define GL_TEXTURE_DEPTH 0x8071
+#define GL_TEXTURE_INTERNAL_FORMAT 0x1003
+#define GL_TEXTURE_RED_SIZE 0x805C
+#define GL_TEXTURE_GREEN_SIZE 0x805D
+#define GL_TEXTURE_BLUE_SIZE 0x805E
+#define GL_TEXTURE_ALPHA_SIZE 0x805F
+#define GL_TEXTURE_DEPTH_SIZE 0x884A
+#define GL_TEXTURE_STENCIL_SIZE 0x88F1
+#define GL_TEXTURE_SHARED_SIZE 0x8C3F
+#define GL_TEXTURE_RED_TYPE 0x8C10
+#define GL_TEXTURE_GREEN_TYPE 0x8C11
+#define GL_TEXTURE_BLUE_TYPE 0x8C12
+#define GL_TEXTURE_ALPHA_TYPE 0x8C13
+#define GL_TEXTURE_DEPTH_TYPE 0x8C16
+#define GL_TEXTURE_COMPRESSED 0x86A1
+#define GL_SAMPLER_2D_MULTISAMPLE 0x9108
+#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109
+#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A
+#define GL_VERTEX_ATTRIB_BINDING 0x82D4
+#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5
+#define GL_VERTEX_BINDING_DIVISOR 0x82D6
+#define GL_VERTEX_BINDING_OFFSET 0x82D7
+#define GL_VERTEX_BINDING_STRIDE 0x82D8
+#define GL_VERTEX_BINDING_BUFFER 0x8F4F
+#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9
+#define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA
+#define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5
+GL_APICALL void GL_APIENTRY glDispatchCompute (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
+GL_APICALL void GL_APIENTRY glDispatchComputeIndirect (GLintptr indirect);
+GL_APICALL void GL_APIENTRY glDrawArraysIndirect (GLenum mode, const void *indirect);
+GL_APICALL void GL_APIENTRY glDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect);
+GL_APICALL void GL_APIENTRY glFramebufferParameteri (GLenum target, GLenum pname, GLint param);
+GL_APICALL void GL_APIENTRY glGetFramebufferParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetProgramInterfaceiv (GLuint program, GLenum programInterface, GLenum pname, GLint *params);
+GL_APICALL GLuint GL_APIENTRY glGetProgramResourceIndex (GLuint program, GLenum programInterface, const GLchar *name);
+GL_APICALL void GL_APIENTRY glGetProgramResourceName (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
+GL_APICALL void GL_APIENTRY glGetProgramResourceiv (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
+GL_APICALL GLint GL_APIENTRY glGetProgramResourceLocation (GLuint program, GLenum programInterface, const GLchar *name);
+GL_APICALL void GL_APIENTRY glUseProgramStages (GLuint pipeline, GLbitfield stages, GLuint program);
+GL_APICALL void GL_APIENTRY glActiveShaderProgram (GLuint pipeline, GLuint program);
+GL_APICALL GLuint GL_APIENTRY glCreateShaderProgramv (GLenum type, GLsizei count, const GLchar *const*strings);
+GL_APICALL void GL_APIENTRY glBindProgramPipeline (GLuint pipeline);
+GL_APICALL void GL_APIENTRY glDeleteProgramPipelines (GLsizei n, const GLuint *pipelines);
+GL_APICALL void GL_APIENTRY glGenProgramPipelines (GLsizei n, GLuint *pipelines);
+GL_APICALL GLboolean GL_APIENTRY glIsProgramPipeline (GLuint pipeline);
+GL_APICALL void GL_APIENTRY glGetProgramPipelineiv (GLuint pipeline, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glProgramUniform1i (GLuint program, GLint location, GLint v0);
+GL_APICALL void GL_APIENTRY glProgramUniform2i (GLuint program, GLint location, GLint v0, GLint v1);
+GL_APICALL void GL_APIENTRY glProgramUniform3i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+GL_APICALL void GL_APIENTRY glProgramUniform4i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+GL_APICALL void GL_APIENTRY glProgramUniform1ui (GLuint program, GLint location, GLuint v0);
+GL_APICALL void GL_APIENTRY glProgramUniform2ui (GLuint program, GLint location, GLuint v0, GLuint v1);
+GL_APICALL void GL_APIENTRY glProgramUniform3ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+GL_APICALL void GL_APIENTRY glProgramUniform4ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+GL_APICALL void GL_APIENTRY glProgramUniform1f (GLuint program, GLint location, GLfloat v0);
+GL_APICALL void GL_APIENTRY glProgramUniform2f (GLuint program, GLint location, GLfloat v0, GLfloat v1);
+GL_APICALL void GL_APIENTRY glProgramUniform3f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+GL_APICALL void GL_APIENTRY glProgramUniform4f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+GL_APICALL void GL_APIENTRY glProgramUniform1iv (GLuint program, GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform2iv (GLuint program, GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform3iv (GLuint program, GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform4iv (GLuint program, GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform1uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform2uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform3uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform4uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform1fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniform2fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniform3fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniform4fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix2x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix3x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix2x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix4x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix3x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix4x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glValidateProgramPipeline (GLuint pipeline);
+GL_APICALL void GL_APIENTRY glGetProgramPipelineInfoLog (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+GL_APICALL void GL_APIENTRY glBindImageTexture (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
+GL_APICALL void GL_APIENTRY glGetBooleani_v (GLenum target, GLuint index, GLboolean *data);
+GL_APICALL void GL_APIENTRY glMemoryBarrier (GLbitfield barriers);
+GL_APICALL void GL_APIENTRY glMemoryBarrierByRegion (GLbitfield barriers);
+GL_APICALL void GL_APIENTRY glTexStorage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+GL_APICALL void GL_APIENTRY glGetMultisamplefv (GLenum pname, GLuint index, GLfloat *val);
+GL_APICALL void GL_APIENTRY glSampleMaski (GLuint maskNumber, GLbitfield mask);
+GL_APICALL void GL_APIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params);
+GL_APICALL void GL_APIENTRY glBindVertexBuffer (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
+GL_APICALL void GL_APIENTRY glVertexAttribFormat (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
+GL_APICALL void GL_APIENTRY glVertexAttribIFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+GL_APICALL void GL_APIENTRY glVertexAttribBinding (GLuint attribindex, GLuint bindingindex);
+GL_APICALL void GL_APIENTRY glVertexBindingDivisor (GLuint bindingindex, GLuint divisor);
+#endif /* GL_ES_VERSION_3_1 */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/third_party/khronos/GLES3/gl3platform.h b/third_party/khronos/GLES3/gl3platform.h
new file mode 100644
index 0000000..b1e869d
--- /dev/null
+++ b/third_party/khronos/GLES3/gl3platform.h
@@ -0,0 +1,30 @@
+#ifndef __gl3platform_h_
+#define __gl3platform_h_
+
+/* $Revision: 23328 $ on $Date:: 2013-10-02 02:28:28 -0700 #$ */
+
+/*
+ * This document is licensed under the SGI Free Software B License Version
+ * 2.0. For details, see http://oss.sgi.com/projects/FreeB/ .
+ */
+
+/* Platform-specific types and definitions for OpenGL ES 3.X gl3.h
+ *
+ * Adopters may modify khrplatform.h and this file to suit their platform.
+ * You are encouraged to submit all modifications to the Khronos group so that
+ * they can be included in future versions of this file. Please submit changes
+ * by sending them to the public Khronos Bugzilla (http://khronos.org/bugzilla)
+ * by filing a bug against product "OpenGL-ES" component "Registry".
+ */
+
+#include <KHR/khrplatform.h>
+
+#ifndef GL_APICALL
+#define GL_APICALL KHRONOS_APICALL
+#endif
+
+#ifndef GL_APIENTRY
+#define GL_APIENTRY KHRONOS_APIENTRY
+#endif
+
+#endif /* __gl3platform_h_ */
diff --git a/third_party/khronos/README.chromium b/third_party/khronos/README.chromium
index d803f14..10259c9 100644
--- a/third_party/khronos/README.chromium
+++ b/third_party/khronos/README.chromium
@@ -2,17 +2,17 @@
Short Name: khronos_headers
URL: http://www.khronos.org/registry
Version: unknown
-Date: 2014-10-20
+Date: 2014-11-26
License: MIT/X11, SGI Free Software License B
Security Critical: no
Description:
-This package contains header files for the EGL and OpenGL ES 2.0 APIs from
+This package contains header files for the EGL and OpenGL ES APIs from
Khronos. They are used for compiling code against these APIs as well as for
generating the GL binding initialization logic.
MIT/X11 (BSD like) license is for {EGL,KHR}/*, SGI Free Software License B is
-for GLES2/*.
+for GLES2/* and GLES3/*.
Local Modifications:
diff --git a/third_party/libpng/BUILD.gn b/third_party/libpng/BUILD.gn
index d4aaf18..488ef43 100644
--- a/third_party/libpng/BUILD.gn
+++ b/third_party/libpng/BUILD.gn
@@ -3,9 +3,7 @@
# found in the LICENSE file.
config("libpng_config") {
- include_dirs = [
- ".",
- ]
+ include_dirs = [ "." ]
defines = [
"CHROME_PNG_WRITE_SUPPORT",
@@ -14,9 +12,7 @@
if (is_android) {
#'toolsets': ['target', 'host'],
- defines += [
- "CHROME_PNG_READ_PACK_SUPPORT", # Required by freetype.
- ]
+ defines += [ "CHROME_PNG_READ_PACK_SUPPORT" ] # Required by freetype.
}
if (is_win) {
@@ -30,7 +26,7 @@
}
source_set("libpng_sources") {
- sources = [
+ sources = [
"png.c",
"png.h",
"pngconf.h",
@@ -66,15 +62,21 @@
public_configs = [ ":libpng_config" ]
- public_deps = [ "//third_party/zlib" ]
+ public_deps = [
+ "//third_party/zlib",
+ ]
}
if (is_win) {
component("libpng") {
- public_deps = [ ":libpng_sources" ]
+ public_deps = [
+ ":libpng_sources",
+ ]
}
} else {
group("libpng") {
- public_deps = [ ":libpng_sources" ]
+ public_deps = [
+ ":libpng_sources",
+ ]
}
}
diff --git a/third_party/libxml/BUILD.gn b/third_party/libxml/BUILD.gn
index 73bb3dc..17ea09a 100644
--- a/third_party/libxml/BUILD.gn
+++ b/third_party/libxml/BUILD.gn
@@ -110,6 +110,7 @@
"src/schematron.c",
"src/threads.c",
"src/tree.c",
+
#"src/trio.c",
#"src/trio.h",
#"src/triodef.h",
@@ -151,9 +152,7 @@
]
if (is_win) {
- cflags_c = [
- "/wd4101", # Unreferenced local variable.
- ]
+ cflags_c = [ "/wd4101" ] # Unreferenced local variable.
} else if (is_mac || is_android) {
# http://www.xmlsoft.org/threads.html says that this is required when using
# libxml from several threads, which can possibly happen in chrome. On
@@ -181,7 +180,5 @@
]
}
- include_dirs = [
- "$os_include",
- ]
+ include_dirs = [ "$os_include" ]
}
diff --git a/third_party/mesa/BUILD.gn b/third_party/mesa/BUILD.gn
index 48b772c..4989a37 100644
--- a/third_party/mesa/BUILD.gn
+++ b/third_party/mesa/BUILD.gn
@@ -49,6 +49,7 @@
"HAVE_LIBXCB_DRI2=1",
"FEATURE_GL=1",
"MAPI_MODE_GLAPI",
+
#"USE_X86_64_ASM",
"IN_DRI_DRIVER",
"USE_XCB",
@@ -89,9 +90,7 @@
}
if (is_linux) {
- defines += [
- "_GNU_SOURCE",
- ]
+ defines += [ "_GNU_SOURCE" ]
}
if (is_posix) {
@@ -223,6 +222,7 @@
"src/src/glsl/ralloc.h",
"src/src/glsl/s_expression.cpp",
"src/src/glsl/s_expression.h",
+
# Skipped in the GN build. This file duplicates symbols from errors.c and
# happens to link in GYP due to static library link ordering.
#"src/src/glsl/standalone_scaffolding.cpp",
@@ -231,12 +231,8 @@
"src/src/glsl/strtod.h",
]
- configs -= [
- "//build/config/compiler:chromium_code",
- ]
- configs += [
- "//build/config/compiler:no_chromium_code",
- ]
+ configs -= [ "//build/config/compiler:chromium_code" ]
+ configs += [ "//build/config/compiler:no_chromium_code" ]
previous_configs = configs
configs = []
configs = [ ":mesa_internal_config" ] + previous_configs
@@ -617,12 +613,8 @@
"src/src/mesa/x86-64/x86-64.h",
]
- configs -= [
- "//build/config/compiler:chromium_code",
- ]
- configs += [
- "//build/config/compiler:no_chromium_code",
- ]
+ configs -= [ "//build/config/compiler:chromium_code" ]
+ configs += [ "//build/config/compiler:no_chromium_code" ]
previous_configs = configs
configs = []
configs = [ ":mesa_internal_config" ] + previous_configs
@@ -651,49 +643,49 @@
}
if (!is_android) { # TODO(GYP) enable for Android.
-
-# Building this target will hide the native OpenGL shared library and
-# replace it with a slow software renderer.
-# TODO(GYP) http://crbug.com/380327 need support for loadable_module.
-#loadable_module("osmesa") {
-shared_library("osmesa") {
- sources = [
- "src/src/mesa/drivers/common/driverfuncs.c",
- "src/src/mesa/drivers/common/driverfuncs.h",
- "src/src/mesa/drivers/common/meta.c",
- "src/src/mesa/drivers/common/meta.h",
- "src/src/mesa/drivers/osmesa/osmesa.c",
- "src/src/mesa/drivers/osmesa/osmesa.def",
- ]
-
- configs -= [
- "//build/config/compiler:chromium_code",
- ]
- configs += [
- ":mesa_headers_config",
- "//build/config/compiler:no_chromium_code",
- ]
- previous_configs = configs
- configs = []
- configs = [ ":mesa_internal_config" ] + previous_configs
-
- include_dirs = [ "src/src/mesa/drivers" ]
-
- deps = [
- ":mesa_headers",
- ":mesa",
- ":mesa_libglslcommon",
- ]
-
- if (is_win) {
- defines = [
- "BUILD_GL32",
- "KEYWORD1=GLAPI",
- "KEYWORD2=GLAPIENTRY",
+ # Building this target will hide the native OpenGL shared library and
+ # replace it with a slow software renderer.
+ # TODO(GYP) http://crbug.com/380327 need support for loadable_module.
+ #loadable_module("osmesa") {
+ shared_library("osmesa") {
+ sources = [
+ "src/src/mesa/drivers/common/driverfuncs.c",
+ "src/src/mesa/drivers/common/driverfuncs.h",
+ "src/src/mesa/drivers/common/meta.c",
+ "src/src/mesa/drivers/common/meta.h",
+ "src/src/mesa/drivers/osmesa/osmesa.c",
+ "src/src/mesa/drivers/osmesa/osmesa.def",
]
+
+ configs -= [ "//build/config/compiler:chromium_code" ]
+ configs += [
+ ":mesa_headers_config",
+ "//build/config/compiler:no_chromium_code",
+ ]
+ previous_configs = configs
+ configs = []
+ configs = [ ":mesa_internal_config" ] + previous_configs
+
+ include_dirs = [ "src/src/mesa/drivers" ]
+
+ if (is_clang) {
+ # Mesa triggers some of these Clang warnings.
+ configs -= [ "//build/config/clang:extra_warnings" ]
+ }
+
+ deps = [
+ ":mesa_headers",
+ ":mesa",
+ ":mesa_libglslcommon",
+ ]
+
+ if (is_win) {
+ defines = [
+ "BUILD_GL32",
+ "KEYWORD1=GLAPI",
+ "KEYWORD2=GLAPIENTRY",
+ ]
+ }
}
-}
-
} # !is_android
-
# TODO(GYP) Android osmesa_in_lib_dir target.
diff --git a/third_party/mesa/mesa.gyp b/third_party/mesa/mesa.gyp
index bc115e1..3db0d4c 100644
--- a/third_party/mesa/mesa.gyp
+++ b/third_party/mesa/mesa.gyp
@@ -700,6 +700,12 @@
'src/src/mesa/drivers/osmesa/osmesa.c',
'src/src/mesa/drivers/osmesa/osmesa.def',
],
+ 'variables': {
+ 'clang_warning_flags_unset': [
+ # Don't warn about string->bool used in asserts.
+ '-Wstring-conversion',
+ ],
+ },
},
],
'conditions': [
diff --git a/third_party/protobuf/BUILD.gn b/third_party/protobuf/BUILD.gn
index eddfc8a..973672b 100644
--- a/third_party/protobuf/BUILD.gn
+++ b/third_party/protobuf/BUILD.gn
@@ -33,9 +33,7 @@
# This condif should be applied to targets using generated code from the proto
# compiler. It sets up the include directories properly.
config("using_proto") {
- include_dirs = [
- "$root_gen_dir/protoc_out",
- ]
+ include_dirs = [ "$root_gen_dir/protoc_out" ]
}
protobuf_lite_sources = [
@@ -139,7 +137,6 @@
"src/google/protobuf/compiler/java/java_doc_comment.cc",
"src/google/protobuf/compiler/java/java_doc_comment.h",
"src/google/protobuf/compiler/parser.h",
-
"src/google/protobuf/stubs/strutil.cc",
"src/google/protobuf/stubs/strutil.h",
"src/google/protobuf/stubs/substitute.cc",
@@ -150,7 +147,6 @@
"src/google/protobuf/stubs/structurally_valid.cc",
"src/google/protobuf/stubs/template_util.h",
"src/google/protobuf/stubs/type_traits.h",
-
"src/google/protobuf/descriptor.cc",
"src/google/protobuf/descriptor.pb.cc",
"src/google/protobuf/descriptor_database.cc",
@@ -162,6 +158,7 @@
"src/google/protobuf/service.cc",
"src/google/protobuf/text_format.cc",
"src/google/protobuf/wire_format.cc",
+
# This file pulls in zlib, but it's not actually used by protoc, so
# instead of compiling zlib for the host, let's just exclude this.
# "src/src/google/protobuf/io/gzip_stream.cc",
diff --git a/third_party/protobuf/proto_library.gni b/third_party/protobuf/proto_library.gni
index 40fb80f..7bbf56d 100644
--- a/third_party/protobuf/proto_library.gni
+++ b/third_party/protobuf/proto_library.gni
@@ -84,25 +84,34 @@
args = []
if (defined(invoker.cc_include)) {
- args += [ "--include", invoker.cc_include ]
+ args += [
+ "--include",
+ invoker.cc_include,
+ ]
}
args += [
- "--protobuf", "$rel_out_dir/{{source_name_part}}.pb.h",
- "--proto-in-dir", "{{source_dir}}",
- "--proto-in-file", "{{source_file_part}}",
+ "--protobuf",
+ "$rel_out_dir/{{source_name_part}}.pb.h",
+ "--proto-in-dir",
+ "{{source_dir}}",
+ "--proto-in-file",
+ "{{source_file_part}}",
+
# TODO(brettw) support system protobuf compiler.
"--use-system-protobuf=0",
]
protoc_label = "//third_party/protobuf:protoc($host_toolchain)"
args += [
- "--",
+ "--",
+
# Prepend with "./" so this will never pick up the system one (normally
# when not cross-compiling, protoc's output directory will be the same
# as the build dir, so the relative location will be empty).
- "./" + rebase_path(get_label_info(protoc_label, "root_out_dir") +
- "/protoc", root_build_dir),
+ "./" +
+ rebase_path(get_label_info(protoc_label, "root_out_dir") + "/protoc",
+ root_build_dir),
]
# If passed cc_generator_options should end in a colon, which will separate
@@ -115,11 +124,15 @@
}
args += [
# cc_generator_options is supposed to end in a colon if it's nonempty.
- "--cpp_out", "$cc_generator_options$rel_out_dir",
- "--python_out", rel_out_dir,
+ "--cpp_out",
+ "$cc_generator_options$rel_out_dir",
+ "--python_out",
+ rel_out_dir,
]
- deps = [ protoc_label ]
+ deps = [
+ protoc_label,
+ ]
if (defined(invoker.deps)) {
deps += invoker.deps
diff --git a/third_party/yasm/BUILD.gn b/third_party/yasm/BUILD.gn
index 700e745..3b2b884 100644
--- a/third_party/yasm/BUILD.gn
+++ b/third_party/yasm/BUILD.gn
@@ -28,7 +28,6 @@
# turn intermediate files into .c files.
if (current_toolchain == host_toolchain) {
-
# Various files referenced by multiple targets.
yasm_gen_include_dir = "$target_gen_dir/include"
yasm_os = os
@@ -52,17 +51,25 @@
}
executable("genmacro") {
- sources = [ "source/patched-yasm/tools/genmacro/genmacro.c" ]
+ sources = [
+ "source/patched-yasm/tools/genmacro/genmacro.c",
+ ]
configs -= [ "//build/config/compiler:chromium_code" ]
- configs += [ ":yasm_config",
- "//build/config/compiler:no_chromium_code" ]
+ configs += [
+ ":yasm_config",
+ "//build/config/compiler:no_chromium_code",
+ ]
}
executable("genmodule") {
- sources = [ "source/patched-yasm/libyasm/genmodule.c" ]
+ sources = [
+ "source/patched-yasm/libyasm/genmodule.c",
+ ]
configs -= [ "//build/config/compiler:chromium_code" ]
- configs += [ ":yasm_config",
- "//build/config/compiler:no_chromium_code" ]
+ configs += [
+ ":yasm_config",
+ "//build/config/compiler:no_chromium_code",
+ ]
}
executable("genperf") {
@@ -72,10 +79,14 @@
]
configs -= [ "//build/config/compiler:chromium_code" ]
- configs += [ ":yasm_config",
- "//build/config/compiler:no_chromium_code" ]
+ configs += [
+ ":yasm_config",
+ "//build/config/compiler:no_chromium_code",
+ ]
- deps = [ ":yasm_utils" ]
+ deps = [
+ ":yasm_utils",
+ ]
}
# Used by both yasm and genperf binaries.
@@ -87,40 +98,52 @@
]
configs -= [ "//build/config/compiler:chromium_code" ]
- configs += [ ":yasm_config",
- "//build/config/compiler:no_chromium_code" ]
+ configs += [
+ ":yasm_config",
+ "//build/config/compiler:no_chromium_code",
+ ]
}
executable("genstring") {
- sources = [ "source/patched-yasm/genstring.c", ]
+ sources = [
+ "source/patched-yasm/genstring.c",
+ ]
configs -= [ "//build/config/compiler:chromium_code" ]
- configs += [ ":yasm_config",
- "//build/config/compiler:no_chromium_code" ]
+ configs += [
+ ":yasm_config",
+ "//build/config/compiler:no_chromium_code",
+ ]
}
executable("genversion") {
- sources = [ "source/patched-yasm/modules/preprocs/nasm/genversion.c" ]
+ sources = [
+ "source/patched-yasm/modules/preprocs/nasm/genversion.c",
+ ]
configs -= [ "//build/config/compiler:chromium_code" ]
- configs += [ ":yasm_config",
- "//build/config/compiler:no_chromium_code" ]
+ configs += [
+ ":yasm_config",
+ "//build/config/compiler:no_chromium_code",
+ ]
}
executable("re2c") {
sources = [
- "source/patched-yasm/tools/re2c/main.c",
- "source/patched-yasm/tools/re2c/code.c",
- "source/patched-yasm/tools/re2c/dfa.c",
- "source/patched-yasm/tools/re2c/parser.c",
- "source/patched-yasm/tools/re2c/actions.c",
- "source/patched-yasm/tools/re2c/scanner.c",
- "source/patched-yasm/tools/re2c/mbo_getopt.c",
- "source/patched-yasm/tools/re2c/substr.c",
- "source/patched-yasm/tools/re2c/translate.c",
+ "source/patched-yasm/tools/re2c/main.c",
+ "source/patched-yasm/tools/re2c/code.c",
+ "source/patched-yasm/tools/re2c/dfa.c",
+ "source/patched-yasm/tools/re2c/parser.c",
+ "source/patched-yasm/tools/re2c/actions.c",
+ "source/patched-yasm/tools/re2c/scanner.c",
+ "source/patched-yasm/tools/re2c/mbo_getopt.c",
+ "source/patched-yasm/tools/re2c/substr.c",
+ "source/patched-yasm/tools/re2c/translate.c",
]
configs -= [ "//build/config/compiler:chromium_code" ]
- configs += [ ":yasm_config",
- "//build/config/compiler:no_chromium_code" ]
+ configs += [
+ ":yasm_config",
+ "//build/config/compiler:no_chromium_code",
+ ]
# re2c is missing CLOSEVOP from one switch.
if (is_posix) {
@@ -210,12 +233,14 @@
"$target_gen_dir/lc3bid.c",
# File generated by generate_module
- "$target_gen_dir/module.c"
+ "$target_gen_dir/module.c",
]
configs -= [ "//build/config/compiler:chromium_code" ]
- configs += [ ":yasm_config",
- "//build/config/compiler:no_chromium_code" ]
+ configs += [
+ ":yasm_config",
+ "//build/config/compiler:no_chromium_code",
+ ]
# Yasm generates a bunch of .c files which its source file #include.
# Add the |target_gen_dir| into the include path so it can find them.
@@ -226,7 +251,10 @@
if (is_win) {
cflags = [ "/wd4267" ] # size_t to int conversion.
} else {
- cflags = [ "-ansi", "-pedantic" ]
+ cflags = [
+ "-ansi",
+ "-pedantic",
+ ]
if (is_clang) {
cflags += [ "-Wno-incompatible-pointer-types" ]
}
@@ -263,7 +291,7 @@
rebase_path(target_gen_dir, root_build_dir) + "/{{source_name_part}}.c",
]
deps = [
- ":generate_x86_insn"
+ ":generate_x86_insn",
]
}
@@ -288,13 +316,14 @@
"/{{source_name_part}}.c",
]
deps = [
- ":generate_x86_insn"
+ ":generate_x86_insn",
]
}
template("compile_macro") {
compiled_action(target_name) {
tool = ":genmacro"
+
# Output #included by source/patched-yasm/frontends/yasm/yasm.c.
inputs = invoker.sources
outputs = invoker.outputs
@@ -312,7 +341,9 @@
compile_macro("compile_nasm_macros") {
# Output #included by
# source/patched-yasm/modules/preprocs/nasm/nasm-parser.c
- sources = [ "source/patched-yasm/modules/parsers/nasm/nasm-std.mac" ]
+ sources = [
+ "source/patched-yasm/modules/parsers/nasm/nasm-std.mac",
+ ]
outputs = [ "$yasm_gen_include_dir/nasm-macros.c" ]
macro_varname = "nasm_standard_mac"
}
@@ -320,22 +351,30 @@
compile_macro("compile_nasm_version") {
# Output #included by
# source/patched-yasm/modules/preprocs/nasm/nasm-preproc.c
- sources = [ "$target_gen_dir/$version_file" ]
+ sources = [
+ "$target_gen_dir/$version_file",
+ ]
outputs = [ "$yasm_gen_include_dir/nasm-version.c" ]
macro_varname = "nasm_version_mac"
- deps = [ ":generate_version" ]
+ deps = [
+ ":generate_version",
+ ]
}
compile_macro("compile_win64_gas") {
# Output #included by source/patched-yasm/frontends/yasm/yasm.c.
- sources = [ "source/patched-yasm/modules/objfmts/coff/win64-gas.mac" ]
+ sources = [
+ "source/patched-yasm/modules/objfmts/coff/win64-gas.mac",
+ ]
outputs = [ "$yasm_gen_include_dir/win64-gas.c" ]
macro_varname = "win64_gas_stdmac"
}
compile_macro("compile_win64_nasm") {
# Output #included by source/patched-yasm/frontends/yasm/yasm.c.
- sources = [ "source/patched-yasm/modules/objfmts/coff/win64-nasm.mac" ]
+ sources = [
+ "source/patched-yasm/modules/objfmts/coff/win64-nasm.mac",
+ ]
outputs = [ "$yasm_gen_include_dir/win64-nasm.c" ]
macro_varname = "win64_nasm_stdmac"
}
@@ -358,7 +397,9 @@
# This call doesn't fit into the re2c template above.
compiled_action("compile_re2c_lc3b") {
tool = ":re2c"
- inputs = [ "source/patched-yasm/modules/arch/lc3b/lc3bid.re" ]
+ inputs = [
+ "source/patched-yasm/modules/arch/lc3b/lc3bid.re",
+ ]
outputs = [ "$target_gen_dir/lc3bid.c" ]
args = [
"-s",
@@ -370,8 +411,11 @@
compiled_action("generate_license") {
tool = ":genstring"
+
# Output #included by source/patched-yasm/frontends/yasm/yasm.c.
- inputs = [ "source/patched-yasm/COPYING" ]
+ inputs = [
+ "source/patched-yasm/COPYING",
+ ]
outputs = [ "$yasm_gen_include_dir/license.c" ]
args = [
"license_msg",
@@ -397,14 +441,12 @@
compiled_action("generate_version") {
tool = ":genversion"
outputs = [ "$target_gen_dir/$version_file" ]
- args = [
- rebase_path(outputs[0],
- root_build_dir)
- ]
+ args = [ rebase_path(outputs[0], root_build_dir) ]
}
action("generate_x86_insn") {
script = "source/patched-yasm/modules/arch/x86/gen_x86_insn.py"
+
# Output eventually #included by source/patched-yasm/frontends/yasm/x86id.c
outputs = [
"$yasm_gen_include_dir/x86insns.c",
diff --git a/third_party/yasm/CHROMIUM.diff b/third_party/yasm/CHROMIUM.diff
new file mode 100644
index 0000000..764cbf7
--- /dev/null
+++ b/third_party/yasm/CHROMIUM.diff
@@ -0,0 +1,24 @@
+--- frontends/tasm/tasm.c
++++ frontends/tasm/tasm.c
+@@ -224,7 +224,9 @@
+ /* version message */
+ /*@observer@*/ static const char *version_msg[] = {
+ PACKAGE_STRING,
++#if !defined(DONT_EMBED_BUILD_METADATA) || defined(OFFICIAL_BUILD)
+ "Compiled on " __DATE__ ".",
++#endif
+ "Copyright (c) 2001-2010 Peter Johnson and other Yasm developers.",
+ "Run yasm --license for licensing overview and summary."
+ };
+--- frontends/yasm/yasm.c
++++ frontends/yasm/yasm.c
+@@ -213,7 +213,9 @@
+ /* version message */
+ /*@observer@*/ static const char *version_msg[] = {
+ PACKAGE_STRING,
++#if !defined(DONT_EMBED_BUILD_METADATA) || defined(OFFICIAL_BUILD)
+ "Compiled on " __DATE__ ".",
++#endif
+ "Copyright (c) 2001-2011 Peter Johnson and other Yasm developers.",
+ "Run yasm --license for licensing overview and summary."
+ };
diff --git a/third_party/yasm/README.chromium b/third_party/yasm/README.chromium
index 56513f7..7006a63 100644
--- a/third_party/yasm/README.chromium
+++ b/third_party/yasm/README.chromium
@@ -13,6 +13,7 @@
* https://github.com/yasm/yasm/commit/2bd66514b6b100887c19d8598da38347b3cff40e
* https://github.com/yasm/yasm/commit/ab19547382660d81e0b4a0232dccb38f44c52a36
* https://github.com/yasm/yasm/commit/9728322335cba96500861ef766b1546d096e5600
+* CHROMIUM.diff
See also the yasm.gyp file for a description of the yasm build process.
diff --git a/third_party/yasm/yasm_assemble.gni b/third_party/yasm/yasm_assemble.gni
index 48c9f8b..fdbf624 100644
--- a/third_party/yasm/yasm_assemble.gni
+++ b/third_party/yasm/yasm_assemble.gni
@@ -45,25 +45,29 @@
if (cpu_arch == "x86") {
_yasm_flags = [
"-fmacho32",
- "-m", "x86",
+ "-m",
+ "x86",
]
} else if (cpu_arch == "x64") {
_yasm_flags = [
"-fmacho64",
- "-m", "amd64",
+ "-m",
+ "amd64",
]
}
} else if (is_posix) {
if (cpu_arch == "x86") {
_yasm_flags = [
"-felf32",
- "-m", "x86",
+ "-m",
+ "x86",
]
} else if (cpu_arch == "x64") {
_yasm_flags = [
"-DPIC",
"-felf64",
- "-m", "amd64",
+ "-m",
+ "amd64",
]
}
} else if (is_win) {
@@ -71,12 +75,14 @@
_yasm_flags = [
"-DPREFIX",
"-fwin32",
- "-m", "x86",
+ "-m",
+ "x86",
]
} else if (cpu_arch == "x64") {
_yasm_flags = [
"-fwin64",
- "-m", "amd64",
+ "-m",
+ "amd64",
]
}
}
@@ -114,12 +120,13 @@
# (when cross-compiling).
yasm_label = "//third_party/yasm($host_toolchain)"
args = [ "./" + # Force current dir.
- rebase_path(get_label_info(yasm_label, "root_out_dir") + "/yasm",
- root_build_dir)
- ]
+ rebase_path(get_label_info(yasm_label, "root_out_dir") + "/yasm",
+ root_build_dir) ]
# Deps.
- deps = [ yasm_label ]
+ deps = [
+ yasm_label,
+ ]
if (defined(invoker.deps)) {
deps += invoker.deps
}
@@ -142,6 +149,7 @@
# This goes to the end of include list.
args += [
"-I.",
+
# Using "//." will produce a relative path "../.." which looks better than
# "../../" which will result from using "//" as the base (although both
# work). This is because rebase_path will terminate the result in a
@@ -150,7 +158,6 @@
"-I" + rebase_path(root_gen_dir, root_build_dir),
]
-
# Extra defines.
if (defined(invoker.defines)) {
foreach(def, invoker.defines) {
@@ -167,8 +174,9 @@
# "$root_out_dir/${target_name}.{{source_dir_part}}.$asm_obj_extension"
outputs = [ "$target_out_dir/{{source_name_part}}.o" ]
args += [
- "-o", rebase_path(outputs[0], root_build_dir),
- "{{source}}"
+ "-o",
+ rebase_path(outputs[0], root_build_dir),
+ "{{source}}",
]
# The wrapper script run_yasm will write the depfile to the same name as
@@ -186,6 +194,8 @@
sources = get_target_outputs(":$action_name")
- deps = [ ":$action_name" ]
+ deps = [
+ ":$action_name",
+ ]
}
}
diff --git a/third_party/zlib/BUILD.gn b/third_party/zlib/BUILD.gn
index b4d9cfd..e49b5e9 100644
--- a/third_party/zlib/BUILD.gn
+++ b/third_party/zlib/BUILD.gn
@@ -8,12 +8,20 @@
static_library("zlib_x86_simd") {
if (!is_ios && (cpu_arch == "x86" || cpu_arch == "x64")) {
- sources = [ "crc_folding.c", "fill_window_sse.c" ]
+ sources = [
+ "crc_folding.c",
+ "fill_window_sse.c",
+ ]
if (!is_win || is_clang) {
- cflags = [ "-msse4.2", "-mpclmul" ]
+ cflags = [
+ "-msse4.2",
+ "-mpclmul",
+ ]
}
} else {
- sources = [ "simd_stub.c"]
+ sources = [
+ "simd_stub.c",
+ ]
}
configs -= [ "//build/config/compiler:chromium_code" ]
@@ -65,7 +73,9 @@
configs += [ "//build/config/compiler:no_chromium_code" ]
public_configs = [ ":zlib_config" ]
- deps = [ ":zlib_x86_simd" ]
+ deps = [
+ ":zlib_x86_simd",
+ ]
}
static_library("minizip") {
@@ -97,7 +107,9 @@
cflags = [ "-Wno-parentheses-equality" ]
}
- deps = [ ":zlib" ]
+ deps = [
+ ":zlib",
+ ]
configs -= [ "//build/config/compiler:chromium_code" ]
configs += [ "//build/config/compiler:no_chromium_code" ]
diff --git a/third_party/zlib/google.patch b/third_party/zlib/google.patch
index 9c3450d..3818b11 100644
--- a/third_party/zlib/google.patch
+++ b/third_party/zlib/google.patch
@@ -7,7 +7,7 @@
-#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0
+#if defined(_WIN32)
-+# define LSEEK _lseeki64
++# define LSEEK (z_off64_t)_lseeki64
+#elif defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0
# define LSEEK lseek64
#else
diff --git a/third_party/zlib/google/zip_reader.cc b/third_party/zlib/google/zip_reader.cc
index 339eb11..a1dddfb 100644
--- a/third_party/zlib/google/zip_reader.cc
+++ b/third_party/zlib/google/zip_reader.cc
@@ -364,8 +364,9 @@
// correct. However, we need to assume that the uncompressed size could be
// incorrect therefore this function needs to read as much data as possible.
std::string contents;
- contents.reserve(std::min<size_t>(
- max_read_bytes, current_entry_info()->original_size()));
+ contents.reserve(static_cast<size_t>(std::min(
+ static_cast<int64>(max_read_bytes),
+ current_entry_info()->original_size())));
bool success = true; // This becomes false when something bad happens.
char buf[internal::kZipBufSize];
diff --git a/third_party/zlib/gzlib.c b/third_party/zlib/gzlib.c
index feffbb1..54e8344 100644
--- a/third_party/zlib/gzlib.c
+++ b/third_party/zlib/gzlib.c
@@ -6,7 +6,7 @@
#include "gzguts.h"
#if defined(_WIN32) && !defined(__BORLANDC__)
-# define LSEEK _lseeki64
+# define LSEEK (z_off64_t)_lseeki64
#elif defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0
# define LSEEK lseek64
#else
diff --git a/tools/android/adb_remote_setup.sh b/tools/android/adb_remote_setup.sh
index 87c6601..2bb2c46 100755
--- a/tools/android/adb_remote_setup.sh
+++ b/tools/android/adb_remote_setup.sh
@@ -84,12 +84,16 @@
# 5037: adb
# 8001: http server
# 9031: sync server
+# 9041: search by image server
+# 9051: policy server
# 10000: net unittests
# 10201: net unittests
ssh -C \
-R 5037:localhost:5037 \
-L 8001:localhost:8001 \
-L 9031:localhost:9031 \
+ -L 9041:localhost:9041 \
+ -L 9051:localhost:9051 \
-R 10000:localhost:10000 \
-R 10201:localhost:10201 \
"$remote_host"
diff --git a/tools/clang/scripts/run_tool.py b/tools/clang/scripts/run_tool.py
index 3725ca3..58a9a86 100755
--- a/tools/clang/scripts/run_tool.py
+++ b/tools/clang/scripts/run_tool.py
@@ -314,14 +314,14 @@
clang_format_diff_path = None
if len(argv) == 3 and argv[2] == '--all':
- filenames = frozenset(_GetFilesFromCompileDB(argv[1]))
+ filenames = set(_GetFilesFromCompileDB(argv[1]))
else:
- filenames = frozenset(_GetFilesFromGit(argv[2:]))
- # Filter out files that aren't C/C++/Obj-C/Obj-C++.
- extensions = frozenset(('.c', '.cc', '.m', '.mm'))
- dispatcher = _CompilerDispatcher(argv[0], argv[1],
- [f for f in filenames
- if os.path.splitext(f)[1] in extensions])
+ filenames = set(_GetFilesFromGit(argv[2:]))
+ # Filter out files that aren't C/C++/Obj-C/Obj-C++.
+ extensions = frozenset(('.c', '.cc', '.m', '.mm'))
+ filenames = [f for f in filenames
+ if os.path.splitext(f)[1] in extensions]
+ dispatcher = _CompilerDispatcher(argv[0], argv[1], filenames)
dispatcher.Run()
# Filter out edits to files that aren't in the git repository, since it's not
# useful to modify files that aren't under source control--typically, these
diff --git a/tools/git/move_source_file.py b/tools/git/move_source_file.py
index a60c7e1..2de0b5b 100755
--- a/tools/git/move_source_file.py
+++ b/tools/git/move_source_file.py
@@ -33,7 +33,7 @@
sort_headers = __import__('sort-headers')
-HANDLED_EXTENSIONS = ['.cc', '.mm', '.h', '.hh']
+HANDLED_EXTENSIONS = ['.cc', '.mm', '.h', '.hh', '.cpp']
def IsHandledFile(path):
@@ -84,7 +84,7 @@
files_with_changed_includes = mffr.MultiFileFindReplace(
r'(#(include|import)\s*["<])%s([>"])' % re.escape(from_path),
r'\1%s\3' % to_path,
- ['*.cc', '*.h', '*.m', '*.mm'])
+ ['*.cc', '*.h', '*.m', '*.mm', '*.cpp'])
# Reorder headers in files that changed.
for changed_file in files_with_changed_includes:
@@ -100,7 +100,7 @@
mffr.MultiFileFindReplace(
r'(//.*)%s' % re.escape(from_path),
r'\1%s' % to_path,
- ['*.cc', '*.h', '*.m', '*.mm'])
+ ['*.cc', '*.h', '*.m', '*.mm', '*.cpp'])
# Update references in .gyp(i) files.
def PathMinusFirstComponent(path):
diff --git a/tools/idl_parser/idl_parser.py b/tools/idl_parser/idl_parser.py
index 9b63f94..16ecc6e 100755
--- a/tools/idl_parser/idl_parser.py
+++ b/tools/idl_parser/idl_parser.py
@@ -283,6 +283,12 @@
"""Dictionary : DICTIONARY error ';'"""
p[0] = self.BuildError(p, 'Dictionary')
+ # [11.2] Error recovery for regular Dictionary
+ # (for errors inside dictionary definition)
+ def p_DictionaryError2(self, p):
+ """Dictionary : DICTIONARY identifier Inheritance '{' error"""
+ p[0] = self.BuildError(p, 'Dictionary')
+
# [12]
def p_DictionaryMembers(self, p):
"""DictionaryMembers : ExtendedAttributeList DictionaryMember DictionaryMembers
@@ -590,6 +596,11 @@
if len(p) > 1:
p[0] = ListFromConcat(p[2], p[3])
+ # [54.1] Arguments error recovery
+ def p_ArgumentsError(self, p):
+ """Arguments : ',' error"""
+ p[0] = self.BuildError(p, 'Arguments')
+
# [55]
def p_Argument(self, p):
"""Argument : ExtendedAttributeList OptionalOrRequiredArgument"""
diff --git a/tools/idl_parser/test_parser/dictionary_web.idl b/tools/idl_parser/test_parser/dictionary_web.idl
index 5030686..ba5b164 100644
--- a/tools/idl_parser/test_parser/dictionary_web.idl
+++ b/tools/idl_parser/test_parser/dictionary_web.idl
@@ -92,4 +92,7 @@
DOMString? setString = null;
};
-
+/* ERROR Unexpected keyword "attribute" after "{". */
+dictionary MyDictUnexpectedAttribute {
+ attribute DOMString foo = "";
+};
diff --git a/tools/idl_parser/test_parser/interface_web.idl b/tools/idl_parser/test_parser/interface_web.idl
index 09a2902..2d19f89 100644
--- a/tools/idl_parser/test_parser/interface_web.idl
+++ b/tools/idl_parser/test_parser/interface_web.idl
@@ -50,6 +50,21 @@
partial interface MyIFaceInherit : Foo {};
/* TREE
+ *Interface(MyIFaceMissingArgument)
+ * Operation(foo)
+ * Arguments()
+ * Argument(arg)
+ * Type()
+ * PrimitiveType(DOMString)
+ * Error(Missing argument.)
+ * Type()
+ * PrimitiveType(void)
+ */
+interface MyIFaceMissingArgument {
+ void foo(DOMString arg, );
+};
+
+/* TREE
*Interface(MyIFaceBig)
* Const(setString)
* PrimitiveType(DOMString)
diff --git a/tools/lsan/suppressions.txt b/tools/lsan/suppressions.txt
index 493ebfc..41f8679 100644
--- a/tools/lsan/suppressions.txt
+++ b/tools/lsan/suppressions.txt
@@ -58,6 +58,7 @@
leak:blink::V8PerIsolateData::ensureDomInJSContext
leak:gin/object_template_builder.h
leak:gin::internal::Dispatcher
+leak:blink::LocalDOMWindow::getComputedStyle
# http://crbug.com/356785
leak:content::RenderViewImplTest_DecideNavigationPolicyForWebUI_Test::TestBody
diff --git a/tools/valgrind/browser_wrapper_win.py b/tools/valgrind/browser_wrapper_win.py
index ee0a961..0023ca7 100644
--- a/tools/valgrind/browser_wrapper_win.py
+++ b/tools/valgrind/browser_wrapper_win.py
@@ -26,7 +26,7 @@
# Usually, we pass "-logdir" "foo\bar\spam path" args to Dr. Memory.
# To group reports per UI test, we want to put the reports for each test into a
# separate directory. This code can be simplified when we have
-# http://code.google.com/p/drmemory/issues/detail?id=684 fixed.
+# https://github.com/DynamoRIO/drmemory/issues/684 fixed.
logdir_idx = cmd_to_run.index("-logdir")
old_logdir = cmd_to_run[logdir_idx + 1]
diff --git a/tools/valgrind/drmemory/suppressions.txt b/tools/valgrind/drmemory/suppressions.txt
index 96ae6fa..4310d8a 100644
--- a/tools/valgrind/drmemory/suppressions.txt
+++ b/tools/valgrind/drmemory/suppressions.txt
@@ -45,32 +45,32 @@
# private symbols so may need to be updated when we switch to auto-loading PDBs
UNADDRESSABLE ACCESS
-name=http://code.google.com/p/drmemory/issues/detail?id=12 UNADDR
+name=https://github.com/DynamoRIO/drmemory/issues/12 UNADDR
...
SHELL32.dll!SHFileOperation*
UNADDRESSABLE ACCESS
-name=http://code.google.com/p/drmemory/issues/detail?id=40 UNADDR
+name=https://github.com/DynamoRIO/drmemory/issues/40 UNADDR
...
WINSPOOL.DRV!*
INVALID HEAP ARGUMENT
-name=http://code.google.com/p/drmemory/issues/detail?id=40 INVALID HEAP
+name=https://github.com/DynamoRIO/drmemory/issues/40 INVALID HEAP
...
WINSPOOL.DRV!*
UNADDRESSABLE ACCESS
-name=http://code.google.com/p/drmemory/issues/detail?id=59
+name=https://github.com/DynamoRIO/drmemory/issues/59
...
*!SetEnvironmentVariable*
UNADDRESSABLE ACCESS
-name=http://code.google.com/p/drmemory/issues/detail?id=68 (UNADDR 1)
+name=https://github.com/DynamoRIO/drmemory/issues/68 (UNADDR 1)
...
MSWSOCK.dll!WSPStartup
UNADDRESSABLE ACCESS
-name=http://code.google.com/p/drmemory/issues/detail?id=68 (UNADDR 2)
+name=https://github.com/DynamoRIO/drmemory/issues/68 (UNADDR 2)
...
ntdll.dll!RtlValidateUnicodeString
@@ -132,7 +132,7 @@
base_unittests.exe!operator new[]
base_unittests.exe!base::ToolsSanityTest_MemoryLeak_Test::TestBody
-# "..." is needed due to http://code.google.com/p/drmemory/issues/detail?id=666
+# "..." is needed due to https://github.com/DynamoRIO/drmemory/issues/666
UNADDRESSABLE ACCESS
name=sanity test 02 (malloc/read left)
base_unittests.exe!*ReadValueOutOfArrayBoundsLeft
@@ -157,7 +157,7 @@
base_unittests.exe!*MakeSomeErrors
base_unittests.exe!base::ToolsSanityTest_AccessesToMallocMemory_Test::TestBody
-# "..." is needed due to http://code.google.com/p/drmemory/issues/detail?id=666
+# "..." is needed due to https://github.com/DynamoRIO/drmemory/issues/666
UNADDRESSABLE ACCESS
name=sanity test 06 (new/read left)
base_unittests.exe!*ReadValueOutOfArrayBoundsLeft
@@ -252,7 +252,7 @@
igdumd32.dll!*
UNADDRESSABLE ACCESS
-name=http://code.google.com/p/drmemory/issues/detail?id=582 bizarre cl-generated read-beyond-TOS
+name=https://github.com/DynamoRIO/drmemory/issues/582 bizarre cl-generated read-beyond-TOS
instruction=mov 0xfffffffc(%esp) -> %eax
chrome.dll!blink::RenderStyle::resetBorder*
@@ -271,7 +271,7 @@
*!sandbox::GetPathFromHandle
GDI USAGE ERROR
-name=http://code.google.com/p/drmemory/issues/detail?id=899 deleting bitmap which is probably safe
+name=https://github.com/DynamoRIO/drmemory/issues/899 deleting bitmap which is probably safe
system call NtGdiDeleteObjectApp
*!skia::`anonymous namespace'::Bitmap::~Bitmap
*!skia::`anonymous namespace'::Bitmap::`scalar deleting destructor'
@@ -325,7 +325,7 @@
name=http://crbug.com/119552 c
# optional gdi32.dll frame followed by user32.dll
# TODO(bruening): once have
-# http://code.google.com/p/drmemory/issues/detail?id=846
+# https://github.com/DynamoRIO/drmemory/issues/846
# I would do "gdi32.dll!...\nuser32.dll!*"
*32.dll!*
...
@@ -462,7 +462,7 @@
system call NtCreateSection
KERNELBASE.dll!CreateFileMappingW
base.dll!base::SharedMemory::Create
-base.dll!base::SharedMemory::CreateAndMapAnonymous
+base.dll!base::SharedMemory::CreateAnonymous
content.dll!content::ChildThread::AllocateSharedMemory
content.dll!content::ChildSharedBitmapManager::AllocateSharedBitmap
cc.dll!cc::ResourceProvider::CreateBitmap
@@ -525,7 +525,7 @@
*!blink::RenderBlock::layout
HANDLE LEAK
-name=https://code.google.com/p/drmemory/issues/detail?id=1545
+name=https://github.com/DynamoRIO/drmemory/issues/1545
system call NtGdiCreateCompatibleDC
GDI32.dll!CreateCompatibleDC
skia.dll!LogFontTypeface::onGetTableData
@@ -603,9 +603,9 @@
# This suppression is deliberately general, as bugs reported in
# v8 generated code are difficult to track down. Xref Dr. Memory issue
-# https://code.google.com/p/drmemory/issues/detail?id=1582
+# https://github.com/DynamoRIO/drmemory/issues/1582
UNADDRESSABLE ACCESS
-name=https://code.google.com/p/drmemory/issues/detail?id=1582
+name=https://github.com/DynamoRIO/drmemory/issues/1582
...
*!v8::internal::Invoke
*!v8::internal::Execution::Call
@@ -623,7 +623,11 @@
*!content::RenderViewHostImpl::CreateRenderView
UNADDRESSABLE ACCESS
-name=http://code.google.com/p/dynamorio/issues/detail?id=1443
+name=https://github.com/DynamoRIO/dynamorio/issues/1443
+dynamorio.dll!*
+
+UNINITIALIZED READ
+name=https://github.com/DynamoRIO/dynamorio/issues/1443 (another instance)
dynamorio.dll!*
UNADDRESSABLE ACCESS
diff --git a/tools/valgrind/drmemory/suppressions_full.txt b/tools/valgrind/drmemory/suppressions_full.txt
index ca3d29a..050e507 100644
--- a/tools/valgrind/drmemory/suppressions_full.txt
+++ b/tools/valgrind/drmemory/suppressions_full.txt
@@ -16,7 +16,7 @@
# TODO(timurrrr): check if these frames change when NT_SYMBOLS are present.
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=406
+name=https://github.com/DynamoRIO/drmemory/issues/406
ADVAPI32.dll!WmiOpenBlock
ADVAPI32.dll!WmiOpenBlock
@@ -28,7 +28,7 @@
# They deliberately use uninit local var in sqlite random generator.
# Random bytes may mess up the call stack between randomByte and
-# sqlite3_* frames (http://code.google.com/p/drmemory/issues/detail?id=1514)
+# sqlite3_* frames (https://github.com/DynamoRIO/drmemory/issues/1514)
# so we just look for randomByte.
UNINITIALIZED READ
name=sqlite3_randomness UNINIT
@@ -76,168 +76,168 @@
# Please note: the following suppressions were written in the abscense of
# private symbols so may need to be updated when we switch to auto-loading PDBs
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=12 (1)
+name=https://github.com/DynamoRIO/drmemory/issues/12 (1)
ntdll.dll!Rtl*
ntdll.dll!Rtl*
ntdll.dll!RtlFindActivationContextSectionString
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=12 (2)
+name=https://github.com/DynamoRIO/drmemory/issues/12 (2)
...
SHELL32.dll!SHFileOperation*
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=12 (3)
+name=https://github.com/DynamoRIO/drmemory/issues/12 (3)
...
SHELL32.dll!SHGetFolderPath*
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=12 (4)
+name=https://github.com/DynamoRIO/drmemory/issues/12 (4)
...
SHELL32.dll!SHGetFolderPath*
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=12 (5)
+name=https://github.com/DynamoRIO/drmemory/issues/12 (5)
...
SHELL32.dll!SHCreateDirectory*
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=12 (6)
+name=https://github.com/DynamoRIO/drmemory/issues/12 (6)
...
SHELL32.dll!ILLoadFromStream*
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=12 (7)
+name=https://github.com/DynamoRIO/drmemory/issues/12 (7)
...
SHELL32.dll!ILSaveToStream*
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=12 (8)
+name=https://github.com/DynamoRIO/drmemory/issues/12 (8)
...
SHELL32.dll!SHFileOperation*
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=12 (9)
+name=https://github.com/DynamoRIO/drmemory/issues/12 (9)
...
SHELL32.dll!SHGetItemFromDataObject
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=12 (10)
+name=https://github.com/DynamoRIO/drmemory/issues/12 (10)
...
SHELL32.dll!SHGetItemFromDataObject
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=12 (11)
+name=https://github.com/DynamoRIO/drmemory/issues/12 (11)
...
ole32.dll!*
SHELL32.dll!SHChangeNotifySuspendResume
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=14 (1)
+name=https://github.com/DynamoRIO/drmemory/issues/14 (1)
...
*!CreateProcess*
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=14 (2)
+name=https://github.com/DynamoRIO/drmemory/issues/14 (2)
...
*!CreateProcess*
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=14 (3)
+name=https://github.com/DynamoRIO/drmemory/issues/14 (3)
...
*!base::LaunchApp*
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=17 (1)
+name=https://github.com/DynamoRIO/drmemory/issues/17 (1)
...
*!CreateWindow*
POSSIBLE LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=17 (2)
+name=https://github.com/DynamoRIO/drmemory/issues/17 (2)
GDI32.dll!*
GDI32.dll!CreateFontIndirectExW
GDI32.dll!CreateFontIndirectW
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=17 (3)
+name=https://github.com/DynamoRIO/drmemory/issues/17 (3)
KERNELBASE.dll!LocalAlloc
...
USER32.dll!CreateWindow*
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=18 a
+name=https://github.com/DynamoRIO/drmemory/issues/18 a
...
*!CoInitialize*
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=18 b
+name=https://github.com/DynamoRIO/drmemory/issues/18 b
...
*!CoCreateInstance*
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=18 c
+name=https://github.com/DynamoRIO/drmemory/issues/18 c
...
*!CoUninitialize*
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=18 d
+name=https://github.com/DynamoRIO/drmemory/issues/18 d
...
UxTheme.dll!*
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=40 a
+name=https://github.com/DynamoRIO/drmemory/issues/40 a
...
WINSPOOL.DRV!*
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=40 b
+name=https://github.com/DynamoRIO/drmemory/issues/40 b
...
WINSPOOL.DRV!*
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=48 a
+name=https://github.com/DynamoRIO/drmemory/issues/48 a
system call NtContinue
...
*!*SetThreadName
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=48 b
+name=https://github.com/DynamoRIO/drmemory/issues/48 b
system call NtContinue
*!WTF::initializeCurrentThreadInternal
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=52 a
+name=https://github.com/DynamoRIO/drmemory/issues/52 a
...
DBGHELP.dll!SymInitialize
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=52 b
+name=https://github.com/DynamoRIO/drmemory/issues/52 b
...
DBGHELP.dll!SymEnumSourceFiles
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=52 c
+name=https://github.com/DynamoRIO/drmemory/issues/52 c
...
msvcrt.dll!_RTDynamicCast
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=52 bit-level fp in dbghelp
+name=https://github.com/DynamoRIO/drmemory/issues/52 bit-level fp in dbghelp
instruction=test 0x*(%*) $0x??
DBGHELP.dll!SymUnloadModule64
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=53
+name=https://github.com/DynamoRIO/drmemory/issues/53
ADVAPI32.dll!WmiMofEnumerateResourcesA
ADVAPI32.dll!WmiMofEnumerateResourcesA
ADVAPI32.dll!Sta*TraceW
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=58
+name=https://github.com/DynamoRIO/drmemory/issues/58
...
*!_cfltcvt_l
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=60
+name=https://github.com/DynamoRIO/drmemory/issues/60
USP10.dll!*
...
USP10.dll!ScriptStringAnalyse
@@ -250,65 +250,65 @@
USER32.dll!IMPSetIMEA
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=65 a
+name=https://github.com/DynamoRIO/drmemory/issues/65 a
...
*!SystemFunction036
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=65 b
+name=https://github.com/DynamoRIO/drmemory/issues/65 b
...
*!talk_base::CreateRandomString
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=68 a
+name=https://github.com/DynamoRIO/drmemory/issues/68 a
...
WS2_32.dll!*
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=68 b
+name=https://github.com/DynamoRIO/drmemory/issues/68 b
...
ADVAPI32.dll!SetSecurityDescriptorDacl
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=68 c
+name=https://github.com/DynamoRIO/drmemory/issues/68 c
...
MSWSOCK.dll!WSPStartup
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=68 d
+name=https://github.com/DynamoRIO/drmemory/issues/68 d
...
ntdll.dll!RtlValidateUnicodeString
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=256
+name=https://github.com/DynamoRIO/drmemory/issues/256
*!_mtinit
*!__tmainCRTStartup
*!mainCRTStartup
POSSIBLE LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=274 a
+name=https://github.com/DynamoRIO/drmemory/issues/274 a
...
GDI32.dll!CreateDCW
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=274 b
+name=https://github.com/DynamoRIO/drmemory/issues/274 b
...
GDI32.dll!CreateDCW
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=275
+name=https://github.com/DynamoRIO/drmemory/issues/275
...
*!_getptd*
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=276
+name=https://github.com/DynamoRIO/drmemory/issues/276
...
ntdll.dll!RtlConvertUlongToLargeInteger
ntdll.dll!RtlConvertUlongToLargeInteger
ntdll.dll!KiUserExceptionDispatcher
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=305
+name=https://github.com/DynamoRIO/drmemory/issues/305
*!free
*!free
*!operator new
@@ -316,57 +316,57 @@
*!MiniDumpWriteDump
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=346 a
+name=https://github.com/DynamoRIO/drmemory/issues/346 a
...
GDI32.dll!CloseEnhMetaFile
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=346 b
+name=https://github.com/DynamoRIO/drmemory/issues/346 b
GDI32.dll!SetPolyFillMode
GDI32.dll!CreateICW
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=362
+name=https://github.com/DynamoRIO/drmemory/issues/362
USER32.dll!UnregisterClass*
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=382
+name=https://github.com/DynamoRIO/drmemory/issues/382
...
ntdll.dll!CsrNewThread
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=397
+name=https://github.com/DynamoRIO/drmemory/issues/397
system call NtDeviceIoControlFile InputBuffer
ADVAPI32.dll!ImpersonateAnonymousToken
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=407 a
+name=https://github.com/DynamoRIO/drmemory/issues/407 a
system call NtRequestWaitReplyPort
RPCRT4.dll!I_RpcSendReceive
RPCRT4.dll!NdrSendReceive
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=407 b
+name=https://github.com/DynamoRIO/drmemory/issues/407 b
IMM32.dll!*
ntdll.dll!LdrInitializeThunk
ntdll.dll!LdrShutdownThread
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=412 a
+name=https://github.com/DynamoRIO/drmemory/issues/412 a
ADVAPI32.dll!RegDeleteValue*
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=412 b
+name=https://github.com/DynamoRIO/drmemory/issues/412 b
...
ADVAPI32.dll!Crypt*
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=412 c
+name=https://github.com/DynamoRIO/drmemory/issues/412 c
...
RPCRT4.dll!NdrClientCall2
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=412 d
+name=https://github.com/DynamoRIO/drmemory/issues/412 d
RSAENH.dll!DllUnregisterServer
...
ADVAPI32.dll!CryptAcquireContextA
@@ -375,17 +375,17 @@
CRYPT32.dll!CertFindCertificateInStore
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=412 e
+name=https://github.com/DynamoRIO/drmemory/issues/412 e
...
RSAENH.dll!CPGenRandom
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=412 f
+name=https://github.com/DynamoRIO/drmemory/issues/412 f
...
CRYPT??.dll!Crypt*
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=412 g
+name=https://github.com/DynamoRIO/drmemory/issues/412 g
*!replace_memcmp
...
*!testing::internal::CmpHelperEQ*
@@ -396,30 +396,30 @@
# have frame pointers, and we have trouble unwinding from it. Therefore, we use
# this broad suppression, effectively disabling uninit checks in rsaenh.dll.
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=412 h
+name=https://github.com/DynamoRIO/drmemory/issues/412 h
RSAENH.dll!*
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=425 a
+name=https://github.com/DynamoRIO/drmemory/issues/425 a
CLBCatQ.DLL!DestroyStgDatabase
CLBCatQ.DLL!PostError
CLBCatQ.DLL!PostError
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=425 b
+name=https://github.com/DynamoRIO/drmemory/issues/425 b
RPCRT4.dll!I_RpcBCacheFree
RPCRT4.dll!I_RpcBCacheFree
...
RPCRT4.dll!NdrClientCall2
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=425 c
+name=https://github.com/DynamoRIO/drmemory/issues/425 c
msdmo.dll!*
msdmo.dll!*
DEVENUM.DLL!*
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=435 a
+name=https://github.com/DynamoRIO/drmemory/issues/435 a
...
ntdll.dll!RtlSetSecurityObject
ntdll.dll!RtlNewSecurityObjectEx
@@ -427,7 +427,7 @@
NTMARTA.dll!AccRewriteSetNamedRights
POSSIBLE LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=435 b
+name=https://github.com/DynamoRIO/drmemory/issues/435 b
WLDAP32.dll!Ordinal325
...
WLDAP32.dll!Ordinal325
@@ -440,34 +440,34 @@
# mod+offs suppression because the symbolic makes no sense and changes
# completely in the presence of WS2_32.dll symbols.
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=438
+name=https://github.com/DynamoRIO/drmemory/issues/438
<WS2_32.dll+0x260c>
<WS2_32.dll+0x2b76>
<WS2_32.dll+0x2c61>
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=454 a
+name=https://github.com/DynamoRIO/drmemory/issues/454 a
...
WINMM.dll!wave*GetNumDevs
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=454 b
+name=https://github.com/DynamoRIO/drmemory/issues/454 b
...
WINMM.dll!wave*GetNumDevs
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=466
+name=https://github.com/DynamoRIO/drmemory/issues/466
ntdll.dll!RtlRunOnceBeginInitialize
ntdll.dll!RtlInitializeCriticalSectionAndSpinCount
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=473 a
+name=https://github.com/DynamoRIO/drmemory/issues/473 a
system call NtDeviceIoControlFile InputBuffer
...
iphlpapi.dll!GetAdaptersAddresses
POSSIBLE LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=473 b
+name=https://github.com/DynamoRIO/drmemory/issues/473 b
ESENT.dll!*
ESENT.dll!*
ESENT.dll!*
@@ -481,14 +481,14 @@
iphlpapi.dll!GetAdaptersAddresses
POSSIBLE LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=473 c
+name=https://github.com/DynamoRIO/drmemory/issues/473 c
RPCRT4.dll!*
RPCRT4.dll!*
...
IPHLPAPI.DLL!GetAdaptersAddresses
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=475
+name=https://github.com/DynamoRIO/drmemory/issues/475
...
ADVAPI32.dll!CryptAcquireContextA
...
@@ -499,105 +499,105 @@
# Lots of leaks from our interactions with the system certificate store. May be
# worth reviewing our use of their API.
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=476 a
+name=https://github.com/DynamoRIO/drmemory/issues/476 a
KERNEL*.dll!LocalAlloc
...
CRYPT32.dll!CertGetCRLContextProperty
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=476 b
+name=https://github.com/DynamoRIO/drmemory/issues/476 b
KERNEL*.dll!LocalAlloc
...
CRYPT32.dll!CertAddCRLContextToStore
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=476 c
+name=https://github.com/DynamoRIO/drmemory/issues/476 c
KERNEL*.dll!LocalAlloc
...
CRYPT32.dll!CertOpenStore
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=476 d
+name=https://github.com/DynamoRIO/drmemory/issues/476 d
...
CRYPT32.dll!CertOpenSystemStore?
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=476 e
+name=https://github.com/DynamoRIO/drmemory/issues/476 e
...
CRYPT32.dll!CertGetCertificateChain
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=476 f
+name=https://github.com/DynamoRIO/drmemory/issues/476 f
...
CRYPT32.dll!CertCompareIntegerBlob
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=476 g
+name=https://github.com/DynamoRIO/drmemory/issues/476 g
...
CRYPT32.dll!CryptUnprotectData
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=476 h
+name=https://github.com/DynamoRIO/drmemory/issues/476 h
KERNEL*.dll!LocalAlloc
...
CRYPT32.dll!CertEnumCertificatesInStore
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=476 i
+name=https://github.com/DynamoRIO/drmemory/issues/476 i
...
CRYPT32.dll!CryptProtectData
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=476 j
+name=https://github.com/DynamoRIO/drmemory/issues/476 j
...
CRYPT32.dll!CryptExportPublicKeyInfoEx
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=502 a
+name=https://github.com/DynamoRIO/drmemory/issues/502 a
system call NtSecureConnectPort parameter #3
GDI32.dll!*
GDI32.dll!*
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=502 b
+name=https://github.com/DynamoRIO/drmemory/issues/502 b
system call NtGdiEnumFonts parameter #6
GDI32.dll!*
GDI32.dll!*
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=511 a
+name=https://github.com/DynamoRIO/drmemory/issues/511 a
RPCRT4.dll!...
ole32.dll!*
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=511 b
+name=https://github.com/DynamoRIO/drmemory/issues/511 b
ole32.dll!*
ole32.dll!*
ole32.dll!StringFromGUID2
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=512 a
+name=https://github.com/DynamoRIO/drmemory/issues/512 a
...
*!browser_sync::Cryptographer::PackBootstrapToken
*!browser_sync::Cryptographer::GetBootstrapToken
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=512 b
+name=https://github.com/DynamoRIO/drmemory/issues/512 b
...
*!Encrypt*
# TODO(bruening): remove these once we have v8 bitfields handled
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=513 a
+name=https://github.com/DynamoRIO/drmemory/issues/513 a
*!v8*
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=513 b
+name=https://github.com/DynamoRIO/drmemory/issues/513 b
*!*
*!v8*
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=513 c
+name=https://github.com/DynamoRIO/drmemory/issues/513 c
<not in a module>
...
*!v8*
@@ -606,17 +606,17 @@
# has no symbols. These are all on the bots using component build, so we use
# v8.dll. TODO(bruening): remove these once we've fixed the symbol issue.
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=513 d
+name=https://github.com/DynamoRIO/drmemory/issues/513 d
v8.dll!*
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=513 e
+name=https://github.com/DynamoRIO/drmemory/issues/513 e
<not in a module>
...
v8.dll!*
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=546
+name=https://github.com/DynamoRIO/drmemory/issues/546
...
mscms.dll!*
...
@@ -631,13 +631,13 @@
*!views::TooltipManagerWin::TooltipManagerWin
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=567 a
+name=https://github.com/DynamoRIO/drmemory/issues/567 a
dbghelp.dll!*
...
dbghelp.dll!StackWalk64
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=567 b
+name=https://github.com/DynamoRIO/drmemory/issues/567 b
*!*
dbghelp.dll!*
...
@@ -647,7 +647,7 @@
# TppWorkerThread w/ syms. We used to use mod+offs here, but that was too
# brittle, so we switched to RPCRT4.dll!*.
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=569
+name=https://github.com/DynamoRIO/drmemory/issues/569
RPCRT4.dll!...
ntdll.dll!*
ntdll.dll!*
@@ -772,7 +772,7 @@
# False pos uninit in shell32 when resolving links.
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=745
+name=https://github.com/DynamoRIO/drmemory/issues/745
SHELL*.dll!*
...
SHELL*.dll!*
@@ -781,31 +781,31 @@
# Probable false pos uninit in ffmpeg. Probably due to running off the end of a
# buffer with SSE/MMX instructions whose results are then masked out later.
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=747 a
+name=https://github.com/DynamoRIO/drmemory/issues/747 a
*!ff_pred4x4_vertical_vp8_mmxext
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=747 b
+name=https://github.com/DynamoRIO/drmemory/issues/747 b
*!ff_pred4x4_down_left_mmxext
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=747 c
+name=https://github.com/DynamoRIO/drmemory/issues/747 c
*!ff_vorbis_floor1_render_list
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=747 d
+name=https://github.com/DynamoRIO/drmemory/issues/747 d
*!ff_put_vp8_epel8_h6_ssse3
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=747 e
+name=https://github.com/DynamoRIO/drmemory/issues/747 e
*!ff_put_vp8_epel8_h4_ssse3
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=747 f
+name=https://github.com/DynamoRIO/drmemory/issues/747 f
*!ff_fft_permute_sse
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=747 g
+name=https://github.com/DynamoRIO/drmemory/issues/747 g
*!ff_simple_idct_add_mmx
# ffmpeg seems to leak a pthread condition variable.
@@ -820,7 +820,7 @@
# Improperly handled ioctl in bcrypt.
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=748
+name=https://github.com/DynamoRIO/drmemory/issues/748
system call NtDeviceIoControlFile InputBuffer
...
bcrypt.dll!BCryptUnregisterConfigChangeNotify
@@ -829,7 +829,7 @@
# Not sure what this is.
POSSIBLE LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=749
+name=https://github.com/DynamoRIO/drmemory/issues/749
...
fwpuclnt.dll!*
...
@@ -849,37 +849,37 @@
# More uninit false pos in rpcrt4.dll not caught by default suppressions.
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=529
+name=https://github.com/DynamoRIO/drmemory/issues/529
RPCRT4.dll!*
...
*!base::LaunchProcess
# System leak from CreateEnvironmentBlock.
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=757
+name=https://github.com/DynamoRIO/drmemory/issues/757
...
USERENV.dll!CreateEnvironmentBlock
# Looks like another instance of 753
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=753
+name=https://github.com/DynamoRIO/drmemory/issues/753
...
ntdll.dll!RtlLoadString
# More bit manip fps
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=493
+name=https://github.com/DynamoRIO/drmemory/issues/493
USP10.dll!ScriptPositionSingleGlyph
# Various TLS leaks that we don't understand yet. We should be finding a root
# for these.
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=778 a
+name=https://github.com/DynamoRIO/drmemory/issues/778 a
KERNELBASE.dll!TlsSetValue
# Originally filed as: http://crbug.com/109281
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=778 b
+name=https://github.com/DynamoRIO/drmemory/issues/778 b
*!operator new
*!operator new[]
*!*::ConstructTlsVector
@@ -888,14 +888,14 @@
# This is an NSS PRThread object installed in TLS. Why isn't this detected as a
# root? See also http://crbug.com/32624
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=778 c
+name=https://github.com/DynamoRIO/drmemory/issues/778 c
*!PR_Calloc
*!_PR_AttachThread
*!_PRI_AttachThread
# Bit-level fps in rich edit layer.
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=791
+name=https://github.com/DynamoRIO/drmemory/issues/791
RICHED20.dll!*
RICHED20.dll!*
@@ -910,13 +910,13 @@
# Async NtReadFile false positives. This was fixed in drmemory r772, remove
# this supp when we pull that rev.
UNADDRESSABLE ACCESS
-name=http://code.google.com/p/drmemory/issues/detail?id=798
+name=https://github.com/DynamoRIO/drmemory/issues/798
system call NtReadFile parameter #5
KERNEL32.dll!ReadFile
# Probable syscall false positive.
UNADDRESSABLE ACCESS
-name=http://code.google.com/p/drmemory/issues/detail?id=809
+name=https://github.com/DynamoRIO/drmemory/issues/809
system call NtGdiPolyPolyDraw parameter #1
*!gfx::Path::CreateNativeRegion
@@ -925,39 +925,39 @@
# write precise suppressions. Until we have bit-level tracking (DRMi#113) we
# should keep this.
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=113 rpcrt4.dll wildcard
+name=https://github.com/DynamoRIO/drmemory/issues/113 rpcrt4.dll wildcard
RPCRT4.dll!*
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=841 a
+name=https://github.com/DynamoRIO/drmemory/issues/841 a
...
CRYPTNET.dll!I_CryptNetGetConnectivity
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=841 b
+name=https://github.com/DynamoRIO/drmemory/issues/841 b
...
webio.dll!*
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=841 c
+name=https://github.com/DynamoRIO/drmemory/issues/841 c
...
winhttp.dll!*
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=841 d
+name=https://github.com/DynamoRIO/drmemory/issues/841 d
...
CRYPTNET.dll!I_CryptNetGetConnectivity
# Often missing a ntdll.dll!KiUserCallbackDispatcher frame.
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=810
+name=https://github.com/DynamoRIO/drmemory/issues/810
instruction=test %edx %edx
USER32.dll!GetClassLongW
...
*!ui::CenterAndSizeWindow
UNINITIALIZED READ
-name=http://code.google.com/p/drmemory/issues/detail?id=815
+name=https://github.com/DynamoRIO/drmemory/issues/815
KERNEL*.dll!...
dxgi.dll!*
USER32.dll!GetMonitorInfoA
@@ -974,7 +974,7 @@
# Possible true system use after free.
UNADDRESSABLE ACCESS
-name=http://code.google.com/p/drmemory/issues/detail?id=623
+name=https://github.com/DynamoRIO/drmemory/issues/623
KERNELBASE.dll!TlsGetValue
OLEAUT32.dll!SysFreeString
OLEAUT32.dll!SysAllocStringByteLen
@@ -985,7 +985,7 @@
# basic_streambuf seems to leak something in creating a std::_Mutex
LEAK
-name=http://code.google.com/p/drmemory/issues/detail?id=857
+name=https://github.com/DynamoRIO/drmemory/issues/857
ntdll.dll!...
ntdll.dll!RtlInitializeCriticalSection
*!_Mtxinit
@@ -1631,7 +1631,7 @@
# There are so many osmesa errors we have to suppress (mostly the unpack_RGB*
# variety) that it's a performance hit. We avoid that by requesting
# whole-module suppression
-# (see https://code.google.com/p/drmemory/issues/detail?id=1529).
+# (see https://github.com/DynamoRIO/drmemory/issues/1529).
UNINITIALIZED READ
name=bug_347967_all_osmesa
osmesa.dll!*
@@ -1883,3 +1883,21 @@
*!TCompiler::compile
*!TypeTrackingTest::compile
*!TypeTrackingTest_StructConstructorResultNoPrecision_Test::TestBody
+
+UNADDRESSABLE ACCESS
+name=bug_436131
+*!ash::test::ShelfViewTestAPI::RunMessageLoopUntilAnimationsDone
+*!ash::test::ShelfViewTest_OverflowBubbleSize_Test::TestBody
+*!testing::internal::HandleExceptionsInMethodIfSupported<>
+
+UNADDRESSABLE ACCESS
+name=bug_436131_b
+views.dll!ObserverListBase<>::RemoveObserver
+*!ash::test::ShelfViewTestAPI::RunMessageLoopUntilAnimationsDone
+*!testing::internal::HandleExceptionsInMethodIfSupported<>
+
+UNADDRESSABLE ACCESS
+name=bug_436131_c
+*!ash::test::ShelfViewTestAPI::GetPreferredSize
+*!ash::test::ShelfViewTest_OverflowBubbleSize_Test::TestBody
+*!testing::internal::HandleExceptionsInMethodIfSupported<>
diff --git a/tools/valgrind/gtest_exclude/base_unittests.gtest.txt b/tools/valgrind/gtest_exclude/base_unittests.gtest.txt
index 74a4ac5..aa85c27 100644
--- a/tools/valgrind/gtest_exclude/base_unittests.gtest.txt
+++ b/tools/valgrind/gtest_exclude/base_unittests.gtest.txt
@@ -27,6 +27,3 @@
# Crashes under Valgrind, see http://crbug.com/355436
OutOfMemoryHandledTest.Unchecked*
-
-# Fail under Valgrind, see http://crbug.com/431702
-ProcMapsTest.ReadProcMaps
diff --git a/tools/valgrind/gtest_exclude/browser_tests.gtest-drmemory_win32.txt b/tools/valgrind/gtest_exclude/browser_tests.gtest-drmemory_win32.txt
index 2a23eee..425b359 100644
--- a/tools/valgrind/gtest_exclude/browser_tests.gtest-drmemory_win32.txt
+++ b/tools/valgrind/gtest_exclude/browser_tests.gtest-drmemory_win32.txt
@@ -1,6 +1,6 @@
# TODO(zhaoqin): File bugs for those failing browser tests.
-# Dr.Memory i#1052: http://code.google.com/p/drmemory/issues/detail?id=1052
+# Dr.Memory i#1052: https://github.com/DynamoRIO/drmemory/issues/1052
#
# The list is too long for gtest_filter, so we exclude the whole
# test case if any of its tests failed.
diff --git a/tools/valgrind/gtest_exclude/chromeos_unittests.gtest.txt b/tools/valgrind/gtest_exclude/chromeos_unittests.gtest.txt
new file mode 100644
index 0000000..ee21d7e
--- /dev/null
+++ b/tools/valgrind/gtest_exclude/chromeos_unittests.gtest.txt
@@ -0,0 +1,3 @@
+# crbug.com/437847
+AutoConnectHandlerTest.ReconnectOnCertPatternResolved
+NetworkConnectionHandlerTest.ConnectWithCertificateSuccess
diff --git a/tools/valgrind/gtest_exclude/content_browsertests.gtest-drmemory_win32.txt b/tools/valgrind/gtest_exclude/content_browsertests.gtest-drmemory_win32.txt
index cd8ecc4..569be95 100644
--- a/tools/valgrind/gtest_exclude/content_browsertests.gtest-drmemory_win32.txt
+++ b/tools/valgrind/gtest_exclude/content_browsertests.gtest-drmemory_win32.txt
@@ -1,7 +1,7 @@
# crbug.com/389132
WebRtcAecDumpBrowserTest.*WithAecDump*
-# http://code.google.com/p/drmemory/issues/detail?id=1528
+# https://github.com/DynamoRIO/drmemory/issues/1528
# Un-analyzed test failures:
DeviceInertialSensorBrowserTest.MotionNullTestWithAlert
DeviceInertialSensorBrowserTest.OrientationNullTestWithAlert
diff --git a/tools/valgrind/gtest_exclude/content_unittests.gtest.txt b/tools/valgrind/gtest_exclude/content_unittests.gtest.txt
index 03eb062..3376b22 100644
--- a/tools/valgrind/gtest_exclude/content_unittests.gtest.txt
+++ b/tools/valgrind/gtest_exclude/content_unittests.gtest.txt
@@ -10,6 +10,3 @@
# http://crbug.com/430391
WebDataConsumerHandleImplTest.*
-
-# http://crbug.com/435441
-PluginLoaderPosixTest.*
diff --git a/tools/valgrind/gtest_exclude/media_unittests.gtest-drmemory_win32.txt b/tools/valgrind/gtest_exclude/media_unittests.gtest-drmemory_win32.txt
index 3152445..8ee264d 100644
--- a/tools/valgrind/gtest_exclude/media_unittests.gtest-drmemory_win32.txt
+++ b/tools/valgrind/gtest_exclude/media_unittests.gtest-drmemory_win32.txt
@@ -1,4 +1,4 @@
# Hangs under Dr. Memory
-# http://code.google.com/p/drmemory/issues/detail?id=978
+# https://github.com/DynamoRIO/drmemory/issues/978
WinAudioTest.SyncSocketBasic
AudioBusTest.CopyTo
diff --git a/tools/valgrind/gtest_exclude/net_unittests.gtest-drmemory_win-xp.txt b/tools/valgrind/gtest_exclude/net_unittests.gtest-drmemory_win-xp.txt
index 46717dc..9d77b20 100644
--- a/tools/valgrind/gtest_exclude/net_unittests.gtest-drmemory_win-xp.txt
+++ b/tools/valgrind/gtest_exclude/net_unittests.gtest-drmemory_win-xp.txt
@@ -1,3 +1,3 @@
-# http://code.google.com/p/drmemory/issues/detail?id=842
+# https://github.com/DynamoRIO/drmemory/issues/842
# Failing and then crashing.
HttpNetworkTransationSpdy21Test.HttpsProxySpdy*
diff --git a/tools/valgrind/gtest_exclude/net_unittests.gtest-drmemory_win32.txt b/tools/valgrind/gtest_exclude/net_unittests.gtest-drmemory_win32.txt
index 465d258..2f7a211 100644
--- a/tools/valgrind/gtest_exclude/net_unittests.gtest-drmemory_win32.txt
+++ b/tools/valgrind/gtest_exclude/net_unittests.gtest-drmemory_win32.txt
@@ -5,7 +5,7 @@
URLRequestTestHTTP.GetTest_ManyCookies
# Dr. Memory hits an assertion:
-# http://code.google.com/p/drmemory/issues/detail?id=422
+# https://github.com/DynamoRIO/drmemory/issues/422
HttpAuthTest.*
HttpAuthHandlerFactoryTest.*
X509CertificateTest.*
diff --git a/tools/valgrind/gtest_exclude/unit_tests.gtest-drmemory_win-xp.txt b/tools/valgrind/gtest_exclude/unit_tests.gtest-drmemory_win-xp.txt
index 2ef9d50..18a4d45 100644
--- a/tools/valgrind/gtest_exclude/unit_tests.gtest-drmemory_win-xp.txt
+++ b/tools/valgrind/gtest_exclude/unit_tests.gtest-drmemory_win-xp.txt
@@ -1,7 +1,7 @@
# Crashing (!) since forever, needs analysis.
BookmarkNodeDataTest.*
-# http://code.google.com/p/drmemory/issues/detail?id=842
+# https://github.com/DynamoRIO/drmemory/issues/842
# Fails assertion. App data corrupted by DrMemory?
JsonSchemaTest.TestType
JsonSchemaTest.TestNumber
diff --git a/tools/valgrind/gtest_exclude/unit_tests.gtest-drmemory_win32.txt b/tools/valgrind/gtest_exclude/unit_tests.gtest-drmemory_win32.txt
index 7e28846..dc461a9 100644
--- a/tools/valgrind/gtest_exclude/unit_tests.gtest-drmemory_win32.txt
+++ b/tools/valgrind/gtest_exclude/unit_tests.gtest-drmemory_win32.txt
@@ -1,16 +1,16 @@
##################################################
# known Dr. Memory bugs:
-# http://code.google.com/p/drmemory/issues/detail?id=318
+# https://github.com/DynamoRIO/drmemory/issues/318
AudioRendererHostTest.*
##################################################
# un-analyzed Dr. Memory bugs:
-# http://code.google.com/p/drmemory/issues/detail?id=979
+# https://github.com/DynamoRIO/drmemory/issues/979
FirefoxProfileImporterTest.Firefox35Importer
-# http://code.google.com/p/drmemory/issues/detail?id=980
+# https://github.com/DynamoRIO/drmemory/issues/980
MetricsLogManagerTest.*
##################################################
@@ -60,7 +60,7 @@
SyncBackendHostTest.DownloadControlTypes
SyncBackendHostTest.SilentlyFailToDownloadControlTypes
-# DrM-i#1339: https://code.google.com/p/drmemory/issues/detail?id=1339
+# DrM-i#1339: https://github.com/DynamoRIO/drmemory/issues/1339
ExtensionServiceTest.InstallTheme
# http://crbug.com/302156
diff --git a/tools/valgrind/memcheck/suppressions.txt b/tools/valgrind/memcheck/suppressions.txt
index fa0f599..299cab2 100644
--- a/tools/valgrind/memcheck/suppressions.txt
+++ b/tools/valgrind/memcheck/suppressions.txt
@@ -3435,3 +3435,93 @@
fun:_ZN3gin21ObjectTemplateBuilder9SetMethodIMN4mojo2js13HandleWrapperEFSsvEEERS0_RKN4base16BasicStringPieceISsEERKT_
fun:_ZN4mojo2js13HandleWrapper24GetObjectTemplateBuilderEPN2v87IsolateE
}
+{
+ bug_436110
+ Memcheck:Param
+ socketcall.sendto(msg)
+ fun:send
+ fun:_ZN4mojo8embedder20PlatformChannelWriteENS0_14PlatformHandleEPKvm
+ fun:_ZN4mojo6system12_GLOBAL__N_115RawChannelPosix11WriteNoLockEPmS3_
+ fun:_ZN4mojo6system12_GLOBAL__N_115RawChannelPosix29OnFileCanWriteWithoutBlockingEi
+ fun:_ZThn112_N4mojo6system12_GLOBAL__N_115RawChannelPosix29OnFileCanWriteWithoutBlockingEi
+ fun:_ZN4base19MessagePumpLibevent21FileDescriptorWatcher29OnFileCanWriteWithoutBlockingEiPS0_
+ fun:_ZN4base19MessagePumpLibevent22OnLibeventNotificationEisPv
+ fun:event_process_active
+ fun:event_base_loop
+ fun:_ZN4base19MessagePumpLibevent3RunEPNS_11MessagePump8DelegateE
+ fun:_ZN4base11MessageLoop10RunHandlerEv
+}
+{
+ bug_436110_a
+ Memcheck:Param
+ socketcall.sendto(msg)
+ fun:send
+ fun:_ZN4mojo8embedder20PlatformChannelWriteENS0_14PlatformHandleEPKvm
+ fun:_ZN4mojo6system12_GLOBAL__N_115RawChannelPosix11WriteNoLockEPmS3_
+ fun:_ZN4mojo6system10RawChannel12WriteMessageE10scoped_ptrINS0_16MessageInTransitEN4base14DefaultDeleterIS3_EEE
+ fun:_ZN4mojo6system7Channel12WriteMessageE10scoped_ptrINS0_16MessageInTransitEN4base14DefaultDeleterIS3_EEE
+ fun:_ZN4mojo6system15ChannelEndpoint18WriteMessageNoLockE10scoped_ptrINS0_16MessageInTransitEN4base14DefaultDeleterIS3_EEE
+ fun:_ZN4mojo6system15ChannelEndpoint14EnqueueMessageE10scoped_ptrINS0_16MessageInTransitEN4base14DefaultDeleterIS3_EEE
+ fun:_ZN4mojo6system24ProxyMessagePipeEndpoint14EnqueueMessageE10scoped_ptrINS0_16MessageInTransitEN4base14DefaultDeleterIS3_EEE
+ fun:_ZN4mojo6system11MessagePipe14EnqueueMessageEj10scoped_ptrINS0_16MessageInTransitEN4base14DefaultDeleterIS3_EEEPSt6vectorINS0_19DispatcherTransportESaIS9_EE
+ fun:_ZN4mojo6system11MessagePipe12WriteMessageEjNS0_11UserPointerIKvEEjPSt6vectorINS0_19DispatcherTransportESaIS6_EEj
+ fun:_ZN4mojo6system21MessagePipeDispatcher22WriteMessageImplNoLockENS0_11UserPointerIKvEEjPSt6vectorINS0_19DispatcherTransportESaIS6_EEj
+ fun:_ZN4mojo6system10Dispatcher12WriteMessageENS0_11UserPointerIKvEEjPSt6vectorINS0_19DispatcherTransportESaIS6_EEj
+ fun:_ZN4mojo6system4Core12WriteMessageEjNS0_11UserPointerIKvEEjNS2_IKjEEjj
+ fun:MojoWriteMessage
+}
+{
+ bug_436110_b
+ Memcheck:Param
+ sendmsg(msg.msg_iov[0])
+ obj:/lib/x86_64-linux-gnu/libpthread-2.15.so
+ fun:_ZN4mojo8embedder33PlatformChannelSendmsgWithHandlesENS0_14PlatformHandleEP5iovecmPS1_m
+ ...
+ fun:MojoWriteMessage
+}
+{
+ bug_436172
+ Memcheck:Leak
+ fun:_Znw*
+ fun:_ZN3IPC11SyncChannelC1EPNS_8ListenerERK13scoped_refptrIN4base22SingleThreadTaskRunnerEEPNS4_13WaitableEventE
+ ...
+ fun:_ZN7content28BrowserGpuChannelHostFactory16EstablishRequest12FinishOnMainEv
+}
+{
+ bug_436172_b
+ Memcheck:Leak
+ fun:_Znw*
+ fun:_ZN3IPC7Channel6CreateERKNS_13ChannelHandleENS0_4ModeEPNS_8ListenerE
+ fun:_ZN3IPC12_GLOBAL__N_122PlatformChannelFactory12BuildChannelEPNS_8ListenerE
+ fun:_ZN3IPC12ChannelProxy7Context13CreateChannelE10scoped_ptrINS_14ChannelFactoryEN4base14DefaultDeleterIS3_EEE
+ ...
+ fun:_ZN7content28BrowserGpuChannelHostFactory16EstablishRequest12FinishOnMainEv
+}
+{
+ bug_436172_c
+ Memcheck:Leak
+ fun:_Znw*
+ fun:_ZN3IPC12ChannelProxy7ContextC1EPNS_8ListenerERK13scoped_refptrIN4base22SingleThreadTaskRunnerEE
+ fun:_ZN3IPC11SyncChannel11SyncContextC1EPNS_8ListenerERK13scoped_refptrIN4base22SingleThreadTaskRunnerEEPNS5_13WaitableEventE
+ fun:_ZN3IPC11SyncChannelC1EPNS_8ListenerERK13scoped_refptrIN4base22SingleThreadTaskRunnerEEPNS4_13WaitableEventE
+ fun:_ZN3IPC11SyncChannel6CreateEPNS_8ListenerERK13scoped_refptrIN4base22SingleThreadTaskRunnerEEPNS4_13WaitableEventE
+ ...
+ fun:_ZN7content28BrowserGpuChannelHostFactory16EstablishRequest12FinishOnMainEv
+}
+{
+ bug_436172_d
+ Memcheck:Leak
+ fun:_Znw*
+ fun:_ZN7content14GpuChannelHost7ConnectERKN3IPC13ChannelHandleEPN4base13WaitableEventE
+ fun:_ZN7content14GpuChannelHost6CreateEPNS_21GpuChannelHostFactoryERKN3gpu7GPUInfoERKN3IPC13ChannelHandleEPN4base13WaitableEventEPNS3_22GpuMemoryBufferManagerE
+ fun:_ZN7content28BrowserGpuChannelHostFactory21GpuChannelEstablishedEv
+ fun:_ZN7content28BrowserGpuChannelHostFactory16EstablishRequest12FinishOnMainEv
+}
+{
+ Expected_leak_due_to_gpu_thread_leaked_by_lazy_instance
+ Memcheck:Leak
+ fun:calloc
+ fun:pthread_setspecific
+ ...
+ fun:_ZN3gpu22InProcessCommandBuffer21InitializeOnGpuThreadERKNS0_27InitializeOnGpuThreadParamsE
+}
diff --git a/tools/valgrind/memcheck/suppressions_linux.txt b/tools/valgrind/memcheck/suppressions_linux.txt
index 6ce4607..dae3936 100644
--- a/tools/valgrind/memcheck/suppressions_linux.txt
+++ b/tools/valgrind/memcheck/suppressions_linux.txt
@@ -21,4 +21,34 @@
# in our own code, or stuff that is so trivial it's not worth fixing.
# 3. Suppressions for real chromium bugs that are not yet fixed.
-
+{
+ bug_436253
+ Memcheck:Overlap
+ fun:memcpy@@GLIBC_2.14
+ fun:_ZN7content14WebPreferencesaSERKS0_
+ fun:_ZN7content14RenderViewImpl22OnUpdateWebPreferencesERKNS_14WebPreferencesE
+ fun:_ZN7content14RenderViewImpl20SetWebkitPreferencesERKNS_14WebPreferencesE
+ fun:_ZThn784_N7content14RenderViewImpl20SetWebkitPreferencesERKNS_14WebPreferencesE
+ fun:_ZN7content16WebKitTestRunner5ResetEv
+}
+{
+ bug_436292
+ Memcheck:Param
+ sendmsg(msg.msg_iov[0])
+ ...
+ fun:MojoWriteMessage
+ fun:_ZN3IPC8internal13MessageReader4SendE10scoped_ptrINS_7MessageEN4base14DefaultDeleterIS3_EEE
+ fun:_ZN3IPC11ChannelMojo4SendEPNS_7MessageE
+ fun:_ZN7content20BrowserMessageFilter4SendEPN3IPC7MessageE
+ fun:_ZN7content17AudioRendererHost18DoCompleteCreationEi
+}
+{
+ bug_436292_b
+ Memcheck:Param
+ sendmsg(msg.msg_iov[0])
+ ...
+ fun:MojoWriteMessage
+ fun:_ZN3IPC8internal13MessageReader4SendE10scoped_ptrINS_7MessageEN4base14DefaultDeleterIS3_EEE
+ fun:_ZN3IPC11ChannelMojo17InitMessageReaderEN4mojo16ScopedHandleBaseINS1_17MessagePipeHandleEEEi
+ fun:_ZN3IPC12_GLOBAL__N_117ServerChannelMojo27ClientChannelWasInitializedEi
+}
diff --git a/tools/valgrind/memcheck/suppressions_mac.txt b/tools/valgrind/memcheck/suppressions_mac.txt
index 4ae5e47..dc9850b 100644
--- a/tools/valgrind/memcheck/suppressions_mac.txt
+++ b/tools/valgrind/memcheck/suppressions_mac.txt
@@ -242,3 +242,10 @@
fun:_ZN7content45PluginLoaderPosixTest_PluginLaunchFailed_TestC1Ev
fun:_ZN7testing8internal15TestFactoryImplIN7content45PluginLoaderPosixTest_PluginLaunchFailed_TestEE10CreateTestEv
}
+{
+ bug_437807
+ Memcheck:Leak
+ ...
+ fun:_ZN4base3mac30PathForFrameworkBundleResourceEPK10__CFString
+ fun:_ZN3gin13IsolateHolder14LoadV8SnapshotEv
+}
diff --git a/tools/valgrind/scan-build.py b/tools/valgrind/scan-build.py
index b58b6cc..b117d1e 100755
--- a/tools/valgrind/scan-build.py
+++ b/tools/valgrind/scan-build.py
@@ -5,6 +5,7 @@
import argparse
import errno
+import json
import os
import re
import sys
@@ -24,7 +25,7 @@
CACHE_DIR = "buildlogs.tmp"
# If we don't find anything after searching |CUTOFF| logs, we're probably done.
-CUTOFF = 100
+CUTOFF = 200
def EnsurePath(path):
"""Makes sure |path| does exist, tries to create it if it doesn't."""
@@ -191,6 +192,8 @@
commands = parser.add_mutually_exclusive_group(required=True)
commands.add_argument("--update", action='store_true')
commands.add_argument("--find", metavar='search term')
+ parser.add_argument("--json", action='store_true',
+ help="Output in JSON format")
args = parser.parse_args()
path = os.path.abspath(os.path.dirname(argv[0]))
@@ -205,22 +208,38 @@
builder.ScanLogs(lambda x:False)
if args.find:
+ result = []
tester = MultiLineChange(args.find.splitlines())
fyi.FetchInfo()
- print "SCANNING FOR ", args.find
+ if not args.json:
+ print "SCANNING FOR ", args.find
for builder in fyi.Builders():
- print "Scanning", builder.Name()
+ if not args.json:
+ print "Scanning", builder.Name()
occurrences = builder.ScanLogs(tester)
if occurrences:
min_build = min(occurrences)
path = builder.GetBuildPath(min_build)
- print "Earliest occurrence in build %d" % min_build
- print "Latest occurrence in build %d" % max(occurrences)
- print "Latest build: %d" % builder.LatestBuild()
- print path
- print "%d total" % len(occurrences)
-
+ if args.json:
+ data = {}
+ data['builder'] = builder.Name()
+ data['first_affected'] = min_build
+ data['last_affected'] = max(occurrences)
+ data['last_build'] = builder.LatestBuild()
+ data['frequency'] = ((int(builder.LatestBuild()) - int(min_build)) /
+ len(occurrences))
+ data['total'] = len(occurrences)
+ data['first_url'] = path
+ result.append(data)
+ else:
+ print "Earliest occurrence in build %d" % min_build
+ print "Latest occurrence in build %d" % max(occurrences)
+ print "Latest build: %d" % builder.LatestBuild()
+ print path
+ print "%d total" % len(occurrences)
+ if args.json:
+ json.dump(result, sys.stdout, indent=2, sort_keys=True)
if __name__ == "__main__":
sys.exit(main(sys.argv))
diff --git a/tools/valgrind/valgrind_test.py b/tools/valgrind/valgrind_test.py
index f568b5e..24fa32a 100644
--- a/tools/valgrind/valgrind_test.py
+++ b/tools/valgrind/valgrind_test.py
@@ -833,11 +833,11 @@
def ToolCommand(self):
"""Get the tool command to run."""
# WINHEAP is what Dr. Memory supports as there are issues w/ both
- # jemalloc (http://code.google.com/p/drmemory/issues/detail?id=320) and
- # tcmalloc (http://code.google.com/p/drmemory/issues/detail?id=314)
+ # jemalloc (https://github.com/DynamoRIO/drmemory/issues/320) and
+ # tcmalloc (https://github.com/DynamoRIO/drmemory/issues/314)
add_env = {
"CHROME_ALLOCATOR" : "WINHEAP",
- "JSIMD_FORCEMMX" : "1", # http://code.google.com/p/drmemory/issues/detail?id=540
+ "JSIMD_FORCEMMX" : "1", # https://github.com/DynamoRIO/drmemory/issues/540
}
for k,v in add_env.iteritems():
logging.info("export %s=%s", k, v)
@@ -855,7 +855,7 @@
# With file-based config we must update the file every time, and
# it will affect simultaneous drmem uses by this user. While file-based
# config has many advantages, here we may want this-instance-only
- # (http://code.google.com/p/drmemory/issues/detail?id=334).
+ # (https://github.com/DynamoRIO/drmemory/issues/334).
drconfig_cmd = [ proc[0].replace("drmemory.exe", "drconfig.exe") ]
drconfig_cmd += ["-quiet"] # suppress errors about no 64-bit libs
run_drconfig = True
@@ -990,7 +990,7 @@
# Use one analyzer for all the log files to avoid printing duplicate reports
#
# TODO(timurrrr): unify this with Valgrind and other tools when we have
- # http://code.google.com/p/drmemory/issues/detail?id=684
+ # https://github.com/DynamoRIO/drmemory/issues/684
analyzer = drmemory_analyze.DrMemoryAnalyzer()
ret = 0
diff --git a/ui/compositor/compositor.cc b/ui/compositor/compositor.cc
index e0b125a..58297e6 100644
--- a/ui/compositor/compositor.cc
+++ b/ui/compositor/compositor.cc
@@ -254,7 +254,7 @@
// TODO(nduca): Temporary while compositor calls
// compositeImmediately() directly.
cc::BeginFrameArgs args = cc::BeginFrameArgs::Create(
- gfx::FrameTime::Now(), base::TimeTicks(),
+ BEGINFRAME_FROM_HERE, gfx::FrameTime::Now(), base::TimeTicks(),
cc::BeginFrameArgs::DefaultInterval(), cc::BeginFrameArgs::SYNCHRONOUS);
BeginMainFrame(args);
host_->Composite(args.frame_time);
diff --git a/ui/compositor/layer.cc b/ui/compositor/layer.cc
index ea30852..2d7b5b3 100644
--- a/ui/compositor/layer.cc
+++ b/ui/compositor/layer.cc
@@ -724,6 +724,13 @@
delegate_->OnPaintLayer(canvas.get());
}
+scoped_refptr<cc::DisplayItemList> Layer::PaintContentsToDisplayList(
+ const gfx::Rect& clip,
+ ContentLayerClient::GraphicsContextStatus gc_status) {
+ NOTIMPLEMENTED();
+ return cc::DisplayItemList::Create();
+}
+
bool Layer::FillsBoundsCompletely() const { return fills_bounds_completely_; }
bool Layer::PrepareTextureMailbox(
diff --git a/ui/compositor/layer.h b/ui/compositor/layer.h
index eb4628d..0aa9e0b 100644
--- a/ui/compositor/layer.h
+++ b/ui/compositor/layer.h
@@ -333,6 +333,9 @@
SkCanvas* canvas,
const gfx::Rect& clip,
ContentLayerClient::GraphicsContextStatus gc_status) override;
+ scoped_refptr<cc::DisplayItemList> PaintContentsToDisplayList(
+ const gfx::Rect& clip,
+ GraphicsContextStatus gc_status) override;
bool FillsBoundsCompletely() const override;
cc::Layer* cc_layer() { return cc_layer_; }
diff --git a/ui/gl/BUILD.gn b/ui/gl/BUILD.gn
index 6968f2c..55218bc 100644
--- a/ui/gl/BUILD.gn
+++ b/ui/gl/BUILD.gn
@@ -179,9 +179,7 @@
"//build/config/linux:xext",
]
- deps += [
- "//ui/gfx/x",
- ]
+ deps += [ "//ui/gfx/x" ]
}
if (is_win) {
sources += [
@@ -232,9 +230,7 @@
libs = [ "android" ]
- deps += [
- ":gl_jni_headers",
- ]
+ deps += [ ":gl_jni_headers" ]
}
if (use_ozone) {
sources += [
@@ -300,10 +296,9 @@
]
args = [
- "--header-paths=" +
- rebase_path("//third_party/khronos", root_build_dir) + ":" +
- rebase_path("//third_party/mesa/src/include", root_build_dir) + ":" +
- rebase_path("//ui/gl", root_build_dir) + ":" +
+ "--header-paths=" + rebase_path("//third_party/khronos", root_build_dir) +
+ ":" + rebase_path("//third_party/mesa/src/include", root_build_dir) +
+ ":" + rebase_path("//ui/gl", root_build_dir) + ":" +
rebase_path("//gpu", root_build_dir),
rebase_path(gl_binding_output_dir, root_build_dir),
]
@@ -339,7 +334,9 @@
}
generate_jni("gl_jni_headers") {
- deps = [ ":surface_jni_headers" ]
+ deps = [
+ ":surface_jni_headers",
+ ]
sources = [
"../android/java/src/org/chromium/ui/gl/SurfaceTextureListener.java",
"../android/java/src/org/chromium/ui/gl/SurfaceTexturePlatformWrapper.java",
diff --git a/ui/gl/gl_bindings.h b/ui/gl/gl_bindings.h
index 595a31f..0d25bbe 100644
--- a/ui/gl/gl_bindings.h
+++ b/ui/gl/gl_bindings.h
@@ -272,6 +272,14 @@
#define GL_CONTEXT_LOST_KHR 0x0507
#endif /* GL_KHR_robustness */
+#ifndef GL_EXT_texture_rg
+#define GL_EXT_texture_rg 1
+#define GL_RED_EXT 0x1903
+#define GL_RG_EXT 0x8227
+#define GL_R8_EXT 0x8229
+#define GL_RG8_EXT 0x822B
+#endif /* GL_EXT_texture_rg */
+
#define GL_GLEXT_PROTOTYPES 1
#if defined(OS_WIN)
diff --git a/ui/gl/gl_context.cc b/ui/gl/gl_context.cc
index 533b7d3..e358069 100644
--- a/ui/gl/gl_context.cc
+++ b/ui/gl/gl_context.cc
@@ -82,6 +82,10 @@
void GLContext::SetSafeToForceGpuSwitch() {
}
+bool GLContext::ForceGpuSwitchIfNeeded() {
+ return true;
+}
+
void GLContext::SetUnbindFboOnMakeCurrent() {
NOTIMPLEMENTED();
}
@@ -199,6 +203,8 @@
bool GLContext::MakeVirtuallyCurrent(
GLContext* virtual_context, GLSurface* surface) {
DCHECK(virtual_gl_api_);
+ if (!ForceGpuSwitchIfNeeded())
+ return false;
return virtual_gl_api_->MakeCurrent(virtual_context, surface);
}
diff --git a/ui/gl/gl_context.h b/ui/gl/gl_context.h
index 372f513..cdebd68 100644
--- a/ui/gl/gl_context.h
+++ b/ui/gl/gl_context.h
@@ -90,6 +90,10 @@
// transitioning can cause corruption and hangs (OS X only).
virtual void SetSafeToForceGpuSwitch();
+ // Attempt to force the context to move to the GPU of its sharegroup. Return
+ // false only in the event of an unexpected error on the context.
+ virtual bool ForceGpuSwitchIfNeeded();
+
// Indicate that the real context switches should unbind the FBO first
// (For an Android work-around only).
virtual void SetUnbindFboOnMakeCurrent();
diff --git a/ui/gl/gl_context_cgl.cc b/ui/gl/gl_context_cgl.cc
index 10f854a..277780a 100644
--- a/ui/gl/gl_context_cgl.cc
+++ b/ui/gl/gl_context_cgl.cc
@@ -136,7 +136,7 @@
}
}
-bool GLContextCGL::MakeCurrent(GLSurface* surface) {
+bool GLContextCGL::ForceGpuSwitchIfNeeded() {
DCHECK(context_);
// The call to CGLSetVirtualScreen can hang on some AMD drivers
@@ -174,6 +174,14 @@
renderer_id_ = renderer_id;
}
}
+ return true;
+}
+
+bool GLContextCGL::MakeCurrent(GLSurface* surface) {
+ DCHECK(context_);
+
+ if (!ForceGpuSwitchIfNeeded())
+ return false;
if (IsCurrent(surface))
return true;
diff --git a/ui/gl/gl_context_cgl.h b/ui/gl/gl_context_cgl.h
index beeb9f9..456ea08 100644
--- a/ui/gl/gl_context_cgl.h
+++ b/ui/gl/gl_context_cgl.h
@@ -29,6 +29,7 @@
void SetSwapInterval(int interval) override;
bool GetTotalGpuMemory(size_t* bytes) override;
void SetSafeToForceGpuSwitch() override;
+ bool ForceGpuSwitchIfNeeded() override;
protected:
~GLContextCGL() override;
diff --git a/url/BUILD.gn b/url/BUILD.gn
index ec15c43..feece8d 100644
--- a/url/BUILD.gn
+++ b/url/BUILD.gn
@@ -117,6 +117,7 @@
deps = [
":url",
+ "//base",
"//base/test:run_all_unittests",
"//testing/gtest",
"//third_party/icu:icuuc",
diff --git a/url/gurl.cc b/url/gurl.cc
index b7374b1..b580125 100644
--- a/url/gurl.cc
+++ b/url/gurl.cc
@@ -322,8 +322,10 @@
}
GURL GURL::GetAsReferrer() const {
- if (!is_valid_ ||
- (!has_ref() && !has_username() && !has_password()))
+ if (!is_valid_ || !SchemeIsHTTPOrHTTPS())
+ return GURL();
+
+ if (!has_ref() && !has_username() && !has_password())
return GURL(*this);
url::Replacements<char> replacements;
diff --git a/url/gurl.h b/url/gurl.h
index 1d388cd..f370934 100644
--- a/url/gurl.h
+++ b/url/gurl.h
@@ -198,7 +198,8 @@
// A helper function to return a GURL stripped from the elements that are not
// supposed to be sent as HTTP referrer: username, password and ref fragment.
- // For invalid URLs the original URL will be returned.
+ // For invalid URLs or URLs that no valid referrers, an empty URL will be
+ // returned.
GURL GetAsReferrer() const;
// Returns true if the scheme for the current URL is a known "standard"
diff --git a/url/gurl_unittest.cc b/url/gurl_unittest.cc
index 3e94550..a699189 100644
--- a/url/gurl_unittest.cc
+++ b/url/gurl_unittest.cc
@@ -343,6 +343,10 @@
{"http://:pass@www.google.com", "http://www.google.com/"},
{"http://:@www.google.com", "http://www.google.com/"},
{"http://www.google.com/temp/foo?q#b", "http://www.google.com/temp/foo?q"},
+ {"not a url", ""},
+ {"unknown-scheme://foo.html", ""},
+ {"file:///tmp/test.html", ""},
+ {"https://www.google.com", "https://www.google.com/"},
};
for (size_t i = 0; i < arraysize(cases); i++) {
GURL url(cases[i].input);
diff --git a/url/origin.cc b/url/origin.cc
index eb2cf14..8aaa173 100644
--- a/url/origin.cc
+++ b/url/origin.cc
@@ -13,7 +13,7 @@
Origin::Origin(const std::string& origin) : string_(origin) {
DCHECK(origin == "null" || MatchPattern(origin, "?*://?*"));
DCHECK_GT(origin.size(), 0u);
- DCHECK_NE(origin[origin.size() - 1], '/');
+ DCHECK(origin == "file://" || origin[origin.size() - 1] != '/');
}
} // namespace url
diff --git a/url/origin_unittest.cc b/url/origin_unittest.cc
index d08342e..c094ee6 100644
--- a/url/origin_unittest.cc
+++ b/url/origin_unittest.cc
@@ -26,6 +26,11 @@
EXPECT_EQ("http://example.com:8080", origin.string());
}
+TEST(OriginTest, constructValidFileOrigin) {
+ Origin origin("file://");
+ EXPECT_EQ("file://", origin.string());
+}
+
TEST(OriginTest, constructValidOriginWithoutPort) {
Origin origin("wss://example2.com");
EXPECT_EQ("wss://example2.com", origin.string());
diff --git a/url/url_constants.cc b/url/url_constants.cc
index 9ef0e63..2dc1478 100644
--- a/url/url_constants.cc
+++ b/url/url_constants.cc
@@ -10,6 +10,7 @@
const char kAboutScheme[] = "about";
const char kBlobScheme[] = "blob";
+const char kContentScheme[] = "content";
const char kDataScheme[] = "data";
const char kFileScheme[] = "file";
const char kFileSystemScheme[] = "filesystem";
diff --git a/url/url_constants.h b/url/url_constants.h
index 3228bbb..c48dafc 100644
--- a/url/url_constants.h
+++ b/url/url_constants.h
@@ -13,6 +13,8 @@
URL_EXPORT extern const char kAboutScheme[];
URL_EXPORT extern const char kBlobScheme[];
+// The content scheme is specific to Android for identifying a stored file.
+URL_EXPORT extern const char kContentScheme[];
URL_EXPORT extern const char kDataScheme[];
URL_EXPORT extern const char kFileScheme[];
URL_EXPORT extern const char kFileSystemScheme[];