diff options
author | Barak Korren <[email protected]> | 2013-04-02 20:38:07 +0300 |
---|---|---|
committer | Barak Korren <[email protected]> | 2013-04-02 20:38:07 +0300 |
commit | 58a2577d48790c79adfd44bcfd662c980ce6cfe4 (patch) | |
tree | 523d814ea0b7b6f617fe515b186099c6e83fed72 /lib/dojo/dom-geometry.js.uncompressed.js | |
parent | e470a273cf09562fb2f9c0c899002303f19c8d16 (diff) | |
parent | cc332603431102a682feda22b9cf0093a29f0176 (diff) |
Merge branch 'master' of https://github.com/gothfox/Tiny-Tiny-RSS.git
Diffstat (limited to 'lib/dojo/dom-geometry.js.uncompressed.js')
-rw-r--r-- | lib/dojo/dom-geometry.js.uncompressed.js | 605 |
1 files changed, 0 insertions, 605 deletions
diff --git a/lib/dojo/dom-geometry.js.uncompressed.js b/lib/dojo/dom-geometry.js.uncompressed.js deleted file mode 100644 index 06b38c295..000000000 --- a/lib/dojo/dom-geometry.js.uncompressed.js +++ /dev/null @@ -1,605 +0,0 @@ -define("dojo/dom-geometry", ["./sniff", "./_base/window","./dom", "./dom-style"], - function(has, win, dom, style){ - // module: - // dojo/dom-geometry - - // the result object - var geom = { - // summary: - // This module defines the core dojo DOM geometry API. - }; - - // Box functions will assume this model. - // On IE/Opera, BORDER_BOX will be set if the primary document is in quirks mode. - // Can be set to change behavior of box setters. - - // can be either: - // "border-box" - // "content-box" (default) - geom.boxModel = "content-box"; - - // We punt per-node box mode testing completely. - // If anybody cares, we can provide an additional (optional) unit - // that overrides existing code to include per-node box sensitivity. - - // Opera documentation claims that Opera 9 uses border-box in BackCompat mode. - // but experiments (Opera 9.10.8679 on Windows Vista) indicate that it actually continues to use content-box. - // IIRC, earlier versions of Opera did in fact use border-box. - // Opera guys, this is really confusing. Opera being broken in quirks mode is not our fault. - - if(has("ie") /*|| has("opera")*/){ - // client code may have to adjust if compatMode varies across iframes - geom.boxModel = document.compatMode == "BackCompat" ? "border-box" : "content-box"; - } - - geom.getPadExtents = function getPadExtents(/*DomNode*/ node, /*Object*/ computedStyle){ - // summary: - // Returns object with special values specifically useful for node - // fitting. - // description: - // Returns an object with `w`, `h`, `l`, `t` properties: - // | l/t/r/b = left/top/right/bottom padding (respectively) - // | w = the total of the left and right padding - // | h = the total of the top and bottom padding - // If 'node' has position, l/t forms the origin for child nodes. - // The w/h are used for calculating boxes. - // Normally application code will not need to invoke this - // directly, and will use the ...box... functions instead. - // node: DOMNode - // computedStyle: Object? - // This parameter accepts computed styles object. - // If this parameter is omitted, the functions will call - // dojo.getComputedStyle to get one. It is a better way, calling - // dojo.computedStyle once, and then pass the reference to this - // computedStyle parameter. Wherever possible, reuse the returned - // object of dojo/dom-style.getComputedStyle(). - - node = dom.byId(node); - var s = computedStyle || style.getComputedStyle(node), px = style.toPixelValue, - l = px(node, s.paddingLeft), t = px(node, s.paddingTop), r = px(node, s.paddingRight), b = px(node, s.paddingBottom); - return {l: l, t: t, r: r, b: b, w: l + r, h: t + b}; - }; - - var none = "none"; - - geom.getBorderExtents = function getBorderExtents(/*DomNode*/ node, /*Object*/ computedStyle){ - // summary: - // returns an object with properties useful for noting the border - // dimensions. - // description: - // - l/t/r/b = the sum of left/top/right/bottom border (respectively) - // - w = the sum of the left and right border - // - h = the sum of the top and bottom border - // - // The w/h are used for calculating boxes. - // Normally application code will not need to invoke this - // directly, and will use the ...box... functions instead. - // node: DOMNode - // computedStyle: Object? - // This parameter accepts computed styles object. - // If this parameter is omitted, the functions will call - // dojo.getComputedStyle to get one. It is a better way, calling - // dojo.computedStyle once, and then pass the reference to this - // computedStyle parameter. Wherever possible, reuse the returned - // object of dojo/dom-style.getComputedStyle(). - - node = dom.byId(node); - var px = style.toPixelValue, s = computedStyle || style.getComputedStyle(node), - l = s.borderLeftStyle != none ? px(node, s.borderLeftWidth) : 0, - t = s.borderTopStyle != none ? px(node, s.borderTopWidth) : 0, - r = s.borderRightStyle != none ? px(node, s.borderRightWidth) : 0, - b = s.borderBottomStyle != none ? px(node, s.borderBottomWidth) : 0; - return {l: l, t: t, r: r, b: b, w: l + r, h: t + b}; - }; - - geom.getPadBorderExtents = function getPadBorderExtents(/*DomNode*/ node, /*Object*/ computedStyle){ - // summary: - // Returns object with properties useful for box fitting with - // regards to padding. - // description: - // - l/t/r/b = the sum of left/top/right/bottom padding and left/top/right/bottom border (respectively) - // - w = the sum of the left and right padding and border - // - h = the sum of the top and bottom padding and border - // - // The w/h are used for calculating boxes. - // Normally application code will not need to invoke this - // directly, and will use the ...box... functions instead. - // node: DOMNode - // computedStyle: Object? - // This parameter accepts computed styles object. - // If this parameter is omitted, the functions will call - // dojo.getComputedStyle to get one. It is a better way, calling - // dojo.computedStyle once, and then pass the reference to this - // computedStyle parameter. Wherever possible, reuse the returned - // object of dojo/dom-style.getComputedStyle(). - - node = dom.byId(node); - var s = computedStyle || style.getComputedStyle(node), - p = geom.getPadExtents(node, s), - b = geom.getBorderExtents(node, s); - return { - l: p.l + b.l, - t: p.t + b.t, - r: p.r + b.r, - b: p.b + b.b, - w: p.w + b.w, - h: p.h + b.h - }; - }; - - geom.getMarginExtents = function getMarginExtents(node, computedStyle){ - // summary: - // returns object with properties useful for box fitting with - // regards to box margins (i.e., the outer-box). - // - // - l/t = marginLeft, marginTop, respectively - // - w = total width, margin inclusive - // - h = total height, margin inclusive - // - // The w/h are used for calculating boxes. - // Normally application code will not need to invoke this - // directly, and will use the ...box... functions instead. - // node: DOMNode - // computedStyle: Object? - // This parameter accepts computed styles object. - // If this parameter is omitted, the functions will call - // dojo.getComputedStyle to get one. It is a better way, calling - // dojo.computedStyle once, and then pass the reference to this - // computedStyle parameter. Wherever possible, reuse the returned - // object of dojo/dom-style.getComputedStyle(). - - node = dom.byId(node); - var s = computedStyle || style.getComputedStyle(node), px = style.toPixelValue, - l = px(node, s.marginLeft), t = px(node, s.marginTop), r = px(node, s.marginRight), b = px(node, s.marginBottom); - return {l: l, t: t, r: r, b: b, w: l + r, h: t + b}; - }; - - // Box getters work in any box context because offsetWidth/clientWidth - // are invariant wrt box context - // - // They do *not* work for display: inline objects that have padding styles - // because the user agent ignores padding (it's bogus styling in any case) - // - // Be careful with IMGs because they are inline or block depending on - // browser and browser mode. - - // Although it would be easier to read, there are not separate versions of - // _getMarginBox for each browser because: - // 1. the branching is not expensive - // 2. factoring the shared code wastes cycles (function call overhead) - // 3. duplicating the shared code wastes bytes - - geom.getMarginBox = function getMarginBox(/*DomNode*/ node, /*Object*/ computedStyle){ - // summary: - // returns an object that encodes the width, height, left and top - // positions of the node's margin box. - // node: DOMNode - // computedStyle: Object? - // This parameter accepts computed styles object. - // If this parameter is omitted, the functions will call - // dojo.getComputedStyle to get one. It is a better way, calling - // dojo.computedStyle once, and then pass the reference to this - // computedStyle parameter. Wherever possible, reuse the returned - // object of dojo/dom-style.getComputedStyle(). - - node = dom.byId(node); - var s = computedStyle || style.getComputedStyle(node), me = geom.getMarginExtents(node, s), - l = node.offsetLeft - me.l, t = node.offsetTop - me.t, p = node.parentNode, px = style.toPixelValue, pcs; - if(has("mozilla")){ - // Mozilla: - // If offsetParent has a computed overflow != visible, the offsetLeft is decreased - // by the parent's border. - // We don't want to compute the parent's style, so instead we examine node's - // computed left/top which is more stable. - var sl = parseFloat(s.left), st = parseFloat(s.top); - if(!isNaN(sl) && !isNaN(st)){ - l = sl; - t = st; - }else{ - // If child's computed left/top are not parseable as a number (e.g. "auto"), we - // have no choice but to examine the parent's computed style. - if(p && p.style){ - pcs = style.getComputedStyle(p); - if(pcs.overflow != "visible"){ - l += pcs.borderLeftStyle != none ? px(node, pcs.borderLeftWidth) : 0; - t += pcs.borderTopStyle != none ? px(node, pcs.borderTopWidth) : 0; - } - } - } - }else if(has("opera") || (has("ie") == 8 && !has("quirks"))){ - // On Opera and IE 8, offsetLeft/Top includes the parent's border - if(p){ - pcs = style.getComputedStyle(p); - l -= pcs.borderLeftStyle != none ? px(node, pcs.borderLeftWidth) : 0; - t -= pcs.borderTopStyle != none ? px(node, pcs.borderTopWidth) : 0; - } - } - return {l: l, t: t, w: node.offsetWidth + me.w, h: node.offsetHeight + me.h}; - }; - - geom.getContentBox = function getContentBox(node, computedStyle){ - // summary: - // Returns an object that encodes the width, height, left and top - // positions of the node's content box, irrespective of the - // current box model. - // node: DOMNode - // computedStyle: Object? - // This parameter accepts computed styles object. - // If this parameter is omitted, the functions will call - // dojo.getComputedStyle to get one. It is a better way, calling - // dojo.computedStyle once, and then pass the reference to this - // computedStyle parameter. Wherever possible, reuse the returned - // object of dojo/dom-style.getComputedStyle(). - - // clientWidth/Height are important since the automatically account for scrollbars - // fallback to offsetWidth/Height for special cases (see #3378) - node = dom.byId(node); - var s = computedStyle || style.getComputedStyle(node), w = node.clientWidth, h, - pe = geom.getPadExtents(node, s), be = geom.getBorderExtents(node, s); - if(!w){ - w = node.offsetWidth; - h = node.offsetHeight; - }else{ - h = node.clientHeight; - be.w = be.h = 0; - } - // On Opera, offsetLeft includes the parent's border - if(has("opera")){ - pe.l += be.l; - pe.t += be.t; - } - return {l: pe.l, t: pe.t, w: w - pe.w - be.w, h: h - pe.h - be.h}; - }; - - // Box setters depend on box context because interpretation of width/height styles - // vary wrt box context. - // - // The value of boxModel is used to determine box context. - // boxModel can be set directly to change behavior. - // - // Beware of display: inline objects that have padding styles - // because the user agent ignores padding (it's a bogus setup anyway) - // - // Be careful with IMGs because they are inline or block depending on - // browser and browser mode. - // - // Elements other than DIV may have special quirks, like built-in - // margins or padding, or values not detectable via computedStyle. - // In particular, margins on TABLE do not seems to appear - // at all in computedStyle on Mozilla. - - function setBox(/*DomNode*/ node, /*Number?*/ l, /*Number?*/ t, /*Number?*/ w, /*Number?*/ h, /*String?*/ u){ - // summary: - // sets width/height/left/top in the current (native) box-model - // dimensions. Uses the unit passed in u. - // node: - // DOM Node reference. Id string not supported for performance - // reasons. - // l: - // left offset from parent. - // t: - // top offset from parent. - // w: - // width in current box model. - // h: - // width in current box model. - // u: - // unit measure to use for other measures. Defaults to "px". - u = u || "px"; - var s = node.style; - if(!isNaN(l)){ - s.left = l + u; - } - if(!isNaN(t)){ - s.top = t + u; - } - if(w >= 0){ - s.width = w + u; - } - if(h >= 0){ - s.height = h + u; - } - } - - function isButtonTag(/*DomNode*/ node){ - // summary: - // True if the node is BUTTON or INPUT.type="button". - return node.tagName.toLowerCase() == "button" || - node.tagName.toLowerCase() == "input" && (node.getAttribute("type") || "").toLowerCase() == "button"; // boolean - } - - function usesBorderBox(/*DomNode*/ node){ - // summary: - // True if the node uses border-box layout. - - // We could test the computed style of node to see if a particular box - // has been specified, but there are details and we choose not to bother. - - // TABLE and BUTTON (and INPUT type=button) are always border-box by default. - // If you have assigned a different box to either one via CSS then - // box functions will break. - - return geom.boxModel == "border-box" || node.tagName.toLowerCase() == "table" || isButtonTag(node); // boolean - } - - geom.setContentSize = function setContentSize(/*DomNode*/ node, /*Object*/ box, /*Object*/ computedStyle){ - // summary: - // Sets the size of the node's contents, irrespective of margins, - // padding, or borders. - // node: DOMNode - // box: Object - // hash with optional "w", and "h" properties for "width", and "height" - // respectively. All specified properties should have numeric values in whole pixels. - // computedStyle: Object? - // This parameter accepts computed styles object. - // If this parameter is omitted, the functions will call - // dojo.getComputedStyle to get one. It is a better way, calling - // dojo.computedStyle once, and then pass the reference to this - // computedStyle parameter. Wherever possible, reuse the returned - // object of dojo/dom-style.getComputedStyle(). - - node = dom.byId(node); - var w = box.w, h = box.h; - if(usesBorderBox(node)){ - var pb = geom.getPadBorderExtents(node, computedStyle); - if(w >= 0){ - w += pb.w; - } - if(h >= 0){ - h += pb.h; - } - } - setBox(node, NaN, NaN, w, h); - }; - - var nilExtents = {l: 0, t: 0, w: 0, h: 0}; - - geom.setMarginBox = function setMarginBox(/*DomNode*/ node, /*Object*/ box, /*Object*/ computedStyle){ - // summary: - // sets the size of the node's margin box and placement - // (left/top), irrespective of box model. Think of it as a - // passthrough to setBox that handles box-model vagaries for - // you. - // node: DOMNode - // box: Object - // hash with optional "l", "t", "w", and "h" properties for "left", "right", "width", and "height" - // respectively. All specified properties should have numeric values in whole pixels. - // computedStyle: Object? - // This parameter accepts computed styles object. - // If this parameter is omitted, the functions will call - // dojo.getComputedStyle to get one. It is a better way, calling - // dojo.computedStyle once, and then pass the reference to this - // computedStyle parameter. Wherever possible, reuse the returned - // object of dojo/dom-style.getComputedStyle(). - - node = dom.byId(node); - var s = computedStyle || style.getComputedStyle(node), w = box.w, h = box.h, - // Some elements have special padding, margin, and box-model settings. - // To use box functions you may need to set padding, margin explicitly. - // Controlling box-model is harder, in a pinch you might set dojo/dom-geometry.boxModel. - pb = usesBorderBox(node) ? nilExtents : geom.getPadBorderExtents(node, s), - mb = geom.getMarginExtents(node, s); - if(has("webkit")){ - // on Safari (3.1.2), button nodes with no explicit size have a default margin - // setting an explicit size eliminates the margin. - // We have to swizzle the width to get correct margin reading. - if(isButtonTag(node)){ - var ns = node.style; - if(w >= 0 && !ns.width){ - ns.width = "4px"; - } - if(h >= 0 && !ns.height){ - ns.height = "4px"; - } - } - } - if(w >= 0){ - w = Math.max(w - pb.w - mb.w, 0); - } - if(h >= 0){ - h = Math.max(h - pb.h - mb.h, 0); - } - setBox(node, box.l, box.t, w, h); - }; - - // ============================= - // Positioning - // ============================= - - geom.isBodyLtr = function isBodyLtr(/*Document?*/ doc){ - // summary: - // Returns true if the current language is left-to-right, and false otherwise. - // doc: Document? - // Optional document to query. If unspecified, use win.doc. - // returns: Boolean - - doc = doc || win.doc; - return (win.body(doc).dir || doc.documentElement.dir || "ltr").toLowerCase() == "ltr"; // Boolean - }; - - geom.docScroll = function docScroll(/*Document?*/ doc){ - // summary: - // Returns an object with {node, x, y} with corresponding offsets. - // doc: Document? - // Optional document to query. If unspecified, use win.doc. - // returns: Object - - doc = doc || win.doc; - var node = win.doc.parentWindow || win.doc.defaultView; // use UI window, not dojo.global window. TODO: use dojo/window::get() except for circular dependency problem - return "pageXOffset" in node ? {x: node.pageXOffset, y: node.pageYOffset } : - (node = has("quirks") ? win.body(doc) : doc.documentElement) && - {x: geom.fixIeBiDiScrollLeft(node.scrollLeft || 0, doc), y: node.scrollTop || 0 }; - }; - - if(has("ie")){ - geom.getIeDocumentElementOffset = function getIeDocumentElementOffset(/*Document?*/ doc){ - // summary: - // returns the offset in x and y from the document body to the - // visual edge of the page for IE - // doc: Document? - // Optional document to query. If unspecified, use win.doc. - // description: - // The following values in IE contain an offset: - // | event.clientX - // | event.clientY - // | node.getBoundingClientRect().left - // | node.getBoundingClientRect().top - // But other position related values do not contain this offset, - // such as node.offsetLeft, node.offsetTop, node.style.left and - // node.style.top. The offset is always (2, 2) in LTR direction. - // When the body is in RTL direction, the offset counts the width - // of left scroll bar's width. This function computes the actual - // offset. - - //NOTE: assumes we're being called in an IE browser - - doc = doc || win.doc; - var de = doc.documentElement; // only deal with HTML element here, position() handles body/quirks - - if(has("ie") < 8){ - var r = de.getBoundingClientRect(), // works well for IE6+ - l = r.left, t = r.top; - if(has("ie") < 7){ - l += de.clientLeft; // scrollbar size in strict/RTL, or, - t += de.clientTop; // HTML border size in strict - } - return { - x: l < 0 ? 0 : l, // FRAME element border size can lead to inaccurate negative values - y: t < 0 ? 0 : t - }; - }else{ - return { - x: 0, - y: 0 - }; - } - }; - } - - geom.fixIeBiDiScrollLeft = function fixIeBiDiScrollLeft(/*Integer*/ scrollLeft, /*Document?*/ doc){ - // summary: - // In RTL direction, scrollLeft should be a negative value, but IE - // returns a positive one. All codes using documentElement.scrollLeft - // must call this function to fix this error, otherwise the position - // will offset to right when there is a horizontal scrollbar. - // scrollLeft: Number - // doc: Document? - // Optional document to query. If unspecified, use win.doc. - // returns: Number - - // In RTL direction, scrollLeft should be a negative value, but IE - // returns a positive one. All codes using documentElement.scrollLeft - // must call this function to fix this error, otherwise the position - // will offset to right when there is a horizontal scrollbar. - - doc = doc || win.doc; - var ie = has("ie"); - if(ie && !geom.isBodyLtr(doc)){ - var qk = has("quirks"), - de = qk ? win.body(doc) : doc.documentElement, - pwin = win.global; // TODO: use winUtils.get(doc) after resolving circular dependency b/w dom-geometry.js and dojo/window.js - if(ie == 6 && !qk && pwin.frameElement && de.scrollHeight > de.clientHeight){ - scrollLeft += de.clientLeft; // workaround ie6+strict+rtl+iframe+vertical-scrollbar bug where clientWidth is too small by clientLeft pixels - } - return (ie < 8 || qk) ? (scrollLeft + de.clientWidth - de.scrollWidth) : -scrollLeft; // Integer - } - return scrollLeft; // Integer - }; - - geom.position = function(/*DomNode*/ node, /*Boolean?*/ includeScroll){ - // summary: - // Gets the position and size of the passed element relative to - // the viewport (if includeScroll==false), or relative to the - // document root (if includeScroll==true). - // - // description: - // Returns an object of the form: - // `{ x: 100, y: 300, w: 20, h: 15 }`. - // If includeScroll==true, the x and y values will include any - // document offsets that may affect the position relative to the - // viewport. - // Uses the border-box model (inclusive of border and padding but - // not margin). Does not act as a setter. - // node: DOMNode|String - // includeScroll: Boolean? - // returns: Object - - node = dom.byId(node); - var db = win.body(node.ownerDocument), - ret = node.getBoundingClientRect(); - ret = {x: ret.left, y: ret.top, w: ret.right - ret.left, h: ret.bottom - ret.top}; - - if(has("ie") < 9){ - // On IE<9 there's a 2px offset that we need to adjust for, see dojo.getIeDocumentElementOffset() - var offset = geom.getIeDocumentElementOffset(node.ownerDocument); - - // fixes the position in IE, quirks mode - ret.x -= offset.x + (has("quirks") ? db.clientLeft + db.offsetLeft : 0); - ret.y -= offset.y + (has("quirks") ? db.clientTop + db.offsetTop : 0); - } - - // account for document scrolling - // if offsetParent is used, ret value already includes scroll position - // so we may have to actually remove that value if !includeScroll - if(includeScroll){ - var scroll = geom.docScroll(node.ownerDocument); - ret.x += scroll.x; - ret.y += scroll.y; - } - - return ret; // Object - }; - - // random "private" functions wildly used throughout the toolkit - - geom.getMarginSize = function getMarginSize(/*DomNode*/ node, /*Object*/ computedStyle){ - // summary: - // returns an object that encodes the width and height of - // the node's margin box - // node: DOMNode|String - // computedStyle: Object? - // This parameter accepts computed styles object. - // If this parameter is omitted, the functions will call - // dojo.getComputedStyle to get one. It is a better way, calling - // dojo.computedStyle once, and then pass the reference to this - // computedStyle parameter. Wherever possible, reuse the returned - // object of dojo/dom-style.getComputedStyle(). - - node = dom.byId(node); - var me = geom.getMarginExtents(node, computedStyle || style.getComputedStyle(node)); - var size = node.getBoundingClientRect(); - return { - w: (size.right - size.left) + me.w, - h: (size.bottom - size.top) + me.h - }; - }; - - geom.normalizeEvent = function(event){ - // summary: - // Normalizes the geometry of a DOM event, normalizing the pageX, pageY, - // offsetX, offsetY, layerX, and layerX properties - // event: Object - if(!("layerX" in event)){ - event.layerX = event.offsetX; - event.layerY = event.offsetY; - } - if(!has("dom-addeventlistener")){ - // old IE version - // FIXME: scroll position query is duped from dojo.html to - // avoid dependency on that entire module. Now that HTML is in - // Base, we should convert back to something similar there. - var se = event.target; - var doc = (se && se.ownerDocument) || document; - // DO NOT replace the following to use dojo.body(), in IE, document.documentElement should be used - // here rather than document.body - var docBody = has("quirks") ? doc.body : doc.documentElement; - var offset = geom.getIeDocumentElementOffset(doc); - event.pageX = event.clientX + geom.fixIeBiDiScrollLeft(docBody.scrollLeft || 0, doc) - offset.x; - event.pageY = event.clientY + (docBody.scrollTop || 0) - offset.y; - } - }; - - // TODO: evaluate separate getters/setters for position and sizes? - - return geom; -}); |