Index: webkit/glue/devtools/js/inject.js |
=================================================================== |
--- webkit/glue/devtools/js/inject.js (revision 14844) |
+++ webkit/glue/devtools/js/inject.js (working copy) |
@@ -111,28 +111,28 @@ |
if (!node.nodeType == Node.ELEMENT_NODE) { |
return {}; |
} |
- var matchedRules = window.getMatchedCSSRules(node, '', authorOnly); |
+ var matchedRules = window.getMatchedCSSRules(node, '', false); |
var matchedCSSRulesObj = []; |
for (var i = 0; matchedRules && i < matchedRules.length; ++i) { |
- var rule = matchedRules[i]; |
- var style = this.serializeStyle_(rule.style); |
+ var rule = matchedRules[i]; |
+ var parentStyleSheet = rule.parentStyleSheet; |
+ var isUserAgent = parentStyleSheet && !parentStyleSheet.ownerNode && |
+ !parentStyleSheet.href; |
+ var isUser = parentStyleSheet && parentStyleSheet.ownerNode && |
+ parentStyleSheet.ownerNode.nodeName == '#document'; |
+ |
+ var style = this.serializeStyle_(rule.style, !isUserAgent && !isUser); |
var ruleValue = { |
'selector' : rule.selectorText, |
'style' : style |
}; |
- if (rule.parentStyleSheet) { |
+ if (parentStyleSheet) { |
ruleValue['parentStyleSheet'] = { |
- 'href' : rule.parentStyleSheet.href, |
- 'ownerNodeName' : rule.parentStyleSheet.ownerNode ? |
- rule.parentStyleSheet.ownerNode.name : null |
+ 'href' : parentStyleSheet.href, |
+ 'ownerNodeName' : parentStyleSheet.ownerNode ? |
+ parentStyleSheet.ownerNode.name : null |
}; |
} |
- var parentStyleSheetHref = (rule.parentStyleSheet ? |
- rule.parentStyleSheet.href : undefined); |
- var parentStyleSheetOwnerNodeName; |
- if (rule.parentStyleSheet && rule.parentStyleSheet.ownerNode) { |
- parentStyleSheetOwnerNodeName = rule.parentStyleSheet.ownerNode.name; |
- } |
matchedCSSRulesObj.push(ruleValue); |
} |
@@ -141,12 +141,11 @@ |
for (var i = 0; attributes && i < attributes.length; ++i) { |
if (attributes[i].style) { |
attributeStyles[attributes[i].name] = |
- this.serializeStyle_(attributes[i].style); |
+ this.serializeStyle_(attributes[i].style, true); |
} |
} |
- |
var result = { |
- 'inlineStyle' : this.serializeStyle_(node.style), |
+ 'inlineStyle' : this.serializeStyle_(node.style, true), |
'computedStyle' : this.serializeStyle_( |
window.getComputedStyle(node, '')), |
'matchedCSSRules' : matchedCSSRulesObj, |
@@ -189,19 +188,21 @@ |
/** |
* Converts given style into serializable object. |
* @param {CSSStyleDeclaration} style Style to serialize. |
+ * @param {boolean} opt_bind Determins whether this style should be bound. |
* @return {Array<Object>} Serializable object. |
* @private |
*/ |
-devtools.Injected.prototype.serializeStyle_ = function(style) { |
+devtools.Injected.prototype.serializeStyle_ = function(style, opt_bind) { |
if (!style) { |
return []; |
} |
- if (!style.__id) { |
- style.__id = this.lastStyleId_++; |
+ var id = style.__id; |
+ if (opt_bind && !id) { |
+ id = style.__id = this.lastStyleId_++; |
this.styles_.push(style); |
} |
var result = [ |
- style.__id, |
+ id, |
style.__disabledProperties, |
style.__disabledPropertyValues, |
style.__disabledPropertyPriorities |
@@ -270,12 +271,76 @@ |
/** |
- * Returns longhand proeprties for a given shorthand one. |
- * @param {CSSStyleDeclaration} style Style declaration to use for lookup. |
- * @param {string} shorthandProperty Shorthand property to get longhands for. |
- * @return {Array.<string>} Array with longhand properties. |
- * @private |
+ * Applies given text to a style. |
+ * @param {Node} node Node to get prorotypes for. |
+ * @param {number} styleId Id of style to toggle. |
+ * @param {string} name Style element name. |
+ * @param {string} styleText New style text. |
+ * @return {boolean} True iff style has been edited successfully. |
*/ |
+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!
|
+ name, styleText) { |
+ var style = this.getStyleForId_(node, styleId); |
+ if (!style) { |
+ return false; |
+ } |
+ |
+ var styleTextLength = this.trimWhitespace_(styleText).length; |
+ |
+ // Create a new element to parse the user input CSS. |
+ var parseElement = document.createElement("span"); |
+ parseElement.setAttribute("style", styleText); |
+ |
+ var tempStyle = parseElement.style; |
+ if (tempStyle.length || !styleTextLength) { |
+ // The input was parsable or the user deleted everything, so remove the |
+ // original property from the real style declaration. If this represents |
+ // a shorthand remove all the longhand properties. |
+ if (style.getPropertyShorthand(name)) { |
+ var longhandProperties = this.getLonghandProperties_(style, name); |
+ for (var i = 0; i < longhandProperties.length; ++i) { |
+ style.removeProperty(longhandProperties[i]); |
+ } |
+ } else { |
+ style.removeProperty(name); |
+ } |
+ } |
+ if (!tempStyle.length) { |
+ // The user typed something, but it didn't parse. Just abort and restore |
+ // the original title for this property. |
+ return false; |
+ } |
+ |
+ // Iterate of the properties on the test element's style declaration and |
+ // add them to the real style declaration. We take care to move shorthands. |
+ var foundShorthands = {}; |
+ var uniqueProperties = this.getUniqueStyleProperties_(tempStyle); |
+ for (var i = 0; i < uniqueProperties.length; ++i) { |
+ var name = uniqueProperties[i]; |
+ var shorthand = tempStyle.getPropertyShorthand(name); |
+ |
+ if (shorthand && shorthand in foundShorthands) { |
+ continue; |
+ } |
+ |
+ if (shorthand) { |
+ var value = this.getShorthandValue_(tempStyle, shorthand); |
+ var priority = this.getShorthandPriority_(tempStyle, shorthand); |
+ foundShorthands[shorthand] = true; |
+ } else { |
+ var value = tempStyle.getPropertyValue(name); |
+ var priority = tempStyle.getPropertyPriority(name); |
+ } |
+ // Set the property on the real style declaration. |
+ style.setProperty((shorthand || name), value, priority); |
+ } |
+ return true; |
+}; |
+ |
+ |
+/** |
+ * Taken from utilities.js as is for injected evaluation. |
+ */ |
devtools.Injected.prototype.getLonghandProperties_ = function(style, |
shorthandProperty) { |
var properties = []; |
@@ -292,3 +357,92 @@ |
} |
return properties; |
}; |
+ |
+ |
+/** |
+ * Taken from utilities.js as is for injected evaluation. |
+ */ |
+devtools.Injected.prototype.getShorthandValue_ = function(style, |
+ shorthandProperty) { |
+ var value = style.getPropertyValue(shorthandProperty); |
+ if (!value) { |
+ // Some shorthands (like border) return a null value, so compute a |
+ // shorthand value. |
+ // FIXME: remove this when http://bugs.webkit.org/show_bug.cgi?id=15823 |
+ // is fixed. |
+ |
+ var foundProperties = {}; |
+ for (var i = 0; i < style.length; ++i) { |
+ var individualProperty = style[i]; |
+ if (individualProperty in foundProperties || |
+ style.getPropertyShorthand(individualProperty) !== |
+ shorthandProperty) { |
+ continue; |
+ } |
+ |
+ var individualValue = style.getPropertyValue(individualProperty); |
+ if (style.isPropertyImplicit(individualProperty) || |
+ individualValue === "initial") { |
+ continue; |
+ } |
+ |
+ foundProperties[individualProperty] = true; |
+ |
+ if (!value) { |
+ value = ""; |
+ } else if (value.length) { |
+ value += " "; |
+ } |
+ value += individualValue; |
+ } |
+ } |
+ return value; |
+}; |
+ |
+ |
+/** |
+ * Taken from utilities.js as is for injected evaluation. |
+ */ |
+devtools.Injected.prototype.getShorthandPriority_ = function(style, |
+ shorthandProperty) { |
+ var priority = style.getPropertyPriority(shorthandProperty); |
+ if (!priority) { |
+ for (var i = 0; i < style.length; ++i) { |
+ var individualProperty = style[i]; |
+ if (style.getPropertyShorthand(individualProperty) !== |
+ shorthandProperty) { |
+ continue; |
+ } |
+ priority = style.getPropertyPriority(individualProperty); |
+ break; |
+ } |
+ } |
+ return priority; |
+}; |
+ |
+ |
+/** |
+ * Taken from utilities.js as is for injected evaluation. |
+ */ |
+devtools.Injected.prototype.trimWhitespace_ = function(str) { |
+ return str.replace(/^[\s\xA0]+|[\s\xA0]+$/g, ''); |
+}; |
+ |
+ |
+/** |
+ * Taken from utilities.js as is for injected evaluation. |
+ */ |
+devtools.Injected.prototype.getUniqueStyleProperties_ = function(style) { |
+ var properties = []; |
+ var foundProperties = {}; |
+ |
+ for (var i = 0; i < style.length; ++i) { |
+ var property = style[i]; |
+ if (property in foundProperties) { |
+ continue; |
+ } |
+ foundProperties[property] = true; |
+ properties.push(property); |
+ } |
+ return properties; |
+}; |