Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(514)

Side by Side Diff: webkit/glue/devtools/js/inject.js

Issue 100199: DevTools: Implement styles editing. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 11 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 /** 5 /**
6 * @fileoverview Javascript that is being injected into the inspectable page 6 * @fileoverview Javascript that is being injected into the inspectable page
7 * while debugging. 7 * while debugging.
8 */ 8 */
9 goog.require('goog.json'); 9 goog.require('goog.json');
10 goog.provide('devtools.Injected'); 10 goog.provide('devtools.Injected');
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 * Returns style information that is used in devtools.js. 104 * Returns style information that is used in devtools.js.
105 * @param {Node} node Node to get prorotypes for. 105 * @param {Node} node Node to get prorotypes for.
106 * @param {boolean} authorOnly Determines whether only author styles need to 106 * @param {boolean} authorOnly Determines whether only author styles need to
107 * be added. 107 * be added.
108 * @return {string} Style collection descriptor. 108 * @return {string} Style collection descriptor.
109 */ 109 */
110 devtools.Injected.prototype.getStyles = function(node, authorOnly) { 110 devtools.Injected.prototype.getStyles = function(node, authorOnly) {
111 if (!node.nodeType == Node.ELEMENT_NODE) { 111 if (!node.nodeType == Node.ELEMENT_NODE) {
112 return {}; 112 return {};
113 } 113 }
114 var matchedRules = window.getMatchedCSSRules(node, '', authorOnly); 114 var matchedRules = window.getMatchedCSSRules(node, '', false);
115 var matchedCSSRulesObj = []; 115 var matchedCSSRulesObj = [];
116 for (var i = 0; matchedRules && i < matchedRules.length; ++i) { 116 for (var i = 0; matchedRules && i < matchedRules.length; ++i) {
117 var rule = matchedRules[i]; 117 var rule = matchedRules[i];
118 var style = this.serializeStyle_(rule.style); 118 var parentStyleSheet = rule.parentStyleSheet;
119 var isUserAgent = parentStyleSheet && !parentStyleSheet.ownerNode &&
120 !parentStyleSheet.href;
121 var isUser = parentStyleSheet && parentStyleSheet.ownerNode &&
122 parentStyleSheet.ownerNode.nodeName == '#document';
123
124 var style = this.serializeStyle_(rule.style, !isUserAgent && !isUser);
119 var ruleValue = { 125 var ruleValue = {
120 'selector' : rule.selectorText, 126 'selector' : rule.selectorText,
121 'style' : style 127 'style' : style
122 }; 128 };
123 if (rule.parentStyleSheet) { 129 if (parentStyleSheet) {
124 ruleValue['parentStyleSheet'] = { 130 ruleValue['parentStyleSheet'] = {
125 'href' : rule.parentStyleSheet.href, 131 'href' : parentStyleSheet.href,
126 'ownerNodeName' : rule.parentStyleSheet.ownerNode ? 132 'ownerNodeName' : parentStyleSheet.ownerNode ?
127 rule.parentStyleSheet.ownerNode.name : null 133 parentStyleSheet.ownerNode.name : null
128 }; 134 };
129 } 135 }
130 var parentStyleSheetHref = (rule.parentStyleSheet ?
131 rule.parentStyleSheet.href : undefined);
132 var parentStyleSheetOwnerNodeName;
133 if (rule.parentStyleSheet && rule.parentStyleSheet.ownerNode) {
134 parentStyleSheetOwnerNodeName = rule.parentStyleSheet.ownerNode.name;
135 }
136 matchedCSSRulesObj.push(ruleValue); 136 matchedCSSRulesObj.push(ruleValue);
137 } 137 }
138 138
139 var attributeStyles = {}; 139 var attributeStyles = {};
140 var attributes = node.attributes; 140 var attributes = node.attributes;
141 for (var i = 0; attributes && i < attributes.length; ++i) { 141 for (var i = 0; attributes && i < attributes.length; ++i) {
142 if (attributes[i].style) { 142 if (attributes[i].style) {
143 attributeStyles[attributes[i].name] = 143 attributeStyles[attributes[i].name] =
144 this.serializeStyle_(attributes[i].style); 144 this.serializeStyle_(attributes[i].style, true);
145 } 145 }
146 } 146 }
147
148 var result = { 147 var result = {
149 'inlineStyle' : this.serializeStyle_(node.style), 148 'inlineStyle' : this.serializeStyle_(node.style, true),
150 'computedStyle' : this.serializeStyle_( 149 'computedStyle' : this.serializeStyle_(
151 window.getComputedStyle(node, '')), 150 window.getComputedStyle(node, '')),
152 'matchedCSSRules' : matchedCSSRulesObj, 151 'matchedCSSRules' : matchedCSSRulesObj,
153 'styleAttributes' : attributeStyles 152 'styleAttributes' : attributeStyles
154 }; 153 };
155 return result; 154 return result;
156 }; 155 };
157 156
158 157
159 /** 158 /**
(...skipping 22 matching lines...) Expand all
182 } 181 }
183 return null; 182 return null;
184 }; 183 };
185 184
186 185
187 186
188 187
189 /** 188 /**
190 * Converts given style into serializable object. 189 * Converts given style into serializable object.
191 * @param {CSSStyleDeclaration} style Style to serialize. 190 * @param {CSSStyleDeclaration} style Style to serialize.
191 * @param {boolean} opt_bind Determins whether this style should be bound.
192 * @return {Array<Object>} Serializable object. 192 * @return {Array<Object>} Serializable object.
193 * @private 193 * @private
194 */ 194 */
195 devtools.Injected.prototype.serializeStyle_ = function(style) { 195 devtools.Injected.prototype.serializeStyle_ = function(style, opt_bind) {
196 if (!style) { 196 if (!style) {
197 return []; 197 return [];
198 } 198 }
199 if (!style.__id) { 199 var id = style.__id;
200 style.__id = this.lastStyleId_++; 200 if (opt_bind && !id) {
201 id = style.__id = this.lastStyleId_++;
201 this.styles_.push(style); 202 this.styles_.push(style);
202 } 203 }
203 var result = [ 204 var result = [
204 style.__id, 205 id,
205 style.__disabledProperties, 206 style.__disabledProperties,
206 style.__disabledPropertyValues, 207 style.__disabledPropertyValues,
207 style.__disabledPropertyPriorities 208 style.__disabledPropertyPriorities
208 ]; 209 ];
209 for (var i = 0; i < style.length; ++i) { 210 for (var i = 0; i < style.length; ++i) {
210 var name = style[i]; 211 var name = style[i];
211 result.push([ 212 result.push([
212 name, 213 name,
213 style.getPropertyPriority(name), 214 style.getPropertyPriority(name),
214 style.isPropertyImplicit(name), 215 style.isPropertyImplicit(name),
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
263 264
264 delete style.__disabledProperties[name]; 265 delete style.__disabledProperties[name];
265 delete style.__disabledPropertyValues[name]; 266 delete style.__disabledPropertyValues[name];
266 delete style.__disabledPropertyPriorities[name]; 267 delete style.__disabledPropertyPriorities[name];
267 } 268 }
268 return true; 269 return true;
269 }; 270 };
270 271
271 272
272 /** 273 /**
273 * Returns longhand proeprties for a given shorthand one. 274 * Applies given text to a style.
274 * @param {CSSStyleDeclaration} style Style declaration to use for lookup. 275 * @param {Node} node Node to get prorotypes for.
275 * @param {string} shorthandProperty Shorthand property to get longhands for. 276 * @param {number} styleId Id of style to toggle.
276 * @return {Array.<string>} Array with longhand properties. 277 * @param {string} name Style element name.
277 * @private 278 * @param {string} styleText New style text.
279 * @return {boolean} True iff style has been edited successfully.
280 */
281 devtools.Injected.prototype.applyStyleText = function(node, styleId,
yurys 2009/04/30 09:55:40 wrong parameter alignment here and in some other p
pfeldman 2009/04/30 10:00:16 Lets better stick to this schema!
282 name, styleText) {
283 var style = this.getStyleForId_(node, styleId);
284 if (!style) {
285 return false;
286 }
287
288 var styleTextLength = this.trimWhitespace_(styleText).length;
289
290 // Create a new element to parse the user input CSS.
291 var parseElement = document.createElement("span");
292 parseElement.setAttribute("style", styleText);
293
294 var tempStyle = parseElement.style;
295 if (tempStyle.length || !styleTextLength) {
296 // The input was parsable or the user deleted everything, so remove the
297 // original property from the real style declaration. If this represents
298 // a shorthand remove all the longhand properties.
299 if (style.getPropertyShorthand(name)) {
300 var longhandProperties = this.getLonghandProperties_(style, name);
301 for (var i = 0; i < longhandProperties.length; ++i) {
302 style.removeProperty(longhandProperties[i]);
303 }
304 } else {
305 style.removeProperty(name);
306 }
307 }
308 if (!tempStyle.length) {
309 // The user typed something, but it didn't parse. Just abort and restore
310 // the original title for this property.
311 return false;
312 }
313
314 // Iterate of the properties on the test element's style declaration and
315 // add them to the real style declaration. We take care to move shorthands.
316 var foundShorthands = {};
317 var uniqueProperties = this.getUniqueStyleProperties_(tempStyle);
318 for (var i = 0; i < uniqueProperties.length; ++i) {
319 var name = uniqueProperties[i];
320 var shorthand = tempStyle.getPropertyShorthand(name);
321
322 if (shorthand && shorthand in foundShorthands) {
323 continue;
324 }
325
326 if (shorthand) {
327 var value = this.getShorthandValue_(tempStyle, shorthand);
328 var priority = this.getShorthandPriority_(tempStyle, shorthand);
329 foundShorthands[shorthand] = true;
330 } else {
331 var value = tempStyle.getPropertyValue(name);
332 var priority = tempStyle.getPropertyPriority(name);
333 }
334 // Set the property on the real style declaration.
335 style.setProperty((shorthand || name), value, priority);
336 }
337 return true;
338 };
339
340
341 /**
342 * Taken from utilities.js as is for injected evaluation.
278 */ 343 */
279 devtools.Injected.prototype.getLonghandProperties_ = function(style, 344 devtools.Injected.prototype.getLonghandProperties_ = function(style,
280 shorthandProperty) { 345 shorthandProperty) {
281 var properties = []; 346 var properties = [];
282 var foundProperties = {}; 347 var foundProperties = {};
283 348
284 for (var i = 0; i < style.length; ++i) { 349 for (var i = 0; i < style.length; ++i) {
285 var individualProperty = style[i]; 350 var individualProperty = style[i];
286 if (individualProperty in foundProperties || 351 if (individualProperty in foundProperties ||
287 style.getPropertyShorthand(individualProperty) != shorthandProperty) { 352 style.getPropertyShorthand(individualProperty) != shorthandProperty) {
288 continue; 353 continue;
289 } 354 }
290 foundProperties[individualProperty] = true; 355 foundProperties[individualProperty] = true;
291 properties.push(individualProperty); 356 properties.push(individualProperty);
292 } 357 }
293 return properties; 358 return properties;
294 }; 359 };
360
361
362 /**
363 * Taken from utilities.js as is for injected evaluation.
364 */
365 devtools.Injected.prototype.getShorthandValue_ = function(style,
366 shorthandProperty) {
367 var value = style.getPropertyValue(shorthandProperty);
368 if (!value) {
369 // Some shorthands (like border) return a null value, so compute a
370 // shorthand value.
371 // FIXME: remove this when http://bugs.webkit.org/show_bug.cgi?id=15823
372 // is fixed.
373
374 var foundProperties = {};
375 for (var i = 0; i < style.length; ++i) {
376 var individualProperty = style[i];
377 if (individualProperty in foundProperties ||
378 style.getPropertyShorthand(individualProperty) !==
379 shorthandProperty) {
380 continue;
381 }
382
383 var individualValue = style.getPropertyValue(individualProperty);
384 if (style.isPropertyImplicit(individualProperty) ||
385 individualValue === "initial") {
386 continue;
387 }
388
389 foundProperties[individualProperty] = true;
390
391 if (!value) {
392 value = "";
393 } else if (value.length) {
394 value += " ";
395 }
396 value += individualValue;
397 }
398 }
399 return value;
400 };
401
402
403 /**
404 * Taken from utilities.js as is for injected evaluation.
405 */
406 devtools.Injected.prototype.getShorthandPriority_ = function(style,
407 shorthandProperty) {
408 var priority = style.getPropertyPriority(shorthandProperty);
409 if (!priority) {
410 for (var i = 0; i < style.length; ++i) {
411 var individualProperty = style[i];
412 if (style.getPropertyShorthand(individualProperty) !==
413 shorthandProperty) {
414 continue;
415 }
416 priority = style.getPropertyPriority(individualProperty);
417 break;
418 }
419 }
420 return priority;
421 };
422
423
424 /**
425 * Taken from utilities.js as is for injected evaluation.
426 */
427 devtools.Injected.prototype.trimWhitespace_ = function(str) {
428 return str.replace(/^[\s\xA0]+|[\s\xA0]+$/g, '');
429 };
430
431
432 /**
433 * Taken from utilities.js as is for injected evaluation.
434 */
435 devtools.Injected.prototype.getUniqueStyleProperties_ = function(style) {
436 var properties = [];
437 var foundProperties = {};
438
439 for (var i = 0; i < style.length; ++i) {
440 var property = style[i];
441 if (property in foundProperties) {
442 continue;
443 }
444 foundProperties[property] = true;
445 properties.push(property);
446 }
447 return properties;
448 };
OLDNEW
« webkit/glue/devtools/js/dom_agent.js ('K') | « webkit/glue/devtools/js/dom_agent.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698