/* * weinre is available under *either* the terms of the modified BSD license *or* the * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text. * * Copyright (c) 2011 IBM Corporation */ requireClass ../common/Binding requireClass ../common/Weinre //----------------------------------------------------------------------------- class ElementHighlighter this.boxMargin = document.createElement("div") this.boxBorder = document.createElement("div") this.boxPadding = document.createElement("div") this.boxContent = document.createElement("div") this.boxMargin.appendChild(this.boxBorder) this.boxBorder.appendChild(this.boxPadding) this.boxPadding.appendChild(this.boxContent) this.boxMargin.style.backgroundColor = "#FCC" this.boxBorder.style.backgroundColor = "#000" this.boxPadding.style.backgroundColor = "#CFC" this.boxContent.style.backgroundColor = "#CCF" this.boxMargin.style.opacity = this.boxBorder.style.opacity = this.boxPadding.style.opacity = this.boxContent.style.opacity = 0.6 this.boxMargin.style.position = this.boxBorder.style.position = this.boxPadding.style.position = this.boxContent.style.position = "absolute" this.boxMargin.style.borderWidth = this.boxBorder.style.borderWidth = this.boxPadding.style.borderWidth = this.boxContent.style.borderWidth = "thin" this.boxMargin.style.borderStyle = this.boxBorder.style.borderStyle = this.boxPadding.style.borderStyle = this.boxContent.style.borderStyle = "solid" this.boxMargin.__weinreHighlighter = this.boxBorder.__weinreHighlighter = this.boxPadding.__weinreHighlighter = this.boxContent.__weinreHighlighter = true this.boxMargin.style.display = "none" document.body.appendChild(this.boxMargin) //----------------------------------------------------------------------------- method on(element) if (null == element) return if (element.nodeType != Node.ELEMENT_NODE) return this.calculateMetrics(element) this.boxMargin.style.display = "block" //----------------------------------------------------------------------------- method off this.boxMargin.style.display = "none" //----------------------------------------------------------------------------- getter element return this.boxMargin //----------------------------------------------------------------------------- method calculateMetrics(element) var metrics = getMetrics(element) this.boxMargin.style.top = metrics.y + "px" this.boxMargin.style.left = metrics.x + "px" this.boxMargin.style.height = metrics.height + "px" this.boxMargin.style.width = metrics.width + "px" this.boxBorder.style.top = metrics.marginTop + "px" this.boxBorder.style.left = metrics.marginLeft + "px" this.boxBorder.style.bottom = metrics.marginBottom + "px" this.boxBorder.style.right = metrics.marginRight + "px" this.boxPadding.style.top = metrics.borderTop + "px" this.boxPadding.style.left = metrics.borderLeft + "px" this.boxPadding.style.bottom = metrics.borderBottom + "px" this.boxPadding.style.right = metrics.borderRight + "px" this.boxContent.style.top = metrics.paddingTop + "px" this.boxContent.style.left = metrics.paddingLeft + "px" this.boxContent.style.bottom = metrics.paddingBottom + "px" this.boxContent.style.right = metrics.paddingRight + "px" //----------------------------------------------------------------------------- function getMetrics(element) var result = {} // get the x,y position var left = 0 var top = 0 var el = element do { left += el.offsetLeft top += el.offsetTop } while (el = el.offsetParent) result.x = left result.y = top // get the computed style var cStyle = document.defaultView.getComputedStyle(element) result.width = fromPx(cStyle["width"]) result.height = fromPx(cStyle["height"]) result.marginLeft = fromPx(cStyle["margin-left"]) result.marginRight = fromPx(cStyle["margin-right"]) result.marginTop = fromPx(cStyle["margin-top"]) result.marginBottom = fromPx(cStyle["margin-bottom"]) result.borderLeft = fromPx(cStyle["border-left-width"]) result.borderRight = fromPx(cStyle["border-right-width"]) result.borderTop = fromPx(cStyle["border-top-width"]) result.borderBottom = fromPx(cStyle["border-bottom-width"]) result.paddingLeft = fromPx(cStyle["padding-left"]) result.paddingRight = fromPx(cStyle["padding-right"]) result.paddingTop = fromPx(cStyle["padding-top"]) result.paddingBottom = fromPx(cStyle["padding-bottom"]) result.width += result.marginLeft + result.marginRight + result.borderRight + result.paddingLeft + result.paddingRight result.height += result.marginTop + result.marginBottom + result.borderBottom + result.paddingTop + result.paddingBottom result.x -= result.marginLeft result.y -= result.marginTop return result //----------------------------------------------------------------------------- function fromPx(string) return parseInt(string.replace(/px$/,""))