Update CodeMirror to 4.10

The beforeChange event API has been completely changed from 3.x.  It
now receives an object with an array of ranges.  The last range is the
"primary" range that most selection methods will default to.

Cursor position CSS was updated in CM 4.x and needs to be adapted to
keep the prior behavior of an underline for current cursor with no
blinking box on selected text.

CM3 related constants in the build system were renamed to CM_ prefix
to avoid needing to rename them again when CodeMirror updates to 5.x.

JavaScript and CSS output were updated to be cm4.{css,js}.  Keep the
major version number in the file names clarifying the content being
loaded into the browser.

Change-Id: I49c70f7155f96c63c94521eeb1d676b4429d6962
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.ui.xml b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.ui.xml
index e08a25d..f563776 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.ui.xml
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.ui.xml
@@ -21,7 +21,7 @@
     @external .CodeMirror, .CodeMirror-lines, .CodeMirror-selectedtext;
     @external .CodeMirror-linenumber, .CodeMirror-vscrollbar .CodeMirror-scroll;
     @external .CodeMirror-dialog-bottom;
-    @external .cm-keymap-fat-cursor, CodeMirror-cursor;
+    @external .cm-animate-fat-cursor, .CodeMirror-cursor;
     @external .cm-searching, .cm-trailingspace, .cm-tab;
 
     .fullscreen {
@@ -134,11 +134,20 @@
       height: 1.11em;
       cursor: pointer;
     }
-    .difftable .CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursor {
+    .difftable .CodeMirror div.CodeMirror-cursor {
       background: transparent;
       text-decoration: underline;
+      border: none;
       z-index: 2;
     }
+    .difftable .cm-animate-fat-cursor {
+      text-decoration: underline;
+      border: none;
+      animation: none;
+      -webkit-animation: none;
+      -moz-animation: none;
+      -o-animation: none;
+    }
     .difftable .CodeMirror-dialog-bottom {
       border-top: 0;
       border-left: 1px solid #000;
diff --git a/gerrit-gwtui/src/main/java/net/codemirror/lib/CodeMirror.java b/gerrit-gwtui/src/main/java/net/codemirror/lib/CodeMirror.java
index bf083b9..9cc00ca 100644
--- a/gerrit-gwtui/src/main/java/net/codemirror/lib/CodeMirror.java
+++ b/gerrit-gwtui/src/main/java/net/codemirror/lib/CodeMirror.java
@@ -208,7 +208,8 @@
   }-*/;
 
   public final native void on(String event, BeforeSelectionChangeHandler handler) /*-{
-    this.on(event, $entry(function(cm, e) {
+    this.on(event, $entry(function(cm, o) {
+      var e = o.ranges[o.ranges.length-1];
       handler.@net.codemirror.lib.CodeMirror.BeforeSelectionChangeHandler::handle(
         Lnet/codemirror/lib/CodeMirror;Lnet/codemirror/lib/LineCharacter;
         Lnet/codemirror/lib/LineCharacter;)(cm,e.anchor,e.head);
diff --git a/gerrit-gwtui/src/main/java/net/codemirror/lib/Lib.java b/gerrit-gwtui/src/main/java/net/codemirror/lib/Lib.java
index bb60fe9..2259467 100644
--- a/gerrit-gwtui/src/main/java/net/codemirror/lib/Lib.java
+++ b/gerrit-gwtui/src/main/java/net/codemirror/lib/Lib.java
@@ -23,10 +23,10 @@
 interface Lib extends ClientBundle {
   static final Lib I = GWT.create(Lib.class);
 
-  @Source("cm3.css")
+  @Source("cm4.css")
   ExternalTextResource css();
 
-  @Source("cm3.js")
+  @Source("cm4.js")
   @DoNotEmbed
   DataResource js();
 }
diff --git a/lib/codemirror/BUCK b/lib/codemirror/BUCK
index 1f79e6e..0404775 100644
--- a/lib/codemirror/BUCK
+++ b/lib/codemirror/BUCK
@@ -1,9 +1,9 @@
 include_defs('//lib/maven.defs')
-include_defs('//lib/codemirror/cm3.defs')
+include_defs('//lib/codemirror/cm.defs')
 include_defs('//lib/codemirror/closure.defs')
 
-VERSION = '57e7ed7177'
-SHA1 = 'd78bc5518707960647d0b8b85d9f1ac011b785d5'
+VERSION = '4.10'
+SHA1 = '577730c11277bf96ce637b183409a2865593f76b'
 URL = GERRIT + 'net/codemirror/codemirror-%s.zip' % VERSION
 
 ZIP = 'codemirror-%s.zip' % VERSION
@@ -25,14 +25,14 @@
       "echo '*/' >>$OUT",
     ] +
     ['unzip -p $(location :zip) %s/%s >>$OUT' % (TOP, n)
-     for n in CM3_CSS + CM3_THEMES]
+     for n in CM_CSS + CM_THEMES]
   ),
   deps = [':zip'],
-  out = 'cm3.css',
+  out = 'cm4.css',
 )
 
 genrule(
-  name = 'cm3-verbose',
+  name = 'cm-verbose',
   cmd = ';'.join([
       ':>$OUT',
       "echo '/** @license' >>$OUT",
@@ -40,17 +40,17 @@
       "echo '*/' >>$OUT",
     ] +
     ['unzip -p $(location :zip) %s/%s >>$OUT' % (TOP, n)
-     for n in CM3_JS]
+     for n in CM_JS]
   ),
   deps = [':zip'],
-  out = 'cm3-verbose.js',
+  out = 'cm4-verbose.js',
 )
 
 js_minify(
   name = 'js',
-  generated = [':cm3-verbose'],
+  generated = [':cm-verbose'],
   compiler_args = CLOSURE_COMPILER_ARGS,
-  out = 'cm3.js'
+  out = 'cm4.js'
 )
 
 prebuilt_jar(
@@ -65,12 +65,12 @@
   cmd = ';'.join([
     'cd $TMP',
     'unzip -q $(location :zip) %s' %
-    ' '.join(['%s/mode/%s' % (TOP, n) for n in CM3_MODES]),
+    ' '.join(['%s/mode/%s' % (TOP, n) for n in CM_MODES]),
     ';'.join(['$(exe :js_minifier) ' +
     ' '.join(CLOSURE_COMPILER_ARGS) +
     ' --js_output_file %s/mode/%s.min --js %s/mode/%s'
-    % (TOP, n, TOP, n) for n in CM3_MODES]),
-    ';'.join(['mv %s/mode/%s.min %s/mode/%s' % (TOP, n, TOP, n) for n in CM3_MODES]),
+    % (TOP, n, TOP, n) for n in CM_MODES]),
+    ';'.join(['mv %s/mode/%s.min %s/mode/%s' % (TOP, n, TOP, n) for n in CM_MODES]),
     'mkdir net',
     'mv %s net/codemirror' % TOP,
     'mkdir net/codemirror/lib',
diff --git a/lib/codemirror/cm3.defs b/lib/codemirror/cm.defs
similarity index 95%
rename from lib/codemirror/cm3.defs
rename to lib/codemirror/cm.defs
index e9eff39..c2e6c32 100644
--- a/lib/codemirror/cm3.defs
+++ b/lib/codemirror/cm.defs
@@ -1,9 +1,9 @@
-CM3_CSS = [
+CM_CSS = [
   'lib/codemirror.css',
   'addon/dialog/dialog.css',
 ]
 
-CM3_THEMES = [
+CM_THEMES = [
   'theme/eclipse.css',
   'theme/elegant.css',
   'theme/midnight.css',
@@ -12,7 +12,7 @@
   'theme/twilight.css',
 ]
 
-CM3_JS = [
+CM_JS = [
   'lib/codemirror.js',
   'keymap/vim.js',
   'addon/dialog/dialog.js',
@@ -22,7 +22,7 @@
   'addon/edit/trailingspace.js',
 ]
 
-CM3_MODES = [
+CM_MODES = [
   'clike/clike.js',
   'clojure/clojure.js',
   'coffeescript/coffeescript.js',