From 03665486cc9424e952fb288aaa919856968ded94 Mon Sep 17 00:00:00 2001
From: Jarred Nicholls <jarred.nicholls@gmail.com>
Date: Wed, 15 Oct 2014 16:10:42 -0400
Subject: [PATCH] <third_party/WebKit>: Prevent cl.exe crash on Windows

cl.exe does not like long relative include paths. In shadow builds that result
in large relative paths, some of the IDL binding include paths are too long
and often completely incorrect, specifically for IDL files that are generated
and are not sourced in the Blink repository. This patch resolves that problem
and makes the paths minimal for generated IDL bindings, preventing the cl.exe
fatal C1001 crash.

Change-Id: I912e2c8d2c4a6de79693c63ff5313958360cb42b
Reviewed-by: Michael Bruning <michael.bruning@digia.com>
---
 .../compute_interfaces_info_individual.py       | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/chromium/third_party/WebKit/Source/bindings/scripts/compute_interfaces_info_individual.py b/chromium/third_party/WebKit/Source/bindings/scripts/compute_interfaces_info_individual.py
index c3671d9ebdf..67abb68f222 100755
--- a/chromium/third_party/WebKit/Source/bindings/scripts/compute_interfaces_info_individual.py
+++ b/chromium/third_party/WebKit/Source/bindings/scripts/compute_interfaces_info_individual.py
@@ -49,7 +49,7 @@ import sys
 
 from utilities import get_file_contents, read_file_to_list, idl_filename_to_interface_name, write_pickle_file, get_interface_extended_attributes_from_idl, is_callback_interface_from_idl, get_partial_interface_name_from_idl, get_implements_from_idl, get_parent_interface, get_put_forward_interfaces_from_idl
 
-module_path = os.path.dirname(__file__)
+module_path = os.path.abspath(os.path.dirname(__file__))
 source_path = os.path.normpath(os.path.join(module_path, os.pardir, os.pardir))
 
 # Global variables (filled in and exported)
@@ -85,13 +85,20 @@ def parse_options():
 # Computations
 ################################################################################
 
-def include_path(idl_filename, implemented_as=None):
+def include_path(idl_filename, component_dir, implemented_as=None):
     """Returns relative path to header file in POSIX format; used in includes.
 
     POSIX format is used for consistency of output, so reference tests are
     platform-independent.
     """
-    relative_path_local = os.path.relpath(idl_filename, source_path)
+    # Some IDL files are generated at build-time and are not sourced in the
+    # Blink repository. So to avoid incorrect and/or very long relative paths
+    # in our include_paths, we have to compute the relative path specially
+    # for these generated IDL files.
+    if idl_filename.startswith(source_path):
+        relative_path_local = os.path.relpath(idl_filename, source_path)
+    else:
+        relative_path_local = os.path.join(component_dir, os.path.basename(idl_filename))
     relative_dir_local = os.path.dirname(relative_path_local)
     relative_dir_posix = relative_dir_local.replace(os.path.sep, posixpath.sep)
 
@@ -115,7 +122,7 @@ def compute_info_individual(idl_filename, component_dir):
 
     extended_attributes = get_interface_extended_attributes_from_idl(idl_file_contents)
     implemented_as = extended_attributes.get('ImplementedAs')
-    this_include_path = include_path(idl_filename, implemented_as)
+    this_include_path = include_path(idl_filename, component_dir, implemented_as)
 
     # Handle partial interfaces
     partial_interface_name = get_partial_interface_name_from_idl(idl_file_contents)
@@ -181,7 +188,7 @@ def main():
     # Information is stored in global variables interfaces_info and
     # partial_interface_files.
     for idl_filename in idl_files:
-        compute_info_individual(idl_filename, options.component_dir)
+        compute_info_individual(os.path.abspath(idl_filename), options.component_dir)
 
     write_pickle_file(options.interfaces_info_file,
                       info_individual(),
-- 
GitLab