Web Inspector: SourceCode.requestContent should return a promise
[WebKit-https.git] / Source / WebInspectorUI / UserInterface / Models / CSSStyleSheet.js
1 /*
2  * Copyright (C) 2013 Apple Inc. 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 WebInspector.CSSStyleSheet = function(id, url, parentFrame)
27 {
28     WebInspector.SourceCode.call(this);
29
30     console.assert(id);
31
32     this._id = id || null;
33
34     this.updateInfo(url, parentFrame);
35 };
36
37 WebInspector.Object.addConstructorFunctions(WebInspector.CSSStyleSheet);
38
39 WebInspector.CSSStyleSheet.resetUniqueDisplayNameNumbers = function()
40 {
41     WebInspector.CSSStyleSheet._nextUniqueDisplayNameNumber = 1;
42 };
43
44 WebInspector.CSSStyleSheet._nextUniqueDisplayNameNumber = 1;
45
46 WebInspector.CSSStyleSheet.Event = {
47     ContentDidChange: "stylesheet-content-did-change"
48 };
49
50 WebInspector.CSSStyleSheet.prototype = {
51     constructor: WebInspector.CSSStyleSheet,
52
53     // Public
54
55     get id()
56     {
57         return this._id;
58     },
59
60     get parentFrame()
61     {
62         return this._parentFrame;
63     },
64
65     get url()
66     {
67         return this._url;
68     },
69
70     get urlComponents()
71     {
72         if (!this._urlComponents)
73             this._urlComponents = parseURL(this._url);
74         return this._urlComponents;
75     },
76
77     get displayName()
78     {
79         if (this._url)
80             return WebInspector.displayNameForURL(this._url, this.urlComponents);
81
82         // Assign a unique number to the StyleSheet object so it will stay the same.
83         if (!this._uniqueDisplayNameNumber)
84             this._uniqueDisplayNameNumber = this.constructor._nextUniqueDisplayNameNumber++;
85
86         return WebInspector.UIString("Anonymous StyleSheet %d").format(this._uniqueDisplayNameNumber);
87     },
88
89     // Protected
90
91     updateInfo: function(url, parentFrame)
92     {
93         this._url = url || null;
94         delete this._urlComponents;
95
96         this._parentFrame = parentFrame || null;
97     },
98
99     get revisionForRequestedContent()
100     {
101         return this.currentRevision;
102     },
103
104     handleCurrentRevisionContentChange: function()
105     {
106         if (!this._id)
107             return;
108
109         function contentDidChange(error)
110         {
111             if (error)
112                 return;
113
114             DOMAgent.markUndoableState();
115
116             this.dispatchEventToListeners(WebInspector.CSSStyleSheet.Event.ContentDidChange);
117         }
118
119         this._ignoreNextContentDidChangeNotification = true;
120
121         CSSAgent.setStyleSheetText(this._id, this.currentRevision.content, contentDidChange.bind(this));
122     },
123
124     requestContentFromBackend: function()
125     {
126         if (!this._id) {
127             // There is no identifier to request content with. Reject the promise to cause the
128             // pending callbacks to get null content.
129             return Promise.reject(new Error("There is no identifier to request content with."));
130         }
131
132         return CSSAgent.getStyleSheetText.promise(this._id);
133     },
134
135     noteContentDidChange: function()
136     {
137         if (this._ignoreNextContentDidChangeNotification) {
138             delete this._ignoreNextContentDidChangeNotification;
139             return false;
140         }
141
142         this.markContentAsStale();
143         this.dispatchEventToListeners(WebInspector.CSSStyleSheet.Event.ContentDidChange);
144         return true;
145     }
146 };
147
148 WebInspector.CSSStyleSheet.prototype.__proto__ = WebInspector.SourceCode.prototype;