001    // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
002    // for details. All rights reserved. Use of this source code is governed by a
003    // BSD-style license that can be found in the LICENSE file.
004    
005    package com.google.dart.compiler.backend.js;
006    
007    import gnu.trove.THashSet;
008    
009    import java.util.Collections;
010    import java.util.Set;
011    
012    /**
013     * Determines whether or not a particular string is a JavaScript keyword or not.
014     */
015    public class JsReservedIdentifiers {
016        public static final Set<String> reservedGlobalSymbols;
017    
018        static {
019            String[] commonBuiltins = new String[] {
020                    // 15.1.1 Value Properties of the Global Object
021                    "NaN", "Infinity", "undefined",
022    
023                    // 15.1.2 Function Properties of the Global Object
024                    "eval", "parseInt", "parseFloat", "isNan", "isFinite",
025    
026                    // 15.1.3 URI Handling Function Properties
027                    "decodeURI", "decodeURIComponent",
028                    "encodeURI",
029                    "encodeURIComponent",
030    
031                    // 15.1.4 Constructor Properties of the Global Object
032                    "Object", "Function", "Array", "String", "Boolean", "Number", "Date",
033                    "RegExp", "Error", "EvalError", "RangeError", "ReferenceError",
034                    "SyntaxError", "TypeError", "URIError",
035    
036                    // 15.1.5 Other Properties of the Global Object
037                    "Math",
038    
039                    // 10.1.6 Activation Object
040                    "arguments",
041    
042                    // B.2 Additional Properties (non-normative)
043                    "escape", "unescape",
044    
045                    // Window props (https://developer.mozilla.org/en/DOM/window)
046                    "applicationCache", "closed", "Components", "content", "controllers",
047                    "crypto", "defaultStatus", "dialogArguments", "directories",
048                    "document", "frameElement", "frames", "fullScreen", "globalStorage",
049                    "history", "innerHeight", "innerWidth", "length",
050                    "location", "locationbar", "localStorage", "menubar",
051                    "mozInnerScreenX", "mozInnerScreenY", "mozScreenPixelsPerCssPixel",
052                    "name", "navigator", "opener", "outerHeight", "outerWidth",
053                    "pageXOffset", "pageYOffset", "parent", "personalbar", "pkcs11",
054                    "returnValue", "screen", "scrollbars", "scrollMaxX", "scrollMaxY",
055                    "self", "sessionStorage", "sidebar", "status", "statusbar", "toolbar",
056                    "top", "window",
057    
058                    // Window methods (https://developer.mozilla.org/en/DOM/window)
059                    "alert", "addEventListener", "atob", "back", "blur", "btoa",
060                    "captureEvents", "clearInterval", "clearTimeout", "close", "confirm",
061                    "disableExternalCapture", "dispatchEvent", "dump",
062                    "enableExternalCapture", "escape", "find", "focus", "forward",
063                    "GeckoActiveXObject", "getAttention", "getAttentionWithCycleCount",
064                    "getComputedStyle", "getSelection", "home", "maximize", "minimize",
065                    "moveBy", "moveTo", "open", "openDialog", "postMessage", "print",
066                    "prompt", "QueryInterface", "releaseEvents", "removeEventListener",
067                    "resizeBy", "resizeTo", "restore", "routeEvent", "scroll", "scrollBy",
068                    "scrollByLines", "scrollByPages", "scrollTo", "setInterval",
069                    "setResizeable", "setTimeout", "showModalDialog", "sizeToContent",
070                    "stop", "uuescape", "updateCommands", "XPCNativeWrapper",
071                    "XPCSafeJSOjbectWrapper",
072    
073                    // Mozilla Window event handlers, same cite
074                    "onabort", "onbeforeunload", "onchange", "onclick", "onclose",
075                    "oncontextmenu", "ondragdrop", "onerror", "onfocus", "onhashchange",
076                    "onkeydown", "onkeypress", "onkeyup", "onload", "onmousedown",
077                    "onmousemove", "onmouseout", "onmouseover", "onmouseup",
078                    "onmozorientation", "onpaint", "onreset", "onresize", "onscroll",
079                    "onselect", "onsubmit", "onunload",
080    
081                    // Safari Web Content Guide
082                    // http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariWebContent/SafariWebContent.pdf
083                    // WebKit Window member data, from WebKit DOM Reference
084                    // (http://developer.apple.com/safari/library/documentation/AppleApplications/Reference/WebKitDOMRef/DOMWindow_idl/Classes/DOMWindow/index.html)
085                    // TODO(fredsa) Many, many more functions and member data to add
086                    "ontouchcancel", "ontouchend", "ontouchmove", "ontouchstart",
087                    "ongesturestart", "ongesturechange", "ongestureend",
088    
089                    // extra window methods
090                    "uneval",
091    
092                    // keywords https://developer.mozilla.org/en/New_in_JavaScript_1.7,
093                    // https://developer.mozilla.org/en/New_in_JavaScript_1.8.1
094                    "getPrototypeOf", "let", "yield",
095    
096                    // "future reserved words"
097                    "abstract", "int", "short", "boolean", "interface", "static", "byte",
098                    "long", "char", "final", "native", "synchronized", "float", "package",
099                    "throws", "goto", "private", "transient", "implements", "protected",
100                    "volatile", "double", "public",
101    
102                    // IE methods
103                    // (http://msdn.microsoft.com/en-us/library/ms535873(VS.85).aspx#)
104                    "attachEvent", "clientInformation", "clipboardData", "createPopup",
105                    "dialogHeight", "dialogLeft", "dialogTop", "dialogWidth",
106                    "onafterprint", "onbeforedeactivate", "onbeforeprint",
107                    "oncontrolselect", "ondeactivate", "onhelp", "onresizeend",
108    
109                    // Common browser-defined identifiers not defined in ECMAScript
110                    "event", "external", "Debug", "Enumerator", "Global", "Image",
111                    "ActiveXObject", "VBArray", "Components",
112    
113                    // Functions commonly defined on Object
114                    "toString", "getClass", "constructor", "prototype", "valueOf",
115    
116                    // Client-side JavaScript identifiers, which are needed for linkers
117                    // that don't ensure GWT's window != $wnd, document != $doc, etc.
118                    // Taken from the Rhino book, pg 715
119                    "Anchor", "Applet", "Attr", "Canvas", "CanvasGradient",
120                    "CanvasPattern", "CanvasRenderingContext2D", "CDATASection",
121                    "CharacterData", "Comment", "CSS2Properties", "CSSRule",
122                    "CSSStyleSheet", "Document", "DocumentFragment", "DocumentType",
123                    "DOMException", "DOMImplementation", "DOMParser", "Element", "Event",
124                    "ExternalInterface", "FlashPlayer", "Form", "Frame", "History",
125                    "HTMLCollection", "HTMLDocument", "HTMLElement", "IFrame", "Image",
126                    "Input", "JSObject", "KeyEvent", "Link", "Location", "MimeType",
127                    "MouseEvent", "Navigator", "Node", "NodeList", "Option", "Plugin",
128                    "ProcessingInstruction", "Range", "RangeException", "Screen", "Select",
129                    "Table", "TableCell", "TableRow", "TableSelection", "Text", "TextArea",
130                    "UIEvent", "Window", "XMLHttpRequest", "XMLSerializer",
131                    "XPathException", "XPathResult", "XSLTProcessor",
132    
133                    // These keywords trigger the loading of the java-plugin. For the
134                    // next-generation plugin, this results in starting a new Java process.
135                    "java", "Packages", "netscape", "sun", "JavaObject", "JavaClass",
136                    "JavaArray", "JavaMember",
137    
138                    // GWT-defined identifiers
139                    "$wnd", "$doc", "$entry", "$moduleName", "$moduleBase", "$gwt_version", "$sessionId",
140    
141                    // Identifiers used by JsStackEmulator; later set to obfuscatable
142                    "$stack", "$stackDepth", "$location",
143            };
144    
145            reservedGlobalSymbols = new THashSet<String>(commonBuiltins.length);
146            Collections.addAll(reservedGlobalSymbols, commonBuiltins);
147        }
148    
149        private JsReservedIdentifiers() {
150        }
151    }