c54f92bca4581e4f1956fdb5cf437cb71cea7b3f
[WebKit-https.git] / Source / WebInspectorUI / UserInterface / Models / Collection.js
1 /*
2  * Copyright (C) 2016 Devin Rousso <webkit@devinrousso.com>. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 WI.Collection = class Collection extends WI.Object
27 {
28     constructor(typeVerifier)
29     {
30         super();
31
32         this._items = new Set;
33
34         console.assert(!typeVerifier || typeof typeVerifier === "function");
35         this._typeVerifier = typeVerifier || WI.Collection.TypeVerifier.Any;
36     }
37
38      // Public
39
40     get items() { return this._items; }
41     get typeVerifier() { return this._typeVerifier; }
42
43     add(item)
44     {
45         let isValidType = this._typeVerifier(item);
46         console.assert(isValidType);
47         if (!isValidType)
48             return;
49
50         console.assert(!this._items.has(item));
51         this._items.add(item);
52
53         this.itemAdded(item);
54
55         this.dispatchEventToListeners(WI.Collection.Event.ItemAdded, {item});
56     }
57
58     remove(item)
59     {
60         let wasRemoved = this._items.delete(item);
61         console.assert(wasRemoved);
62
63         this.itemRemoved(item);
64
65         this.dispatchEventToListeners(WI.Collection.Event.ItemRemoved, {item});
66     }
67
68     clear()
69     {
70         let items = new Set(this._items);
71
72         this._items.clear();
73
74         this.itemsCleared(items);
75
76         for (let item of items)
77             this.dispatchEventToListeners(WI.Collection.Event.ItemRemoved, {item});
78     }
79
80     toArray()
81     {
82         return Array.from(this._items);
83     }
84
85     toJSON()
86     {
87         return this.toArray();
88     }
89
90      // Protected
91
92     itemAdded(item)
93     {
94         // Implemented by subclasses.
95     }
96
97     itemRemoved(item)
98     {
99         // Implemented by subclasses.
100     }
101
102     itemsCleared(items)
103     {
104         // Implemented by subclasses.
105     }
106 };
107
108  WI.Collection.Event = {
109     ItemAdded: "collection-item-added",
110     ItemRemoved: "collection-item-removed",
111 };
112
113  WI.Collection.TypeVerifier = {
114     Any: (object) => true,
115     Frame: (object) => object instanceof WI.Frame,
116     Resource: (object) => object instanceof WI.Resource,
117     Script: (object) => object instanceof WI.Script,
118     CSSStyleSheet: (object) => object instanceof WI.CSSStyleSheet,
119     Canvas: (object) => object instanceof WI.Canvas,
120     ShaderProgram: (object) => object instanceof WI.ShaderProgram,
121 };