Web Inspector: Move the computation that results in UI strings from JSC to the Web...
[WebKit-https.git] / Source / WebInspectorUI / UserInterface / Models / TypeSet.js
1 /*
2  * Copyright (C) 2014 Apple Inc. All rights reserved.
3  * Copyright (C) Saam Barati.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
15  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
16  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
18  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
24  * THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 WebInspector.TypeSet = function(runtimeTypeDescriptionPayload)
28 {
29     this._types = runtimeTypeDescriptionPayload;
30
31     var typeSet = this._types.typeSet;
32     var bitString = 0x0;
33     if (typeSet.isFunction)
34         bitString |= WebInspector.TypeSet.TypeBit.Function;
35     if (typeSet.isUndefined)
36         bitString |= WebInspector.TypeSet.TypeBit.Undefined;
37     if (typeSet.isNull)
38         bitString |= WebInspector.TypeSet.TypeBit.Null;
39     if (typeSet.isBoolean)
40         bitString |= WebInspector.TypeSet.TypeBit.Boolean;
41     if (typeSet.isInteger)
42         bitString |= WebInspector.TypeSet.TypeBit.Integer;
43     if (typeSet.isNumber)
44         bitString |= WebInspector.TypeSet.TypeBit.Number;
45     if (typeSet.isString)
46         bitString |= WebInspector.TypeSet.TypeBit.String;
47     if (typeSet.isObject)
48         bitString |= WebInspector.TypeSet.TypeBit.Object;
49
50     console.assert(bitString);
51     this._bitString = bitString;
52
53     this._primitiveTypeNames = null;
54 };
55
56 WebInspector.TypeSet.fromPayload = function(payload)
57 {
58     return new WebInspector.TypeSet(payload);
59 };
60
61 WebInspector.TypeSet.TypeBit = {
62     "Function"    :  0x1,
63     "Undefined"   :  0x2,
64     "Null"        :  0x4,
65     "Boolean"     :  0x8,
66     "Integer"     :  0x10,
67     "Number"      :  0x20,
68     "String"      :  0x40,
69     "Object"      :  0x80
70 };
71
72 WebInspector.TypeSet.NullOrUndefinedTypeBits = WebInspector.TypeSet.TypeBit.Null | WebInspector.TypeSet.TypeBit.Undefined;
73
74 WebInspector.TypeSet.prototype = {
75     constructor: WebInspector.TypeSet,
76     __proto__: WebInspector.Object.prototype,
77
78     isContainedIn: function(test)
79     {
80         // This function checks if types in bitString are contained in the types described by the 'test' bitstring. (i.e we haven't seen more types than 'test').
81         // We have seen fewer or equal number of types as 'test' if ANDing bitString with test doesn't zero out any of our bits.
82
83         // For example:
84
85         // 0b0110 (bitString)
86         // 0b1111 (test)
87         // ------ (AND)
88         // 0b0110 == bitString
89
90         // 0b0110 (bitString)
91         // 0b0010 (test)
92         // ------ (AND)
93         // 0b0010 != bitString
94
95         return this._bitString && (this._bitString & test) === this._bitString;
96     },
97
98     get primitiveTypeNames()
99     {
100         if (this._primitiveTypeNames)
101             return this._primitiveTypeNames;
102
103         this._primitiveTypeNames = [];
104         var typeSet = this._types.typeSet;
105         if (typeSet.isUndefined)
106             this._primitiveTypeNames.push("Undefined");
107         if (typeSet.isNull)
108             this._primitiveTypeNames.push("Null");
109         if (typeSet.isBoolean)
110             this._primitiveTypeNames.push("Boolean");
111         if (typeSet.isString)
112             this._primitiveTypeNames.push("String");
113
114         // It's implied that type Integer is contained in type Number. Don't put 
115         // both 'Integer' and 'Number' into the set because this could imply that 
116         // Number means to Double instead of Double|Integer.
117         if (typeSet.isNumber)
118             this._primitiveTypeNames.push("Number");
119         else if (typeSet.isInteger)
120             this._primitiveTypeNames.push("Integer");
121
122         return this._primitiveTypeNames;
123     }
124 };