From 2c51448e6ad5c9c03c21b4031f3653c927d96a76 Mon Sep 17 00:00:00 2001
From: Romain Courteaud <romain@nexedi.com>
Date: Fri, 28 Jun 2019 13:51:54 +0000
Subject: [PATCH] [erp5_core/erp5_web_renderjs_ui] Update jio 3.38.0

---
 .../web_page_module/rjs_jio_js.js             | 74 ++++++++++++-------
 .../web_page_module/rjs_jio_js.xml            |  4 +-
 .../portal_skins/erp5_core/jio.js.js          | 74 ++++++++++++-------
 3 files changed, 98 insertions(+), 54 deletions(-)

diff --git a/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_jio_js.js b/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_jio_js.js
index 1f82e4b54e..e965a3c8c3 100644
--- a/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_jio_js.js
+++ b/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_jio_js.js
@@ -6105,6 +6105,8 @@ var arrayExtend = function () {
     return true;
   }
   return false;
+}, parseQuotedString = function (string) {
+  return string.replace(/(?:\\(")|(\\[^"]))/g, '$1$2');
 },
   error_offsets = [],
   error_lookaheads = [],
@@ -6226,7 +6228,7 @@ case 17:
  this.$ = mkSimpleQuery('', $$[$0]); 
 break;
 case 18:
- this.$ = mkSimpleQuery('', $$[$0-1]); 
+ this.$ = mkSimpleQuery('', parseQuotedString($$[$0-1])); 
 break;
 }
 },
@@ -6930,6 +6932,9 @@ return new Parser;
       throw new TypeError("jioquery.sortOn(): " +
                           "Argument 1 is not of type 'array'");
     }
+    if (sort_on_option.length === 0) {
+      return list;
+    }
     list.sort(generateSortFunction(
       key_schema,
       sort_on_option
@@ -7445,6 +7450,16 @@ return new Parser;
                         "Argument 1 is not a search text or a parsable object");
   };
 
+  function ensureString(value) {
+    if (value === undefined) { return "undefined"; }
+    if (value === null) { return "null"; }
+    return value.toString();
+  }
+
+  function renderSearchTextValue(value) {
+    return '"' + ensureString(value).replace(/"/g, '\\"') + '"';
+  }
+
   function objectToSearchText(query) {
     var i = 0,
       query_list = null,
@@ -7453,7 +7468,8 @@ return new Parser;
       common_key = "";
     if (query.type === "simple") {
       return (query.key ? query.key + ": " : "") +
-        (query.operator || "") + ' "' + query.value + '"';
+        (query.operator || "") + ' ' +
+        renderSearchTextValue(query.value);
     }
     if (query.type === "complex") {
       query_list = query.query_list;
@@ -7484,7 +7500,7 @@ return new Parser;
         for (i = 0; i < query_list.length; i += 1) {
           string_list.push(
             (query_list[i].operator || "") +
-              ' "' + query_list[i].value + '"'
+              ' ' + renderSearchTextValue(query_list[i].value)
           );
         }
       } else {
@@ -10357,7 +10373,8 @@ return new Parser;
               });
           }
           report.log(id, options.from_local ? LOG_UNEXPECTED_REMOTE_ATTACHMENT :
-                                              LOG_UNEXPECTED_LOCAL_ATTACHMENT);
+                                              LOG_UNEXPECTED_LOCAL_ATTACHMENT,
+                     JSON.stringify(attachment_dict));
         }, function (error) {
           if ((error instanceof jIO.util.jIOError) &&
               (error.status_code === 404)) {
@@ -14916,13 +14933,19 @@ return new Parser;
   }
 
   function waitForOpenIndexedDB(db_name, callback) {
+    var request;
+
+    function canceller() {
+      if ((request !== undefined) && (request.result !== undefined)) {
+        request.result.close();
+      }
+    }
+
     function resolver(resolve, reject) {
       // Open DB //
-      var request = indexedDB.open(db_name);
+      request = indexedDB.open(db_name);
       request.onerror = function (error) {
-        if (request.result) {
-          request.result.close();
-        }
+        canceller();
         if ((error !== undefined) &&
             (error.target instanceof IDBOpenDBRequest) &&
             (error.target.error instanceof DOMError)) {
@@ -14934,17 +14957,16 @@ return new Parser;
       };
 
       request.onabort = function () {
-        request.result.close();
+        canceller();
         reject("Aborting connection to: " + db_name);
       };
 
       request.ontimeout = function () {
-        request.result.close();
         reject("Connection to: " + db_name + " timeout");
       };
 
       request.onblocked = function () {
-        request.result.close();
+        canceller();
         reject("Connection to: " + db_name + " was blocked");
       };
 
@@ -14952,26 +14974,32 @@ return new Parser;
       request.onupgradeneeded = handleUpgradeNeeded;
 
       request.onversionchange = function () {
-        request.result.close();
+        canceller();
         reject(db_name + " was upgraded");
       };
 
       request.onsuccess = function () {
+        var result;
+        try {
+          result = callback(request.result);
+        } catch (error) {
+          reject(error);
+        }
         return new RSVP.Queue()
           .push(function () {
-            return callback(request.result);
+            return result;
           })
-          .push(function (result) {
-            request.result.close();
-            resolve(result);
+          .push(function (final_result) {
+            canceller();
+            resolve(final_result);
           }, function (error) {
-            request.result.close();
+            canceller();
             reject(error);
           });
       };
     }
 
-    return new RSVP.Promise(resolver);
+    return new RSVP.Promise(resolver, canceller);
   }
 
   function waitForTransaction(db, stores, flag, callback) {
@@ -15001,14 +15029,8 @@ return new Parser;
             reject(error);
           });
       };
-      tx.onerror = function (error) {
-        canceller();
-        reject(error);
-      };
-      tx.onabort = function (evt) {
-        reject(evt.target);
-      };
-      return tx;
+      tx.onerror = reject;
+      tx.onabort = reject;
     }
     return new RSVP.Promise(resolver, canceller);
   }
diff --git a/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_jio_js.xml b/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_jio_js.xml
index 8b58bdf35c..fd7ae2a7da 100644
--- a/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_jio_js.xml
+++ b/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_jio_js.xml
@@ -234,7 +234,7 @@
             </item>
             <item>
                 <key> <string>serial</string> </key>
-                <value> <string>974.4070.21826.50261</string> </value>
+                <value> <string>976.45837.16266.40243</string> </value>
             </item>
             <item>
                 <key> <string>state</string> </key>
@@ -252,7 +252,7 @@
                     </tuple>
                     <state>
                       <tuple>
-                        <float>1551694892.25</float>
+                        <float>1561969491.3</float>
                         <string>UTC</string>
                       </tuple>
                     </state>
diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/jio.js.js b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/jio.js.js
index 1f82e4b54e..e965a3c8c3 100644
--- a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/jio.js.js
+++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/jio.js.js
@@ -6105,6 +6105,8 @@ var arrayExtend = function () {
     return true;
   }
   return false;
+}, parseQuotedString = function (string) {
+  return string.replace(/(?:\\(")|(\\[^"]))/g, '$1$2');
 },
   error_offsets = [],
   error_lookaheads = [],
@@ -6226,7 +6228,7 @@ case 17:
  this.$ = mkSimpleQuery('', $$[$0]); 
 break;
 case 18:
- this.$ = mkSimpleQuery('', $$[$0-1]); 
+ this.$ = mkSimpleQuery('', parseQuotedString($$[$0-1])); 
 break;
 }
 },
@@ -6930,6 +6932,9 @@ return new Parser;
       throw new TypeError("jioquery.sortOn(): " +
                           "Argument 1 is not of type 'array'");
     }
+    if (sort_on_option.length === 0) {
+      return list;
+    }
     list.sort(generateSortFunction(
       key_schema,
       sort_on_option
@@ -7445,6 +7450,16 @@ return new Parser;
                         "Argument 1 is not a search text or a parsable object");
   };
 
+  function ensureString(value) {
+    if (value === undefined) { return "undefined"; }
+    if (value === null) { return "null"; }
+    return value.toString();
+  }
+
+  function renderSearchTextValue(value) {
+    return '"' + ensureString(value).replace(/"/g, '\\"') + '"';
+  }
+
   function objectToSearchText(query) {
     var i = 0,
       query_list = null,
@@ -7453,7 +7468,8 @@ return new Parser;
       common_key = "";
     if (query.type === "simple") {
       return (query.key ? query.key + ": " : "") +
-        (query.operator || "") + ' "' + query.value + '"';
+        (query.operator || "") + ' ' +
+        renderSearchTextValue(query.value);
     }
     if (query.type === "complex") {
       query_list = query.query_list;
@@ -7484,7 +7500,7 @@ return new Parser;
         for (i = 0; i < query_list.length; i += 1) {
           string_list.push(
             (query_list[i].operator || "") +
-              ' "' + query_list[i].value + '"'
+              ' ' + renderSearchTextValue(query_list[i].value)
           );
         }
       } else {
@@ -10357,7 +10373,8 @@ return new Parser;
               });
           }
           report.log(id, options.from_local ? LOG_UNEXPECTED_REMOTE_ATTACHMENT :
-                                              LOG_UNEXPECTED_LOCAL_ATTACHMENT);
+                                              LOG_UNEXPECTED_LOCAL_ATTACHMENT,
+                     JSON.stringify(attachment_dict));
         }, function (error) {
           if ((error instanceof jIO.util.jIOError) &&
               (error.status_code === 404)) {
@@ -14916,13 +14933,19 @@ return new Parser;
   }
 
   function waitForOpenIndexedDB(db_name, callback) {
+    var request;
+
+    function canceller() {
+      if ((request !== undefined) && (request.result !== undefined)) {
+        request.result.close();
+      }
+    }
+
     function resolver(resolve, reject) {
       // Open DB //
-      var request = indexedDB.open(db_name);
+      request = indexedDB.open(db_name);
       request.onerror = function (error) {
-        if (request.result) {
-          request.result.close();
-        }
+        canceller();
         if ((error !== undefined) &&
             (error.target instanceof IDBOpenDBRequest) &&
             (error.target.error instanceof DOMError)) {
@@ -14934,17 +14957,16 @@ return new Parser;
       };
 
       request.onabort = function () {
-        request.result.close();
+        canceller();
         reject("Aborting connection to: " + db_name);
       };
 
       request.ontimeout = function () {
-        request.result.close();
         reject("Connection to: " + db_name + " timeout");
       };
 
       request.onblocked = function () {
-        request.result.close();
+        canceller();
         reject("Connection to: " + db_name + " was blocked");
       };
 
@@ -14952,26 +14974,32 @@ return new Parser;
       request.onupgradeneeded = handleUpgradeNeeded;
 
       request.onversionchange = function () {
-        request.result.close();
+        canceller();
         reject(db_name + " was upgraded");
       };
 
       request.onsuccess = function () {
+        var result;
+        try {
+          result = callback(request.result);
+        } catch (error) {
+          reject(error);
+        }
         return new RSVP.Queue()
           .push(function () {
-            return callback(request.result);
+            return result;
           })
-          .push(function (result) {
-            request.result.close();
-            resolve(result);
+          .push(function (final_result) {
+            canceller();
+            resolve(final_result);
           }, function (error) {
-            request.result.close();
+            canceller();
             reject(error);
           });
       };
     }
 
-    return new RSVP.Promise(resolver);
+    return new RSVP.Promise(resolver, canceller);
   }
 
   function waitForTransaction(db, stores, flag, callback) {
@@ -15001,14 +15029,8 @@ return new Parser;
             reject(error);
           });
       };
-      tx.onerror = function (error) {
-        canceller();
-        reject(error);
-      };
-      tx.onabort = function (evt) {
-        reject(evt.target);
-      };
-      return tx;
+      tx.onerror = reject;
+      tx.onabort = reject;
     }
     return new RSVP.Promise(resolver, canceller);
   }
-- 
2.30.9