Properly substitute variables that reference paths outside SRCDIR.

Apply the same kind of trick added in r58 and use a define's base name if it
refers to a location outside SRCDIR; so far, GritNode::AssignFirstIds() would
parse a file name differently than _ReadFirstIdsFromFile() even though they
refer to the same entry.

TEST=in Chromium, make BUILDTYPE=Release builddir_name=/outside/srcdir/out tracing_resources
R=joi@chromium.org

Landing for original author raphael.kubo.da.costa@intel.com,
https://codereview.chromium.org/69463002/

Review URL: https://codereview.chromium.org/68163013

git-svn-id: http://grit-i18n.googlecode.com/svn/trunk@138 7262f16d-afe8-6277-6482-052fa10e57b1
diff --git a/grit/node/misc.py b/grit/node/misc.py
index 734c57a..345081f 100755
--- a/grit/node/misc.py
+++ b/grit/node/misc.py
@@ -49,7 +49,6 @@
   def ReplaceVariable(matchobj):
     for key, value in defines.iteritems():
       if matchobj.group(1) == key:
-        value = os.path.abspath(value)[len(src_root_dir) + 1:]
         return value
     return ''
 
@@ -58,7 +57,12 @@
     new_grd_filename = re.sub(r'<\(([A-Za-z_]+)\)', ReplaceVariable,
                               grd_filename)
     if new_grd_filename != grd_filename:
-      new_grd_filename = new_grd_filename.replace('\\', '/')
+      abs_grd_filename = os.path.abspath(new_grd_filename)
+      if abs_grd_filename[:len(src_root_dir)] != src_root_dir:
+        new_grd_filename = os.path.basename(abs_grd_filename)
+      else:
+        new_grd_filename = abs_grd_filename[len(src_root_dir) + 1:]
+        new_grd_filename = new_grd_filename.replace('\\', '/')
       renames.append((grd_filename, new_grd_filename))
 
   for grd_filename, new_grd_filename in renames:
diff --git a/grit/node/misc_unittest.py b/grit/node/misc_unittest.py
index 496d153..b353edb 100644
--- a/grit/node/misc_unittest.py
+++ b/grit/node/misc_unittest.py
@@ -46,6 +46,12 @@
     self.assertEqual({},
         id_dict.get('out/Release/obj/gen/devtools/devtools.grd', None))
 
+    src_dir, id_dict = misc._ReadFirstIdsFromFile(
+        test_resource_ids,
+        {
+          'SHARED_INTERMEDIATE_DIR': '/outside/src_dir',
+        })
+    self.assertEqual({}, id_dict.get('devtools.grd', None))
 
 class IfNodeUnittest(unittest.TestCase):
   def testIffyness(self):