This is an automated email from the ASF dual-hosted git repository.

dongjoon pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/spark.git


The following commit(s) were added to refs/heads/master by this push:
     new 15462e1a [SPARK-28004][UI] Update jquery to 3.4.1
15462e1a is described below

commit 15462e1a8fa8da54ac51f4d21f567f3c288e6701
Author: Sean Owen <sean.o...@databricks.com>
AuthorDate: Fri Jun 14 22:19:20 2019 -0700

    [SPARK-28004][UI] Update jquery to 3.4.1
    
    ## What changes were proposed in this pull request?
    
    We're using an old-ish jQuery, 1.12.4, and should probably update for Spark 
3 to keep up in general, but also to keep up with CVEs. In fact, we know of at 
least one resolved in only 3.4.0+ 
(https://nvd.nist.gov/vuln/detail/CVE-2019-11358). They may not affect Spark, 
but, if the update isn't painful, maybe worthwhile in order to make future 3.x 
updates easier.
    
    jQuery 1 -> 2 doesn't sound like a breaking change, as 2.0 is supposed to 
maintain compatibility with 1.9+ 
(https://blog.jquery.com/2013/04/18/jquery-2-0-released/)
    
    2 -> 3 has breaking changes: https://jquery.com/upgrade-guide/3.0/. It's 
hard to evaluate each one, but the most likely area for problems is in ajax(). 
However, our usage of jQuery (and plugins) is pretty simple.
    
    Update jquery to 3.4.1; update jquery blockUI and mustache to latest
    
    ## How was this patch tested?
    
    Manual testing of docs build (except R docs), worker/master UI, spark 
application UI.
    Note: this really doesn't guarantee it works, as our tests can't test 
javascript, and this is merely anecdotal testing, although I clicked about 
every link I could find. There's a risk this breaks a minor part of the UI; it 
does seem to work fine in the main.
    
    Closes #24843 from srowen/SPARK-28004.
    
    Authored-by: Sean Owen <sean.o...@databricks.com>
    Signed-off-by: Dongjoon Hyun <dh...@apple.com>
---
 core/pom.xml                                       | 27 ++++++
 .../org/apache/spark/ui/static/historypage.js      |  2 +-
 .../apache/spark/ui/static/jquery-1.12.4.min.js    |  5 --
 .../org/apache/spark/ui/static/jquery-3.4.1.min.js |  2 +
 .../apache/spark/ui/static/jquery.blockUI.min.js   |  6 +-
 .../org/apache/spark/ui/static/jquery.mustache.js  | 96 +++++++++++++++++-----
 .../main/scala/org/apache/spark/ui/UIUtils.scala   |  2 +-
 .../spark/deploy/history/HistoryServerSuite.scala  |  6 +-
 dev/.rat-excludes                                  |  2 +-
 docs/_layouts/global.html                          |  2 +-
 docs/js/main.js                                    |  2 +-
 docs/js/vendor/jquery-1.12.4.min.js                |  5 --
 docs/js/vendor/jquery-3.4.1.min.js                 |  2 +
 pom.xml                                            | 14 ++++
 14 files changed, 130 insertions(+), 43 deletions(-)

diff --git a/core/pom.xml b/core/pom.xml
index c61719c..8a872de 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -317,6 +317,33 @@
       <artifactId>selenium-htmlunit-driver</artifactId>
       <scope>test</scope>
     </dependency>
+    <!-- Coerce sbt into honoring these dependency updates: -->
+    <dependency>
+      <groupId>net.sourceforge.htmlunit</groupId>
+      <artifactId>htmlunit</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>net.sourceforge.htmlunit</groupId>
+      <artifactId>htmlunit-core-js</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <!-- at least just for tests, coerce SBT to use the updated 
httpcore/client version -->
+    <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpclient</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpmime</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpcore</artifactId>
+      <scope>test</scope>
+    </dependency>
     <!-- Added for selenium: -->
     <dependency>
       <groupId>xml-apis</groupId>
diff --git a/core/src/main/resources/org/apache/spark/ui/static/historypage.js 
b/core/src/main/resources/org/apache/spark/ui/static/historypage.js
index 381706c..5f29162 100644
--- a/core/src/main/resources/org/apache/spark/ui/static/historypage.js
+++ b/core/src/main/resources/org/apache/spark/ui/static/historypage.js
@@ -104,7 +104,7 @@ $(document).ready(function() {
     });
 
     var historySummary = $("#history-summary");
-    var searchString = historySummary["context"]["location"]["search"];
+    var searchString = window.location.search;
     var requestedIncomplete = getParameterByName("showIncomplete", 
searchString);
     requestedIncomplete = (requestedIncomplete == "true" ? true : false);
 
diff --git 
a/core/src/main/resources/org/apache/spark/ui/static/jquery-1.12.4.min.js 
b/core/src/main/resources/org/apache/spark/ui/static/jquery-1.12.4.min.js
deleted file mode 100644
index e836475..0000000
--- a/core/src/main/resources/org/apache/spark/ui/static/jquery-1.12.4.min.js
+++ /dev/null
@@ -1,5 +0,0 @@
-/*! jQuery v1.12.4 | (c) jQuery Foundation | jquery.org/license */
-!function(a,b){"object"==typeof module&&"object"==typeof 
module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw
 new Error("jQuery requires a window with a document");return 
b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var 
c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="1.12.4",n=function(a,b){return
 new 
n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r
 [...]
-}return c}function Q(a){var b;for(b in 
a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function
 R(a,b,d,e){if(M(a)){var 
f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void
 0!==d||"string"!=typeof b)return 
k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),"object"!=typeof
 b&&"function"!=typeof 
b||(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void
 0!==d& [...]
-marginLeft:0},function(){return a.getBoundingClientRect().left}):0))+"px":void 
0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var
 d=0,e={},f="string"==typeof c?c.split(" 
"):[c];4>d;d++)e[a+V[d]+b]=f[d]||f[d-2]||f[0];return 
e}},Na.test(a)||(n.cssHooks[a+b].set=db)}),n.fn.extend({css:function(a,b){return
 Y(this,function(a,b,c){var 
d,e,f={},g=0;if(n.isArray(b)){for(d=Ra(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return
 f}return v [...]
-padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var
 f=arguments.length&&(c||"boolean"!=typeof 
d),g=c||(d===!0||e===!0?"margin":"border");return Y(this,function(b,c,d){var 
e;return 
n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void
 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 
0,f,null)}})}),n.fn.extend({bind:function(a,b,c){ [...]
diff --git 
a/core/src/main/resources/org/apache/spark/ui/static/jquery-3.4.1.min.js 
b/core/src/main/resources/org/apache/spark/ui/static/jquery-3.4.1.min.js
new file mode 100644
index 0000000..07c00cd
--- /dev/null
+++ b/core/src/main/resources/org/apache/spark/ui/static/jquery-3.4.1.min.js
@@ -0,0 +1,2 @@
+/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | 
jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof 
module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw
 new Error("jQuery requires a window with a document");return 
t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use 
strict";var 
t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof
 e& [...]
\ No newline at end of file
diff --git 
a/core/src/main/resources/org/apache/spark/ui/static/jquery.blockUI.min.js 
b/core/src/main/resources/org/apache/spark/ui/static/jquery.blockUI.min.js
index 1e84b3e..6f52560 100644
--- a/core/src/main/resources/org/apache/spark/ui/static/jquery.blockUI.min.js
+++ b/core/src/main/resources/org/apache/spark/ui/static/jquery.blockUI.min.js
@@ -1,6 +1,6 @@
 /*
-* jQuery BlockUI; v20131009
+* jQuery BlockUI; v20141123
 * http://jquery.malsup.com/block/
-* Copyright (c) 2013 M. Alsup; Dual licensed: MIT/GPL
+* Copyright (c) 2014 M. Alsup; Dual licensed: MIT/GPL
 */
-(function(){"use strict";function e(e){function o(o,i){var 
s,h,k=o==window,v=i&&void 0!==i.message?i.message:void 
0;if(i=e.extend({},e.blockUI.defaults,i||{}),!i.ignoreIfBlocked||!e(o).data("blockUI.isBlocked")){if(i.overlayCSS=e.extend({},e.blockUI.defaults.overlayCSS,i.overlayCSS||{}),s=e.extend({},e.blockUI.defaults.css,i.css||{}),i.onOverlayClick&&(i.overlayCSS.cursor="pointer"),h=e.extend({},e.blockUI.defaults.themedCSS,i.themedCSS||{}),v=void
 0===v?i.message:v,k&&b&&t(window,{fadeO [...]
\ No newline at end of file
+(function(){"use strict";function e(e){function o(o,i){var 
s,h,k=o==window,v=i&&void 0!==i.message?i.message:void 
0;if(i=e.extend({},e.blockUI.defaults,i||{}),!i.ignoreIfBlocked||!e(o).data("blockUI.isBlocked")){if(i.overlayCSS=e.extend({},e.blockUI.defaults.overlayCSS,i.overlayCSS||{}),s=e.extend({},e.blockUI.defaults.css,i.css||{}),i.onOverlayClick&&(i.overlayCSS.cursor="pointer"),h=e.extend({},e.blockUI.defaults.themedCSS,i.themedCSS||{}),v=void
 0===v?i.message:v,k&&b&&t(window,{fadeO [...]
\ No newline at end of file
diff --git 
a/core/src/main/resources/org/apache/spark/ui/static/jquery.mustache.js 
b/core/src/main/resources/org/apache/spark/ui/static/jquery.mustache.js
index 6f93498..68631de 100644
--- a/core/src/main/resources/org/apache/spark/ui/static/jquery.mustache.js
+++ b/core/src/main/resources/org/apache/spark/ui/static/jquery.mustache.js
@@ -45,6 +45,19 @@
     return obj != null && typeof obj === 'object' && (propName in obj);
   }
 
+  /**
+   * Safe way of detecting whether or not the given thing is a primitive and
+   * whether it has the given property
+   */
+  function primitiveHasOwnProperty (primitive, propName) {
+    return (
+      primitive != null
+      && typeof primitive !== 'object'
+      && primitive.hasOwnProperty
+      && primitive.hasOwnProperty(propName)
+    );
+  }
+
   // Workaround for https://issues.apache.org/jira/browse/COUCHDB-577
   // See https://github.com/janl/mustache.js/issues/189
   var regExpTest = RegExp.prototype.test;
@@ -377,11 +390,11 @@
     if (cache.hasOwnProperty(name)) {
       value = cache[name];
     } else {
-      var context = this, names, index, lookupHit = false;
+      var context = this, intermediateValue, names, index, lookupHit = false;
 
       while (context) {
         if (name.indexOf('.') > 0) {
-          value = context.view;
+          intermediateValue = context.view;
           names = name.split('.');
           index = 0;
 
@@ -395,20 +408,51 @@
            *
            * This is specially necessary for when the value has been set to
            * `undefined` and we want to avoid looking up parent contexts.
+           *
+           * In the case where dot notation is used, we consider the lookup
+           * to be successful even if the last "object" in the path is
+           * not actually an object but a primitive (e.g., a string, or an
+           * integer), because it is sometimes useful to access a property
+           * of an autoboxed primitive, such as the length of a string.
            **/
-          while (value != null && index < names.length) {
+          while (intermediateValue != null && index < names.length) {
             if (index === names.length - 1)
-              lookupHit = hasProperty(value, names[index]);
+              lookupHit = (
+                hasProperty(intermediateValue, names[index])
+                || primitiveHasOwnProperty(intermediateValue, names[index])
+              );
 
-            value = value[names[index++]];
+            intermediateValue = intermediateValue[names[index++]];
           }
         } else {
-          value = context.view[name];
+          intermediateValue = context.view[name];
+
+          /**
+           * Only checking against `hasProperty`, which always returns `false` 
if
+           * `context.view` is not an object. Deliberately omitting the check
+           * against `primitiveHasOwnProperty` if dot notation is not used.
+           *
+           * Consider this example:
+           * ```
+           * Mustache.render("The length of a football field is 
{{#length}}{{length}}{{/length}}.", {length: "100 yards"})
+           * ```
+           *
+           * If we were to check also against `primitiveHasOwnProperty`, as we 
do
+           * in the dot notation case, then render call would return:
+           *
+           * "The length of a football field is 9."
+           *
+           * rather than the expected:
+           *
+           * "The length of a football field is 100 yards."
+           **/
           lookupHit = hasProperty(context.view, name);
         }
 
-        if (lookupHit)
+        if (lookupHit) {
+          value = intermediateValue;
           break;
+        }
 
         context = context.parent;
       }
@@ -439,15 +483,17 @@
   };
 
   /**
-   * Parses and caches the given `template` and returns the array of tokens
+   * Parses and caches the given `template` according to the given `tags` or
+   * `mustache.tags` if `tags` is omitted,  and returns the array of tokens
    * that is generated from the parse.
    */
   Writer.prototype.parse = function parse (template, tags) {
     var cache = this.cache;
-    var tokens = cache[template];
+    var cacheKey = template + ':' + (tags || mustache.tags).join(':');
+    var tokens = cache[cacheKey];
 
     if (tokens == null)
-      tokens = cache[template] = parseTemplate(template, tags);
+      tokens = cache[cacheKey] = parseTemplate(template, tags);
 
     return tokens;
   };
@@ -460,11 +506,15 @@
    * names and templates of partials that are used in the template. It may
    * also be a function that is used to load partial templates on the fly
    * that takes a single argument: the name of the partial.
+   *
+   * If the optional `tags` argument is given here it must be an array with two
+   * string values: the opening and closing tags used in the template (e.g.
+   * [ "<%", "%>" ]). The default is to mustache.tags.
    */
-  Writer.prototype.render = function render (template, view, partials) {
-    var tokens = this.parse(template);
+  Writer.prototype.render = function render (template, view, partials, tags) {
+    var tokens = this.parse(template, tags);
     var context = (view instanceof Context) ? view : new Context(view);
-    return this.renderTokens(tokens, context, partials, template);
+    return this.renderTokens(tokens, context, partials, template, tags);
   };
 
   /**
@@ -476,7 +526,7 @@
    * If the template doesn't use higher-order sections, this argument may
    * be omitted.
    */
-  Writer.prototype.renderTokens = function renderTokens (tokens, context, 
partials, originalTemplate) {
+  Writer.prototype.renderTokens = function renderTokens (tokens, context, 
partials, originalTemplate, tags) {
     var buffer = '';
 
     var token, symbol, value;
@@ -487,7 +537,7 @@
 
       if (symbol === '#') value = this.renderSection(token, context, partials, 
originalTemplate);
       else if (symbol === '^') value = this.renderInverted(token, context, 
partials, originalTemplate);
-      else if (symbol === '>') value = this.renderPartial(token, context, 
partials, originalTemplate);
+      else if (symbol === '>') value = this.renderPartial(token, context, 
partials, tags);
       else if (symbol === '&') value = this.unescapedValue(token, context);
       else if (symbol === 'name') value = this.escapedValue(token, context);
       else if (symbol === 'text') value = this.rawValue(token);
@@ -542,12 +592,12 @@
       return this.renderTokens(token[4], context, partials, originalTemplate);
   };
 
-  Writer.prototype.renderPartial = function renderPartial (token, context, 
partials) {
+  Writer.prototype.renderPartial = function renderPartial (token, context, 
partials, tags) {
     if (!partials) return;
 
     var value = isFunction(partials) ? partials(token[1]) : partials[token[1]];
     if (value != null)
-      return this.renderTokens(this.parse(value), context, partials, value);
+      return this.renderTokens(this.parse(value, tags), context, partials, 
value);
   };
 
   Writer.prototype.unescapedValue = function unescapedValue (token, context) {
@@ -567,7 +617,7 @@
   };
 
   mustache.name = 'mustache.js';
-  mustache.version = '2.3.2';
+  mustache.version = '3.0.1';
   mustache.tags = [ '{{', '}}' ];
 
   // All high-level mustache.* functions use this writer.
@@ -591,16 +641,18 @@
 
   /**
    * Renders the `template` with the given `view` and `partials` using the
-   * default writer.
+   * default writer. If the optional `tags` argument is given here it must be 
an
+   * array with two string values: the opening and closing tags used in the
+   * template (e.g. [ "<%", "%>" ]). The default is to mustache.tags.
    */
-  mustache.render = function render (template, view, partials) {
+  mustache.render = function render (template, view, partials, tags) {
     if (typeof template !== 'string') {
       throw new TypeError('Invalid template! Template should be a "string" ' +
                           'but "' + typeStr(template) + '" was given as the 
first ' +
                           'argument for mustache#render(template, view, 
partials)');
     }
 
-    return defaultWriter.render(template, view, partials);
+    return defaultWriter.render(template, view, partials, tags);
   };
 
   // This is here for backwards compatibility with 0.4.x.,
@@ -627,4 +679,4 @@
   mustache.Writer = Writer;
 
   return mustache;
-}));
+}));
\ No newline at end of file
diff --git a/core/src/main/scala/org/apache/spark/ui/UIUtils.scala 
b/core/src/main/scala/org/apache/spark/ui/UIUtils.scala
index 11647c0..b59f03a 100644
--- a/core/src/main/scala/org/apache/spark/ui/UIUtils.scala
+++ b/core/src/main/scala/org/apache/spark/ui/UIUtils.scala
@@ -172,7 +172,7 @@ private[spark] object UIUtils extends Logging {
     <link rel="stylesheet"
           href={prependBaseUri(request, "/static/timeline-view.css")} 
type="text/css"/>
     <script src={prependBaseUri(request, "/static/sorttable.js")} ></script>
-    <script src={prependBaseUri(request, 
"/static/jquery-1.12.4.min.js")}></script>
+    <script src={prependBaseUri(request, 
"/static/jquery-3.4.1.min.js")}></script>
     <script src={prependBaseUri(request, "/static/vis.min.js")}></script>
     <script src={prependBaseUri(request, 
"/static/bootstrap-tooltip.js")}></script>
     <script src={prependBaseUri(request, 
"/static/initialize-tooltips.js")}></script>
diff --git 
a/core/src/test/scala/org/apache/spark/deploy/history/HistoryServerSuite.scala 
b/core/src/test/scala/org/apache/spark/deploy/history/HistoryServerSuite.scala
index 5ba27a0..c12b71a 100644
--- 
a/core/src/test/scala/org/apache/spark/deploy/history/HistoryServerSuite.scala
+++ 
b/core/src/test/scala/org/apache/spark/deploy/history/HistoryServerSuite.scala
@@ -26,6 +26,7 @@ import javax.servlet.http.{HttpServletRequest, 
HttpServletRequestWrapper, HttpSe
 import scala.collection.JavaConverters._
 import scala.concurrent.duration._
 
+import com.gargoylesoftware.htmlunit.BrowserVersion
 import com.google.common.io.{ByteStreams, Files}
 import org.apache.commons.io.{FileUtils, IOUtils}
 import org.apache.hadoop.fs.{FileStatus, FileSystem, Path}
@@ -366,9 +367,8 @@ class HistoryServerSuite extends SparkFunSuite with 
BeforeAndAfter with Matchers
     contextHandler.addServlet(holder, "/")
     server.attachHandler(contextHandler)
 
-    implicit val webDriver: WebDriver = new HtmlUnitDriver(true) {
-      getWebClient.getOptions.setThrowExceptionOnScriptError(false)
-    }
+    implicit val webDriver: WebDriver =
+      new HtmlUnitDriver(BrowserVersion.INTERNET_EXPLORER_11, true)
 
     try {
       val url = s"http://localhost:$port";
diff --git a/dev/.rat-excludes b/dev/.rat-excludes
index 7c2a720..0d74164 100644
--- a/dev/.rat-excludes
+++ b/dev/.rat-excludes
@@ -22,7 +22,7 @@ docs
 slaves
 spark-env.cmd
 bootstrap-tooltip.js
-jquery-1.12.4.min.js
+jquery-3.4.1.min.js
 d3.min.js
 dagre-d3.min.js
 graphlib-dot.min.js
diff --git a/docs/_layouts/global.html b/docs/_layouts/global.html
index 63e9a42..8ea15dc 100755
--- a/docs/_layouts/global.html
+++ b/docs/_layouts/global.html
@@ -159,7 +159,7 @@
              <!-- /container -->
         </div>
 
-        <script src="js/vendor/jquery-1.12.4.min.js"></script>
+        <script src="js/vendor/jquery-3.4.1.min.js"></script>
         <script src="js/vendor/bootstrap.min.js"></script>
         <script src="js/vendor/anchor.min.js"></script>
         <script src="js/main.js"></script>
diff --git a/docs/js/main.js b/docs/js/main.js
index 2329eb8..3ee3dbe 100755
--- a/docs/js/main.js
+++ b/docs/js/main.js
@@ -93,5 +93,5 @@ $(function() {
 
   // Scroll now too in case we had opened the page on a hash, but wait a bit 
because some browsers
   // will try to do *their* initial scroll after running the onReady handler.
-  $(window).load(function() { setTimeout(function() { maybeScrollToHash(); }, 
25); }); 
+  $(window).on('load', function() { setTimeout(function() { 
maybeScrollToHash(); }, 25); });
 });
diff --git a/docs/js/vendor/jquery-1.12.4.min.js 
b/docs/js/vendor/jquery-1.12.4.min.js
deleted file mode 100755
index e836475..0000000
--- a/docs/js/vendor/jquery-1.12.4.min.js
+++ /dev/null
@@ -1,5 +0,0 @@
-/*! jQuery v1.12.4 | (c) jQuery Foundation | jquery.org/license */
-!function(a,b){"object"==typeof module&&"object"==typeof 
module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw
 new Error("jQuery requires a window with a document");return 
b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var 
c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="1.12.4",n=function(a,b){return
 new 
n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r
 [...]
-}return c}function Q(a){var b;for(b in 
a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function
 R(a,b,d,e){if(M(a)){var 
f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void
 0!==d||"string"!=typeof b)return 
k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),"object"!=typeof
 b&&"function"!=typeof 
b||(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void
 0!==d& [...]
-marginLeft:0},function(){return a.getBoundingClientRect().left}):0))+"px":void 
0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var
 d=0,e={},f="string"==typeof c?c.split(" 
"):[c];4>d;d++)e[a+V[d]+b]=f[d]||f[d-2]||f[0];return 
e}},Na.test(a)||(n.cssHooks[a+b].set=db)}),n.fn.extend({css:function(a,b){return
 Y(this,function(a,b,c){var 
d,e,f={},g=0;if(n.isArray(b)){for(d=Ra(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return
 f}return v [...]
-padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var
 f=arguments.length&&(c||"boolean"!=typeof 
d),g=c||(d===!0||e===!0?"margin":"border");return Y(this,function(b,c,d){var 
e;return 
n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void
 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 
0,f,null)}})}),n.fn.extend({bind:function(a,b,c){ [...]
diff --git a/docs/js/vendor/jquery-3.4.1.min.js 
b/docs/js/vendor/jquery-3.4.1.min.js
new file mode 100644
index 0000000..07c00cd
--- /dev/null
+++ b/docs/js/vendor/jquery-3.4.1.min.js
@@ -0,0 +1,2 @@
+/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | 
jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof 
module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw
 new Error("jQuery requires a window with a document");return 
t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use 
strict";var 
t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof
 e& [...]
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 62394b2..d970da1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -189,6 +189,7 @@
     <antlr4.version>4.7.1</antlr4.version>
     <jpam.version>1.1</jpam.version>
     <selenium.version>2.52.0</selenium.version>
+    <htmlunit.version>2.22</htmlunit.version>
     <!--
     Managed up from older version from Avro; sync with 
jackson-module-paranamer dependency version
     -->
@@ -549,6 +550,19 @@
         <version>${selenium.version}</version>
         <scope>test</scope>
       </dependency>
+      <!-- Update htmlunit dependency that selenium uses for better JS support 
-->
+      <dependency>
+        <groupId>net.sourceforge.htmlunit</groupId>
+        <artifactId>htmlunit</artifactId>
+        <version>${htmlunit.version}</version>
+        <scope>test</scope>
+      </dependency>
+      <dependency>
+        <groupId>net.sourceforge.htmlunit</groupId>
+        <artifactId>htmlunit-core-js</artifactId>
+        <version>${htmlunit.version}</version>
+        <scope>test</scope>
+      </dependency>
       <!-- Added for selenium only, and should match its dependent version: -->
       <dependency>
         <groupId>xml-apis</groupId>


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@spark.apache.org
For additional commands, e-mail: commits-h...@spark.apache.org

Reply via email to