Return-Path: X-Original-To: apmail-archiva-commits-archive@www.apache.org Delivered-To: apmail-archiva-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id CB61C79D1 for ; Wed, 21 Dec 2011 09:07:59 +0000 (UTC) Received: (qmail 42820 invoked by uid 500); 21 Dec 2011 09:07:59 -0000 Delivered-To: apmail-archiva-commits-archive@archiva.apache.org Received: (qmail 42756 invoked by uid 500); 21 Dec 2011 09:07:52 -0000 Mailing-List: contact commits-help@archiva.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@archiva.apache.org Delivered-To: mailing list commits@archiva.apache.org Received: (qmail 42743 invoked by uid 99); 21 Dec 2011 09:07:52 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 21 Dec 2011 09:07:52 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 21 Dec 2011 09:07:47 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id B15C723889E1 for ; Wed, 21 Dec 2011 09:07:25 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1221654 - /archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/knockout-debug.js Date: Wed, 21 Dec 2011 09:07:25 -0000 To: commits@archiva.apache.org From: olamy@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20111221090725.B15C723889E1@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: olamy Date: Wed Dec 21 09:07:25 2011 New Revision: 1221654 URL: http://svn.apache.org/viewvc?rev=1221654&view=rev Log: upgrade Knockout to v2.0.0rc3 Modified: archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/knockout-debug.js Modified: archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/knockout-debug.js URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/knockout-debug.js?rev=1221654&r1=1221653&r2=1221654&view=diff ============================================================================== --- archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/knockout-debug.js (original) +++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/knockout-debug.js Wed Dec 21 09:07:25 2011 @@ -1,4 +1,4 @@ -// Knockout JavaScript library v1.3.0rc +// Knockout JavaScript library v2.0.0rc3 // (c) Steven Sanderson - http://knockoutjs.com/ // License: MIT (http://www.opensource.org/licenses/mit-license.php) @@ -294,17 +294,34 @@ ko.utils = new (function () { }, outerHTML: function(node) { - // For IE and Chrome - var nativeOuterHtml = node.outerHTML; - if (typeof nativeOuterHtml == "string") - return nativeOuterHtml; - + // For Chrome on non-text nodes + // (Although IE supports outerHTML, the way it formats HTML is inconsistent - sometimes closing tags are omitted, sometimes not. That caused https://github.com/SteveSanderson/knockout/issues/212.) + if (ieVersion === undefined) { + var nativeOuterHtml = node.outerHTML; + if (typeof nativeOuterHtml == "string") + return nativeOuterHtml; + } + // Other browsers var dummyContainer = window.document.createElement("div"); dummyContainer.appendChild(node.cloneNode(true)); return dummyContainer.innerHTML; }, + setTextContent: function(element, textContent) { + var value = ko.utils.unwrapObservable(textContent); + if ((value === null) || (value === undefined)) + value = ""; + + 'innerText' in element ? element.innerText = value + : element.textContent = value; + + if (ieVersion) { + // Believe it or not, this actually fixes an IE9 rendering bug. Insane. https://github.com/SteveSanderson/knockout/issues/209 + element.innerHTML = element.innerHTML; + } + }, + range: function (min, max) { min = ko.utils.unwrapObservable(min); max = ko.utils.unwrapObservable(max); @@ -398,25 +415,29 @@ ko.utils = new (function () { })(); ko.exportSymbol('ko.utils', ko.utils); -ko.exportSymbol('ko.utils.arrayForEach', ko.utils.arrayForEach); -ko.exportSymbol('ko.utils.arrayFirst', ko.utils.arrayFirst); -ko.exportSymbol('ko.utils.arrayFilter', ko.utils.arrayFilter); -ko.exportSymbol('ko.utils.arrayGetDistinctValues', ko.utils.arrayGetDistinctValues); -ko.exportSymbol('ko.utils.arrayIndexOf', ko.utils.arrayIndexOf); -ko.exportSymbol('ko.utils.arrayMap', ko.utils.arrayMap); -ko.exportSymbol('ko.utils.arrayPushAll', ko.utils.arrayPushAll); -ko.exportSymbol('ko.utils.arrayRemoveItem', ko.utils.arrayRemoveItem); -ko.exportSymbol('ko.utils.extend', ko.utils.extend); -ko.exportSymbol('ko.utils.fieldsIncludedWithJsonPost', ko.utils.fieldsIncludedWithJsonPost); -ko.exportSymbol('ko.utils.getFormFields', ko.utils.getFormFields); -ko.exportSymbol('ko.utils.postJson', ko.utils.postJson); -ko.exportSymbol('ko.utils.parseJson', ko.utils.parseJson); -ko.exportSymbol('ko.utils.registerEventHandler', ko.utils.registerEventHandler); -ko.exportSymbol('ko.utils.stringifyJson', ko.utils.stringifyJson); -ko.exportSymbol('ko.utils.range', ko.utils.range); -ko.exportSymbol('ko.utils.toggleDomNodeCssClass', ko.utils.toggleDomNodeCssClass); -ko.exportSymbol('ko.utils.triggerEvent', ko.utils.triggerEvent); -ko.exportSymbol('ko.utils.unwrapObservable', ko.utils.unwrapObservable); +ko.utils.arrayForEach([ + ['arrayForEach', ko.utils.arrayForEach], + ['arrayFirst', ko.utils.arrayFirst], + ['arrayFilter', ko.utils.arrayFilter], + ['arrayGetDistinctValues', ko.utils.arrayGetDistinctValues], + ['arrayIndexOf', ko.utils.arrayIndexOf], + ['arrayMap', ko.utils.arrayMap], + ['arrayPushAll', ko.utils.arrayPushAll], + ['arrayRemoveItem', ko.utils.arrayRemoveItem], + ['extend', ko.utils.extend], + ['fieldsIncludedWithJsonPost', ko.utils.fieldsIncludedWithJsonPost], + ['getFormFields', ko.utils.getFormFields], + ['postJson', ko.utils.postJson], + ['parseJson', ko.utils.parseJson], + ['registerEventHandler', ko.utils.registerEventHandler], + ['stringifyJson', ko.utils.stringifyJson], + ['range', ko.utils.range], + ['toggleDomNodeCssClass', ko.utils.toggleDomNodeCssClass], + ['triggerEvent', ko.utils.triggerEvent], + ['unwrapObservable', ko.utils.unwrapObservable] +], function(item) { + ko.exportSymbol('ko.utils.' + item[0], item[1]); +}); if (!Function.prototype['bind']) { // Function.prototype.bind is a standard part of ECMAScript 5th Edition (December 2009, http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf) @@ -580,9 +601,28 @@ ko.exportSymbol('ko.utils.domNodeDisposa return ko.utils.makeArray(div.lastChild.childNodes); } + + function jQueryHtmlParse(html) { + var elems = jQuery['clean']([html]); + + // As of jQuery 1.7.1, jQuery parses the HTML by appending it to some dummy parent nodes held in an in-memory document fragment. + // Unfortunately, it never clears the dummy parent nodes from the document fragment, so it leaks memory over time. + // Fix this by finding the top-most dummy parent element, and detaching it from its owner fragment. + if (elems && elems[0]) { + // Find the top-most parent element that's a direct child of a document fragment + var elem = elems[0]; + while (elem.parentNode && elem.parentNode.nodeType !== 11 /* i.e., DocumentFragment */) + elem = elem.parentNode; + // ... then detach it + if (elem.parentNode) + elem.parentNode.removeChild(elem); + } + + return elems; + } ko.utils.parseHtmlFragment = function(html) { - return typeof jQuery != 'undefined' ? jQuery['clean']([html]) // As below, benefit from jQuery's optimisations where possible + return typeof jQuery != 'undefined' ? jQueryHtmlParse(html) // As below, benefit from jQuery's optimisations where possible : simpleHtmlParse(html); // ... otherwise, this simple logic will do in most common cases. }; @@ -699,6 +739,13 @@ ko.extenders = { }, timeout); } }); + }, + + 'notify': function(target, notifyWhen) { + target["equalityComparer"] = notifyWhen == "always" + ? function() { return false } // Treat all values as not equal + : ko.observable["fn"]["equalityComparer"]; + return target; } }; @@ -732,7 +779,6 @@ ko.subscribable = function () { ko.utils.extend(this, ko.subscribable['fn']); ko.exportProperty(this, 'subscribe', this.subscribe); ko.exportProperty(this, 'extend', this.extend); - ko.exportProperty(this, 'notifySubscribers', this.notifySubscribers); ko.exportProperty(this, 'getSubscriptionsCount', this.getSubscriptionsCount); } @@ -753,7 +799,7 @@ ko.subscribable['fn'] = { return subscription; }, - notifySubscribers: function (valueToNotify, event) { + "notifySubscribers": function (valueToNotify, event) { event = event || defaultEvent; if (this._subscriptions[event]) { ko.utils.arrayForEach(this._subscriptions[event].slice(0), function (subscription) { @@ -779,7 +825,7 @@ ko.subscribable['fn'] = { ko.isSubscribable = function (instance) { - return typeof instance.subscribe == "function" && typeof instance.notifySubscribers == "function"; + return typeof instance.subscribe == "function" && typeof instance["notifySubscribers"] == "function"; }; ko.exportSymbol('ko.subscribable', ko.subscribable); @@ -833,8 +879,8 @@ ko.observable = function (initialValue) } } ko.subscribable.call(observable); - observable.valueHasMutated = function () { observable.notifySubscribers(_latestValue); } - observable.valueWillMutate = function () { observable.notifySubscribers(_latestValue, "beforeChange"); } + observable.valueHasMutated = function () { observable["notifySubscribers"](_latestValue); } + observable.valueWillMutate = function () { observable["notifySubscribers"](_latestValue, "beforeChange"); } ko.utils.extend(observable, ko.observable['fn']); ko.exportProperty(observable, "valueHasMutated", observable.valueHasMutated); @@ -1066,13 +1112,13 @@ ko.dependentObservable = function (evalu }); var valueForThis = options["owner"] || evaluatorFunctionTarget; // If undefined, it will default to "window" by convention. This might change in the future. var newValue = options["read"].call(valueForThis); - dependentObservable.notifySubscribers(_latestValue, "beforeChange"); + dependentObservable["notifySubscribers"](_latestValue, "beforeChange"); _latestValue = newValue; } finally { ko.dependencyDetection.end(); } - dependentObservable.notifySubscribers(_latestValue); + dependentObservable["notifySubscribers"](_latestValue); _hasBeenEvaluated = true; } @@ -1207,13 +1253,15 @@ ko.exportSymbol('ko.computed', ko.depend ko.exportSymbol('ko.toJS', ko.toJS); ko.exportSymbol('ko.toJSON', ko.toJSON);(function () { + var hasDomDataExpandoProperty = '__ko__hasDomDataOptionValue__'; + // Normally, SELECT elements and their OPTIONs can only take value of type 'string' (because the values // are stored on DOM attributes). ko.selectExtensions provides a way for SELECTs/OPTIONs to have values // that are arbitrary objects. This is very convenient when implementing things like cascading dropdowns. ko.selectExtensions = { readValue : function(element) { if (element.tagName == 'OPTION') { - if (element['__ko__hasDomDataOptionValue__'] === true) + if (element[hasDomDataExpandoProperty] === true) return ko.utils.domData.get(element, ko.bindingHandlers.options.optionValueDomDataKey); return element.getAttribute("value"); } else if (element.tagName == 'SELECT') @@ -1226,18 +1274,19 @@ ko.exportSymbol('ko.toJSON', ko.toJSON); if (element.tagName == 'OPTION') { switch(typeof value) { case "string": - case "number": ko.utils.domData.set(element, ko.bindingHandlers.options.optionValueDomDataKey, undefined); - if ('__ko__hasDomDataOptionValue__' in element) { // IE <= 8 throws errors if you delete non-existent properties from a DOM node - delete element['__ko__hasDomDataOptionValue__']; + if (hasDomDataExpandoProperty in element) { // IE <= 8 throws errors if you delete non-existent properties from a DOM node + delete element[hasDomDataExpandoProperty]; } element.value = value; break; default: // Store arbitrary object using DomData ko.utils.domData.set(element, ko.bindingHandlers.options.optionValueDomDataKey, value); - element['__ko__hasDomDataOptionValue__'] = true; - element.value = ""; + element[hasDomDataExpandoProperty] = true; + + // Special treatment of numbers is just for backward compatibility. KO 1.2.1 wrote numerical values to element.value. + element.value = typeof value === "number" ? value : ""; break; } } else if (element.tagName == 'SELECT') { @@ -1894,7 +1943,10 @@ ko.bindingHandlers['event'] = { var allBindings = allBindingsAccessor(); try { - handlerReturnValue = handlerFunction.apply(viewModel, arguments); + // Take all the event args, and prefix with the viewmodel + var argsForHandler = ko.utils.makeArray(arguments); + argsForHandler.unshift(viewModel); + handlerReturnValue = handlerFunction.apply(viewModel, argsForHandler); } finally { if (handlerReturnValue !== true) { // Normally we want to prevent default action. Developer can override this be explicitly returning true. if (event.preventDefault) @@ -1920,7 +1972,7 @@ ko.bindingHandlers['event'] = { ko.bindingHandlers['submit'] = { 'init': function (element, valueAccessor, allBindingsAccessor, viewModel) { if (typeof valueAccessor() != "function") - throw new Error("The value for a submit binding must be a function to invoke on submit"); + throw new Error("The value for a submit binding must be a function"); ko.utils.registerEventHandler(element, "submit", function (event) { var handlerReturnValue; var value = valueAccessor(); @@ -2057,6 +2109,7 @@ ko.bindingHandlers['options'] = { return ko.selectExtensions.readValue(node) || node.innerText || node.textContent; }); var previousScrollTop = element.scrollTop; + element.scrollTop = 0; // Workaround for a Chrome rendering bug. Note that we restore the scroll position later. (https://github.com/SteveSanderson/knockout/issues/215) var value = ko.utils.unwrapObservable(valueAccessor()); var selectedValue = element.value; @@ -2097,9 +2150,8 @@ ko.bindingHandlers['options'] = { optionText = optionValue; // Given no optionsText arg; use the data value itself if ((optionText === null) || (optionText === undefined)) optionText = ""; - optionText = ko.utils.unwrapObservable(optionText).toString(); - typeof option.innerText == "string" ? option.innerText = optionText - : option.textContent = optionText; + + ko.utils.setTextContent(option, optionText); element.appendChild(option); } @@ -2127,7 +2179,7 @@ ko.bindingHandlers['options'] = { } } }; -ko.bindingHandlers['options'].optionValueDomDataKey = '__ko.bindingHandlers.options.optionValueDomData__'; +ko.bindingHandlers['options'].optionValueDomDataKey = '__ko.optionValueDomData__'; ko.bindingHandlers['selectedOptions'] = { getSelectedValuesFromSelectNode: function (selectNode) { @@ -2170,11 +2222,7 @@ ko.bindingHandlers['selectedOptions'] = ko.bindingHandlers['text'] = { 'update': function (element, valueAccessor) { - var value = ko.utils.unwrapObservable(valueAccessor()); - if ((value === null) || (value === undefined)) - value = ""; - typeof element.innerText == "string" ? element.innerText = value - : element.textContent = value; + ko.utils.setTextContent(element, valueAccessor()); } }; @@ -2435,11 +2483,11 @@ ko.exportSymbol('ko.allowedVirtualElemen ko.templateEngine = function () { }; ko.templateEngine.prototype['renderTemplateSource'] = function (templateSource, bindingContext, options) { - throw "Override renderTemplateSource in your ko.templateEngine subclass"; + throw "Override renderTemplateSource"; }; ko.templateEngine.prototype['createJavaScriptEvaluatorBlock'] = function (script) { - throw "Override createJavaScriptEvaluatorBlock in your ko.templateEngine subclass"; + throw "Override createJavaScriptEvaluatorBlock"; }; ko.templateEngine.prototype['makeTemplateSource'] = function(template) { @@ -2453,7 +2501,7 @@ ko.templateEngine.prototype['makeTemplat // Anonymous template return new ko.templateSources.anonymousTemplate(template); } else - throw new Error("Unrecognised template type: " + template); + throw new Error("Unknown template type: " + template); }; ko.templateEngine.prototype['renderTemplate'] = function (template, bindingContext, options) { @@ -2805,12 +2853,11 @@ ko.exportSymbol('ko.templateRewriting.ap var templateSubscription = null; - if (typeof bindingValue['foreach'] != "undefined") { + if ((typeof bindingValue === 'object') && ('foreach' in bindingValue)) { // Note: can't use 'in' operator on strings // Render once for each data point (treating data set as empty if shouldDisplay==false) var dataArray = (shouldDisplay && bindingValue['foreach']) || []; templateSubscription = ko.renderTemplateForEach(templateName || element, dataArray, /* options: */ bindingValue, element, bindingContext); - } - else { + } else { if (shouldDisplay) { // Render once for this single data point (or use the viewModel if no data was provided) var innerBindingContext = (typeof bindingValue == 'object') && ('data' in bindingValue)