@@ -37,19 +37,15 @@ define(function CSSAgent(require, exports, module) {
3737
3838 require ( "thirdparty/path-utils/path-utils.min" ) ;
3939
40+ var _ = require ( "thirdparty/lodash" ) ;
41+
4042 var Inspector = require ( "LiveDevelopment/Inspector/Inspector" ) ;
4143
4244 /**
43- * Stylesheet urls
45+ * Stylesheet details
4446 * @type {Object.<string, CSS.CSSStyleSheetHeader> }
4547 */
46- var _urlToStyle = { } ;
47-
48- /**
49- * Map of stylesheet ids to urls
50- * @type {Object.<string, string> }
51- */
52- var _styleSheetIdToUrl ;
48+ var _styleSheetDetails = { } ;
5349
5450 /**
5551 * Is getAllStyleSheets() API defined? - This is undefined until we test for API
@@ -73,18 +69,26 @@ define(function CSSAgent(require, exports, module) {
7369 * @param {frame: Frame } res
7470 */
7571 function _onFrameNavigated ( event , res ) {
76- // Clear maps when navigating to a new page
77- _urlToStyle = { } ;
78- _styleSheetIdToUrl = { } ;
72+ // Clear maps when navigating to a new page, but not if an iframe was loaded
73+ if ( ! res . frame . parentId ) {
74+ _styleSheetDetails = { } ;
75+ }
7976 }
8077
8178 /**
82- * Get a style sheet for a url
79+ * Get the style sheets for a url
8380 * @param {string } url
84- * @return {CSS. CSSStyleSheetHeader }
81+ * @return {Object.<string, CSSStyleSheetHeader> }
8582 */
8683 function styleForURL ( url ) {
87- return _urlToStyle [ _canonicalize ( url ) ] ;
84+ var styleSheetId , styles = { } ;
85+ url = _canonicalize ( url ) ;
86+ for ( styleSheetId in _styleSheetDetails ) {
87+ if ( _styleSheetDetails [ styleSheetId ] . canonicalizedURL === url ) {
88+ styles [ styleSheetId ] = _styleSheetDetails [ styleSheetId ] ;
89+ }
90+ }
91+ return styles ;
8892 }
8993
9094 /**
@@ -93,24 +97,36 @@ define(function CSSAgent(require, exports, module) {
9397 * @deprecated
9498 */
9599 function getStylesheetURLs ( ) {
96- var urls = [ ] , url ;
97- for ( url in _urlToStyle ) {
98- if ( _urlToStyle . hasOwnProperty ( url ) ) {
99- urls . push ( url ) ;
100- }
100+ var styleSheetId , urls = [ ] ;
101+ for ( styleSheetId in _styleSheetDetails ) {
102+ urls [ _styleSheetDetails [ styleSheetId ] . canonicalizedURL ] = true ;
101103 }
102- return urls ;
104+ return _ . keys ( urls ) ;
103105 }
104106
105107 /**
106108 * Reload a CSS style sheet from a document
107109 * @param {Document } document
110+ * @param {string= } newContent new content of every stylesheet. Defaults to doc.getText() if omitted
108111 * @return {jQuery.Promise }
109112 */
110- function reloadCSSForDocument ( doc ) {
111- var style = styleForURL ( doc . url ) ;
112- console . assert ( style , "Style Sheet for document not loaded: " + doc . url ) ;
113- return Inspector . CSS . setStyleSheetText ( style . styleSheetId , doc . getText ( ) ) ;
113+ function reloadCSSForDocument ( doc , newContent ) {
114+ var styles = styleForURL ( doc . url ) ,
115+ styleSheetId ,
116+ deferreds = [ ] ;
117+
118+ if ( newContent === undefined ) {
119+ newContent = doc . getText ( ) ;
120+ }
121+ for ( styleSheetId in styles ) {
122+ deferreds . push ( Inspector . CSS . setStyleSheetText ( styles [ styleSheetId ] . styleSheetId , newContent ) ) ;
123+ }
124+ if ( ! deferreds . length ) {
125+ console . error ( "Style Sheet for document not loaded: " + doc . url ) ;
126+ return new $ . Deferred ( ) . reject ( ) . promise ( ) ;
127+ }
128+ // return master deferred
129+ return $ . when . apply ( $ , deferreds ) ;
114130 }
115131
116132 /**
@@ -119,9 +135,7 @@ define(function CSSAgent(require, exports, module) {
119135 * @return {jQuery.Promise }
120136 */
121137 function clearCSSForDocument ( doc ) {
122- var style = styleForURL ( doc . url ) ;
123- console . assert ( style , "Style Sheet for document not loaded: " + doc . url ) ;
124- return Inspector . CSS . setStyleSheetText ( style . styleSheetId , "" ) ;
138+ return reloadCSSForDocument ( doc , "" ) ;
125139 }
126140
127141 /**
@@ -130,16 +144,21 @@ define(function CSSAgent(require, exports, module) {
130144 * @param {header: CSSStyleSheetHeader }
131145 */
132146 function _styleSheetAdded ( event , res ) {
133- var url = _canonicalize ( res . header . sourceURL ) ,
134- existing = _urlToStyle [ url ] ;
147+ var url = _canonicalize ( res . header . sourceURL ) ,
148+ existing = styleForURL ( res . header . sourceURL ) ,
149+ styleSheetId = res . header . styleSheetId ,
150+ duplicate ;
135151
136152 // detect duplicates
137- if ( existing && existing . styleSheetId === res . header . styleSheetId ) {
153+ duplicate = _ . some ( existing , function ( styleSheet ) {
154+ return styleSheet && styleSheet . styleSheetId === styleSheetId ;
155+ } ) ;
156+ if ( duplicate ) {
138157 return ;
139158 }
140159
141- _urlToStyle [ url ] = res . header ;
142- _styleSheetIdToUrl [ res . header . styleSheetId ] = url ;
160+ _styleSheetDetails [ styleSheetId ] = res . header ;
161+ _styleSheetDetails [ styleSheetId ] . canonicalizedURL = url ; // canonicalized URL
143162
144163 $ ( exports ) . triggerHandler ( "styleSheetAdded" , [ url , res . header ] ) ;
145164 }
@@ -150,16 +169,11 @@ define(function CSSAgent(require, exports, module) {
150169 * @param {styleSheetId: StyleSheetId }
151170 */
152171 function _styleSheetRemoved ( event , res ) {
153- var url = _styleSheetIdToUrl [ res . styleSheetId ] ,
154- header = url && _urlToStyle [ url ] ;
155-
156- if ( url ) {
157- delete _urlToStyle [ url ] ;
158- }
172+ var header = _styleSheetDetails [ res . styleSheetId ] ;
159173
160- delete _styleSheetIdToUrl [ res . styleSheetId ] ;
174+ delete _styleSheetDetails [ res . styleSheetId ] ;
161175
162- $ ( exports ) . triggerHandler ( "styleSheetRemoved" , [ url , header ] ) ;
176+ $ ( exports ) . triggerHandler ( "styleSheetRemoved" , [ header . canonicalizedURL , header ] ) ;
163177 }
164178
165179 /**
@@ -233,4 +247,4 @@ define(function CSSAgent(require, exports, module) {
233247 exports . clearCSSForDocument = clearCSSForDocument ;
234248 exports . load = load ;
235249 exports . unload = unload ;
236- } ) ;
250+ } ) ;
0 commit comments