[Closure Compile GN] Update Closure docs.

This CL updates Chromium Closure Compilation docs to use GN-based
compilation.

Bug: 632206
Change-Id: Ie3aef4b7f81744e04051489731acf4e7aa80da15
Reviewed-on: https://chromium-review.googlesource.com/1098749
Reviewed-by: Demetrios Papadopoulos <[email protected]>
Commit-Queue: calamity <[email protected]>
Cr-Commit-Position: refs/heads/master@{#567116}
diff --git a/docs/closure_compilation.md b/docs/closure_compilation.md
index 81a002b..4ae3688 100644
--- a/docs/closure_compilation.md
+++ b/docs/closure_compilation.md
@@ -84,31 +84,31 @@
 
 To do this, we can create:
 
-  + ui/compiled_resources2.gyp
+  + ui/BUILD.gn
 
 With these contents:
 
 ```
-# Copyright 2016 The Chromium Authors. All rights reserved.
+# Copyright 2018 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.
-{
-  'targets': [
-    {
-      # Target names is typically just without ".js"
-      'target_name': 'makes_things_pretty',
 
-      'dependencies': [
-        '../lib/compiled_resources2.gyp:does_the_hard_stuff',
+import("//third_party/closure_compiler/compile_js.gni")
 
-        # Teaches closure about non-standard environments/APIs, e.g.
-        # chrome.send(), chrome.app.window, etc.
-        '<(EXTERNS_GYP):extern_name_goes_here'
-      ],
+js_type_check("closure_compile") {
+  deps = [
+    ":make_things_pretty",
+  ]
+}
 
-      'includes': ['../path/to/third_party/closure_compiler/compile_js2.gypi'],
-    },
-  ],
+js_library("make_things_pretty") {
+  deps = [
+    "../lib:does_the_hard_stuff",
+  ]
+
+  externs_list = [
+    "$externs_path/extern_name_goes_here.js"
+  ]
 }
 ```
 
@@ -120,10 +120,10 @@
 python, depot_tools). Note: on Ubuntu, you can probably just run `sudo apt-get
 install openjdk-7-jre`.
 
-Now you should be able to run:
+After you set closure_compile = true in your gn args, you should be able to run:
 
 ```shell
-third_party/closure_compiler/run_compiler
+ninja -C out/Default webui_closure_compile
 ```
 
 and should see output like this:
@@ -133,10 +133,10 @@
 [0/1] ACTION Compiling ui/makes_things_pretty.js
 ```
 
-To compile only a specific target, add an argument after the script name:
+To compile only a specific folder, add an argument after the script name:
 
 ```shell
-third_party/closure_compiler/run_compiler makes_things_pretty
+ninja -C out/Default ui:closure_compile
 ```
 
 In our example code, this error should appear:
@@ -152,51 +152,41 @@
 
 Hooray! We can catch type errors in JavaScript!
 
+## Preferred BUILD.gn structure
+* Make all individual JS file targets a js\_library.
+* The top level target should be called “closure\_compile”.
+* If you have subfolders that need compiling, make “closure\_compile” a group(),
+  and any files in the current directory a js\_type\_check() called “<directory>\_resources”.
+* Otherwise, just make “closure\_compile” a js\_type\_check with all your js\_library targets as deps
+* Leave all closure targets below other kinds of targets becaure they’re less ‘important’
+
+See also:
+[Closure Compilation with GN](https://docs.google.com/a/chromium.org/document/d/1Ee9ggmp6U-lM-w9WmxN5cSLkK9B5YAq14939Woo-JY0/edit).
+
 ## Trying your change
 
-Closure compilation also has [try
-bots](https://build.chromium.org/p/tryserver.chromium.linux/builders/closure_compilation)
-which can check whether you could *would* break the build if it was committed.
+Closure compilation runs in the compile step of Linux, Android and ChromeOS builds.
 
 From the command line, you try your change with:
 
 ```shell
-git cl try -b closure_compilation
+git cl try -b linux_chromium_rel_ng
 ```
 
-To automatically check that your code typechecks cleanly before submitting, you
-can add this line to your CL description:
-
-```
-CQ_INCLUDE_TRYBOTS=tryserver.chromium.linux:closure_compilation
-```
-
-Working in common resource directories in Chrome automatically adds this line
-for you.
-
 ## Integrating with the continuous build
 
-To compile your code on every commit, add your file to the `'dependencies'` list
-in `src/third_party/closure_compiler/compiled_resources2.gyp`:
+To compile your code on every commit, add your file to the
+`'webui_closure_compile'` target in `src/BUILD.gn`:
 
 ```
-{
-  'targets': [
-    {
-      'target_name': 'compile_all_resources',
-      'dependencies': [
-         # ... other projects ...
-++       '../my_project/compiled_resources2.gyp:*',
-      ],
-    }
-  ]
-}
+  group("webui_closure_compile") {
+    data_deps = [
+      # Other projects
+      "my/project:closure_compile",
+    ]
+  }
 ```
 
-This file is used by the
-[Closure compiler bot](https://build.chromium.org/p/chromium.fyi/builders/Closure%20Compilation%20Linux)
-to automatically compile your code on every commit.
-
 ## Externs
 
 [Externs files](https://github.com/google/closure-compiler/wiki/FAQ#how-do-i-write-an-externs-file)
diff --git a/styleguide/web/web.md b/styleguide/web/web.md
index e657ab39..981caa2 100644
--- a/styleguide/web/web.md
+++ b/styleguide/web/web.md
@@ -331,11 +331,11 @@
   compiler](https://chromium.googlesource.com/chromium/src/+/master/docs/closure_compilation.md)
   to identify JS type errors and enforce correct JSDoc annotations.
 
-* Add a `compiled_resources2.gyp` file to any new web UI code directory.
+* Add a `BUILD.gn` file to any new web UI code directory.
 
-* Ensure that your `compiled_resources2.gyp` file is included in
-  `third_party/closure_compiler/compiled_resources2.gyp` (or somewhere in its
-  include hierarchy) so that your code is typechecked in an automated way.
+* Ensure that your `BUILD.gn` file is included in
+  `src/BUILD.gn:webui_closure_compile` (or somewhere in its
+  deps hierarchy) so that your code is typechecked in an automated way.
 
 * Type Polymer elements by appending 'Element' to the element name, e.g.
   `/** @type {IronIconElement} */`
@@ -381,8 +381,8 @@
     * `created`, `ready`, `attached`, `detached`
     * public methods
     * event handlers, computed functions, and private methods
- 
-* Use camelCase for element IDs to simplify local DOM accessors (i.e. 
+
+* Use camelCase for element IDs to simplify local DOM accessors (i.e.
   `this.$.camelCase` instead of `this.$[‘dash-case’]`).
 
 * Use `this.foo` instead of `newFoo` arguments in observers when possible.