[ChromeDriver] Allow null value for script timeout

Bug: chromedriver:2796
Change-Id: If8ea3747baac59a7deb6a63c5abb15ca9695abda
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1521768
Reviewed-by: John Chen <johnchen@chromium.org>
Commit-Queue: Tatiana Buldina <buldina@chromium.org>
Cr-Commit-Position: refs/heads/master@{#640940}
diff --git a/chrome/test/chromedriver/capabilities.cc b/chrome/test/chromedriver/capabilities.cc
index 1d43bf2d..a2b42ba 100644
--- a/chrome/test/chromedriver/capabilities.cc
+++ b/chrome/test/chromedriver/capabilities.cc
@@ -225,12 +225,20 @@
     return Status(kInvalidArgument, "'timeouts' must be a JSON object");
   for (const auto& it : timeouts->DictItems()) {
     int64_t timeout_ms_int64 = -1;
-    if (!GetOptionalSafeInt(timeouts, it.first, &timeout_ms_int64)
-        || timeout_ms_int64 < 0)
-      return Status(kInvalidArgument, "value must be a non-negative integer");
-    base::TimeDelta timeout =
-                          base::TimeDelta::FromMilliseconds(timeout_ms_int64);
+    base::TimeDelta timeout;
     const std::string& type = it.first;
+    if (it.second.is_none()) {
+      if (type == "script")
+        timeout = base::TimeDelta::Max();
+      else
+        return Status(kInvalidArgument, "timeout can not be null");
+    } else {
+      if (!GetOptionalSafeInt(timeouts, it.first, &timeout_ms_int64) ||
+          timeout_ms_int64 < 0)
+        return Status(kInvalidArgument, "value must be a non-negative integer");
+      else
+        timeout = base::TimeDelta::FromMilliseconds(timeout_ms_int64);
+    }
     if (type == "script") {
       capabilities->script_timeout = timeout;
     } else if (type == "pageLoad") {
diff --git a/chrome/test/chromedriver/session_commands.cc b/chrome/test/chromedriver/session_commands.cc
index abe0053..055ad1a 100644
--- a/chrome/test/chromedriver/session_commands.cc
+++ b/chrome/test/chromedriver/session_commands.cc
@@ -133,8 +133,11 @@
   } else {
     caps->SetBoolean("setWindowRect", true);
   }
-  SetSafeInt(caps.get(), "timeouts.script",
-             session->script_timeout.InMilliseconds());
+  if (session->script_timeout == base::TimeDelta::Max())
+    caps->SetPath({"timeouts", "script"}, base::Value());
+  else
+    SetSafeInt(caps.get(), "timeouts.script",
+               session->script_timeout.InMilliseconds());
   SetSafeInt(caps.get(), "timeouts.pageLoad",
              session->page_load_timeout.InMilliseconds());
   SetSafeInt(caps.get(), "timeouts.implicit",
@@ -755,12 +758,21 @@
                              std::unique_ptr<base::Value>* value) {
   for (const auto& setting : params.DictItems()) {
     int64_t timeout_ms_int64 = -1;
-    if (!GetOptionalSafeInt(&params, setting.first, &timeout_ms_int64) ||
-        timeout_ms_int64 < 0)
-      return Status(kInvalidArgument, "value must be a non-negative integer");
-    base::TimeDelta timeout =
-                    base::TimeDelta::FromMilliseconds(timeout_ms_int64);
+    base::TimeDelta timeout;
     const std::string& type = setting.first;
+    if (setting.second.is_none()) {
+      if (type == "script")
+        timeout = base::TimeDelta::Max();
+      else
+        return Status(kInvalidArgument, "timeout can not be null");
+    } else {
+        if (!GetOptionalSafeInt(&params, setting.first, &timeout_ms_int64)
+            || timeout_ms_int64 < 0)
+            return Status(kInvalidArgument,
+                          "value must be a non-negative integer");
+        else
+            timeout = base::TimeDelta::FromMilliseconds(timeout_ms_int64);
+    }
     if (type == "script") {
       session->script_timeout = timeout;
     } else if (type == "pageLoad") {
@@ -791,7 +803,11 @@
                           const base::DictionaryValue& params,
                           std::unique_ptr<base::Value>* value) {
   base::DictionaryValue timeouts;
-  SetSafeInt(&timeouts, "script", session->script_timeout.InMilliseconds());
+  if (session->script_timeout == base::TimeDelta::Max())
+    timeouts.SetKey("script", base::Value());
+  else
+    SetSafeInt(&timeouts, "script", session->script_timeout.InMilliseconds());
+
   SetSafeInt(&timeouts, "pageLoad",
                         session->page_load_timeout.InMilliseconds());
   SetSafeInt(&timeouts, "implicit", session->implicit_wait.InMilliseconds());