archiva-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ol...@apache.org
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 GMT
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 </li> 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)



Mime
View raw message