From 5a34cac9594d710f6e5675bee34dc16be1b4d8a0 Mon Sep 17 00:00:00 2001 From: Ananya Sen Date: Mon, 16 Jul 2012 15:34:07 -0700 Subject: Fixed copy paste from external applications Signed-off-by: Ananya Sen --- js/clipboard/external-apps-clipboard-agent.js | 138 +++++---------------- .../internal-ops/elements-clipboard-agent.js | 24 ++-- js/mediators/element-mediator.js | 6 +- 3 files changed, 42 insertions(+), 126 deletions(-) (limited to 'js') diff --git a/js/clipboard/external-apps-clipboard-agent.js b/js/clipboard/external-apps-clipboard-agent.js index 6b9d8090..e78950df 100644 --- a/js/clipboard/external-apps-clipboard-agent.js +++ b/js/clipboard/external-apps-clipboard-agent.js @@ -38,6 +38,12 @@ var Montage = require("montage/core/core").Montage, var ExternalAppsClipboardAgent = exports.ExternalAppsClipboardAgent = Montage.create(Component, { + //count how many times pasted + //used to move multiple pastes of same copy + pasteCounter:{ + value: 0 + }, + paste:{ value: function(clipboardEvent){ var clipboardData = clipboardEvent.clipboardData, @@ -57,16 +63,14 @@ var ExternalAppsClipboardAgent = exports.ExternalAppsClipboardAgent = Montage.cr }catch(e){ console.log(""+e.stack); } - this.application.ninja.selectionController.selectElements(imageElement); this.application.ninja.currentDocument.model.needsSave = true; - } } } try{ if(!!htmlData || !!textData){ - this.pasteHtml(htmlData, textData); + this.doPasteHtml(htmlData, textData); } }catch(e){ console.log(""+e.stack); @@ -108,16 +112,16 @@ var ExternalAppsClipboardAgent = exports.ExternalAppsClipboardAgent = Montage.cr //Adding element once it is loaded element.onload = function () { element.onload = null; - self.application.ninja.elementMediator.addElements(element, rules, true); + self.application.ninja.elementMediator.addElements(element, rules, true/*notify*/, false /*callAddDelegate*/); }; //Setting rules of element rules = { 'position': 'absolute', - 'top' : '100px', - 'left' : '100px' + 'top' : '0px', + 'left' : '0px' }; // - self.application.ninja.elementMediator.addElements(element, rules, false); + self.application.ninja.elementMediator.addElements(element, rules, false/*notify*/, false /*callAddDelegate*/); } else { //HANDLE ERROR ON SAVING FILE TO BE ADDED AS ELEMENT } @@ -126,119 +130,37 @@ var ExternalAppsClipboardAgent = exports.ExternalAppsClipboardAgent = Montage.cr } }, - //paste from external applicaitons - pasteHtml:{ + doPasteHtml:{ value: function(htmlData, textData){ - var i=0, j=0, - pasteDataObject=null, - pastedElements = [], - node = null, nodeList = null, - styles = null, - divWrapper = null, - spanWrapper = null, - metaEl = null, - self = this; + var divWrapper = null, data = null; if(htmlData){ - //cleanse HTML - - htmlData.replace(/["+ textData +"")[0]; - styles = {"position":"absolute", "top":"100px", "left":"100px"}; - this.pastePositioned(node, styles); + htmlData = htmlData.replace(/\]+>/gi, ""); // Remove the meta tag. + htmlData = htmlData.replace(/\ - - - - -
- - - diff --git a/js/components/layout/stage-mode.reel/stage-mode.js b/js/components/layout/stage-mode.reel/stage-mode.js deleted file mode 100755 index bb8c4594..00000000 --- a/js/components/layout/stage-mode.reel/stage-mode.js +++ /dev/null @@ -1,77 +0,0 @@ -/* -Copyright (c) 2012, Motorola Mobility LLC. -All Rights Reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of Motorola Mobility LLC nor the names of its - contributors may be used to endorse or promote products derived from this - software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - */ - -var Montage = require("montage/core/core").Montage, - Component = require("montage/ui/component").Component; - -exports.StageMode = Montage.create(Component, { - - _chromePreview: { - value: null - }, - - chromePreview: { - get: function() { - return this._chromePreview; - }, - set: function(value) { - if(value !== this._chromePreview) { - this._chromePreview = value; - this.needsDraw = true; - } - } - }, - - prepareForDraw: { - value: function() { - this.element.addEventListener("click", this, false); - } - }, - - draw: { - value: function() { - if(this._livePreview) { - this.element.classList.remove("editMode"); - this.element.classList.add("liveMode"); - - } else { - this.element.classList.remove("liveMode"); - this.element.classList.add("editMode"); - } - } - }, - - handleClick: { - value: function(event) { - this.chromePreview = !this.chromePreview; - } - } -}); diff --git a/js/components/menu/menu-entry.reel/menu-entry.css b/js/components/menu/menu-entry.reel/menu-entry.css deleted file mode 100755 index 6f05d09c..00000000 --- a/js/components/menu/menu-entry.reel/menu-entry.css +++ /dev/null @@ -1,89 +0,0 @@ -/* -Copyright (c) 2012, Motorola Mobility LLC. -All Rights Reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of Motorola Mobility LLC nor the names of its - contributors may be used to endorse or promote products derived from this - software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - */ - -.topMenuItem { - float: left; - display: inline; -} - -.topMenuItem .menubg{ - color: #f7f7f7; -} - -.topMenuItem .menuName { - font-family: 'Droid Sans', sans-serif; - font-size: 10pt; - padding: 3px 12px 3px 8px; - text-shadow : 1px 1px 1px #000000; -} - -.menubg{ - display: inline; -} - -.menubg.checked .check { - opacity: 1; -} - -.selected { - background-color: #7F7F7F; -} - -.menu-label { - font-family: 'Droid Sans', sans-serif; - font-size: 10pt; - padding: 3px 12px 3px 8px; - text-shadow: 1px 1px 1px black; -} - -.subEntries{ - position: absolute; - z-index: 100000; - float:left; - font-family: 'Droid Sans', sans-serif !important; - color: #ffffff; - background: #494949; - border: 1px solid #292929; - border-radius: 8px; - padding: 8px 0px 8px 0px; - box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.8); - white-space:nowrap; -} - -.menuItem { - font-size: 9pt; - padding: 4px 8px; - display: block; - float: none; - position: relative; - background: #474747; - color: white; -} diff --git a/js/components/menu/menu-entry.reel/menu-entry.html b/js/components/menu/menu-entry.reel/menu-entry.html deleted file mode 100755 index ddac73ab..00000000 --- a/js/components/menu/menu-entry.reel/menu-entry.html +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - - - - - - -
  • - - -
      -
    • -
    - -
  • - - - diff --git a/js/components/menu/menu-entry.reel/menu-entry.js b/js/components/menu/menu-entry.reel/menu-entry.js deleted file mode 100755 index 10b49417..00000000 --- a/js/components/menu/menu-entry.reel/menu-entry.js +++ /dev/null @@ -1,140 +0,0 @@ -/* -Copyright (c) 2012, Motorola Mobility LLC. -All Rights Reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of Motorola Mobility LLC nor the names of its - contributors may be used to endorse or promote products derived from this - software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - */ - -var Montage = require("montage/core/core").Montage; -var Component = require("montage/ui/component").Component; - -exports.MenuEntry = Montage.create(Component, { - topHeader: { - value: null - }, - - topHeaderText: { - value: null - }, - - subEntries: { - value: null - }, - - // Reference to the parent Menu component - _menu: { - value: null - }, - - menu: { - get: function() { - return this._menu; - }, - set: function(value) { - if(value !== this._menu) { - this._menu = value; - } - } - }, - - _data: { - value: null - }, - - data: { - get: function() { - return this._data; - }, - set: function(value) { - if(this._data !== value) { - this._data = value; - } - } - }, - - select: { - value: function() { - this.element.classList.add("selected"); - this.subEntries.style.display = "block"; - } - }, - - deselect: { - value: function() { - this.element.classList.remove("selected"); - this.subEntries.style.display = "none"; - } - }, - - _menuIsActive: { - value: false - }, - - menuIsActive: { - get: function() { - return this._menuIsActive; - }, - set: function(value) { - if(value) this.element.addEventListener("mouseover", this, false); - } - }, - - toggleOnMenuItemAction: { - value: function() { - // TODO: Hack! Rework this! - //for non menu headers only - this.parentComponent.ownerComponent.toggleActivation(this); - } - }, - - captureMousedown: { - value: function(event) { - // TODO: Hack! Rework this! - //for menu headers only - if(event.target.getAttribute("data-montage-id") === "topHeaderText"){ - this.parentComponent.ownerComponent.toggleActivation(this); - } - } - }, - - handleMouseover: { - value: function(event) { - this.parentComponent.ownerComponent.activeEntry = this; - } - }, - - prepareForDraw: { - value: function() { - - this.subEntries.style.display = "none"; - - this.topHeaderText.innerHTML = this.data.header; - - this.element.addEventListener("mousedown", this, true); - } - } -}); diff --git a/js/components/menu/menu-item.reel/menu-item.css b/js/components/menu/menu-item.reel/menu-item.css deleted file mode 100755 index 95fd673c..00000000 --- a/js/components/menu/menu-item.reel/menu-item.css +++ /dev/null @@ -1,99 +0,0 @@ -/* -Copyright (c) 2012, Motorola Mobility LLC. -All Rights Reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of Motorola Mobility LLC nor the names of its - contributors may be used to endorse or promote products derived from this - software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - */ - -.menuItem .menuName { - font-family: 'Droid Sans', sans-serif; - font-size: 10pt; - padding: 3px 12px 3px 8px; - text-shadow : 1px 1px 1px #000000; - cursor:pointer; -} - -.menuItem:hover { - background-color: #7f7f7f; - cursor:pointer; -} - -.menubg .subEntries { - top: 0%; - left: 100%; - width: auto; - white-space:nowrap; -} - -.itemSeparator:hover { - background-color: #474747; -} - -.separator{ - width:100%; - height:2px; - position: relative; - border: 1px groove #474747 ; - border-radius: 2px; - background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#474747), to(#cccccc)); - opacity: 0.5; -} - -.disabled { - opacity: 0.5; -} - -.disabled:hover { - background-color: #474747; -} - -.menubg .check { - float:left; - background-image: url(../../../../images/menu/checkmark.png); - background-repeat: no-repeat; - background-position: center; - width: 10px; - height: 15px; - opacity: 0; -} - -.menubg.submenu .rightArrow { - float: right; - background-image:url('../../../../images/menu/arrow.png'); - background-repeat: no-repeat; - background-position: center; - width: 10px; - height: 15px; - position: absolute; - right:4px; - top: 5px; - margin-left: 8px; -} - -.subEntries.subMenu .rightArrow { - opacity: 0; -} diff --git a/js/components/menu/menu-item.reel/menu-item.html b/js/components/menu/menu-item.reel/menu-item.html deleted file mode 100755 index 364a0997..00000000 --- a/js/components/menu/menu-item.reel/menu-item.html +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/js/components/menu/menu-item.reel/menu-item.js b/js/components/menu/menu-item.reel/menu-item.js deleted file mode 100755 index 63cc79b7..00000000 --- a/js/components/menu/menu-item.reel/menu-item.js +++ /dev/null @@ -1,198 +0,0 @@ -/* -Copyright (c) 2012, Motorola Mobility LLC. -All Rights Reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of Motorola Mobility LLC nor the names of its - contributors may be used to endorse or promote products derived from this - software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - */ - -var Montage = require("montage/core/core").Montage; -var Component = require("montage/ui/component").Component; - -exports.MenuItem = Montage.create(Component, { - - itemBackground: { - value: null - }, - - itemText: { - value: null - }, - - subMenu: { - value: null - }, - - data: { - value: null - }, - - _enabled: { - value: false - }, - - enabled: { - get: function() { - return this._enabled; - }, - set: function(value) { - if(value !== this._enabled) { - this._enabled = value; - this.needsDraw = true; - } - } - }, - - _checked: { - value: null - }, - - checked: { - get: function() { - return this._checked; - }, - set: function(value) { - /* - if( Object.prototype.toString.call( value ) === '[object Array]' ) { - value = value.indexOf(this.data.displayText + "Panel") >= 0; - } - */ - - if(this._checked !== value) { - this._checked = value; - this.needsDraw = true; - } - } - }, - - submenu: { - value: false - }, - - subentries: { - value: [] - }, - - prepareForDraw: { - value: function() { - - if(!this.data) return; - - if(this.data.separator) { - this.element.classList.add("itemSeparator"); - this.itemBackground.classList.remove("menubg"); - this.itemBackground.classList.add("separator"); - - return; - - } - - // Binding the checked to the assigned bound property - if(this.data.checked) { - Object.defineBinding(this, "checked", { - boundObject: this.application.ninja.appModel, - boundObjectPropertyPath: this.data.checked.boundProperty - }); - - } - - if(this.data.submenu) { - this.submenu = true; - this.subentries = this.data.entries; - this.subMenu.classList.add("subMenu"); - } - - this.element.addEventListener("mouseover", this, false); - this.element.addEventListener("mouseout", this, false); - - this.itemText.innerHTML = this.data.displayText; - this.element.addEventListener("mouseup", this, true); - } - }, - - draw: { - value: function() { - - if(this.enabled) { - this.element.classList.remove("disabled"); - } else { - this.element.classList.add("disabled"); - } - - if(this.checked) { - this.itemBackground.classList.add("checked"); - } else { - this.itemBackground.classList.remove("checked"); - } - - if(this.submenu) { - this.itemBackground.classList.add("submenu"); - } - } - }, - - captureMouseup: { - value: function(event) { - - if(this.data.radio && this.checked){ - this.parentComponent.ownerComponent.toggleOnMenuItemAction(); - return; - } - - if( ( this.enabled === true || this.enabled > 0 ) && (this.submenu === false) ) { - if(this.data.action) { - NJevent ( this.data.action ); - } else if(this.checked !== null) { - this.checked = !this.checked; - } - this.parentComponent.ownerComponent.toggleOnMenuItemAction(); - } - - } - }, - - handleMouseover: { - value: function() { - if(this.enabled){ - this.element.style.backgroundColor = "#7f7f7f"; - this.element.style.cursor = "pointer"; - if(this.data.submenu) { - this.subMenu.style.display = "block"; - } - } - } - }, - - handleMouseout: { - value: function() { - this.element.style.backgroundColor = "#474747"; - if(this.data.submenu) { - this.subMenu.style.display = "none"; - } - } - } - -}); diff --git a/js/components/menu/menu.reel/menu.css b/js/components/menu/menu.reel/menu.css deleted file mode 100755 index 903832ed..00000000 --- a/js/components/menu/menu.reel/menu.css +++ /dev/null @@ -1,39 +0,0 @@ -/* -Copyright (c) 2012, Motorola Mobility LLC. -All Rights Reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of Motorola Mobility LLC nor the names of its - contributors may be used to endorse or promote products derived from this - software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIAB