author | Erik Vold <evold@mozilla.com> |
Sat, 23 Aug 2014 08:30:34 -0700 | |
changeset 201239 | ec2f8320d372db0fe75868ef9cb392a2a2f1c913 |
parent 201238 | 49ff0d5fcd3af9c4e4947ddb344c173c0347865b |
child 201240 | cf45937d8c9de8416f55e4c83817bfe245380ae2 |
push id | 27365 |
push user | ryanvm@gmail.com |
push date | Mon, 25 Aug 2014 15:24:30 +0000 |
treeherder | mozilla-central@23c70481ed91 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | me |
bugs | 1053911 |
milestone | 34.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
deleted file mode 100644 --- a/addon-sdk/source/examples/reddit-panel/README.md +++ /dev/null @@ -1,14 +0,0 @@ -<!-- This Source Code Form is subject to the terms of the Mozilla Public - - License, v. 2.0. If a copy of the MPL was not distributed with this - - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> - -The Reddit Panel example add-on displays Reddit in a panel you open -by clicking a widget in the add-on bar. When you click a Reddit story -in the panel, the story opens in a new tab. - -The add-on demonstrates the Panel and Widget APIs as well as content scripts -and using jQuery as a content script. - -Due to a bug in Firefox 4.0b7, this example doesn't work in that version -of Firefox and requires a recent Firefox 4.0b8pre nightly build, Firefox 4.0b8 -itself, or a newer version of Firefox.
deleted file mode 100644 --- a/addon-sdk/source/examples/reddit-panel/data/jquery-1.4.4.min.js +++ /dev/null @@ -1,167 +0,0 @@ -/*! - * jQuery JavaScript Library v1.4.4 - * http://jquery.com/ - * - * Copyright 2010, John Resig - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * Copyright 2010, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * - * Date: Thu Nov 11 19:04:53 2010 -0500 - */ -(function(E,B){function ka(a,b,d){if(d===B&&a.nodeType===1){d=a.getAttribute("data-"+b);if(typeof d==="string"){try{d=d==="true"?true:d==="false"?false:d==="null"?null:!c.isNaN(d)?parseFloat(d):Ja.test(d)?c.parseJSON(d):d}catch(e){}c.data(a,b,d)}else d=B}return d}function U(){return false}function ca(){return true}function la(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ka(a){var b,d,e,f,h,l,k,o,x,r,A,C=[];f=[];h=c.data(this,this.nodeType?"events":"__events__");if(typeof h==="function")h= -h.events;if(!(a.liveFired===this||!h||!h.live||a.button&&a.type==="click")){if(a.namespace)A=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var J=h.live.slice(0);for(k=0;k<J.length;k++){h=J[k];h.origType.replace(X,"")===a.type?f.push(h.selector):J.splice(k--,1)}f=c(a.target).closest(f,a.currentTarget);o=0;for(x=f.length;o<x;o++){r=f[o];for(k=0;k<J.length;k++){h=J[k];if(r.selector===h.selector&&(!A||A.test(h.namespace))){l=r.elem;e=null;if(h.preType==="mouseenter"|| -h.preType==="mouseleave"){a.type=h.preType;e=c(a.relatedTarget).closest(h.selector)[0]}if(!e||e!==l)C.push({elem:l,handleObj:h,level:r.level})}}}o=0;for(x=C.length;o<x;o++){f=C[o];if(d&&f.level>d)break;a.currentTarget=f.elem;a.data=f.handleObj.data;a.handleObj=f.handleObj;A=f.handleObj.origHandler.apply(f.elem,arguments);if(A===false||a.isPropagationStopped()){d=f.level;if(A===false)b=false;if(a.isImmediatePropagationStopped())break}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(La, -"`").replace(Ma,"&")}function ma(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Na.test(b))return c.filter(b,e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function na(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this, -e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var l in e[h])c.event.add(this,h,e[h][l],e[h][l].data)}}})}function Oa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function oa(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?Pa:Qa,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a, -"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function da(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Ra.test(a)?e(a,h):da(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)?e(a,""):c.each(b,function(f,h){da(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(pa.concat.apply([],pa.slice(0,b)),function(){d[this]=a});return d}function qa(a){if(!ea[a]){var b=c("<"+ -a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";ea[a]=d}return ea[a]}function fa(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var t=E.document,c=function(){function a(){if(!b.isReady){try{t.documentElement.doScroll("left")}catch(j){setTimeout(a,1);return}b.ready()}}var b=function(j,s){return new b.fn.init(j,s)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,l=/\S/,k=/^\s+/,o=/\s+$/,x=/\W/,r=/\d/,A=/^<(\w+)\s*\/?>(?:<\/\1>)?$/, -C=/^[\],:{}\s]*$/,J=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,I=/(?:^|:|,)(?:\s*\[)+/g,L=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,i=/(msie) ([\w.]+)/,n=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false,q=[],u,y=Object.prototype.toString,F=Object.prototype.hasOwnProperty,M=Array.prototype.push,N=Array.prototype.slice,O=String.prototype.trim,D=Array.prototype.indexOf,R={};b.fn=b.prototype={init:function(j, -s){var v,z,H;if(!j)return this;if(j.nodeType){this.context=this[0]=j;this.length=1;return this}if(j==="body"&&!s&&t.body){this.context=t;this[0]=t.body;this.selector="body";this.length=1;return this}if(typeof j==="string")if((v=h.exec(j))&&(v[1]||!s))if(v[1]){H=s?s.ownerDocument||s:t;if(z=A.exec(j))if(b.isPlainObject(s)){j=[t.createElement(z[1])];b.fn.attr.call(j,s,true)}else j=[H.createElement(z[1])];else{z=b.buildFragment([v[1]],[H]);j=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this, -j)}else{if((z=t.getElementById(v[2]))&&z.parentNode){if(z.id!==v[2])return f.find(j);this.length=1;this[0]=z}this.context=t;this.selector=j;return this}else if(!s&&!x.test(j)){this.selector=j;this.context=t;j=t.getElementsByTagName(j);return b.merge(this,j)}else return!s||s.jquery?(s||f).find(j):b(s).find(j);else if(b.isFunction(j))return f.ready(j);if(j.selector!==B){this.selector=j.selector;this.context=j.context}return b.makeArray(j,this)},selector:"",jquery:"1.4.4",length:0,size:function(){return this.length}, -toArray:function(){return N.call(this,0)},get:function(j){return j==null?this.toArray():j<0?this.slice(j)[0]:this[j]},pushStack:function(j,s,v){var z=b();b.isArray(j)?M.apply(z,j):b.merge(z,j);z.prevObject=this;z.context=this.context;if(s==="find")z.selector=this.selector+(this.selector?" ":"")+v;else if(s)z.selector=this.selector+"."+s+"("+v+")";return z},each:function(j,s){return b.each(this,j,s)},ready:function(j){b.bindReady();if(b.isReady)j.call(t,b);else q&&q.push(j);return this},eq:function(j){return j=== --1?this.slice(j):this.slice(j,+j+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(j){return this.pushStack(b.map(this,function(s,v){return j.call(s,v,s)}))},end:function(){return this.prevObject||b(null)},push:M,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var j,s,v,z,H,G=arguments[0]||{},K=1,Q=arguments.length,ga=false; -if(typeof G==="boolean"){ga=G;G=arguments[1]||{};K=2}if(typeof G!=="object"&&!b.isFunction(G))G={};if(Q===K){G=this;--K}for(;K<Q;K++)if((j=arguments[K])!=null)for(s in j){v=G[s];z=j[s];if(G!==z)if(ga&&z&&(b.isPlainObject(z)||(H=b.isArray(z)))){if(H){H=false;v=v&&b.isArray(v)?v:[]}else v=v&&b.isPlainObject(v)?v:{};G[s]=b.extend(ga,v,z)}else if(z!==B)G[s]=z}return G};b.extend({noConflict:function(j){E.$=e;if(j)E.jQuery=d;return b},isReady:false,readyWait:1,ready:function(j){j===true&&b.readyWait--; -if(!b.readyWait||j!==true&&!b.isReady){if(!t.body)return setTimeout(b.ready,1);b.isReady=true;if(!(j!==true&&--b.readyWait>0))if(q){var s=0,v=q;for(q=null;j=v[s++];)j.call(t,b);b.fn.trigger&&b(t).trigger("ready").unbind("ready")}}},bindReady:function(){if(!p){p=true;if(t.readyState==="complete")return setTimeout(b.ready,1);if(t.addEventListener){t.addEventListener("DOMContentLoaded",u,false);E.addEventListener("load",b.ready,false)}else if(t.attachEvent){t.attachEvent("onreadystatechange",u);E.attachEvent("onload", -b.ready);var j=false;try{j=E.frameElement==null}catch(s){}t.documentElement.doScroll&&j&&a()}}},isFunction:function(j){return b.type(j)==="function"},isArray:Array.isArray||function(j){return b.type(j)==="array"},isWindow:function(j){return j&&typeof j==="object"&&"setInterval"in j},isNaN:function(j){return j==null||!r.test(j)||isNaN(j)},type:function(j){return j==null?String(j):R[y.call(j)]||"object"},isPlainObject:function(j){if(!j||b.type(j)!=="object"||j.nodeType||b.isWindow(j))return false;if(j.constructor&& -!F.call(j,"constructor")&&!F.call(j.constructor.prototype,"isPrototypeOf"))return false;for(var s in j);return s===B||F.call(j,s)},isEmptyObject:function(j){for(var s in j)return false;return true},error:function(j){throw j;},parseJSON:function(j){if(typeof j!=="string"||!j)return null;j=b.trim(j);if(C.test(j.replace(J,"@").replace(w,"]").replace(I,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(j):(new Function("return "+j))();else b.error("Invalid JSON: "+j)},noop:function(){},globalEval:function(j){if(j&& -l.test(j)){var s=t.getElementsByTagName("head")[0]||t.documentElement,v=t.createElement("script");v.type="text/javascript";if(b.support.scriptEval)v.appendChild(t.createTextNode(j));else v.text=j;s.insertBefore(v,s.firstChild);s.removeChild(v)}},nodeName:function(j,s){return j.nodeName&&j.nodeName.toUpperCase()===s.toUpperCase()},each:function(j,s,v){var z,H=0,G=j.length,K=G===B||b.isFunction(j);if(v)if(K)for(z in j){if(s.apply(j[z],v)===false)break}else for(;H<G;){if(s.apply(j[H++],v)===false)break}else if(K)for(z in j){if(s.call(j[z], -z,j[z])===false)break}else for(v=j[0];H<G&&s.call(v,H,v)!==false;v=j[++H]);return j},trim:O?function(j){return j==null?"":O.call(j)}:function(j){return j==null?"":j.toString().replace(k,"").replace(o,"")},makeArray:function(j,s){var v=s||[];if(j!=null){var z=b.type(j);j.length==null||z==="string"||z==="function"||z==="regexp"||b.isWindow(j)?M.call(v,j):b.merge(v,j)}return v},inArray:function(j,s){if(s.indexOf)return s.indexOf(j);for(var v=0,z=s.length;v<z;v++)if(s[v]===j)return v;return-1},merge:function(j, -s){var v=j.length,z=0;if(typeof s.length==="number")for(var H=s.length;z<H;z++)j[v++]=s[z];else for(;s[z]!==B;)j[v++]=s[z++];j.length=v;return j},grep:function(j,s,v){var z=[],H;v=!!v;for(var G=0,K=j.length;G<K;G++){H=!!s(j[G],G);v!==H&&z.push(j[G])}return z},map:function(j,s,v){for(var z=[],H,G=0,K=j.length;G<K;G++){H=s(j[G],G,v);if(H!=null)z[z.length]=H}return z.concat.apply([],z)},guid:1,proxy:function(j,s,v){if(arguments.length===2)if(typeof s==="string"){v=j;j=v[s];s=B}else if(s&&!b.isFunction(s)){v= -s;s=B}if(!s&&j)s=function(){return j.apply(v||this,arguments)};if(j)s.guid=j.guid=j.guid||s.guid||b.guid++;return s},access:function(j,s,v,z,H,G){var K=j.length;if(typeof s==="object"){for(var Q in s)b.access(j,Q,s[Q],z,H,v);return j}if(v!==B){z=!G&&z&&b.isFunction(v);for(Q=0;Q<K;Q++)H(j[Q],s,z?v.call(j[Q],Q,H(j[Q],s)):v,G);return j}return K?H(j[0],s):B},now:function(){return(new Date).getTime()},uaMatch:function(j){j=j.toLowerCase();j=L.exec(j)||g.exec(j)||i.exec(j)||j.indexOf("compatible")<0&&n.exec(j)|| -[];return{browser:j[1]||"",version:j[2]||"0"}},browser:{}});b.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(j,s){R["[object "+s+"]"]=s.toLowerCase()});m=b.uaMatch(m);if(m.browser){b.browser[m.browser]=true;b.browser.version=m.version}if(b.browser.webkit)b.browser.safari=true;if(D)b.inArray=function(j,s){return D.call(s,j)};if(!/\s/.test("\u00a0")){k=/^[\s\xA0]+/;o=/[\s\xA0]+$/}f=b(t);if(t.addEventListener)u=function(){t.removeEventListener("DOMContentLoaded",u, -false);b.ready()};else if(t.attachEvent)u=function(){if(t.readyState==="complete"){t.detachEvent("onreadystatechange",u);b.ready()}};return E.jQuery=E.$=b}();(function(){c.support={};var a=t.documentElement,b=t.createElement("script"),d=t.createElement("div"),e="script"+c.now();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],l=t.createElement("select"), -k=l.appendChild(t.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")),hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:k.selected,deleteExpando:true,optDisabled:false,checkClone:false, -scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};l.disabled=true;c.support.optDisabled=!k.disabled;b.type="text/javascript";try{b.appendChild(t.createTextNode("window."+e+"=1;"))}catch(o){}a.insertBefore(b,a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}try{delete b.test}catch(x){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function r(){c.support.noCloneEvent= -false;d.detachEvent("onclick",r)});d.cloneNode(true).fireEvent("onclick")}d=t.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=t.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var r=t.createElement("div");r.style.width=r.style.paddingLeft="1px";t.body.appendChild(r);c.boxModel=c.support.boxModel=r.offsetWidth===2;if("zoom"in r.style){r.style.display="inline";r.style.zoom= -1;c.support.inlineBlockNeedsLayout=r.offsetWidth===2;r.style.display="";r.innerHTML="<div style='width:4px;'></div>";c.support.shrinkWrapBlocks=r.offsetWidth!==2}r.innerHTML="<table><tr><td style='padding:0;display:none'></td><td>t</td></tr></table>";var A=r.getElementsByTagName("td");c.support.reliableHiddenOffsets=A[0].offsetHeight===0;A[0].style.display="";A[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&A[0].offsetHeight===0;r.innerHTML="";t.body.removeChild(r).style.display= -"none"});a=function(r){var A=t.createElement("div");r="on"+r;var C=r in A;if(!C){A.setAttribute(r,"return;");C=typeof A[r]==="function"}return C};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();var ra={},Ja=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?ra:a;var e=a.nodeType,f=e?a[c.expando]:null,h= -c.cache;if(!(e&&!f&&typeof b==="string"&&d===B)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]=c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==B)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?ra:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando); -else if(d)delete f[e];else for(var l in a)delete a[l]}},acceptData:function(a){if(a.nodeName){var b=c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){var d=null;if(typeof a==="undefined"){if(this.length){var e=this[0].attributes,f;d=c.data(this[0]);for(var h=0,l=e.length;h<l;h++){f=e[h].name;if(f.indexOf("data-")===0){f=f.substr(5);ka(this[0],f,d[f])}}}return d}else if(typeof a==="object")return this.each(function(){c.data(this, -a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(b===B){d=this.triggerHandler("getData"+k[1]+"!",[k[0]]);if(d===B&&this.length){d=c.data(this[0],a);d=ka(this[0],a,d)}return d===B&&k[1]?this.data(k[0]):d}else return this.each(function(){var o=c(this),x=[k[0],b];o.triggerHandler("setData"+k[1]+"!",x);c.data(this,a,b);o.triggerHandler("changeData"+k[1]+"!",x)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var e= -c.data(a,b);if(!d)return e||[];if(!e||c.isArray(d))e=c.data(a,b,c.makeArray(d));else e.push(d);return e}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),e=d.shift();if(e==="inprogress")e=d.shift();if(e){b==="fx"&&d.unshift("inprogress");e.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===B)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this, -a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var sa=/[\n\t]/g,ha=/\s+/,Sa=/\r/g,Ta=/^(?:href|src|style)$/,Ua=/^(?:button|input)$/i,Va=/^(?:button|input|object|select|textarea)$/i,Wa=/^a(?:rea)?$/i,ta=/^(?:radio|checkbox)$/i;c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan", -colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};c.fn.extend({attr:function(a,b){return c.access(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(x){var r=c(this);r.addClass(a.call(this,x,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType=== -1)if(f.className){for(var h=" "+f.className+" ",l=f.className,k=0,o=b.length;k<o;k++)if(h.indexOf(" "+b[k]+" ")<0)l+=" "+b[k];f.className=c.trim(l)}else f.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(o){var x=c(this);x.removeClass(a.call(this,o,x.attr("class")))});if(a&&typeof a==="string"||a===B)for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===1&&f.className)if(a){for(var h=(" "+f.className+" ").replace(sa," "), -l=0,k=b.length;l<k;l++)h=h.replace(" "+b[l]+" "," ");f.className=c.trim(h)}else f.className=""}return this},toggleClass:function(a,b){var d=typeof a,e=typeof b==="boolean";if(c.isFunction(a))return this.each(function(f){var h=c(this);h.toggleClass(a.call(this,f,h.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var f,h=0,l=c(this),k=b,o=a.split(ha);f=o[h++];){k=e?k:!l.hasClass(f);l[k?"addClass":"removeClass"](f)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this, -"__className__",this.className);this.className=this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(sa," ").indexOf(a)>-1)return true;return false},val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one"; -if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h<e;h++){var l=f[h];if(l.selected&&(c.support.optDisabled?!l.disabled:l.getAttribute("disabled")===null)&&(!l.parentNode.disabled||!c.nodeName(l.parentNode,"optgroup"))){a=c(l).val();if(b)return a;d.push(a)}}return d}if(ta.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Sa,"")}return B}var k=c.isFunction(a);return this.each(function(o){var x=c(this),r=a;if(this.nodeType===1){if(k)r= -a.call(this,o,x.val());if(r==null)r="";else if(typeof r==="number")r+="";else if(c.isArray(r))r=c.map(r,function(C){return C==null?"":C+""});if(c.isArray(r)&&ta.test(this.type))this.checked=c.inArray(x.val(),r)>=0;else if(c.nodeName(this,"select")){var A=c.makeArray(r);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),A)>=0});if(!A.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true}, -attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return B;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==B;b=e&&c.props[b]||b;var h=Ta.test(b);if((b in a||a[b]!==B)&&e&&!h){if(f){b==="type"&&Ua.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&& -b.specified?b.value:Va.test(a.nodeName)||Wa.test(a.nodeName)&&a.href?0:B;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return B;a=!c.support.hrefNormalized&&e&&h?a.getAttribute(b,2):a.getAttribute(b);return a===null?B:a}});var X=/\.(.*)$/,ia=/^(?:textarea|input|select)$/i,La=/\./g,Ma=/ /g,Xa=/[^\w\s.|`]/g,Ya=function(a){return a.replace(Xa,"\\$&")},ua={focusin:0,focusout:0}; -c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;else if(!d)return;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var l=a.nodeType?"events":"__events__",k=h[l],o=h.handle;if(typeof k==="function"){o=k.handle;k=k.events}else if(!k){a.nodeType||(h[l]=h=function(){});h.events=k={}}if(!o)h.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem, -arguments):B};o.elem=a;b=b.split(" ");for(var x=0,r;l=b[x++];){h=f?c.extend({},f):{handler:d,data:e};if(l.indexOf(".")>-1){r=l.split(".");l=r.shift();h.namespace=r.slice(0).sort().join(".")}else{r=[];h.namespace=""}h.type=l;if(!h.guid)h.guid=d.guid;var A=k[l],C=c.event.special[l]||{};if(!A){A=k[l]=[];if(!C.setup||C.setup.call(a,e,r,o)===false)if(a.addEventListener)a.addEventListener(l,o,false);else a.attachEvent&&a.attachEvent("on"+l,o)}if(C.add){C.add.call(a,h);if(!h.handler.guid)h.handler.guid= -d.guid}A.push(h);c.event.global[l]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,l=0,k,o,x,r,A,C,J=a.nodeType?"events":"__events__",w=c.data(a),I=w&&w[J];if(w&&I){if(typeof I==="function"){w=I;I=I.events}if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in I)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[l++];){r=f;k=f.indexOf(".")<0;o=[];if(!k){o=f.split(".");f=o.shift();x=RegExp("(^|\\.)"+ -c.map(o.slice(0).sort(),Ya).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(A=I[f])if(d){r=c.event.special[f]||{};for(h=e||0;h<A.length;h++){C=A[h];if(d.guid===C.guid){if(k||x.test(C.namespace)){e==null&&A.splice(h--,1);r.remove&&r.remove.call(a,C)}if(e!=null)break}}if(A.length===0||e!=null&&A.length===1){if(!r.teardown||r.teardown.call(a,o)===false)c.removeEvent(a,f,w.handle);delete I[f]}}else for(h=0;h<A.length;h++){C=A[h];if(k||x.test(C.namespace)){c.event.remove(a,r,C.handler,h);A.splice(h--,1)}}}if(c.isEmptyObject(I)){if(b= -w.handle)b.elem=null;delete w.events;delete w.handle;if(typeof w==="function")c.removeData(a,J);else c.isEmptyObject(w)&&c.removeData(a)}}}}},trigger:function(a,b,d,e){var f=a.type||a;if(!e){a=typeof a==="object"?a[c.expando]?a:c.extend(c.Event(f),a):c.Event(f);if(f.indexOf("!")>=0){a.type=f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType=== -8)return B;a.result=B;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)===false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){var l;e=a.target;var k=f.replace(X,""),o=c.nodeName(e,"a")&&k=== -"click",x=c.event.special[k]||{};if((!x._default||x._default.call(d,a)===false)&&!o&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[k]){if(l=e["on"+k])e["on"+k]=null;c.event.triggered=true;e[k]()}}catch(r){}if(l)e["on"+k]=l;c.event.triggered=false}}},handle:function(a){var b,d,e,f;d=[];var h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+ -d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var l=d.length;f<l;f++){var k=d[f];if(b||e.test(k.namespace)){a.handler=k.handler;a.data=k.data;a.handleObj=k;k=k.handler.apply(this,h);if(k!==B){a.result=k;if(k===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), -fix:function(a){if(a[c.expando])return a;var b=a;a=c.Event(b);for(var d=this.props.length,e;d;){e=this.props[--d];a[e]=b[e]}if(!a.target)a.target=a.srcElement||t;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=t.documentElement;d=t.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop|| -d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(a.which==null&&(a.charCode!=null||a.keyCode!=null))a.which=a.charCode!=null?a.charCode:a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==B)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,Y(a.origType,a.selector),c.extend({},a,{handler:Ka,guid:a.handler.guid}))},remove:function(a){c.event.remove(this, -Y(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,d){if(c.isWindow(this))this.onbeforeunload=d},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.removeEvent=t.removeEventListener?function(a,b,d){a.removeEventListener&&a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent&&a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp= -c.now();this[c.expando]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=ca;var a=this.originalEvent;if(a)if(a.preventDefault)a.preventDefault();else a.returnValue=false},stopPropagation:function(){this.isPropagationStopped=ca;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=ca;this.stopPropagation()},isDefaultPrevented:U,isPropagationStopped:U,isImmediatePropagationStopped:U}; -var va=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},wa=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?wa:va,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?wa:va)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(){if(this.nodeName.toLowerCase()!== -"form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length){a.liveFired=B;return la("submit",this,arguments)}});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13){a.liveFired=B;return la("submit",this,arguments)}})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};if(!c.support.changeBubbles){var V, -xa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ia.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=xa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===B||f===e))if(e!=null||f){a.type="change";a.liveFired= -B;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",xa(a))}},setup:function(){if(this.type=== -"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ia.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ia.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}t.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){ua[b]++===0&&t.addEventListener(a,d,true)},teardown:function(){--ua[b]=== -0&&t.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=B}var l=b==="one"?c.proxy(f,function(o){c(this).unbind(o,l);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var k=this.length;h<k;h++)c.event.add(this[h],d,l,e)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&!a.preventDefault)for(var d in a)this.unbind(d, -a[d]);else{d=0;for(var e=this.length;d<e;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,e){return this.live(b,d,e,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var d=c.Event(a);d.preventDefault();d.stopPropagation();c.event.trigger(d,b,this[0]);return d.result}},toggle:function(a){for(var b=arguments,d= -1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(e){var f=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,f+1);e.preventDefault();return b[f].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var ya={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,e,f,h){var l,k=0,o,x,r=h||this.selector;h=h?this:c(this.context);if(typeof d=== -"object"&&!d.preventDefault){for(l in d)h[b](l,e,d[l],r);return this}if(c.isFunction(e)){f=e;e=B}for(d=(d||"").split(" ");(l=d[k++])!=null;){o=X.exec(l);x="";if(o){x=o[0];l=l.replace(X,"")}if(l==="hover")d.push("mouseenter"+x,"mouseleave"+x);else{o=l;if(l==="focus"||l==="blur"){d.push(ya[l]+x);l+=x}else l=(ya[l]||l)+x;if(b==="live"){x=0;for(var A=h.length;x<A;x++)c.event.add(h[x],"live."+Y(l,r),{data:e,selector:r,handler:f,origType:l,origHandler:f,preType:o})}else h.unbind("live."+Y(l,r),f)}}return this}}); -c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){c.fn[b]=function(d,e){if(e==null){e=d;d=null}return arguments.length>0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}}); -(function(){function a(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1&&!q){y.sizcache=n;y.sizset=p}if(y.nodeName.toLowerCase()===i){F=y;break}y=y[g]}m[p]=F}}}function b(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1){if(!q){y.sizcache=n;y.sizset=p}if(typeof i!=="string"){if(y===i){F=true;break}}else if(k.filter(i, -[y]).length>0){F=y;break}}y=y[g]}m[p]=F}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,l=true;[0,0].sort(function(){l=false;return 0});var k=function(g,i,n,m){n=n||[];var p=i=i||t;if(i.nodeType!==1&&i.nodeType!==9)return[];if(!g||typeof g!=="string")return n;var q,u,y,F,M,N=true,O=k.isXML(i),D=[],R=g;do{d.exec("");if(q=d.exec(R)){R=q[3];D.push(q[1]);if(q[2]){F=q[3]; -break}}}while(q);if(D.length>1&&x.exec(g))if(D.length===2&&o.relative[D[0]])u=L(D[0]+D[1],i);else for(u=o.relative[D[0]]?[i]:k(D.shift(),i);D.length;){g=D.shift();if(o.relative[g])g+=D.shift();u=L(g,u)}else{if(!m&&D.length>1&&i.nodeType===9&&!O&&o.match.ID.test(D[0])&&!o.match.ID.test(D[D.length-1])){q=k.find(D.shift(),i,O);i=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]}if(i){q=m?{expr:D.pop(),set:C(m)}:k.find(D.pop(),D.length===1&&(D[0]==="~"||D[0]==="+")&&i.parentNode?i.parentNode:i,O);u=q.expr?k.filter(q.expr, -q.set):q.set;if(D.length>0)y=C(u);else N=false;for(;D.length;){q=M=D.pop();if(o.relative[M])q=D.pop();else M="";if(q==null)q=i;o.relative[M](y,q,O)}}else y=[]}y||(y=u);y||k.error(M||g);if(f.call(y)==="[object Array]")if(N)if(i&&i.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&k.contains(i,y[g])))n.push(u[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&n.push(u[g]);else n.push.apply(n,y);else C(y,n);if(F){k(F,p,n,m);k.uniqueSort(n)}return n};k.uniqueSort=function(g){if(w){h= -l;g.sort(w);if(h)for(var i=1;i<g.length;i++)g[i]===g[i-1]&&g.splice(i--,1)}return g};k.matches=function(g,i){return k(g,null,null,i)};k.matchesSelector=function(g,i){return k(i,null,null,[g]).length>0};k.find=function(g,i,n){var m;if(!g)return[];for(var p=0,q=o.order.length;p<q;p++){var u,y=o.order[p];if(u=o.leftMatch[y].exec(g)){var F=u[1];u.splice(1,1);if(F.substr(F.length-1)!=="\\"){u[1]=(u[1]||"").replace(/\\/g,"");m=o.find[y](u,i,n);if(m!=null){g=g.replace(o.match[y],"");break}}}}m||(m=i.getElementsByTagName("*")); -return{set:m,expr:g}};k.filter=function(g,i,n,m){for(var p,q,u=g,y=[],F=i,M=i&&i[0]&&k.isXML(i[0]);g&&i.length;){for(var N in o.filter)if((p=o.leftMatch[N].exec(g))!=null&&p[2]){var O,D,R=o.filter[N];D=p[1];q=false;p.splice(1,1);if(D.substr(D.length-1)!=="\\"){if(F===y)y=[];if(o.preFilter[N])if(p=o.preFilter[N](p,F,n,y,m,M)){if(p===true)continue}else q=O=true;if(p)for(var j=0;(D=F[j])!=null;j++)if(D){O=R(D,p,j,F);var s=m^!!O;if(n&&O!=null)if(s)q=true;else F[j]=false;else if(s){y.push(D);q=true}}if(O!== -B){n||(F=y);g=g.replace(o.match[N],"");if(!q)return[];break}}}if(g===u)if(q==null)k.error(g);else break;u=g}return F};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var o=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/, -POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},relative:{"+":function(g,i){var n=typeof i==="string",m=n&&!/\W/.test(i);n=n&&!m;if(m)i=i.toLowerCase();m=0;for(var p=g.length,q;m<p;m++)if(q=g[m]){for(;(q=q.previousSibling)&&q.nodeType!==1;);g[m]=n||q&&q.nodeName.toLowerCase()=== -i?q||false:q===i}n&&k.filter(i,g,true)},">":function(g,i){var n,m=typeof i==="string",p=0,q=g.length;if(m&&!/\W/.test(i))for(i=i.toLowerCase();p<q;p++){if(n=g[p]){n=n.parentNode;g[p]=n.nodeName.toLowerCase()===i?n:false}}else{for(;p<q;p++)if(n=g[p])g[p]=m?n.parentNode:n.parentNode===i;m&&k.filter(i,g,true)}},"":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=i=i.toLowerCase();q=a}q("parentNode",i,p,g,m,n)},"~":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m= -i=i.toLowerCase();q=a}q("previousSibling",i,p,g,m,n)}},find:{ID:function(g,i,n){if(typeof i.getElementById!=="undefined"&&!n)return(g=i.getElementById(g[1]))&&g.parentNode?[g]:[]},NAME:function(g,i){if(typeof i.getElementsByName!=="undefined"){for(var n=[],m=i.getElementsByName(g[1]),p=0,q=m.length;p<q;p++)m[p].getAttribute("name")===g[1]&&n.push(m[p]);return n.length===0?null:n}},TAG:function(g,i){return i.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,i,n,m,p,q){g=" "+g[1].replace(/\\/g, -"")+" ";if(q)return g;q=0;for(var u;(u=i[q])!=null;q++)if(u)if(p^(u.className&&(" "+u.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))n||m.push(u);else if(n)i[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var i=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=i[1]+(i[2]||1)-0;g[3]=i[3]-0}g[0]=e++;return g},ATTR:function(g,i,n, -m,p,q){i=g[1].replace(/\\/g,"");if(!q&&o.attrMap[i])g[1]=o.attrMap[i];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,i,n,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,i);else{g=k.filter(g[3],i,n,true^p);n||m.push.apply(m,g);return false}else if(o.match.POS.test(g[0])||o.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled=== -true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,i,n){return!!k(n[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"=== -g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,i){return i===0},last:function(g,i,n,m){return i===m.length-1},even:function(g,i){return i%2===0},odd:function(g,i){return i%2===1},lt:function(g,i,n){return i<n[3]-0},gt:function(g,i,n){return i>n[3]-0},nth:function(g,i,n){return n[3]- -0===i},eq:function(g,i,n){return n[3]-0===i}},filter:{PSEUDO:function(g,i,n,m){var p=i[1],q=o.filters[p];if(q)return q(g,n,i,m);else if(p==="contains")return(g.textContent||g.innerText||k.getText([g])||"").indexOf(i[3])>=0;else if(p==="not"){i=i[3];n=0;for(m=i.length;n<m;n++)if(i[n]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+p)},CHILD:function(g,i){var n=i[1],m=g;switch(n){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(n=== -"first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":n=i[2];var p=i[3];if(n===1&&p===0)return true;var q=i[0],u=g.parentNode;if(u&&(u.sizcache!==q||!g.nodeIndex)){var y=0;for(m=u.firstChild;m;m=m.nextSibling)if(m.nodeType===1)m.nodeIndex=++y;u.sizcache=q}m=g.nodeIndex-p;return n===0?m===0:m%n===0&&m/n>=0}},ID:function(g,i){return g.nodeType===1&&g.getAttribute("id")===i},TAG:function(g,i){return i==="*"&&g.nodeType===1||g.nodeName.toLowerCase()=== -i},CLASS:function(g,i){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(i)>-1},ATTR:function(g,i){var n=i[1];n=o.attrHandle[n]?o.attrHandle[n](g):g[n]!=null?g[n]:g.getAttribute(n);var m=n+"",p=i[2],q=i[4];return n==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&n!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,i,n,m){var p=o.setFilters[i[2]]; -if(p)return p(g,n,i,m)}}},x=o.match.POS,r=function(g,i){return"\\"+(i-0+1)},A;for(A in o.match){o.match[A]=RegExp(o.match[A].source+/(?![^\[]*\])(?![^\(]*\))/.source);o.leftMatch[A]=RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[A].source.replace(/\\(\d+)/g,r))}var C=function(g,i){g=Array.prototype.slice.call(g,0);if(i){i.push.apply(i,g);return i}return g};try{Array.prototype.slice.call(t.documentElement.childNodes,0)}catch(J){C=function(g,i){var n=0,m=i||[];if(f.call(g)==="[object Array]")Array.prototype.push.apply(m, -g);else if(typeof g.length==="number")for(var p=g.length;n<p;n++)m.push(g[n]);else for(;g[n];n++)m.push(g[n]);return m}}var w,I;if(t.documentElement.compareDocumentPosition)w=function(g,i){if(g===i){h=true;return 0}if(!g.compareDocumentPosition||!i.compareDocumentPosition)return g.compareDocumentPosition?-1:1;return g.compareDocumentPosition(i)&4?-1:1};else{w=function(g,i){var n,m,p=[],q=[];n=g.parentNode;m=i.parentNode;var u=n;if(g===i){h=true;return 0}else if(n===m)return I(g,i);else if(n){if(!m)return 1}else return-1; -for(;u;){p.unshift(u);u=u.parentNode}for(u=m;u;){q.unshift(u);u=u.parentNode}n=p.length;m=q.length;for(u=0;u<n&&u<m;u++)if(p[u]!==q[u])return I(p[u],q[u]);return u===n?I(g,q[u],-1):I(p[u],i,1)};I=function(g,i,n){if(g===i)return n;for(g=g.nextSibling;g;){if(g===i)return-1;g=g.nextSibling}return 1}}k.getText=function(g){for(var i="",n,m=0;g[m];m++){n=g[m];if(n.nodeType===3||n.nodeType===4)i+=n.nodeValue;else if(n.nodeType!==8)i+=k.getText(n.childNodes)}return i};(function(){var g=t.createElement("div"), -i="script"+(new Date).getTime(),n=t.documentElement;g.innerHTML="<a name='"+i+"'/>";n.insertBefore(g,n.firstChild);if(t.getElementById(i)){o.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:B:[]};o.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}n.removeChild(g); -n=g=null})();(function(){var g=t.createElement("div");g.appendChild(t.createComment(""));if(g.getElementsByTagName("*").length>0)o.find.TAG=function(i,n){var m=n.getElementsByTagName(i[1]);if(i[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="<a href='#'></a>";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")o.attrHandle.href=function(i){return i.getAttribute("href",2)};g=null})();t.querySelectorAll&& -function(){var g=k,i=t.createElement("div");i.innerHTML="<p class='TEST'></p>";if(!(i.querySelectorAll&&i.querySelectorAll(".TEST").length===0)){k=function(m,p,q,u){p=p||t;m=m.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!u&&!k.isXML(p))if(p.nodeType===9)try{return C(p.querySelectorAll(m),q)}catch(y){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var F=p.getAttribute("id"),M=F||"__sizzle__";F||p.setAttribute("id",M);try{return C(p.querySelectorAll("#"+M+" "+m),q)}catch(N){}finally{F|| -p.removeAttribute("id")}}return g(m,p,q,u)};for(var n in g)k[n]=g[n];i=null}}();(function(){var g=t.documentElement,i=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,n=false;try{i.call(t.documentElement,"[test!='']:sizzle")}catch(m){n=true}if(i)k.matchesSelector=function(p,q){q=q.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(p))try{if(n||!o.match.PSEUDO.test(q)&&!/!=/.test(q))return i.call(p,q)}catch(u){}return k(q,null,null,[p]).length>0}})();(function(){var g= -t.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){o.order.splice(1,0,"CLASS");o.find.CLASS=function(i,n,m){if(typeof n.getElementsByClassName!=="undefined"&&!m)return n.getElementsByClassName(i[1])};g=null}}})();k.contains=t.documentElement.contains?function(g,i){return g!==i&&(g.contains?g.contains(i):true)}:t.documentElement.compareDocumentPosition? -function(g,i){return!!(g.compareDocumentPosition(i)&16)}:function(){return false};k.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var L=function(g,i){for(var n,m=[],p="",q=i.nodeType?[i]:i;n=o.match.PSEUDO.exec(g);){p+=n[0];g=g.replace(o.match.PSEUDO,"")}g=o.relative[g]?g+"*":g;n=0;for(var u=q.length;n<u;n++)k(g,q[n],m);return k.filter(p,m)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=k.getText;c.isXMLDoc=k.isXML; -c.contains=k.contains})();var Za=/Until$/,$a=/^(?:parents|prevUntil|prevAll)/,ab=/,/,Na=/^.[^:#\[\.,]*$/,bb=Array.prototype.slice,cb=c.expr.match.POS;c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,e=0,f=this.length;e<f;e++){d=b.length;c.find(a,this[e],b);if(e>0)for(var h=d;h<b.length;h++)for(var l=0;l<d;l++)if(b[l]===b[h]){b.splice(h--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,e=b.length;d<e;d++)if(c.contains(this,b[d]))return true})}, -not:function(a){return this.pushStack(ma(this,a,false),"not",a)},filter:function(a){return this.pushStack(ma(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){var d=[],e,f,h=this[0];if(c.isArray(a)){var l,k={},o=1;if(h&&a.length){e=0;for(f=a.length;e<f;e++){l=a[e];k[l]||(k[l]=c.expr.match.POS.test(l)?c(l,b||this.context):l)}for(;h&&h.ownerDocument&&h!==b;){for(l in k){e=k[l];if(e.jquery?e.index(h)>-1:c(h).is(e))d.push({selector:l,elem:h,level:o})}h= -h.parentNode;o++}}return d}l=cb.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e<f;e++)for(h=this[e];h;)if(l?l.index(h)>-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h||!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context): -c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a, -2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a, -b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Za.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||ab.test(e))&&$a.test(a))f=f.reverse();return this.pushStack(f,a,bb.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===B||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&& -e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var za=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,Aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Ba=/<([\w:]+)/,db=/<tbody/i,eb=/<|&#?\w+;/,Ca=/<(?:script|object|embed|option|style)/i,Da=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/\=([^="'>\s]+\/)>/g,P={option:[1, -"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};P.optgroup=P.option;P.tbody=P.tfoot=P.colgroup=P.caption=P.thead;P.th=P.td;if(!c.support.htmlSerialize)P._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= -c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==B)return this.empty().append((this[0]&&this[0].ownerDocument||t).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, -wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, -prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, -this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*"));c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); -return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(za,"").replace(fb,'="$1">').replace($,"")],e)[0]}else return this.cloneNode(true)});if(a===true){na(this,b);na(this.find("*"),b.find("*"))}return b},html:function(a){if(a===B)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(za,""):null; -else if(typeof a==="string"&&!Ca.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!P[(Ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Aa,"<$1></$2>");try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(e){this.empty().append(a)}}else c.isFunction(a)?this.each(function(f){var h=c(this);h.html(a.call(this,f,h.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d= -c(this),e=d.html();d.replaceWith(a.call(this,b,e))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){var e,f,h,l=a[0],k=[];if(!c.support.checkClone&&arguments.length===3&&typeof l==="string"&&Da.test(l))return this.each(function(){c(this).domManip(a, -b,d,true)});if(c.isFunction(l))return this.each(function(x){var r=c(this);a[0]=l.call(this,x,b?r.html():B);r.domManip(a,b,d)});if(this[0]){e=l&&l.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:c.buildFragment(a,this,k);h=e.fragment;if(f=h.childNodes.length===1?h=h.firstChild:h.firstChild){b=b&&c.nodeName(f,"tr");f=0;for(var o=this.length;f<o;f++)d.call(b?c.nodeName(this[f],"table")?this[f].getElementsByTagName("tbody")[0]||this[f].appendChild(this[f].ownerDocument.createElement("tbody")): -this[f]:this[f],f>0||e.cacheable||this.length>1?h.cloneNode(true):h)}k.length&&c.each(k,Oa)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:t;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===t&&!Ca.test(a[0])&&(c.support.checkClone||!Da.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append", -prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h=d.length;f<h;f++){var l=(f>0?this.clone(true):this).get();c(d[f])[b](l);e=e.concat(l)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||t;if(typeof b.createElement==="undefined")b=b.ownerDocument|| -b[0]&&b[0].ownerDocument||t;for(var f=[],h=0,l;(l=a[h])!=null;h++){if(typeof l==="number")l+="";if(l){if(typeof l==="string"&&!eb.test(l))l=b.createTextNode(l);else if(typeof l==="string"){l=l.replace(Aa,"<$1></$2>");var k=(Ba.exec(l)||["",""])[1].toLowerCase(),o=P[k]||P._default,x=o[0],r=b.createElement("div");for(r.innerHTML=o[1]+l+o[2];x--;)r=r.lastChild;if(!c.support.tbody){x=db.test(l);k=k==="table"&&!x?r.firstChild&&r.firstChild.childNodes:o[1]==="<table>"&&!x?r.childNodes:[];for(o=k.length- -1;o>=0;--o)c.nodeName(k[o],"tbody")&&!k[o].childNodes.length&&k[o].parentNode.removeChild(k[o])}!c.support.leadingWhitespace&&$.test(l)&&r.insertBefore(b.createTextNode($.exec(l)[0]),r.firstChild);l=r.childNodes}if(l.nodeType)f.push(l);else f=c.merge(f,l)}}if(d)for(h=0;f[h];h++)if(e&&c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script")))); -d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,l=0,k;(k=a[l])!=null;l++)if(!(k.nodeName&&c.noData[k.nodeName.toLowerCase()]))if(d=k[c.expando]){if((b=e[d])&&b.events)for(var o in b.events)f[o]?c.event.remove(k,o):c.removeEvent(k,o,b.handle);if(h)delete k[c.expando];else k.removeAttribute&&k.removeAttribute(c.expando);delete e[d]}}});var Ea=/alpha\([^)]*\)/i,gb=/opacity=([^)]*)/,hb=/-([a-z])/ig,ib=/([A-Z])/g,Fa=/^-?\d+(?:px)?$/i, -jb=/^-?\d/,kb={position:"absolute",visibility:"hidden",display:"block"},Pa=["Left","Right"],Qa=["Top","Bottom"],W,Ga,aa,lb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===B)return this;return c.access(this,a,b,true,function(d,e,f){return f!==B?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true, -zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),l=a.style,k=c.cssHooks[h];b=c.cssProps[h]||h;if(d!==B){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!k||!("set"in k)||(d=k.set(a,d))!==B)try{l[b]=d}catch(o){}}}else{if(k&&"get"in k&&(f=k.get(a,false,e))!==B)return f;return l[b]}}},css:function(a,b,d){var e,f=c.camelCase(b), -h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==B)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]=e[f]},camelCase:function(a){return a.replace(hb,lb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=oa(d,b,f);else c.swap(d,kb,function(){h=oa(d,b,f)});if(h<=0){h=W(d,b,b);if(h==="0px"&&aa)h=aa(d,b,b); -if(h!=null)return h===""||h==="auto"?"0px":h}if(h<0||h==null){h=d.style[b];return h===""||h==="auto"?"0px":h}return typeof h==="string"?h:h+"px"}},set:function(d,e){if(Fa.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return gb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f= -d.filter||"";d.filter=Ea.test(f)?f.replace(Ea,e):d.filter+" "+e}};if(t.defaultView&&t.defaultView.getComputedStyle)Ga=function(a,b,d){var e;d=d.replace(ib,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return B;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};if(t.documentElement.currentStyle)aa=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b],h=a.style;if(!Fa.test(f)&&jb.test(f)){d=h.left; -e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f===""?"auto":f};W=Ga||aa;if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var mb=c.now(),nb=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, -ob=/^(?:select|textarea)/i,pb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,qb=/^(?:GET|HEAD)$/,Ra=/\[\]$/,T=/\=\?(&|$)/,ja=/\?/,rb=/([?&])_=[^&]*/,sb=/^(\w+:)?\/\/([^\/?#]+)/,tb=/%20/g,ub=/#.*$/,Ha=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ha)return Ha.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b=== -"object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(l,k){if(k==="success"||k==="notmodified")h.html(f?c("<div>").append(l.responseText.replace(nb,"")).find(f):l.responseText);d&&h.each(d,[l.responseText,k,l])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&& -!this.disabled&&(this.checked||ob.test(this.nodeName)||pb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})}, -getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html", -script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),l=qb.test(h);b.url=b.url.replace(ub,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ja.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data|| -!T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+mb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var k=E[d];E[d]=function(m){if(c.isFunction(k))k(m);else{E[d]=B;try{delete E[d]}catch(p){}}f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);r&&r.removeChild(A)}}if(b.dataType==="script"&&b.cache===null)b.cache= -false;if(b.cache===false&&l){var o=c.now(),x=b.url.replace(rb,"$1_="+o);b.url=x+(x===b.url?(ja.test(b.url)?"&":"?")+"_="+o:"")}if(b.data&&l)b.url+=(ja.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");o=(o=sb.exec(b.url))&&(o[1]&&o[1].toLowerCase()!==location.protocol||o[2].toLowerCase()!==location.host);if(b.dataType==="script"&&h==="GET"&&o){var r=t.getElementsByTagName("head")[0]||t.documentElement,A=t.createElement("script");if(b.scriptCharset)A.charset=b.scriptCharset; -A.src=b.url;if(!d){var C=false;A.onload=A.onreadystatechange=function(){if(!C&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){C=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);A.onload=A.onreadystatechange=null;r&&A.parentNode&&r.removeChild(A)}}}r.insertBefore(A,r.firstChild);return B}var J=false,w=b.xhr();if(w){b.username?w.open(h,b.url,b.async,b.username,b.password):w.open(h,b.url,b.async);try{if(b.data!=null&&!l||a&&a.contentType)w.setRequestHeader("Content-Type", -b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}o||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(I){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&& -c.triggerGlobal(b,"ajaxSend",[w,b]);var L=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){J||c.handleComplete(b,w,e,f);J=true;if(w)w.onreadystatechange=c.noop}else if(!J&&w&&(w.readyState===4||m==="timeout")){J=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d|| -c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&Function.prototype.call.call(g,w);L("abort")}}catch(i){}b.async&&b.timeout>0&&setTimeout(function(){w&&!J&&L("timeout")},b.timeout);try{w.send(l||b.data==null?null:b.data)}catch(n){c.handleError(b,w,null,n);c.handleComplete(b,w,e,f)}b.async||L();return w}},param:function(a,b){var d=[],e=function(h,l){l=c.isFunction(l)?l():l;d[d.length]= -encodeURIComponent(h)+"="+encodeURIComponent(l)};if(b===B)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)da(f,a[f],b,e);return d.join("&").replace(tb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess", -[b,a])},handleComplete:function(a,b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"), -e=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}}); -if(E.ActiveXObject)c.ajaxSettings.xhr=function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var ea={},vb=/^(?:toggle|show|hide)$/,wb=/^([+\-]=)?([\d+.\-]+)(.*)$/,ba,pa=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show", -3),a,b,d);else{d=0;for(var e=this.length;d<e;d++){a=this[d];b=a.style.display;if(!c.data(a,"olddisplay")&&b==="none")b=a.style.display="";b===""&&c.css(a,"display")==="none"&&c.data(a,"olddisplay",qa(a.nodeName))}for(d=0;d<e;d++){a=this[d];b=a.style.display;if(b===""||b==="none")a.style.display=c.data(a,"olddisplay")||""}return this}},hide:function(a,b,d){if(a||a===0)return this.animate(S("hide",3),a,b,d);else{a=0;for(b=this.length;a<b;a++){d=c.css(this[a],"display");d!=="none"&&c.data(this[a],"olddisplay", -d)}for(a=0;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b,d){var e=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||e?this.each(function(){var f=e?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(S("toggle",3),a,b,d);return this},fadeTo:function(a,b,d,e){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d,e)},animate:function(a,b,d,e){var f=c.speed(b, -d,e);if(c.isEmptyObject(a))return this.each(f.complete);return this[f.queue===false?"each":"queue"](function(){var h=c.extend({},f),l,k=this.nodeType===1,o=k&&c(this).is(":hidden"),x=this;for(l in a){var r=c.camelCase(l);if(l!==r){a[r]=a[l];delete a[l];l=r}if(a[l]==="hide"&&o||a[l]==="show"&&!o)return h.complete.call(this);if(k&&(l==="height"||l==="width")){h.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(c.css(this,"display")==="inline"&&c.css(this,"float")==="none")if(c.support.inlineBlockNeedsLayout)if(qa(this.nodeName)=== -"inline")this.style.display="inline-block";else{this.style.display="inline";this.style.zoom=1}else this.style.display="inline-block"}if(c.isArray(a[l])){(h.specialEasing=h.specialEasing||{})[l]=a[l][1];a[l]=a[l][0]}}if(h.overflow!=null)this.style.overflow="hidden";h.curAnim=c.extend({},a);c.each(a,function(A,C){var J=new c.fx(x,h,A);if(vb.test(C))J[C==="toggle"?o?"show":"hide":C](a);else{var w=wb.exec(C),I=J.cur()||0;if(w){var L=parseFloat(w[2]),g=w[3]||"px";if(g!=="px"){c.style(x,A,(L||1)+g);I=(L|| -1)/J.cur()*I;c.style(x,A,I+g)}if(w[1])L=(w[1]==="-="?-1:1)*L+I;J.custom(I,L,g)}else J.custom(I,C,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);this.each(function(){for(var e=d.length-1;e>=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b, -d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a* -Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(l){return f.step(l)} -var f=this,h=c.fx;this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;e.elem=this.elem;if(e()&&c.timers.push(e)&&!ba)ba=setInterval(h.tick,h.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true; -this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(k,o){f.style["overflow"+o]=h.overflow[k]})}this.options.hide&&c(this.elem).hide();if(this.options.hide|| -this.options.show)for(var l in this.options.curAnim)c.style(this.elem,l,this.options.orig[l]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a= -c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||c.fx.stop()},interval:13,stop:function(){clearInterval(ba);ba=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a=== -b.elem}).length};var xb=/^t(?:able|d|h)$/i,Ia=/^(?:body|html)$/i;c.fn.offset="getBoundingClientRect"in t.documentElement?function(a){var b=this[0],d;if(a)return this.each(function(l){c.offset.setOffset(this,a,l)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);try{d=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,h=f.documentElement;if(!d||!c.contains(h,b))return d||{top:0,left:0};b=f.body;f=fa(f);return{top:d.top+(f.pageYOffset||c.support.boxModel&& -h.scrollTop||b.scrollTop)-(h.clientTop||b.clientTop||0),left:d.left+(f.pageXOffset||c.support.boxModel&&h.scrollLeft||b.scrollLeft)-(h.clientLeft||b.clientLeft||0)}}:function(a){var b=this[0];if(a)return this.each(function(x){c.offset.setOffset(this,a,x)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d,e=b.offsetParent,f=b.ownerDocument,h=f.documentElement,l=f.body;d=(f=f.defaultView)?f.getComputedStyle(b,null):b.currentStyle; -for(var k=b.offsetTop,o=b.offsetLeft;(b=b.parentNode)&&b!==l&&b!==h;){if(c.offset.supportsFixedPosition&&d.position==="fixed")break;d=f?f.getComputedStyle(b,null):b.currentStyle;k-=b.scrollTop;o-=b.scrollLeft;if(b===e){k+=b.offsetTop;o+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&xb.test(b.nodeName))){k+=parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}e=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&d.overflow!=="visible"){k+= -parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}d=d}if(d.position==="relative"||d.position==="static"){k+=l.offsetTop;o+=l.offsetLeft}if(c.offset.supportsFixedPosition&&d.position==="fixed"){k+=Math.max(h.scrollTop,l.scrollTop);o+=Math.max(h.scrollLeft,l.scrollLeft)}return{top:k,left:o}};c.offset={initialize:function(){var a=t.body,b=t.createElement("div"),d,e,f,h=parseFloat(c.css(a,"marginTop"))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px", -height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";a.insertBefore(b,a.firstChild);d=b.firstChild;e=d.firstChild;f=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=e.offsetTop!==5;this.doesAddBorderForTableAndCells= -f.offsetTop===5;e.style.position="fixed";e.style.top="20px";this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15;e.style.position=e.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==h;a.removeChild(b);c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.css(a, -"marginTop"))||0;d+=parseFloat(c.css(a,"marginLeft"))||0}return{top:b,left:d}},setOffset:function(a,b,d){var e=c.css(a,"position");if(e==="static")a.style.position="relative";var f=c(a),h=f.offset(),l=c.css(a,"top"),k=c.css(a,"left"),o=e==="absolute"&&c.inArray("auto",[l,k])>-1;e={};var x={};if(o)x=f.position();l=o?x.top:parseInt(l,10)||0;k=o?x.left:parseInt(k,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+l;if(b.left!=null)e.left=b.left-h.left+k;"using"in b?b.using.call(a, -e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Ia.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||t.body;a&&!Ia.test(a.nodeName)&& -c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==B)return this.each(function(){if(h=fa(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=fa(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase(); -c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(l){var k=c(this);k[d](e.call(this,l,k[d]()))});if(c.isWindow(f))return f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b];else if(f.nodeType===9)return Math.max(f.documentElement["client"+ -b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]);else if(e===B){f=c.css(f,d);var h=parseFloat(f);return c.isNaN(h)?f:h}else return this.css(d,typeof e==="string"?e:e+"px")}})})(window);
deleted file mode 100644 --- a/addon-sdk/source/examples/reddit-panel/data/panel.js +++ /dev/null @@ -1,35 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -// This is a content script. It executes inside the context of the Reddit page -// loaded into the panel and has access to that page's window object and other -// global objects (although the page does not have access to globals defined by -// this script unless they are explicitly attached to the window object). -// -// This content script is injected into the context of the Reddit page -// by the Panel API, which is accessed by the main add-on script in lib/main.js. -// See that script for more information about how the panel is created. - -$(window).click(function (event) { - var t = event.target; - - // Don't intercept the click if it isn't on a link. - if (t.nodeName != "A") - return; - - // Don't intercept the click if it was on one of the links in the header - // or next/previous footer, since those links should load in the panel itself. - if ($(t).parents('#header').length || $(t).parents('.nextprev').length) - return; - - // Intercept the click, passing it to the addon, which will load it in a tab. - event.stopPropagation(); - event.preventDefault(); - self.port.emit('click', t.toString()); -}); - -// Panels have an OS-specific background color by default, and the Mac OS X -// background color is dark grey, but Reddit expects its background to be white -// and looks odd when it isn't, so set it to white. -$("body").css("background", "white");
deleted file mode 100644 --- a/addon-sdk/source/examples/reddit-panel/lib/main.js +++ /dev/null @@ -1,49 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -"use strict"; - -var { data } = require("sdk/self"); -var { ToggleButton } = require("sdk/ui"); - -var base64png = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYA" + - "AABzenr0AAAASUlEQVRYhe3O0QkAIAwD0eyqe3Q993AQ3cBSUKpygfsNTy" + - "N5ugbQpK0BAADgP0BRDWXWlwEAAAAAgPsA3rzDaAAAAHgPcGrpgAnzQ2FG" + - "bWRR9AAAAABJRU5ErkJggg%3D%3D"; - -var reddit_panel = require("sdk/panel").Panel({ - width: 240, - height: 320, - contentURL: "http://www.reddit.com/.mobile?keep_extension=True", - contentScriptFile: [data.url("jquery-1.4.4.min.js"), - data.url("panel.js")], - onHide: handleHide -}); - -reddit_panel.port.on("click", function(url) { - require("sdk/tabs").open(url); -}); - -let button = ToggleButton({ - id: "open-reddit-btn", - label: "Reddit", - icon: base64png, - onChange: handleChange -}); - -exports.main = function(options, callbacks) { - // If you run cfx with --static-args='{"quitWhenDone":true}' this program - // will automatically quit Firefox when it's done. - if (options.staticArgs.quitWhenDone) - callbacks.quit(); -}; - -function handleChange(state) { - if (state.checked) { - reddit_panel.show({ position: button }); - } -} - -function handleHide() { - button.state('window', { checked: false }); -}
deleted file mode 100644 --- a/addon-sdk/source/examples/reddit-panel/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "license": "MPL 2.0", - "name": "reddit-panel", - "contributors": [], - "author": "Myk Melez", - "keywords": [], - "description": "Displays Reddit in a panel.", - "id": "anonid0-reddit-panel" -}
deleted file mode 100644 --- a/addon-sdk/source/examples/reddit-panel/tests/test-main.js +++ /dev/null @@ -1,22 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -"use strict"; - -var m = require("main"); -var self = require("sdk/self"); - -exports.testMain = function(test) { - var callbacks = { quit: function() { - test.pass(); - test.done(); - } }; - - test.waitUntilDone(); - // Make sure it doesn't crash... - m.main({ staticArgs: {quitWhenDone: true} }, callbacks); -}; - -exports.testData = function(test) { - test.assert(self.data.load("panel.js").length > 0); -};
--- a/addon-sdk/source/lib/sdk/content/mod.js +++ b/addon-sdk/source/lib/sdk/content/mod.js @@ -3,36 +3,36 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict"; module.metadata = { "stability": "experimental" }; const { Ci } = require("chrome"); -const method = require("../../method/core"); +const { dispatcher } = require("../util/dispatcher"); const { add, remove, iterator } = require("../lang/weak-set"); -let getTargetWindow = method("getTargetWindow"); +let getTargetWindow = dispatcher("getTargetWindow"); getTargetWindow.define(function (target) { if (target instanceof Ci.nsIDOMWindow) return target; if (target instanceof Ci.nsIDOMDocument) return target.defaultView || null; return null; }); exports.getTargetWindow = getTargetWindow; -let attachTo = method("attachTo"); +let attachTo = dispatcher("attachTo"); exports.attachTo = attachTo; -let detachFrom = method("detatchFrom"); +let detachFrom = dispatcher("detatchFrom"); exports.detachFrom = detachFrom; function attach(modification, target) { if (!modification) return; let window = getTargetWindow(target);
--- a/addon-sdk/source/lib/sdk/core/promise.js +++ b/addon-sdk/source/lib/sdk/core/promise.js @@ -12,17 +12,18 @@ * https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/Promise.jsm * https://github.com/cujojs/when * https://github.com/kriskowal/q */ const PROMISE_URI = 'resource://gre/modules/Promise.jsm'; getEnvironment.call(this, function ({ require, exports, module, Cu }) { -const { defer, resolve, all, reject, race } = Cu.import(PROMISE_URI, {}).Promise; +const Promise = Cu.import(PROMISE_URI, {}).Promise; +const { Debugging, defer, resolve, all, reject, race } = Promise; module.metadata = { 'stability': 'unstable' }; let promised = (function() { // Note: Define shortcuts and utility functions here in order to avoid // slower property accesses and unnecessary closure creations on each @@ -70,17 +71,17 @@ let promised = (function() { exports.promised = promised; exports.all = all; exports.defer = defer; exports.resolve = resolve; exports.reject = reject; exports.race = race; exports.Promise = Promise; - +exports.Debugging = Debugging; }); function getEnvironment (callback) { let Cu, _exports, _module, _require; // CommonJS / SDK if (typeof(require) === 'function') { Cu = require('chrome').Cu;
--- a/addon-sdk/source/lib/sdk/deprecated/unit-test-finder.js +++ b/addon-sdk/source/lib/sdk/deprecated/unit-test-finder.js @@ -45,27 +45,26 @@ const getTestEntries = directory => mapc const removeDups = (array) => array.reduce((result, value) => { if (value != result[result.length - 1]) { result.push(value); } return result; }, []); -const getSuites = function getSuites({ id }) { +const getSuites = function getSuites({ id, filter }) { return getAddon(id).then(addon => { let fileURI = addon.getResourceURI("tests/"); let isPacked = fileURI.scheme == "jar"; let xpiURI = addon.getResourceURI(); let file = xpiURI.QueryInterface(Ci.nsIFileURL).file; let suites = []; let addEntry = (entry) => { - let pass = TEST_REGEX.test(entry); - if (pass) { - let suite = (isNative ? "./" : "") + RegExp.$2 + RegExp.$3; + if (filter(entry) && TEST_REGEX.test(entry)) { + let suite = (isNative ? "./" : "") + (RegExp.$2 || "") + RegExp.$3; suites.push(suite); } } if (isPacked) { return getZipReader(file).then(zip => { let entries = zip.findEntries(null); while (entries.hasMore()) { @@ -85,58 +84,62 @@ const getSuites = function getSuites({ i // sort and remove dups suites = removeDups(suites.sort()); return suites; }); } exports.getSuites = getSuites; -const makeFilter = function makeFilter(options) { +const makeFilters = function makeFilters(options) { + options = options || {}; + // A filter string is {fileNameRegex}[:{testNameRegex}] - ie, a colon // optionally separates a regex for the test fileName from a regex for the // testName. if (options.filter) { let colonPos = options.filter.indexOf(':'); let filterFileRegex, filterNameRegex; if (colonPos === -1) { filterFileRegex = new RegExp(options.filter); + filterNameRegex = { test: () => true } } else { filterFileRegex = new RegExp(options.filter.substr(0, colonPos)); filterNameRegex = new RegExp(options.filter.substr(colonPos + 1)); } - // This function will first be called with just the filename; if - // it returns true the module will be loaded then the function - // called again with both the filename and the testname. - return (filename, testname) => { - return filterFileRegex.test(filename) && - ((testname && filterNameRegex) ? filterNameRegex.test(testname) - : true); - }; + + return { + fileFilter: (name) => filterFileRegex.test(name), + testFilter: (name) => filterNameRegex.test(name) + } } - return () => true; + return { + fileFilter: () => true, + testFilter: () => true + }; } -exports.makeFilter = makeFilter; +exports.makeFilters = makeFilters; let loader = Loader(module); const NOT_TESTS = ['setup', 'teardown']; var TestFinder = exports.TestFinder = function TestFinder(options) { memory.track(this); this.filter = options.filter; this.testInProcess = options.testInProcess === false ? false : true; this.testOutOfProcess = options.testOutOfProcess === true ? true : false; }; TestFinder.prototype = { findTests: function findTests() { - return getSuites({ id: id }).then(suites => { - let filter = makeFilter({ filter: this.filter }); + let { fileFilter, testFilter } = makeFilters({ filter: this.filter }); + + return getSuites({ id: id, filter: fileFilter }).then(suites => { let tests = []; suites.forEach(suite => { // Load each test file as a main module in its own loader instance // `suite` is defined by cuddlefish/manifest.py:ManifestBuilder.build let suiteModule; try { @@ -153,17 +156,17 @@ TestFinder.prototype = { else { console.exception(e); throw e; } } if (this.testInProcess) { for (let name of Object.keys(suiteModule).sort()) { - if (NOT_TESTS.indexOf(name) === -1 && filter(suite, name)) { + if (NOT_TESTS.indexOf(name) === -1 && testFilter(name)) { tests.push({ setup: suiteModule.setup, teardown: suiteModule.teardown, testFunction: suiteModule[name], name: suite + "." + name }); } }
--- a/addon-sdk/source/lib/sdk/deprecated/unit-test.js +++ b/addon-sdk/source/lib/sdk/deprecated/unit-test.js @@ -5,19 +5,19 @@ module.metadata = { "stability": "deprecated" }; const memory = require("./memory"); const timer = require("../timers"); const cfxArgs = require("../test/options"); -const { getTabs, getURI } = require("../tabs/utils"); +const { getTabs, closeTab, getURI } = require("../tabs/utils"); const { windows, isBrowser } = require("../window/utils"); -const { defer, all } = require("../core/promise"); +const { defer, all, Debugging: PromiseDebugging } = require("../core/promise"); const findAndRunTests = function findAndRunTests(options) { var TestFinder = require("./unit-test-finder").TestFinder; var finder = new TestFinder({ filter: options.filter, testInProcess: options.testInProcess, testOutOfProcess: options.testOutOfProcess }); @@ -43,25 +43,29 @@ const TestRunner = function TestRunner(o this.testRunSummary = []; this.expectFailNesting = 0; this.done = TestRunner.prototype.done.bind(this); }; TestRunner.prototype = { toString: function toString() "[object TestRunner]", - DEFAULT_PAUSE_TIMEOUT: cfxArgs.parseable ? 5*60000 : 15000, + DEFAULT_PAUSE_TIMEOUT: (cfxArgs.parseable ? 300000 : 15000), //Five minutes (5*60*1000ms) PAUSE_DELAY: 500, _logTestFailed: function _logTestFailed(why) { if (!(why in this.test.errors)) this.test.errors[why] = 0; this.test.errors[why]++; }, + _uncaughtErrorObserver: function({message, date, fileName, stack, lineNumber}) { + this.fail("There was an uncaught Promise rejection: " + stack); + }, + pass: function pass(message) { if(!this.expectFailure) { if ("testMessage" in this.console) this.console.testMessage(true, true, this.test.name, message); else this.console.info("pass:", message); this.passed++; this.test.passed++; @@ -294,23 +298,26 @@ TestRunner.prototype = { win.addEventListener("DOMContentLoaded", function onLoad() { win.removeEventListener("DOMContentLoaded", onLoad, false); resolve(); }, false); } return promise; }); + PromiseDebugging.flushUncaughtErrors(); + all(winPromises).then(_ => { let tabs = []; for (let win of wins.filter(isBrowser)) { for (let tab of getTabs(win)) { tabs.push(tab); } } + let leftover = tabs.slice(1); if (wins.length != 1) this.fail("Should not be any unexpected windows open"); if (tabs.length != 1) this.fail("Should not be any unexpected tabs open"); if (tabs.length != 1 || wins.length != 1) { console.log("Windows open:"); for (let win of wins) { @@ -319,16 +326,18 @@ TestRunner.prototype = { console.log(win.location + " - " + tabs.map(getURI).join(", ")); } else { console.log(win.location); } } } + leftover.forEach(closeTab); + this.testRunSummary.push({ name: this.test.name, passed: this.test.passed, failed: this.test.failed, errors: [error for (error in this.test.errors)].join(", ") }); if (this.onDone !== null) { @@ -487,16 +496,18 @@ TestRunner.prototype = { runNextTest(this); }, start: function start(options) { this.test = options.test; this.test.passed = 0; this.test.failed = 0; this.test.errors = {}; + PromiseDebugging.clearUncaughtErrorObservers(); + PromiseDebugging.addUncaughtErrorObserver(this._uncaughtErrorObserver.bind(this)); this.isDone = false; this.onDone = function(self) { if (cfxArgs.parseable) self.console.print("TEST-END | " + self.test.name + "\n"); options.onDone(self); } this.waitTimeout = null;
--- a/addon-sdk/source/lib/sdk/places/host/host-bookmarks.js +++ b/addon-sdk/source/lib/sdk/places/host/host-bookmarks.js @@ -85,17 +85,22 @@ function createBookmarkItem (data) { data.group, newURI(data.url), data.index, data.title ); // In the event where default or no index is provided (-1), // query the actual index for the response if (data.index === -1) data.index = bmsrv.getItemIndex(data.id); - data.updated = bmsrv.getItemLastModified(data.id); + try { + data.updated = bmsrv.getItemLastModified(data.id); + } + catch (e) { + console.exception(e); + } return tag(data, true).then(() => data); } exports.createBookmarkItem = createBookmarkItem; function saveBookmarkItem (data) { let id = data.id; if (!id) @@ -189,44 +194,34 @@ function getChildren ({ id }) { return all(ids.map(id => getBookmarkItem({ id: id }))); } exports.getChildren = getChildren; /* * Hook into host */ -let reqStream = filter(request, function (data) /sdk-places-bookmarks/.test(data.event)); -on(reqStream, 'data', function ({event, id, data}) { +let reqStream = filter(request, (data) => /sdk-places-bookmarks/.test(data.event)); +on(reqStream, 'data', ({ event, id, data }) => { if (!EVENT_MAP[event]) return; - let resData = { - id: id, - event: event - }; + let resData = { id: id, event: event }; - promised(EVENT_MAP[event])(data).then(res => { - resData.data = res; - respond(resData); - }, reason => { - resData.error = reason; - respond(resData); - }); + promised(EVENT_MAP[event])(data). + then(res => resData.data = res, e => resData.error = e). + then(() => emit(response, 'data', resData)); }); -function respond (data) { - emit(response, 'data', data); -} - function tag (data, isNew) { // If a new item, we can skip checking what other tags // are on the item if (data.type !== 'bookmark') { return resolve(); - } else if (!isNew) { + } + else if (!isNew) { return send('sdk-places-tags-get-tags-by-url', { url: data.url }) .then(tags => { return send('sdk-places-tags-untag', { tags: tags.filter(tag => !~data.tags.indexOf(tag)), url: data.url }); }).then(() => send('sdk-places-tags-tag', { url: data.url, tags: data.tags
--- a/addon-sdk/source/lib/sdk/stylesheet/style.js +++ b/addon-sdk/source/lib/sdk/stylesheet/style.js @@ -8,17 +8,17 @@ module.metadata = { }; const { Cc, Ci } = require("chrome"); const { Class } = require("../core/heritage"); const { URL, isLocalURL } = require('../url'); const events = require("../system/events"); const { loadSheet, removeSheet, isTypeValid } = require("./utils"); const { isString } = require("../lang/type"); -const { attachTo, detachFrom, getTargetWindow } = require("../content/mod"); +const { attachTo, detachFrom } = require("../content/mod"); const { data } = require('../self'); const { freeze, create } = Object; function Style({ source, uri, type }) { source = source == null ? null : freeze([].concat(source)); uri = uri == null ? null : freeze([].concat(uri)); type = type == null ? "author" : type;
--- a/addon-sdk/source/lib/sdk/system/child_process.js +++ b/addon-sdk/source/lib/sdk/system/child_process.js @@ -190,17 +190,17 @@ exports.exec = exec; function execFile (file, ...args) { let cmdArgs = [], callback; // Default options let options = { cwd: null, env: null, encoding: 'utf8', timeout: 0, - maxBuffer: 200 * 1024, + maxBuffer: 204800, //200 KB (200*1024 bytes) killSignal: 'SIGTERM' }; if (isFunction(args[args.length - 1])) callback = args[args.length - 1]; if (isArray(args[0])) { cmdArgs = args[0];
--- a/addon-sdk/source/lib/sdk/tabs/tab.js +++ b/addon-sdk/source/lib/sdk/tabs/tab.js @@ -6,14 +6,23 @@ module.metadata = { 'stability': 'unstable', 'engines': { 'Firefox': '*', 'Fennec': '*' } }; +const { getTargetWindow } = require("../content/mod"); +const { getTabContentWindow, isTab } = require("./utils"); +const { viewFor } = require("../view/core"); + if (require('../system/xul-app').name == 'Fennec') { module.exports = require('./tab-fennec'); } else { module.exports = require('./tab-firefox'); } + +getTargetWindow.when(isTab, tab => getTabContentWindow(tab)); + +getTargetWindow.when(x => x instanceof module.exports.Tab, + tab => getTabContentWindow(viewFor(tab)));
--- a/addon-sdk/source/lib/sdk/test/harness.js +++ b/addon-sdk/source/lib/sdk/test/harness.js @@ -248,16 +248,18 @@ function cleanup() { // read the code coverage object, if it exists, from CoverJS-moz if (typeof loader.globals.global == "object") { coverObject = loader.globals.global['__$coverObject'] || {}; } consoleListener.errorsLogged = 0; loader = null; + consoleListener.unregister(); + memory.gc(); } catch (e) { results.failed++; console.error("unload.send() threw an exception."); console.exception(e); }; @@ -349,17 +351,17 @@ function getPotentialLeaks() { if (!isPossibleLeak(item)) return; compartments[matches[1]] = item; return; } - if (matches = windowRegexp.exec(path)) { + if ((matches = windowRegexp.exec(path))) { if (matches[1] in windows) return; let details = windowDetails.exec(matches[1]); if (!details) { console.error("Unable to parse window detail " + matches[1]); return; } @@ -435,17 +437,34 @@ var POINTLESS_ERRORS = [ '[JavaScript Warning: "Duplicate resource declaration for', 'file: "chrome://browser/content/', 'file: "chrome://global/content/', '[JavaScript Warning: "The character encoding of a framed document was ' + 'not declared.' ]; var consoleListener = { + registered: false, + + register: function() { + if (this.registered) + return; + cService.registerListener(this); + this.registered = true; + }, + + unregister: function() { + if (!this.registered) + return; + cService.unregisterListener(this); + this.registered = false; + }, + errorsLogged: 0, + observe: function(object) { if (!(object instanceof Ci.nsIScriptError)) return; this.errorsLogged++; var message = object.QueryInterface(Ci.nsIConsoleMessage).message; var pointless = [err for (err of POINTLESS_ERRORS) if (message.indexOf(err) >= 0)]; if (pointless.length == 0 && message) @@ -567,17 +586,17 @@ var runTests = exports.runTests = functi iterationsLeft = options.iterations; profileMemory = options.profileMemory; stopOnError = options.stopOnError; onDone = options.onDone; print = options.print; findAndRunTests = options.findAndRunTests; try { - cService.registerListener(consoleListener); + consoleListener.register(); print("Running tests on " + system.name + " " + system.version + "/Gecko " + system.platformVersion + " (" + system.id + ") under " + system.platform + "/" + system.architecture + ".\n"); if (options.parseable) testConsole = new TestRunnerTinderboxConsole(new PlainTextConsole(), options); else @@ -587,17 +606,18 @@ var runTests = exports.runTests = functi console: testConsole, global: {} // useful for storing things like coverage testing. }); // Load these before getting initial leak stats as they will still be in // memory when we check later require("../deprecated/unit-test"); require("../deprecated/unit-test-finder"); - startLeaks = getPotentialLeaks(); + if (profileMemory) + startLeaks = getPotentialLeaks(); nextIteration(); } catch (e) { let frames = fromException(e).reverse().reduce(function(frames, frame) { if (frame.fileName.split("/").pop() === "unit-test-finder.js") frames.done = true if (!frames.done) frames.push(frame) @@ -616,9 +636,9 @@ var runTests = exports.runTests = functi toString: { value: function() String(e), writable: true, configurable: true }, }); print("Error: " + error + " \n " + format(error)); onDone({passed: 0, failed: 1}); } }; -unload(_ => cService.unregisterListener(consoleListener)); +unload(_ => consoleListener.unregister());
--- a/addon-sdk/source/lib/sdk/test/options.js +++ b/addon-sdk/source/lib/sdk/test/options.js @@ -10,13 +10,14 @@ module.metadata = { const options = require("@test/options"); const { id } = require("../self"); const { get } = require("../preferences/service"); const readPref = (key) => get("extensions." + id + ".sdk." + key); exports.iterations = readPref("test.iterations") || options.iterations; exports.filter = readPref("test.filter") || options.filter; -exports.profileMemory = readPref("profile.memory") || options.profileMemory, -exports.stopOnError = readPref("test.stop") || options.stopOnError, +exports.profileMemory = readPref("profile.memory") || options.profileMemory; +exports.stopOnError = readPref("test.stop") || options.stopOnError; +exports.keepOpen = readPref("test.keepOpen") || false; exports.verbose = (readPref("output.logLevel") == "verbose") || options.verbose; exports.parseable = (readPref("output.format") == "tbpl") || options.parseable; exports.checkMemory = readPref("profile.leaks") || options.check_memory;
--- a/addon-sdk/source/lib/sdk/test/runner.js +++ b/addon-sdk/source/lib/sdk/test/runner.js @@ -4,33 +4,38 @@ "use strict"; module.metadata = { "stability": "experimental" }; var { exit, stdout } = require("../system"); var cfxArgs = require("../test/options"); +var events = require("../system/events"); function runTests(findAndRunTests) { var harness = require("./harness"); function onDone(tests) { stdout.write("\n"); var total = tests.passed + tests.failed; stdout.write(tests.passed + " of " + total + " tests passed.\n"); + events.emit("sdk:test:results", { data: JSON.stringify(tests) }); + if (tests.failed == 0) { if (tests.passed === 0) stdout.write("No tests were run\n"); - exit(0); + if (!cfxArgs.keepOpen) + exit(0); } else { if (cfxArgs.verbose || cfxArgs.parseable) printFailedTests(tests, stdout.write); - exit(1); + if (!cfxArgs.keepOpen) + exit(1); } }; // We may have to run test on next cycle, otherwise XPCOM components // are not correctly updated. // For ex: nsIFocusManager.getFocusedElementForWindow may throw // NS_ERROR_ILLEGAL_VALUE exception. require("../timers").setTimeout(_ => harness.runTests({
--- a/addon-sdk/source/lib/sdk/ui/sidebar.js +++ b/addon-sdk/source/lib/sdk/ui/sidebar.js @@ -82,17 +82,17 @@ const Sidebar = Class({ title: self.title, sidebarurl: self.url }); bars.push(bar); windowNS(window).bar = bar; bar.addEventListener('command', function() { if (isSidebarShowing(window, self)) { - hideSidebar(window, self); + hideSidebar(window, self).catch(() => {}); return; } showSidebar(window, self); }, false); function onSidebarLoad() { // check if the sidebar is ready @@ -163,17 +163,17 @@ const Sidebar = Class({ windowNS(window).onSidebarLoad = onSidebarLoad; sidebar.addEventListener('load', onSidebarLoad, true); // removed properly }, onUntrack: function(window) { if (!isBrowser(window)) return; // hide the sidebar if it is showing - hideSidebar(window, self); + hideSidebar(window, self).catch(() => {}); // kill the menu item let { bar } = windowNS(window); if (bar) { removeFromArray(viewsFor(self), bar); dispose(bar); } @@ -262,17 +262,17 @@ const Sidebar = Class({ views.delete(this); models.delete(this); } }); exports.Sidebar = Sidebar; function validateTitleAndURLCombo(sidebar, title, url) { url = resolveURL(url); - + if (sidebar.title == title && sidebar.url == url) { return false; } for (let window of windows(null, { includePrivate: true })) { let sidebar = window.document.querySelector('menuitem[sidebarurl="' + url + '"][label="' + title + '"]'); if (sidebar) { throw Error('The provided title and url combination is invalid (already used).');
--- a/addon-sdk/source/lib/toolkit/loader.js +++ b/addon-sdk/source/lib/toolkit/loader.js @@ -400,32 +400,33 @@ exports.resolve = resolve; // http://nodejs.org/api/modules.html#modules_all_together const nodeResolve = iced(function nodeResolve(id, requirer, { rootURI }) { // Resolve again id = exports.resolve(id, requirer); // we assume that extensions are correct, i.e., a directory doesnt't have '.js' // and a js file isn't named 'file.json.js' let fullId = join(rootURI, id); + let resolvedPath; - let resolvedPath; if ((resolvedPath = loadAsFile(fullId))) return stripBase(rootURI, resolvedPath); - else if ((resolvedPath = loadAsDirectory(fullId))) + + if ((resolvedPath = loadAsDirectory(fullId))) return stripBase(rootURI, resolvedPath); + // If manifest has dependencies, attempt to look up node modules // in the `dependencies` list - else { - let dirs = getNodeModulePaths(dirname(join(rootURI, requirer))).map(dir => join(dir, id)); - for (let i = 0; i < dirs.length; i++) { - if ((resolvedPath = loadAsFile(dirs[i]))) - return stripBase(rootURI, resolvedPath); - if ((resolvedPath = loadAsDirectory(dirs[i]))) - return stripBase(rootURI, resolvedPath); - } + let dirs = getNodeModulePaths(dirname(join(rootURI, requirer))).map(dir => join(dir, id)); + for (let i = 0; i < dirs.length; i++) { + if ((resolvedPath = loadAsFile(dirs[i]))) + return stripBase(rootURI, resolvedPath); + + if ((resolvedPath = loadAsDirectory(dirs[i]))) + return stripBase(rootURI, resolvedPath); } // We would not find lookup for things like `sdk/tabs`, as that's part of // the alias mapping. If during `generateMap`, the runtime lookup resolves // with `resolveURI` -- if during runtime, then `resolve` will throw. return void 0; }); exports.nodeResolve = nodeResolve; @@ -447,24 +448,24 @@ function loadAsFile (path) { } catch (e) {} return found; } // Attempts to load `path/package.json`'s `main` entry, // followed by `path/index.js`, or `undefined` otherwise function loadAsDirectory (path) { - let found; try { // If `path/package.json` exists, parse the `main` entry // and attempt to load that let main = getManifestMain(JSON.parse(readURI(path + '/package.json'))); if (main != null) { let tmpPath = join(path, main); - if ((found = loadAsFile(tmpPath))) + let found = loadAsFile(tmpPath); + if (found) return found } try { let tmpPath = path + '/index.js'; readURI(tmpPath); return tmpPath; } catch (e) {} } catch (e) { @@ -528,73 +529,25 @@ const resolveURI = iced(function resolve exports.resolveURI = resolveURI; // Creates version of `require` that will be exposed to the given `module` // in the context of the given `loader`. Each module gets own limited copy // of `require` that is allowed to load only a modules that are associated // with it during link time. const Require = iced(function Require(loader, requirer) { let { - modules, mapping, resolve, load, manifest, rootURI, isNative, requireMap + modules, mapping, resolve: loaderResolve, load, manifest, rootURI, isNative, requireMap } = loader; function require(id) { if (!id) // Throw if `id` is not passed. throw Error('you must provide a module name when calling require() from ' + requirer.id, requirer.uri); - let requirement; - let uri; - - // TODO should get native Firefox modules before doing node-style lookups - // to save on loading time - if (isNative) { - // If a requireMap is available from `generateMap`, use that to - // immediately resolve the node-style mapping. - if (requireMap && requireMap[requirer.id]) - requirement = requireMap[requirer.id][id]; - - // For native modules, we want to check if it's a module specified - // in 'modules', like `chrome`, or `@loader` -- if it exists, - // just set the uri to skip resolution - if (!requirement && modules[id]) - uri = requirement = id; - - // If no requireMap was provided, or resolution not found in - // the requireMap, and not a npm dependency, attempt a runtime lookup - if (!requirement && !isNodeModule(id)) { - // If `isNative` defined, this is using the new, native-style - // loader, not cuddlefish, so lets resolve using node's algorithm - // and get back a path that needs to be resolved via paths mapping - // in `resolveURI` - requirement = resolve(id, requirer.id, { - manifest: manifest, - rootURI: rootURI - }); - } - - // If not found in the map, not a node module, and wasn't able to be - // looked up, it's something - // found in the paths most likely, like `sdk/tabs`, which should - // be resolved relatively if needed using traditional resolve - if (!requirement) { - requirement = isRelative(id) ? exports.resolve(id, requirer.id) : id; - } - } else { - // Resolve `id` to its requirer if it's relative. - requirement = requirer ? resolve(id, requirer.id) : id; - } - - // Resolves `uri` of module using loaders resolve function. - uri = uri || resolveURI(requirement, mapping); - - if (!uri) // Throw if `uri` can not be resolved. - throw Error('Module: Can not resolve "' + id + '" module required by ' + - requirer.id + ' located at ' + requirer.uri, requirer.uri); - + let { uri, requirement } = getRequirements(id); let module = null; // If module is already cached by loader then just use it. if (uri in modules) { module = modules[uri]; } else if (isJSMURI(uri)) { module = modules[uri] = Module(requirement, uri); module.exports = Cu.import(uri, {}); @@ -638,16 +591,83 @@ const Require = iced(function Require(lo // Also clear out the Sandbox that was created delete loader.sandboxes[uri]; throw e; } } return module.exports; } + + // Resolution function taking a module name/path and + // returning a resourceURI and a `requirement` used by the loader. + // Used by both `require` and `require.resolve`. + function getRequirements(id) { + if (!id) // Throw if `id` is not passed. + throw Error('you must provide a module name when calling require() from ' + + requirer.id, requirer.uri); + + let requirement; + let uri; + + // TODO should get native Firefox modules before doing node-style lookups + // to save on loading time + if (isNative) { + // If a requireMap is available from `generateMap`, use that to + // immediately resolve the node-style mapping. + if (requireMap && requireMap[requirer.id]) + requirement = requireMap[requirer.id][id]; + + // For native modules, we want to check if it's a module specified + // in 'modules', like `chrome`, or `@loader` -- if it exists, + // just set the uri to skip resolution + if (!requirement && modules[id]) + uri = requirement = id; + + // If no requireMap was provided, or resolution not found in + // the requireMap, and not a npm dependency, attempt a runtime lookup + if (!requirement && !isNodeModule(id)) { + // If `isNative` defined, this is using the new, native-style + // loader, not cuddlefish, so lets resolve using node's algorithm + // and get back a path that needs to be resolved via paths mapping + // in `resolveURI` + requirement = loaderResolve(id, requirer.id, { + manifest: manifest, + rootURI: rootURI + }); + } + + // If not found in the map, not a node module, and wasn't able to be + // looked up, it's something + // found in the paths most likely, like `sdk/tabs`, which should + // be resolved relatively if needed using traditional resolve + if (!requirement) { + requirement = isRelative(id) ? exports.resolve(id, requirer.id) : id; + } + } else { + // Resolve `id` to its requirer if it's relative. + requirement = requirer ? loaderResolve(id, requirer.id) : id; + } + + // Resolves `uri` of module using loaders resolve function. + uri = uri || resolveURI(requirement, mapping); + + if (!uri) // Throw if `uri` can not be resolved. + throw Error('Module: Can not resolve "' + id + '" module required by ' + + requirer.id + ' located at ' + requirer.uri, requirer.uri); + + return { uri: uri, requirement: requirement }; + } + + // Expose the `resolve` function for this `Require` instance + require.resolve = function resolve(id) { + let { uri } = getRequirements(id); + return uri; + } + // Make `require.main === module` evaluate to true in main module scope. require.main = loader.main === requirer ? requirer : undefined; return iced(require); }); exports.Require = Require; const main = iced(function main(loader, id) { // If no main entry provided, and native loader is used, @@ -859,24 +879,24 @@ function getManifestMain (manifest) { function findAllModuleIncludes (uri, options, results, callback) { let { resolve, manifest, rootURI } = options; results = results || {}; // Abort if JSON or JSM if (isJSONURI(uri) || isJSMURI(uri)) { callback(results); - return void 0; + return; } findModuleIncludes(join(rootURI, uri), modules => { // If no modules are included in the file, just call callback immediately if (!modules.length) { callback(results); - return void 0; + return; } results[uri] = modules.reduce((agg, mod) => { let resolved = resolve(mod, uri, { manifest: manifest, rootURI: rootURI }); // If resolution found, store the resolution; otherwise, // skip storing it as runtime lookup will handle this if (!resolved)
--- a/addon-sdk/source/python-lib/cuddlefish/__init__.py +++ b/addon-sdk/source/python-lib/cuddlefish/__init__.py @@ -234,16 +234,23 @@ parser_groups = ( help="JSON file to overload package.json properties", default=None, cmds=['xpi'])), (("", "--abort-on-missing-module",), dict(dest="abort_on_missing", help="Abort if required module is missing", action="store_true", default=False, cmds=['test', 'run', 'xpi', 'testpkgs'])), + (("", "--no-connections",), dict(dest="no_connections", + help="disable/enable remote connections (on for cfx run only by default)", + type="choice", + choices=["on", "off", "default"], + default="default", + cmds=['test', 'run', 'testpkgs', + 'testall', 'testaddons', 'testex'])), ] ), ("Internal Command-Specific Options", [ (("", "--addons",), dict(dest="addons", help=("paths of addons to install, " "comma-separated"), metavar=None, @@ -741,24 +748,20 @@ def run(arguments=sys.argv[1:], target_c # this means that alternative loaders probably won't work with # --strip-xpi. assert packaging.DEFAULT_LOADER == "addon-sdk" assert pkg_cfg.packages["addon-sdk"].loader == "lib/sdk/loader/cuddlefish.js" cuddlefish_js_path = os.path.join(pkg_cfg.packages["addon-sdk"].root_dir, "lib", "sdk", "loader", "cuddlefish.js") loader_modules = [("addon-sdk", "lib", "sdk/loader/cuddlefish", cuddlefish_js_path)] scan_tests = command == "test" - test_filter_re = None - if scan_tests and options.filter: - test_filter_re = options.filter - if ":" in options.filter: - test_filter_re = options.filter.split(":")[0] + try: manifest = build_manifest(target_cfg, pkg_cfg, deps, scan_tests, - test_filter_re, loader_modules, + None, loader_modules, abort_on_missing=options.abort_on_missing) except ModuleNotFoundError, e: print str(e) sys.exit(1) except BadChromeMarkerError, e: # An error had already been displayed on stderr in manifest code sys.exit(1) used_deps = manifest.get_used_packages() @@ -894,16 +897,26 @@ def run(arguments=sys.argv[1:], target_c harness_options=harness_options, limit_to=used_files, extra_harness_options=extra_harness_options, bundle_sdk=True, pkgdir=options.pkgdir) else: from cuddlefish.runner import run_app + if options.no_connections == "default": + if command == "run": + no_connections = False + else: + no_connections = True + elif options.no_connections == "on": + no_connections = True + else: + no_connections = False + if options.profiledir: options.profiledir = os.path.expanduser(options.profiledir) options.profiledir = os.path.abspath(options.profiledir) if options.addons is not None: options.addons = options.addons.split(",") enable_e10s = options.enable_e10s or target_cfg.get('e10s', False) @@ -926,17 +939,18 @@ def run(arguments=sys.argv[1:], target_c used_files=used_files, enable_mobile=options.enable_mobile, mobile_app_name=options.mobile_app_name, env_root=env_root, is_running_tests=(command == "test"), overload_modules=options.overload_modules, bundle_sdk=options.bundle_sdk, pkgdir=options.pkgdir, - enable_e10s=enable_e10s) + enable_e10s=enable_e10s, + no_connections=no_connections) except ValueError, e: print "" print "A given cfx option has an inappropriate value:" print >>sys.stderr, " " + " \n ".join(str(e).split("\n")) retval = -1 except Exception, e: if str(e).startswith(MOZRUNNER_BIN_NOT_FOUND): print >>sys.stderr, MOZRUNNER_BIN_NOT_FOUND_HELP.strip()
--- a/addon-sdk/source/python-lib/cuddlefish/prefs.py +++ b/addon-sdk/source/python-lib/cuddlefish/prefs.py @@ -14,30 +14,49 @@ DEFAULT_COMMON_PREFS = { 'devtools.debugger.remote-enabled' : True, 'extensions.sdk.console.logLevel': 'info', 'extensions.checkCompatibility.nightly' : False, # Disable extension updates and notifications. 'extensions.update.enabled' : False, + 'lightweightThemes.update.enabled' : False, 'extensions.update.notifyUser' : False, # From: # http://hg.mozilla.org/mozilla-central/file/1dd81c324ac7/build/automation.py.in#l372 # Only load extensions from the application and user profile. # AddonManager.SCOPE_PROFILE + AddonManager.SCOPE_APPLICATION 'extensions.enabledScopes' : 5, # Disable metadata caching for installed add-ons by default 'extensions.getAddons.cache.enabled' : False, # Disable intalling any distribution add-ons 'extensions.installDistroAddons' : False, # Allow installing extensions dropped into the profile folder 'extensions.autoDisableScopes' : 10, +} + +DEFAULT_NO_CONNECTIONS_PREFS = { + 'toolkit.telemetry.enabled': False, + 'app.update.auto' : False, + 'app.update.url': 'http://localhost/app-dummy/update', + 'media.gmp-gmpopenh264.autoupdate' : False, + 'media.gmp-manager.cert.checkAttributes' : False, + 'media.gmp-manager.cert.requireBuiltIn' : False, + 'media.gmp-manager.url' : 'http://localhost/media-dummy/gmpmanager', + 'browser.newtab.url' : 'about:blank', + 'browser.search.update': False, + 'browser.safebrowsing.enabled' : False, + 'browser.safebrowsing.updateURL': 'http://localhost/safebrowsing-dummy/update', + 'browser.safebrowsing.gethashURL': 'http://localhost/safebrowsing-dummy/gethash', + 'browser.safebrowsing.reportURL': 'http://localhost/safebrowsing-dummy/report', + 'browser.safebrowsing.malware.reportURL': 'http://localhost/safebrowsing-dummy/malwarereport', + # Disable app update 'app.update.enabled' : False, # Point update checks to a nonexistent local URL for fast failures. 'extensions.update.url' : 'http://localhost/extensions-dummy/updateURL', 'extensions.blocklist.url' : 'http://localhost/extensions-dummy/blocklistURL', # Make sure opening about:addons won't hit the network. 'extensions.webservice.discoverURL' : 'http://localhost/extensions-dummy/discoveryURL'
--- a/addon-sdk/source/python-lib/cuddlefish/runner.py +++ b/addon-sdk/source/python-lib/cuddlefish/runner.py @@ -12,35 +12,36 @@ import subprocess import re import shutil import mozrunner from cuddlefish.prefs import DEFAULT_COMMON_PREFS from cuddlefish.prefs import DEFAULT_FIREFOX_PREFS from cuddlefish.prefs import DEFAULT_THUNDERBIRD_PREFS from cuddlefish.prefs import DEFAULT_FENNEC_PREFS +from cuddlefish.prefs import DEFAULT_NO_CONNECTIONS_PREFS # Used to remove noise from ADB output CLEANUP_ADB = re.compile(r'^(I|E)/(stdout|stderr|GeckoConsole)\s*\(\s*\d+\):\s*(.*)$') # Used to filter only messages send by `console` module FILTER_ONLY_CONSOLE_FROM_ADB = re.compile(r'^I/(stdout|stderr)\s*\(\s*\d+\):\s*((info|warning|error|debug): .*)$') # Used to detect the currently running test PARSEABLE_TEST_NAME = re.compile(r'TEST-START \| ([^\n]+)\n') # Maximum time we'll wait for tests to finish, in seconds. # The purpose of this timeout is to recover from infinite loops. It should be # longer than the amount of time any test run takes, including those on slow # machines running slow (debug) versions of Firefox. -RUN_TIMEOUT = 1.5 * 60 * 60 # 1.5 Hour +RUN_TIMEOUT = 5400 #1.5 hours (1.5 * 60 * 60 sec) # Maximum time we'll wait for tests to emit output, in seconds. # The purpose of this timeout is to recover from hangs. It should be longer # than the amount of time any test takes to report results. -OUTPUT_TIMEOUT = 60 * 5 # five minutes +OUTPUT_TIMEOUT = 300 #five minutes (60 * 5 sec) def follow_file(filename): """ Generator that yields the latest unread content from the given file, or None if no new content is available. For example: @@ -414,28 +415,32 @@ def run_app(harness_root_dir, manifest_r norun=None, used_files=None, enable_mobile=False, mobile_app_name=None, env_root=None, is_running_tests=False, overload_modules=False, bundle_sdk=True, pkgdir="", - enable_e10s=False): + enable_e10s=False, + no_connections=False): if binary: binary = os.path.expanduser(binary) if addons is None: addons = [] else: addons = list(addons) cmdargs = [] preferences = dict(DEFAULT_COMMON_PREFS) + if no_connections: + preferences.update(DEFAULT_NO_CONNECTIONS_PREFS) + if enable_e10s: preferences['browser.tabs.remote.autostart'] = True # For now, only allow running on Mobile with --force-mobile argument if app_type in ["fennec", "fennec-on-device"] and not enable_mobile: print """ WARNING: Firefox Mobile support is still experimental. If you would like to run an addon on this platform, use --force-mobile flag: @@ -502,16 +507,18 @@ def run_app(harness_root_dir, manifest_r logfile_tail = follow_file(logfile) atexit.register(maybe_remove_logfile) logfile = os.path.abspath(os.path.expanduser(logfile)) maybe_remove_logfile() env = {} env.update(os.environ) + if no_connections: + env['MOZ_DISABLE_NONLOCAL_CONNECTIONS'] = '1' env['MOZ_NO_REMOTE'] = '1' env['XPCOM_DEBUG_BREAK'] = 'stack' env['NS_TRACE_MALLOC_DISABLE_STACKS'] = '1' env.update(extra_environment) if norun: cmdargs.append("-no-remote") # Create the addon XPI so mozrunner will copy it to the profile it creates.
--- a/addon-sdk/source/python-lib/cuddlefish/xpi.py +++ b/addon-sdk/source/python-lib/cuddlefish/xpi.py @@ -28,27 +28,25 @@ def build_xpi(template_root_dir, manifes "application.ini", xpi_path] IGNORED_TOP_LVL_FILES = ["install.rdf"] files_to_copy = {} # maps zipfile path to local-disk abspath dirs_to_create = set() # zipfile paths, no trailing slash zf = zipfile.ZipFile(xpi_path, "w", zipfile.ZIP_DEFLATED) - open('.install.rdf', 'w').write(str(manifest)) - zf.write('.install.rdf', 'install.rdf') - os.remove('.install.rdf') + zf.writestr('install.rdf', str(manifest)) # Handle add-on icon if 'icon' in harness_options: - zf.write(str(harness_options['icon']), 'icon.png') + zf.write(os.path.join(str(harness_options['icon'])), 'icon.png') del harness_options['icon'] if 'icon64' in harness_options: - zf.write(str(harness_options['icon64']), 'icon64.png') + zf.write(os.path.join(str(harness_options['icon64'])), 'icon64.png') del harness_options['icon64'] # chrome.manifest if os.path.isfile(os.path.join(pkgdir, 'chrome.manifest')): files_to_copy['chrome.manifest'] = os.path.join(pkgdir, 'chrome.manifest') # chrome folder (would contain content, skin, and locale folders typically) folder = 'chrome' @@ -156,14 +154,12 @@ def build_xpi(template_root_dir, manifes harness_options = harness_options.copy() for key,value in extra_harness_options.items(): if key in harness_options: msg = "Can't use --harness-option for existing key '%s'" % key raise HarnessOptionAlreadyDefinedError(msg) harness_options[key] = value # Write harness-options.json - open('.options.json', 'w').write(json.dumps(harness_options, indent=1, - sort_keys=True)) - zf.write('.options.json', 'harness-options.json') - os.remove('.options.json') + zf.writestr('harness-options.json', json.dumps(harness_options, indent=1, + sort_keys=True)) zf.close()
--- a/addon-sdk/source/python-lib/mozrunner/killableprocess.py +++ b/addon-sdk/source/python-lib/mozrunner/killableprocess.py @@ -121,26 +121,26 @@ class Popen(subprocess.Popen): cwd, env, universal_newlines, startupinfo, creationflags, shell, to_close, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) = args_tuple if not isinstance(args, types.StringTypes): args = subprocess.list2cmdline(args) - + # Always or in the create new process group creationflags |= winprocess.CREATE_NEW_PROCESS_GROUP if startupinfo is None: startupinfo = winprocess.STARTUPINFO() if None not in (p2cread, c2pwrite, errwrite): startupinfo.dwFlags |= winprocess.STARTF_USESTDHANDLES - + startupinfo.hStdInput = int(p2cread) startupinfo.hStdOutput = int(c2pwrite) startupinfo.hStdError = int(errwrite) if shell: startupinfo.dwFlags |= winprocess.STARTF_USESHOWWINDOW startupinfo.wShowWindow = winprocess.SW_HIDE comspec = os.environ.get("COMSPEC", "cmd.exe") args = comspec + " /c " + args @@ -167,17 +167,17 @@ class Popen(subprocess.Popen): self._child_created = True self._handle = hp self._thread = ht self.pid = pid self.tid = tid if canCreateJob: # We create a new job for this process, so that we can kill - # the process and any sub-processes + # the process and any sub-processes self._job = winprocess.CreateJobObject() winprocess.AssignProcessToJobObject(self._job, int(hp)) else: self._job = None winprocess.ResumeThread(int(ht)) ht.Close() @@ -193,17 +193,17 @@ class Popen(subprocess.Popen): """Kill the process. If group=True, all sub-processes will also be killed.""" self.kill_called = True if mswindows: if group and self._job: winprocess.TerminateJobObject(self._job, 127) else: winprocess.TerminateProcess(self._handle, 127) - self.returncode = 127 + self.returncode = 127 else: if group: try: os.killpg(self.pid, signal.SIGKILL) except: pass else: os.kill(self.pid, signal.SIGKILL) self.returncode = -9 @@ -218,30 +218,30 @@ class Popen(subprocess.Popen): timeout = timeout * 1000 starttime = datetime.datetime.now() if mswindows: if timeout is None: timeout = -1 rc = winprocess.WaitForSingleObject(self._handle, timeout) - + if (rc == winprocess.WAIT_OBJECT_0 or rc == winprocess.WAIT_ABANDONED or rc == winprocess.WAIT_FAILED): # Object has either signaled, or the API call has failed. In # both cases we want to give the OS the benefit of the doubt # and supply a little time before we start shooting processes # with an M-16. - # Returns 1 if running, 0 if not, -1 if timed out + # Returns 1 if running, 0 if not, -1 if timed out def check(): now = datetime.datetime.now() diff = now - starttime - if (diff.seconds * 1000 * 1000 + diff.microseconds) < (timeout * 1000): + if (diff.seconds * 1000000 + diff.microseconds) < (timeout * 1000): # (1000*1000) if self._job: if (winprocess.QueryInformationJobObject(self._job, 8)['BasicInfo']['ActiveProcesses'] > 0): # Job Object is still containing active processes return 1 else: # No job, we use GetExitCodeProcess, which will tell us if the process is still active self.returncode = winprocess.GetExitCodeProcess(self._handle) if (self.returncode == STILL_ACTIVE): @@ -309,21 +309,21 @@ class Popen(subprocess.Popen): return group_wait(timeout) else: if subprocess.poll() is not None: returncode = self.returncode time.sleep(.5) now = datetime.datetime.now() diff = now - starttime return self.returncode - + return self.returncode # We get random maxint errors from subprocesses __del__ __del__ = lambda self: None def setpgid_preexec_fn(): os.setpgid(0, 0) - + def runCommand(cmd, **kwargs): if sys.platform != "win32": return Popen(cmd, preexec_fn=setpgid_preexec_fn, **kwargs) else: return Popen(cmd, **kwargs)
--- a/addon-sdk/source/test/addons/e10s-tabs/lib/main.js +++ b/addon-sdk/source/test/addons/e10s-tabs/lib/main.js @@ -1,19 +1,50 @@ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 'use strict'; const { merge } = require('sdk/util/object'); -const { get } = require('sdk/preferences/service'); +const { version, platform } = require('sdk/system'); +const { getMostRecentBrowserWindow, isBrowser } = require('sdk/window/utils'); +const { WindowTracker } = require('sdk/deprecated/window-utils'); +const { close, focus } = require('sdk/window/helpers'); +const { when } = require('sdk/system/unload'); -merge(module.exports, require('./test-tab')); +function replaceWindow(remote) { + let next = null; + let old = getMostRecentBrowserWindow(); + let promise = new Promise(resolve => { + let tracker = WindowTracker({ + onTrack: window => { + if (window !== next) + return; + resolve(window); + tracker.unload(); + } + }); + }) + next = old.OpenBrowserWindow({ remote }); + return promise.then(focus).then(_ => close(old)); +} + +// merge(module.exports, require('./test-tab')); merge(module.exports, require('./test-tab-events')); merge(module.exports, require('./test-tab-observer')); merge(module.exports, require('./test-tab-utils')); -// e10s tests should not ride the train to aurora -if (get('app.update.channel') !== 'nightly') { +// run e10s tests only on builds from trunk, fx-team, Nightly.. +if (!version.endsWith('a1')) { module.exports = {}; } -require('sdk/test/runner').runTestsFromModule(module); +// bug 1054482 - e10s test addons time out on linux +if (platform === 'linux') { + module.exports = {}; + require('sdk/test/runner').runTestsFromModule(module); +} +else { + replaceWindow(true).then(_ => + require('sdk/test/runner').runTestsFromModule(module)); + + when(_ => replaceWindow(false)); +}
--- a/addon-sdk/source/test/addons/e10s-tabs/package.json +++ b/addon-sdk/source/test/addons/e10s-tabs/package.json @@ -1,10 +1,9 @@ { "name": "e10s-tabs", "title": "e10s-tabs", "id": "jid1-ZZaXFHAPlHwbgw", "description": "run tab tests in e10s mode", "author": "Tomislav Jovanovic", "license": "MPL 2.0", - "version": "0.1", - "e10s": true + "version": "0.1" }
--- a/addon-sdk/source/test/addons/e10s/lib/main.js +++ b/addon-sdk/source/test/addons/e10s/lib/main.js @@ -1,36 +1,61 @@ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 'use strict'; -const { get: getPref } = require('sdk/preferences/service'); -const { getMostRecentBrowserWindow } = require('sdk/window/utils'); +const { getMostRecentBrowserWindow, isBrowser } = require('sdk/window/utils'); +const { promise: windowPromise, close, focus } = require('sdk/window/helpers'); const { openTab, closeTab, getBrowserForTab } = require('sdk/tabs/utils'); +const { WindowTracker } = require('sdk/deprecated/window-utils'); +const { version, platform } = require('sdk/system'); +const { when } = require('sdk/system/unload'); const tabs = require('sdk/tabs'); -exports.testRemotePrefIsSet = function(assert) { - assert.ok(getPref('browser.tabs.remote.autostart'), - "Electrolysis remote tabs pref should be set"); -} - exports.testTabIsRemote = function(assert, done) { const url = 'data:text/html,test-tab-is-remote'; let tab = openTab(getMostRecentBrowserWindow(), url); assert.ok(tab.getAttribute('remote'), "The new tab should be remote"); // can't simply close a remote tab before it is loaded, bug 1006043 let mm = getBrowserForTab(tab).messageManager; mm.addMessageListener('7', function listener() { mm.removeMessageListener('7', listener); tabs.once('close', done); closeTab(tab); }) mm.loadFrameScript('data:,sendAsyncMessage("7")', true); } -// e10s tests should not ride the train to aurora, beta -if (getPref('app.update.channel') !== 'nightly') { +// run e10s tests only on builds from trunk, fx-team, Nightly.. +if (!version.endsWith('a1')) { module.exports = {}; } -require('sdk/test/runner').runTestsFromModule(module); +function replaceWindow(remote) { + let next = null; + let old = getMostRecentBrowserWindow(); + let promise = new Promise(resolve => { + let tracker = WindowTracker({ + onTrack: window => { + if (window !== next) + return; + resolve(window); + tracker.unload(); + } + }); + }) + next = old.OpenBrowserWindow({ remote }); + return promise.then(focus).then(_ => close(old)); +} + +// bug 1054482 - e10s test addons time out on linux +if (platform === 'linux') { + module.exports = {}; + require('sdk/test/runner').runTestsFromModule(module); +} +else { + replaceWindow(true).then(_ => + require('sdk/test/runner').runTestsFromModule(module)); + + when(_ => replaceWindow(false)); +}
--- a/addon-sdk/source/test/addons/e10s/package.json +++ b/addon-sdk/source/test/addons/e10s/package.json @@ -1,10 +1,9 @@ { - "name": "e10s-flag", - "title": "e10s-flag", + "name": "e10s", + "title": "e10s", "id": "jid1-DYaXFHAPlHwbgw", "description": "a basic e10s test add-on", "author": "Tomislav Jovanovic", "license": "MPL 2.0", - "version": "0.1", - "e10s": true + "version": "0.1" }
--- a/addon-sdk/source/test/addons/page-mod-debugger-post/main.js +++ b/addon-sdk/source/test/addons/page-mod-debugger-post/main.js @@ -127,9 +127,12 @@ function attachTabActorForUrl(aClient, a } function closeConnection() { let deferred = promise.defer(); gClient.close(deferred.resolve); return deferred.promise; } +// bug 1042976 - temporary test disable +module.exports = {}; + require('sdk/test/runner').runTestsFromModule(module);
--- a/addon-sdk/source/test/addons/page-mod-debugger-pre/main.js +++ b/addon-sdk/source/test/addons/page-mod-debugger-pre/main.js @@ -122,9 +122,12 @@ function attachTabActorForUrl(aClient, a } function closeConnection() { let deferred = promise.defer(); gClient.close(deferred.resolve); return deferred.promise; } +// bug 1042976 - temporary test disable +module.exports = {}; + require('sdk/test/runner').runTestsFromModule(module);
--- a/addon-sdk/source/test/addons/places/tests/test-places-events.js +++ b/addon-sdk/source/test/addons/places/tests/test-places-events.js @@ -20,54 +20,51 @@ const bmsrv = Cc['@mozilla.org/browser/n getService(Ci.nsINavBookmarksService); const { release, platform } = require('node/os'); const isOSX10_6 = (() => { let vString = release(); return vString && /darwin/.test(platform()) && /10\.6/.test(vString); })(); -const { - search -} = require('sdk/places/history'); +const { search } = require('sdk/places/history'); const { invalidResolve, invalidReject, createTree, createBookmark, compareWithHost, addVisits, resetPlaces, createBookmarkItem, removeVisits } = require('../places-helper'); const { save, MENU, UNSORTED } = require('sdk/places/bookmarks'); const { promisedEmitter } = require('sdk/places/utils'); exports['test bookmark-item-added'] = function (assert, done) { - function handler ({type, data}) { + events.on('data', function handler ({type, data}) { if (type !== 'bookmark-item-added') return; if (data.title !== 'bookmark-added-title') return; + events.off('data', handler); assert.equal(type, 'bookmark-item-added', 'correct type in bookmark-added event'); - assert.equal(data.type, 'bookmark', 'correct data in bookmark-added event'); - assert.ok(data.id != null, 'correct data in bookmark-added event'); - assert.ok(data.parentId != null, 'correct data in bookmark-added event'); - assert.ok(data.index != null, 'correct data in bookmark-added event'); - assert.equal(data.url, 'http://moz.com/', 'correct data in bookmark-added event'); - assert.ok(data.dateAdded != null, 'correct data in bookmark-added event'); - events.off('data', handler); + assert.equal(data.type, 'bookmark', 'correct data.type in bookmark-added event'); + assert.ok(data.id != null, 'correct data.id in bookmark-added event'); + assert.notEqual(data.parentId, null, 'correct data.parentId in bookmark-added event'); + assert.ok(data.index >= 0, 'correct data.index in bookmark-added event'); + assert.equal(data.url, 'http://moz.com/', 'correct data.url in bookmark-added event'); + assert.notEqual(data.dateAdded, null, 'correct data.dateAdded in bookmark-added event'); done(); - } - events.on('data', handler); + }); createBookmark({ title: 'bookmark-added-title' }); }; exports['test bookmark-item-changed'] = function (assert, done) { let id; let complete = makeCompleted(done); // Due to bug 969616 and bug 971964, disabling tests in 10.6 (happens only // in debug builds) to prevent intermittent failures if (isOSX10_6) { - assert.ok(true, 'skipping test in OSX 10.6'); + assert.pass('skipping test in OSX 10.6'); return done(); } function handler ({type, data}) { if (type !== 'bookmark-item-changed') return; if (data.id !== id) return; // Abort if the 'bookmark-item-changed' event isn't for the `title` property, // as sometimes the event can be for the `url` property. @@ -89,28 +86,28 @@ exports['test bookmark-item-changed'] = complete(); } events.on('data', handler); createBookmarkItem({ title: 'bookmark-changed-title' }).then(item => { id = item.id; item.title = 'bookmark-changed-title-2'; return saveP(item); - }).then(complete); + }).then(complete).catch(assert.fail); }; exports['test bookmark-item-moved'] = function (assert, done) { let id; let complete = makeCompleted(done); let previousIndex, previousParentId; // Due to bug 969616 and bug 971964, disabling tests in 10.6 (happens only // in debug builds) to prevent intermittent failures if (isOSX10_6) { - assert.ok(true, 'skipping test in OSX 10.6'); + assert.ok(true, 'skipping test in OSX 10.6'); return done(); } function handler ({type, data}) { if (type !== 'bookmark-item-moved') return; if (data.id !== id) return; assert.equal(type, 'bookmark-item-moved', 'correct type in bookmark-item-moved event'); @@ -133,17 +130,17 @@ exports['test bookmark-item-moved'] = fu title: 'bookmark-moved-title', group: UNSORTED }).then(item => { id = item.id; previousIndex = bmsrv.getItemIndex(id); previousParentId = bmsrv.getFolderIdForItem(id); item.group = MENU; return saveP(item); - }).then(complete); + }).then(complete).catch(assert.fail); }; exports['test bookmark-item-removed'] = function (assert, done) { let id; let complete = makeCompleted(done); function handler ({type, data}) { if (type !== 'bookmark-item-removed') return; if (data.id !== id) return; @@ -166,17 +163,17 @@ exports['test bookmark-item-removed'] = createBookmarkItem({ title: 'bookmark-item-remove-title', group: UNSORTED }).then(item => { id = item.id; item.remove = true; return saveP(item); - }).then(complete); + }).then(complete).catch(assert.fail); }; exports['test bookmark-item-visited'] = function (assert, done) { let id; let complete = makeCompleted(done); function handler ({type, data}) { if (type !== 'bookmark-item-visited') return; if (data.id !== id) return; @@ -200,17 +197,17 @@ exports['test bookmark-item-visited'] = events.on('data', handler); createBookmarkItem({ title: 'bookmark-item-visited', url: 'http://bookmark-item-visited.com/' }).then(item => { id = item.id; return addVisits('http://bookmark-item-visited.com/'); - }).then(complete); + }).then(complete).catch(assert.fail); }; exports['test history-start-batch, history-end-batch, history-start-clear'] = function (assert, done) { let complete = makeCompleted(done, 4); let startEvent = filter(events, ({type}) => type === 'history-start-batch'); let endEvent = filter(events, ({type}) => type === 'history-end-batch'); let clearEvent = filter(events, ({type}) => type === 'history-start-clear'); function startHandler ({type, data}) {
--- a/addon-sdk/source/test/fixtures/native-addon-test/index.js +++ b/addon-sdk/source/test/fixtures/native-addon-test/index.js @@ -14,16 +14,17 @@ exports.defaultMain = require('test-defa exports.testJSON = require('./dir/c'); exports.dummyModule = require('./dir/dummy'); exports.eventCore = require('sdk/event/core'); exports.promise = require('sdk/core/promise'); exports.localJSM = require('./dir/test.jsm'); exports.promisejsm = require('modules/Promise.jsm').Promise; +exports.require = require; let math = require('test-math'); exports.areModulesCached = (math === exports.math); // Added noise to test AST walker function square (x) { let tmp = x; tmp *= x;
new file mode 100644 --- /dev/null +++ b/addon-sdk/source/test/fixtures/native-addon-test/node_modules/test-assets/index.js @@ -0,0 +1,1 @@ +module.exports = "assets!"
new file mode 100644 --- /dev/null +++ b/addon-sdk/source/test/fixtures/native-addon-test/node_modules/test-assets/package.json @@ -0,0 +1,6 @@ +{ + "name": "test-assets", + "version": "0.0.1", + "dependencies": { + } +}
new file mode 100644 --- /dev/null +++ b/addon-sdk/source/test/fixtures/native-addon-test/node_modules/test-assets/styles.css @@ -0,0 +1,3 @@ +body { + background-color: #ff0077; +}
--- a/addon-sdk/source/test/fixtures/native-addon-test/package.json +++ b/addon-sdk/source/test/fixtures/native-addon-test/package.json @@ -1,9 +1,10 @@ { "main":"index.js", "dependencies": { "test-math": "*", "test-custom-main": "*", "test-custom-main-relative": "*", - "test-default-main": "*" + "test-default-main": "*", + "test-assets": "*" } }
--- a/addon-sdk/source/test/test-loader.js +++ b/addon-sdk/source/test/test-loader.js @@ -361,9 +361,17 @@ exports['test shared globals'] = functio assert.ok(Cu.getGlobalForObject(m).foo, "main is shared"); assert.ok(Cu.getGlobalForObject(a).foo, "a is shared"); assert.ok(!Cu.getGlobalForObject(b).foo, "b isn't shared"); unload(loader); } +exports["test require#resolve"] = function(assert) { + let root = require.resolve("sdk/tabs").replace(/commonjs\.path\/(.*)$/, "") + "commonjs.path/"; + assert.ok(/^resource:\/\/extensions\.modules\.[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}-at-jetpack\.commonjs\.path\/$/.test(root), "correct resolution root"); + + assert.equal(root + "sdk/tabs.js", require.resolve("sdk/tabs"), "correct resolution of sdk module"); + assert.equal(root + "toolkit/loader.js", require.resolve("toolkit/loader"), "correct resolution of sdk module"); +}; + require('test').run(exports);
--- a/addon-sdk/source/test/test-native-loader.js +++ b/addon-sdk/source/test/test-native-loader.js @@ -80,23 +80,23 @@ exports['test JSM loading'] = function ( getJSON('/fixtures/jsm-package/package.json').then(manifest => { let rootURI = root + '/fixtures/jsm-package/'; let loader = Loader({ paths: makePaths(rootURI), rootURI: rootURI, manifest: manifest, isNative: true }); - + let program = main(loader); assert.ok(program.localJSMCached, 'local relative JSMs are cached'); assert.ok(program.isCachedJSAbsolute , 'absolute resource:// js are cached'); assert.ok(program.isCachedPath, 'JSMs resolved in paths are cached'); assert.ok(program.isCachedAbsolute, 'absolute resource:// JSMs are cached'); - + assert.ok(program.localJSM, 'able to load local relative JSMs'); all([ program.isLoadedPath(10), program.isLoadedAbsolute(20), program.isLoadedJSAbsolute(30) ]).then(([path, absolute, jsabsolute]) => { assert.equal(path, 10, 'JSM files resolved from path work'); assert.equal(absolute, 20, 'JSM files resolved from full resource:// work'); @@ -147,16 +147,45 @@ exports['test native Loader without mapp let program = main(loader); testLoader(program, assert); unload(loader); done(); }).then(null, (reason) => console.error(reason)); }; +exports["test require#resolve with relative, dependencies"] = function(assert, done) { + getJSON('/fixtures/native-addon-test/package.json').then(manifest => { + let rootURI = root + '/fixtures/native-addon-test/'; + let loader = Loader({ + paths: makePaths(rootURI), + rootURI: rootURI, + manifest: manifest, + isNative: true + }); + + let program = main(loader); + let fixtureRoot = program.require.resolve("./").replace(/native-addon-test\/(.*)/, "") + "native-addon-test/"; + + assert.ok(/^resource:\/\/[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}-at-jetpack\/addon-sdk\/tests\/fixtures\/native-addon-test\/$/.test(fixtureRoot), + "correct resolution root"); + assert.equal(program.require.resolve("test-math"), fixtureRoot + "node_modules/test-math/index.js", "works with node_modules"); + assert.equal(program.require.resolve("./newmodule"), fixtureRoot + "newmodule/lib/file.js", "works with directory mains"); + assert.equal(program.require.resolve("./dir/a"), fixtureRoot + "dir/a.js", "works with normal relative module lookups"); + assert.equal(program.require.resolve("modules/Promise.jsm"), "resource://gre/modules/Promise.jsm", "works with path lookups"); + + // TODO bug 1050422, handle loading non JS/JSM file paths + // assert.equal(program.require.resolve("test-assets/styles.css"), fixtureRoot + "node_modules/test-assets/styles.css", + // "works with different file extension lookups in dependencies"); + + unload(loader); + done(); + }).then(null, (reason) => console.error(reason)); +}; + function testLoader (program, assert) { // Test 'main' entries // no relative custom main `lib/index.js` assert.equal(program.customMainModule, 'custom entry file', 'a node_module dependency correctly uses its `main` entry in manifest'); // relative custom main `./lib/index.js` assert.equal(program.customMainModuleRelative, 'custom entry file relative', 'a node_module dependency correctly uses its `main` entry in manifest with relative ./');
--- a/addon-sdk/source/test/test-tabs-common.js +++ b/addon-sdk/source/test/test-tabs-common.js @@ -7,16 +7,21 @@ const { Loader, LoaderWithHookedConsole const { browserWindows } = require('sdk/windows'); const tabs = require('sdk/tabs'); const { isPrivate } = require('sdk/private-browsing'); const { openDialog } = require('sdk/window/utils'); const { isWindowPrivate } = require('sdk/window/utils'); const { setTimeout } = require('sdk/timers'); const { openWebpage } = require('./private-browsing/helper'); const { isTabPBSupported, isWindowPBSupported } = require('sdk/private-browsing/utils'); +const { getTabContentWindow } = require('sdk/tabs/utils'); +const { attach, detach } = require('sdk/content/mod'); +const { Style } = require('sdk/stylesheet/style'); +const fixtures = require('./fixtures'); +const { viewFor } = require('sdk/view/core'); const app = require("sdk/system/xul-app"); const URL = 'data:text/html;charset=utf-8,<html><head><title>#title#</title></head></html>'; // TEST: tab count exports.testTabCounts = function(assert, done) { tabs.open({ url: 'about:blank', @@ -42,17 +47,17 @@ exports.testTabCounts = function(assert, exports.testTabRelativePath = function(assert, done) { const { merge } = require("sdk/util/object"); const self = require("sdk/self"); let loader = Loader(module, null, null, { modules: { "sdk/self": merge({}, self, { - data: merge({}, self.data, require("./fixtures")) + data: merge({}, self.data, fixtures) }) } }); let tabs = loader.require("sdk/tabs"); tabs.open({ url: "./test.html", @@ -545,9 +550,60 @@ exports.testOnPageShowEventDeclarative = tabs.open({ url: firstUrl, onPageShow: onPageShow, onOpen: onOpen, onReady: onReady }); }; +exports.testAttachStyleToTab = function(assert, done) { + let style = Style({ + source: "div { height: 100px; }", + uri: fixtures.url("include-file.css") + }); + + tabs.open({ + url: "data:text/html;charset=utf-8,<div style='background: silver'>css test</div>", + onReady: (tab) => { + let xulTab = viewFor(tab); + + attach(style, tab) + + let { document } = getTabContentWindow(xulTab); + let div = document.querySelector("div"); + + assert.equal(div.clientHeight, 100, + "Style.source properly attached to tab"); + + assert.equal(div.offsetHeight, 120, + "Style.uri properly attached to tab"); + + detach(style, tab); + + assert.notEqual(div.clientHeight, 100, + "Style.source properly detached from tab"); + + assert.notEqual(div.offsetHeight, 120, + "Style.uri properly detached from tab"); + + attach(style, xulTab); + + assert.equal(div.clientHeight, 100, + "Style.source properly attached to xul tab"); + + assert.equal(div.offsetHeight, 120, + "Style.uri properly attached to xul tab"); + + detach(style, tab); + + assert.notEqual(div.clientHeight, 100, + "Style.source properly detached from xul tab"); + + assert.notEqual(div.offsetHeight, 120, + "Style.uri properly detached from xul tab"); + + tab.close(done); + } + }); +}; + require('sdk/test').run(exports);
--- a/addon-sdk/source/test/test-ui-sidebar.js +++ b/addon-sdk/source/test/test-ui-sidebar.js @@ -17,16 +17,17 @@ const { getMostRecentBrowserWindow, isFo const { open, close, focus, promise: windowPromise } = require('sdk/window/helpers'); const { setTimeout, setImmediate } = require('sdk/timers'); const { isPrivate } = require('sdk/private-browsing'); const data = require('./fixtures'); const { URL } = require('sdk/url'); const { once, off, emit } = require('sdk/event/core'); const { defer, all } = require('sdk/core/promise'); const { modelFor } = require('sdk/model/core'); +require('sdk/windows'); const { BUILTIN_SIDEBAR_MENUITEMS, isSidebarShowing, getSidebarMenuitems, getExtraSidebarMenuitems, makeID, simulateCommand, simulateClick, isChecked } = require('./sidebar/utils'); exports.testSidebarBasicLifeCycle = function(assert, done) { const { Sidebar } = require('sdk/ui/sidebar'); let testName = 'testSidebarBasicLifeCycle';
new file mode 100644 --- /dev/null +++ b/addon-sdk/source/test/test-unit-test-finder.js @@ -0,0 +1,57 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + "use strict"; + +const { makeFilters } = require("sdk/deprecated/unit-test-finder"); + +const testFiles = [ "test-clipboard", "test-timers" ] +const testMethods = [ "test set clipboard", "test setTimeout" ] + +exports["test makeFilters no options"] = (assert) => { + let { fileFilter, testFilter } = makeFilters(); + testFiles.forEach(f => assert.ok(fileFilter(f), "using no options on filename " + f + " works")); + testMethods.forEach(m => assert.ok(testFilter(m), "using no options on method name " + m + " works")); +} + +exports["test makeFilters no filter"] = (assert) => { + let { fileFilter, testFilter } = makeFilters({}); + testFiles.forEach(f => assert.ok(fileFilter(f), "using no options on filename " + f + " works")); + testMethods.forEach(m => assert.ok(testFilter(m), "using no options on method name " + m + " works")); +} + +exports["test makeFilters no method filter"] = (assert) => { + let { fileFilter, testFilter } = makeFilters({ filter: "i" }); + testFiles.forEach(f => assert.ok(fileFilter(f), "using filter 'i' on filename " + f + " works")); + testMethods.forEach(m => assert.ok(testFilter(m), "using filter 'i' on method name " + m + " works")); + + let { fileFilter, testFilter } = makeFilters({ filter: "i:" }); + testFiles.forEach(f => assert.ok(fileFilter(f), "using filter 'i:' on filename " + f + " works")); + testMethods.forEach(m => assert.ok(testFilter(m), "using filter 'i:' on method name " + m + " works")); + + let { fileFilter, testFilter } = makeFilters({ filter: "z:" }); + testFiles.forEach(f => assert.ok(!fileFilter(f), "using filter 'z:' on filename " + f + " dnw")); + testMethods.forEach(m => assert.ok(testFilter(m), "using filter 'z:' on method name " + m + " works")); +} + +exports["test makeFilters no file filter"] = (assert) => { + let { fileFilter, testFilter } = makeFilters({ filter: ":i" }); + testFiles.forEach(f => assert.ok(fileFilter(f), "using filter ':i' on filename " + f + " works")); + testMethods.forEach(m => assert.ok(testFilter(m), "using filter ':i' on method name " + m + " works")); + + let { fileFilter, testFilter } = makeFilters({ filter: ":z" }); + testFiles.forEach(f => assert.ok(fileFilter(f), "using filter ':z' on filename " + f + " works")); + testMethods.forEach(m => assert.ok(!testFilter(m), "using filter ':z' on method name " + m + " dnw")); +} + +exports["test makeFilters both filters"] = (assert) => { + let { fileFilter, testFilter } = makeFilters({ filter: "i:i" }); + testFiles.forEach(f => assert.ok(fileFilter(f), "using filter 'i:i' on filename " + f + " works")); + testMethods.forEach(m => assert.ok(testFilter(m), "using filter 'i:i' on method name " + m + " works")); + + let { fileFilter, testFilter } = makeFilters({ filter: "z:z" }); + testFiles.forEach(f => assert.ok(!fileFilter(f), "using filter 'z:z' on filename " + f + " dnw")); + testMethods.forEach(m => assert.ok(!testFilter(m), "using filter 'z:z' on method name " + m + " dnw")); +} + +require("sdk/test").run(exports);