Update from https://crrev.com/311076

Includes updating DCHECK_IS_ON to a function-style macro and removing
various dead skia-overriding code from Sky.

Review URL: https://codereview.chromium.org/851503003
diff --git a/gin/BUILD.gn b/gin/BUILD.gn
index b352c3a..d389b84 100644
--- a/gin/BUILD.gn
+++ b/gin/BUILD.gn
@@ -2,6 +2,8 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//build/module_args/v8.gni")
+
 component("gin") {
   sources = [
     "arguments.cc",
@@ -68,6 +70,40 @@
   deps = [
     "//base/third_party/dynamic_annotations",
   ]
+  if (v8_use_external_startup_data && is_win) {
+    deps += [
+      ":gin_v8_snapshot_fingerprint",
+      "//crypto:crypto",
+    ]
+    sources += [ "$target_gen_dir/v8_snapshot_fingerprint.cc" ]
+    defines += [ "V8_VERIFY_EXTERNAL_STARTUP_DATA" ]
+  }
+}
+
+if (v8_use_external_startup_data) {
+  action("gin_v8_snapshot_fingerprint") {
+    script = "//gin/fingerprint/fingerprint_v8_snapshot.py"
+
+    snapshot_file = "$root_build_dir/snapshot_blob.bin"
+    natives_file = "$root_build_dir/natives_blob.bin"
+    output_file = "$target_gen_dir/v8_snapshot_fingerprint.cc"
+
+    args = [
+      "--snapshot_file",
+      rebase_path(snapshot_file, root_build_dir),
+      "--natives_file",
+      rebase_path(natives_file, root_build_dir),
+      "--output_file",
+      rebase_path(output_file, root_build_dir),
+    ]
+    inputs = [
+      snapshot_file,
+      natives_file,
+    ]
+    outputs = [
+      output_file,
+    ]
+  }
 }
 
 executable("gin_shell") {
diff --git a/gin/DEPS b/gin/DEPS
index 4e3f30a..d4cc2ba 100644
--- a/gin/DEPS
+++ b/gin/DEPS
@@ -1,4 +1,5 @@
 include_rules = [
   "+base",
+  "+crypto",
   "+v8",
 ]
diff --git a/gin/fingerprint/fingerprint_v8_snapshot.gypi b/gin/fingerprint/fingerprint_v8_snapshot.gypi
new file mode 100644
index 0000000..ede0de3
--- /dev/null
+++ b/gin/fingerprint/fingerprint_v8_snapshot.gypi
@@ -0,0 +1,47 @@
+# Copyright 2015 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.
+
+# This file is meant to be included into a target to provide a rule that
+# fingerprints the v8 snapshot and generates a .cc file which includes this
+# fingerprint.
+#
+# To use this, create a gyp target with the following form:
+#  {
+#    'target_name': 'gin_v8_snapshot_fingerprint',
+#    'type': 'none',
+#    'variables': {
+#      'snapshot_file': 'snapshot blob file to be fingerprinted',
+#      'natives_file': 'natives blob file to be fingerprinted',
+#      'output_file': 'output .cc file to generate with fingerprints',
+#    },
+#    'includes': [ '../gin/fingerprint/fingerprint_v8_snapshot.gypi' ],
+#  },
+#
+
+{
+  'conditions': [
+    ['v8_use_external_startup_data==1', {
+      'actions': [
+        {
+          'action_name': 'Generate V8 snapshot fingerprint',
+          'message': 'Generating V8 snapshot fingerprint',
+          'inputs': [
+            '<(DEPTH)/gin/fingerprint/fingerprint_v8_snapshot.py',
+            '<(snapshot_file)',
+            '<(natives_file)',
+          ],
+          'outputs': [
+            '<(output_file)',
+          ],
+          'action': [
+            'python', '<(DEPTH)/gin/fingerprint/fingerprint_v8_snapshot.py',
+            '--snapshot_file=<(snapshot_file)',
+            '--natives_file=<(natives_file)',
+            '--output_file=<(output_file)',
+          ],
+        }
+      ],
+    }],
+  ],
+}
\ No newline at end of file
diff --git a/gin/fingerprint/fingerprint_v8_snapshot.py b/gin/fingerprint/fingerprint_v8_snapshot.py
new file mode 100755
index 0000000..d1f7092
--- /dev/null
+++ b/gin/fingerprint/fingerprint_v8_snapshot.py
@@ -0,0 +1,86 @@
+#!/usr/bin/env python
+#
+# Copyright 2015 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.
+
+"""Fingerprints the V8 snapshot blob files.
+
+Constructs a SHA256 fingerprint of the V8 natives and snapshot blob files and
+creates a .cc file which includes these fingerprint as variables.
+"""
+
+import hashlib
+import optparse
+import os
+import sys
+
+_HEADER = """// Copyright 2015 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.
+
+// This file was generated by fingerprint_v8_snapshot.py.
+
+namespace gin {
+"""
+
+_FOOTER = """
+}  // namespace gin
+"""
+
+
+def FingerprintFile(file_path):
+  input_file = open(file_path, 'rb')
+  sha256 = hashlib.sha256()
+  while True:
+    block = input_file.read(sha256.block_size)
+    if not block:
+      break
+    sha256.update(block)
+  return sha256.digest()
+
+
+def WriteFingerprint(output_file, variable_name, fingerprint):
+  output_file.write('\nextern const unsigned char %s[] = { ' % variable_name)
+  for byte in fingerprint:
+    output_file.write(str(ord(byte)) + ', ')
+  output_file.write('};\n')
+
+
+def WriteOutputFile(natives_fingerprint,
+                    snapshot_fingerprint,
+                    output_file_path):
+  output_dir_path = os.path.dirname(output_file_path)
+  if not os.path.exists(output_dir_path):
+    os.makedirs(output_dir_path)
+  output_file = open(output_file_path, 'w')
+
+  output_file.write(_HEADER)
+  WriteFingerprint(output_file, 'g_natives_fingerprint', natives_fingerprint)
+  output_file.write('\n')
+  WriteFingerprint(output_file, 'g_snapshot_fingerprint', snapshot_fingerprint)
+  output_file.write(_FOOTER)
+
+
+def main():
+  parser = optparse.OptionParser()
+
+  parser.add_option('--snapshot_file',
+                    help='The input V8 snapshot blob file path.')
+  parser.add_option('--natives_file',
+                    help='The input V8 natives blob file path.')
+  parser.add_option('--output_file',
+                    help='The path for the output cc file which will be write.')
+
+  options, _ = parser.parse_args()
+
+  natives_fingerprint = FingerprintFile(options.natives_file)
+  snapshot_fingerprint = FingerprintFile(options.snapshot_file)
+  WriteOutputFile(
+      natives_fingerprint, snapshot_fingerprint, options.output_file)
+
+  return 0
+
+
+if __name__ == '__main__':
+  sys.exit(main())
diff --git a/gin/gin.gyp b/gin/gin.gyp
index b38dc85..096c120 100644
--- a/gin/gin.gyp
+++ b/gin/gin.gyp
@@ -5,6 +5,7 @@
 {
   'variables': {
     'chromium_code': 1,
+    'gin_gen_path': '<(SHARED_INTERMEDIATE_DIR)/gin/',
   },
   'targets': [
     {
@@ -14,7 +15,6 @@
         '../base/base.gyp:base',
         '../base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations',
         '../v8/tools/gyp/v8.gyp:v8',
-
       ],
       'export_dependent_settings': [
         '../base/base.gyp:base',
@@ -78,6 +78,30 @@
         'wrappable.h',
         'wrapper_info.cc',
       ],
+      'conditions': [
+        ['v8_use_external_startup_data==1 and OS=="win"', {
+          'dependencies': [
+            'gin_v8_snapshot_fingerprint',
+            '../crypto/crypto.gyp:crypto',
+          ],
+          'sources': [
+            '<(gin_gen_path)/v8_snapshot_fingerprint.cc',
+          ],
+          'defines': [
+            'V8_VERIFY_EXTERNAL_STARTUP_DATA',
+          ]
+        }],
+      ],
+    },
+    {
+      'target_name': 'gin_v8_snapshot_fingerprint',
+      'type': 'none',
+      'variables': {
+        'snapshot_file': '<(PRODUCT_DIR)/snapshot_blob.bin',
+        'natives_file': '<(PRODUCT_DIR)/natives_blob.bin',
+        'output_file': '<(gin_gen_path)/v8_snapshot_fingerprint.cc',
+      },
+      'includes': [ '../gin/fingerprint/fingerprint_v8_snapshot.gypi' ],
     },
     {
       'target_name': 'gin_shell',
diff --git a/gin/isolate_holder.cc b/gin/isolate_holder.cc
index 2b6d64b..c666e29 100644
--- a/gin/isolate_holder.cc
+++ b/gin/isolate_holder.cc
@@ -11,7 +11,9 @@
 #include "base/logging.h"
 #include "base/message_loop/message_loop.h"
 #include "base/rand_util.h"
+#include "base/strings/sys_string_conversions.h"
 #include "base/sys_info.h"
+#include "crypto/sha2.h"
 #include "gin/array_buffer.h"
 #include "gin/debug_impl.h"
 #include "gin/function_template.h"
@@ -19,8 +21,8 @@
 #include "gin/public/v8_platform.h"
 #include "gin/run_microtasks_observer.h"
 
-#ifdef V8_USE_EXTERNAL_STARTUP_DATA
-#ifdef OS_MACOSX
+#if defined(V8_USE_EXTERNAL_STARTUP_DATA)
+#if defined(OS_MACOSX)
 #include "base/mac/foundation_util.h"
 #endif  // OS_MACOSX
 #include "base/path_service.h"
@@ -40,16 +42,29 @@
 base::MemoryMappedFile* g_mapped_natives = NULL;
 base::MemoryMappedFile* g_mapped_snapshot = NULL;
 
-#ifdef V8_USE_EXTERNAL_STARTUP_DATA
-bool MapV8Files(base::FilePath* natives_path, base::FilePath* snapshot_path,
-                int natives_fd = -1, int snapshot_fd = -1) {
+#if defined(V8_USE_EXTERNAL_STARTUP_DATA)
+bool MapV8Files(base::FilePath* natives_path,
+                base::FilePath* snapshot_path,
+                int natives_fd = -1,
+                int snapshot_fd = -1,
+                base::MemoryMappedFile::Region natives_region =
+                    base::MemoryMappedFile::Region::kWholeFile,
+                base::MemoryMappedFile::Region snapshot_region =
+                    base::MemoryMappedFile::Region::kWholeFile) {
   int flags = base::File::FLAG_OPEN | base::File::FLAG_READ;
 
   g_mapped_natives = new base::MemoryMappedFile;
   if (!g_mapped_natives->IsValid()) {
+#if !defined(OS_WIN)
     if (natives_fd == -1
-        ? !g_mapped_natives->Initialize(base::File(*natives_path, flags))
-        : !g_mapped_natives->Initialize(base::File(natives_fd))) {
+            ? !g_mapped_natives->Initialize(base::File(*natives_path, flags),
+                                            natives_region)
+            : !g_mapped_natives->Initialize(base::File(natives_fd),
+                                            natives_region)) {
+#else
+    if (!g_mapped_natives->Initialize(base::File(*natives_path, flags),
+                                      natives_region)) {
+#endif  // !OS_WIN
       delete g_mapped_natives;
       g_mapped_natives = NULL;
       LOG(FATAL) << "Couldn't mmap v8 natives data file";
@@ -59,9 +74,16 @@
 
   g_mapped_snapshot = new base::MemoryMappedFile;
   if (!g_mapped_snapshot->IsValid()) {
+#if !defined(OS_WIN)
     if (snapshot_fd == -1
-        ? !g_mapped_snapshot->Initialize(base::File(*snapshot_path, flags))
-        : !g_mapped_snapshot->Initialize(base::File(snapshot_fd))) {
+            ? !g_mapped_snapshot->Initialize(base::File(*snapshot_path, flags),
+                                             snapshot_region)
+            : !g_mapped_snapshot->Initialize(base::File(snapshot_fd),
+                                             snapshot_region)) {
+#else
+    if (!g_mapped_snapshot->Initialize(base::File(*snapshot_path, flags),
+                                       snapshot_region)) {
+#endif  // !OS_WIN
       delete g_mapped_snapshot;
       g_mapped_snapshot = NULL;
       LOG(ERROR) << "Couldn't mmap v8 snapshot data file";
@@ -72,21 +94,44 @@
   return true;
 }
 
+#if defined(V8_VERIFY_EXTERNAL_STARTUP_DATA)
+bool VerifyV8SnapshotFile(base::MemoryMappedFile* snapshot_file,
+                          const unsigned char* fingerprint) {
+  unsigned char output[crypto::kSHA256Length];
+  crypto::SHA256HashString(
+      base::StringPiece(reinterpret_cast<const char*>(snapshot_file->data()),
+                        snapshot_file->length()),
+      output, sizeof(output));
+  return !memcmp(fingerprint, output, sizeof(output));
+}
+#endif  // V8_VERIFY_EXTERNAL_STARTUP_DATA
+
 #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)
+#elif defined(OS_WIN)
+    base::DIR_MODULE;
+#endif  // OS_ANDROID
+#endif  // !OS_MACOSX
 
 #endif  // V8_USE_EXTERNAL_STARTUP_DATA
 
 }  // namespace
 
+#if defined(V8_USE_EXTERNAL_STARTUP_DATA)
 
-#ifdef V8_USE_EXTERNAL_STARTUP_DATA
+#if defined(V8_VERIFY_EXTERNAL_STARTUP_DATA)
+// Defined in gen/gin/v8_snapshot_fingerprint.cc
+extern const unsigned char g_natives_fingerprint[];
+extern const unsigned char g_snapshot_fingerprint[];
+#endif  // V8_VERIFY_EXTERNAL_STARTUP_DATA
+
+const char IsolateHolder::kNativesFileName[] = "natives_blob.bin";
+const char IsolateHolder::kSnapshotFileName[] = "snapshot_blob.bin";
+
 // static
 bool IsolateHolder::LoadV8Snapshot() {
   if (g_mapped_natives && g_mapped_snapshot)
@@ -97,26 +142,58 @@
   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");
+  base::FilePath natives_path = data_path.AppendASCII(kNativesFileName);
+  base::FilePath snapshot_path = data_path.AppendASCII(kSnapshotFileName);
 #else  // !defined(OS_MACOSX)
+  base::ScopedCFTypeRef<CFStringRef> natives_file_name(
+      base::SysUTF8ToCFStringRef(kNativesFileName));
   base::FilePath natives_path = base::mac::PathForFrameworkBundleResource(
-      CFSTR("natives_blob.bin"));
+      natives_file_name);
+  base::ScopedCFTypeRef<CFStringRef> snapshot_file_name(
+      base::SysUTF8ToCFStringRef(kSnapshotFileName));
   base::FilePath snapshot_path = base::mac::PathForFrameworkBundleResource(
-      CFSTR("snapshot_blob.bin"));
+      snapshot_file_name);
   DCHECK(!natives_path.empty());
   DCHECK(!snapshot_path.empty());
 #endif  // !defined(OS_MACOSX)
 
-  return MapV8Files(&natives_path, &snapshot_path);
+  if (!MapV8Files(&natives_path, &snapshot_path))
+    return false;
+
+#if defined(V8_VERIFY_EXTERNAL_STARTUP_DATA)
+  return VerifyV8SnapshotFile(g_mapped_natives, g_natives_fingerprint) &&
+         VerifyV8SnapshotFile(g_mapped_snapshot, g_snapshot_fingerprint);
+#else
+  return true;
+#endif  // V8_VERIFY_EXTERNAL_STARTUP_DATA
 }
 
 //static
-bool IsolateHolder::LoadV8SnapshotFD(int natives_fd, int snapshot_fd) {
+bool IsolateHolder::LoadV8SnapshotFd(int natives_fd,
+                               int64 natives_offset,
+                               int64 natives_size,
+                               int snapshot_fd,
+                               int64 snapshot_offset,
+                               int64 snapshot_size) {
   if (g_mapped_natives && g_mapped_snapshot)
     return true;
 
-  return MapV8Files(NULL, NULL, natives_fd, snapshot_fd);
+  base::MemoryMappedFile::Region natives_region =
+      base::MemoryMappedFile::Region::kWholeFile;
+  if (natives_size != 0 || natives_offset != 0) {
+    natives_region =
+        base::MemoryMappedFile::Region(natives_offset, natives_size);
+  }
+
+  base::MemoryMappedFile::Region snapshot_region =
+      base::MemoryMappedFile::Region::kWholeFile;
+  if (natives_size != 0 || natives_offset != 0) {
+    snapshot_region =
+        base::MemoryMappedFile::Region(snapshot_offset, snapshot_size);
+  }
+
+  return MapV8Files(
+      NULL, NULL, natives_fd, snapshot_fd, natives_region, snapshot_region);
 }
 #endif  // V8_USE_EXTERNAL_STARTUP_DATA
 
@@ -193,7 +270,7 @@
     v8::V8::SetFlagsFromString(v8_flags, sizeof(v8_flags) - 1);
   }
   v8::V8::SetEntropySource(&GenerateEntropy);
-#ifdef V8_USE_EXTERNAL_STARTUP_DATA
+#if defined(V8_USE_EXTERNAL_STARTUP_DATA)
   v8::StartupData natives;
   natives.data = reinterpret_cast<const char*>(g_mapped_natives->data());
   natives.raw_size = static_cast<int>(g_mapped_natives->length());
diff --git a/gin/public/isolate_holder.h b/gin/public/isolate_holder.h
index b12734c..44d1d89 100644
--- a/gin/public/isolate_holder.h
+++ b/gin/public/isolate_holder.h
@@ -33,7 +33,7 @@
   // Should be invoked once before creating IsolateHolder instances to
   // initialize V8 and Gin. In case V8_USE_EXTERNAL_STARTUP_DATA is defined,
   // V8's initial snapshot should be loaded (by calling LoadV8Snapshot or
-  // LoadV8SnapshotFD) before calling Initialize.
+  // LoadV8SnapshotFd) before calling Initialize.
   static void Initialize(ScriptMode mode,
                          v8::ArrayBuffer::Allocator* allocator);
 
@@ -51,8 +51,16 @@
   // thread.
   void RemoveRunMicrotasksObserver();
 
-#ifdef V8_USE_EXTERNAL_STARTUP_DATA
-  static bool LoadV8SnapshotFD(int natives_fd, int snapshot_fd);
+#if defined(V8_USE_EXTERNAL_STARTUP_DATA)
+  static const char kNativesFileName[];
+  static const char kSnapshotFileName[];
+
+  static bool LoadV8SnapshotFd(int natives_fd,
+                               int64 natives_offset,
+                               int64 natives_size,
+                               int snapshot_fd,
+                               int64 snapshot_offset,
+                               int64 snapshot_size);
   static bool LoadV8Snapshot();
 #endif  // V8_USE_EXTERNAL_STARTUP_DATA
   static void GetV8ExternalSnapshotData(const char** natives_data_out,