aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEbrahim Byagowi <ebrahim@gnu.org>2019-02-21 03:11:08 +0330
committerEbrahim Byagowi <ebrahim@gnu.org>2019-02-25 01:43:57 +0330
commit2bc42c16b3513d5828f4c085207f419bb8cc2209 (patch)
treeac74ca02f3bd813287ad06e856b66997f91eeecb
parent759634f4ffe0d6b68691374a52c54979f7d7ba5c (diff)
downloadmediawikicore-2bc42c16b3513d5828f4c085207f419bb8cc2209.tar.gz
mediawikicore-2bc42c16b3513d5828f4c085207f419bb8cc2209.zip
resourceloader: Make JSMinPlus allow reserved words as property name (ES5)
This makes parse of "var a = { true: 12 };" and "var a = { true: 12 };" possible thus making JSMinPlus ES5 compatible. Bug: T215280 Change-Id: I84bcacf26ab8900d09958b5d961cc40e1a046698
-rw-r--r--includes/libs/jsminplus.php50
-rw-r--r--tests/phpunit/includes/libs/JavaScriptMinifierTest.php4
2 files changed, 51 insertions, 3 deletions
diff --git a/includes/libs/jsminplus.php b/includes/libs/jsminplus.php
index 08e9d690db26..3134e50cfafb 100644
--- a/includes/libs/jsminplus.php
+++ b/includes/libs/jsminplus.php
@@ -1292,7 +1292,10 @@ class JSParser
if ($tt == OP_DOT)
{
- $this->t->mustMatch(TOKEN_IDENTIFIER);
+ $tt = $this->t->get();
+ if (!$this->isKeyword($tt) && $tt !== TOKEN_IDENTIFIER)
+ throw $this->t->newSyntaxError("Unexpected token; token identifier or keyword expected.");
+
array_push($operands, new JSNode($this->t, OP_DOT, array_pop($operands), new JSNode($this->t)));
}
else
@@ -1427,6 +1430,11 @@ class JSParser
}
else
{
+ // Accept keywords as property names by treating
+ // them similarly with identifiers
+ if ($this->isKeyword($tt))
+ $tt = TOKEN_IDENTIFIER;
+
switch ($tt)
{
case TOKEN_IDENTIFIER:
@@ -1618,6 +1626,46 @@ class JSParser
return $n;
}
+
+ private function isKeyword($tt)
+ {
+ switch ($tt) {
+ case KEYWORD_BREAK:
+ case KEYWORD_CASE:
+ case KEYWORD_CATCH:
+ case KEYWORD_CONST:
+ case KEYWORD_CONTINUE:
+ case KEYWORD_DEBUGGER:
+ case KEYWORD_DEFAULT:
+ case KEYWORD_DELETE:
+ case KEYWORD_DO:
+ case KEYWORD_ELSE:
+ case KEYWORD_ENUM:
+ case KEYWORD_FALSE:
+ case KEYWORD_FINALLY:
+ case KEYWORD_FOR:
+ case KEYWORD_FUNCTION:
+ case KEYWORD_IF:
+ case KEYWORD_IN:
+ case KEYWORD_INSTANCEOF:
+ case KEYWORD_NEW:
+ case KEYWORD_NULL:
+ case KEYWORD_RETURN:
+ case KEYWORD_SWITCH:
+ case KEYWORD_THIS:
+ case KEYWORD_THROW:
+ case KEYWORD_TRUE:
+ case KEYWORD_TRY:
+ case KEYWORD_TYPEOF:
+ case KEYWORD_VAR:
+ case KEYWORD_VOID:
+ case KEYWORD_WHILE:
+ case KEYWORD_WITH:
+ return true;
+ default:
+ return false;
+ }
+ }
}
class JSCompilerContext
diff --git a/tests/phpunit/includes/libs/JavaScriptMinifierTest.php b/tests/phpunit/includes/libs/JavaScriptMinifierTest.php
index 54dc583b10e9..d57d0dd553cc 100644
--- a/tests/phpunit/includes/libs/JavaScriptMinifierTest.php
+++ b/tests/phpunit/includes/libs/JavaScriptMinifierTest.php
@@ -182,8 +182,8 @@ class JavaScriptMinifierTest extends PHPUnit\Framework\TestCase {
// Boolean minification (!0 / !1)
[ "var a = { b: true };", "var a={b:!0};" ],
- [ "var a = { true: 12 };", "var a={true:12};", false ],
- [ "a.true = 12;", "a.true=12;", false ],
+ [ "var a = { true: 12 };", "var a={true:12};" ],
+ [ "a.true = 12;", "a.true=12;" ],
[ "a.foo = true;", "a.foo=!0;" ],
[ "a.foo = false;", "a.foo=!1;" ],
];