author | Michael Krelin <hacker@klever.net> | 2013-11-28 20:04:10 (UTC) |
---|---|---|
committer | Michael Krelin <hacker@klever.net> | 2013-11-28 20:04:10 (UTC) |
commit | 11a51653179a40dff1ecf13b9b4eb5e073920c04 (patch) (unidiff) | |
tree | f3dc8437724ecf8d5967ce61e6734ab89fb58704 /frontend/beta | |
parent | 6cd9e34b5b49473923190a6a70c436908c98505e (diff) | |
download | clipperz-11a51653179a40dff1ecf13b9b4eb5e073920c04.zip clipperz-11a51653179a40dff1ecf13b9b4eb5e073920c04.tar.gz clipperz-11a51653179a40dff1ecf13b9b4eb5e073920c04.tar.bz2 |
frontend: turn off autocompletion for input elements in record
otherwise the very presence of saved form values for the same host may
(at least in some browsers) ruin the record if it was edited and
carelessly saved.
-rw-r--r-- | frontend/beta/js/Clipperz/PM/Components/RecordDetail/FieldValueComponent.js | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/frontend/beta/js/Clipperz/PM/Components/RecordDetail/FieldValueComponent.js b/frontend/beta/js/Clipperz/PM/Components/RecordDetail/FieldValueComponent.js index f2c70aa..a8117d7 100644 --- a/frontend/beta/js/Clipperz/PM/Components/RecordDetail/FieldValueComponent.js +++ b/frontend/beta/js/Clipperz/PM/Components/RecordDetail/FieldValueComponent.js | |||
@@ -44,227 +44,227 @@ Clipperz.PM.Components.RecordDetail.FieldValueComponent = function(anElement, ar | |||
44 | //============================================================================= | 44 | //============================================================================= |
45 | 45 | ||
46 | YAHOO.extendX(Clipperz.PM.Components.RecordDetail.FieldValueComponent, Clipperz.PM.Components.RecordDetail.AbstractFieldSubComponent, { | 46 | YAHOO.extendX(Clipperz.PM.Components.RecordDetail.FieldValueComponent, Clipperz.PM.Components.RecordDetail.AbstractFieldSubComponent, { |
47 | 47 | ||
48 | 'toString': function() { | 48 | 'toString': function() { |
49 | return "Clipperz.PM.Components.RecordDetail.FieldValueComponent component"; | 49 | return "Clipperz.PM.Components.RecordDetail.FieldValueComponent component"; |
50 | }, | 50 | }, |
51 | 51 | ||
52 | //------------------------------------------------------------------------- | 52 | //------------------------------------------------------------------------- |
53 | 53 | ||
54 | 'value': function() { | 54 | 'value': function() { |
55 | return this.recordField().value(); | 55 | return this.recordField().value(); |
56 | }, | 56 | }, |
57 | 57 | ||
58 | 'setValue': function(aValue) { | 58 | 'setValue': function(aValue) { |
59 | this.recordField().setValue(aValue); | 59 | this.recordField().setValue(aValue); |
60 | }, | 60 | }, |
61 | 61 | ||
62 | //------------------------------------------------------------------------- | 62 | //------------------------------------------------------------------------- |
63 | 63 | ||
64 | 'inputElement': function() { | 64 | 'inputElement': function() { |
65 | return this._inputElement; | 65 | return this._inputElement; |
66 | }, | 66 | }, |
67 | 67 | ||
68 | 'setInputElement': function(aValue) { | 68 | 'setInputElement': function(aValue) { |
69 | this._inputElement = aValue; | 69 | this._inputElement = aValue; |
70 | }, | 70 | }, |
71 | 71 | ||
72 | //------------------------------------------------------------------------- | 72 | //------------------------------------------------------------------------- |
73 | 73 | ||
74 | 'scrambledStatus': function() { | 74 | 'scrambledStatus': function() { |
75 | return this._scrambledStatus; | 75 | return this._scrambledStatus; |
76 | }, | 76 | }, |
77 | 77 | ||
78 | 'setScrambledStatus': function(aValue) { | 78 | 'setScrambledStatus': function(aValue) { |
79 | this._scrambledStatus = aValue; | 79 | this._scrambledStatus = aValue; |
80 | }, | 80 | }, |
81 | 81 | ||
82 | //------------------------------------------------------------------------- | 82 | //------------------------------------------------------------------------- |
83 | 83 | ||
84 | 'handleTypeChange': function() { | 84 | 'handleTypeChange': function() { |
85 | //MochiKit.Logging.logDebug(">>> handling type change - " + this.recordField().type()); | 85 | //MochiKit.Logging.logDebug(">>> handling type change - " + this.recordField().type()); |
86 | this.synchronizeComponentValues(); | 86 | this.synchronizeComponentValues(); |
87 | this.update(); | 87 | this.update(); |
88 | }, | 88 | }, |
89 | 89 | ||
90 | //------------------------------------------------------------------------- | 90 | //------------------------------------------------------------------------- |
91 | 91 | ||
92 | 'addrUrl': function() { | 92 | 'addrUrl': function() { |
93 | var result; | 93 | var result; |
94 | 94 | ||
95 | result = "http://maps.google.com/maps?q=" + this.value().split(' ').join('+'); | 95 | result = "http://maps.google.com/maps?q=" + this.value().split(' ').join('+'); |
96 | 96 | ||
97 | return result; | 97 | return result; |
98 | }, | 98 | }, |
99 | 99 | ||
100 | //------------------------------------------------------------------------- | 100 | //------------------------------------------------------------------------- |
101 | 101 | ||
102 | 'updateViewMode': function() { | 102 | 'updateViewMode': function() { |
103 | var scarmbledStatus; | 103 | var scarmbledStatus; |
104 | 104 | ||
105 | scrambledStatus = this.scrambledStatus() || 'SCRAMBLED'; | 105 | scrambledStatus = this.scrambledStatus() || 'SCRAMBLED'; |
106 | 106 | ||
107 | this.element().update(""); | 107 | this.element().update(""); |
108 | if (this.recordField().hidden() == false) { | 108 | if (this.recordField().hidden() == false) { |
109 | switch(this.recordField().type()) { | 109 | switch(this.recordField().type()) { |
110 | case 'TXT': | 110 | case 'TXT': |
111 | case 'PWD': | 111 | case 'PWD': |
112 | Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'span', html:this.value()}); | 112 | Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'span', html:this.value()}); |
113 | break; | 113 | break; |
114 | case 'URL': | 114 | case 'URL': |
115 | varurlLocation; | 115 | varurlLocation; |
116 | 116 | ||
117 | urlLocation = Clipperz.Base.sanitizeString(this.value()); | 117 | urlLocation = Clipperz.Base.sanitizeString(this.value()); |
118 | if (! (/^(https?|ftp|svn):\/\//.test(urlLocation))) { | 118 | if (! (/^(https?|ftp|svn):\/\//.test(urlLocation))) { |
119 | urlLocation = 'http://' + urlLocation; | 119 | urlLocation = 'http://' + urlLocation; |
120 | } | 120 | } |
121 | Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'a', href:urlLocation, html:this.value(), target:'_blank'}); | 121 | Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'a', href:urlLocation, html:this.value(), target:'_blank'}); |
122 | break; | 122 | break; |
123 | case 'DATE': | 123 | case 'DATE': |
124 | Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'span', html:this.value()}); | 124 | Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'span', html:this.value()}); |
125 | break; | 125 | break; |
126 | case 'ADDR': | 126 | case 'ADDR': |
127 | Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'a', href:this.addrUrl(), html:this.value(), target:'_blank'}); | 127 | Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'a', href:this.addrUrl(), html:this.value(), target:'_blank'}); |
128 | break; | 128 | break; |
129 | } | 129 | } |
130 | } else { | 130 | } else { |
131 | var tableElement; | 131 | var tableElement; |
132 | var tdElement; | 132 | var tdElement; |
133 | var inputElement; | 133 | var inputElement; |
134 | var passwordElementConfiguration; | 134 | var passwordElementConfiguration; |
135 | 135 | ||
136 | if (scrambledStatus == 'SCRAMBLED') { | 136 | if (scrambledStatus == 'SCRAMBLED') { |
137 | varscrambledInputElement; | 137 | varscrambledInputElement; |
138 | 138 | ||
139 | if ((Clipperz_IEisBroken === true) && (Clipperz.PM.Proxy.defaultProxy.isReadOnly())) { | 139 | if ((Clipperz_IEisBroken === true) && (Clipperz.PM.Proxy.defaultProxy.isReadOnly())) { |
140 | scrambledInputElement = {tag:'input', type:'password', value:"this.value()"}; | 140 | scrambledInputElement = {tag:'input', type:'password', value:"this.value()", autocomplete:"off"}; |
141 | } else { | 141 | } else { |
142 | scrambledInputElement = {tag:'input', type:'text', cls:'scrambledField', title:Clipperz.PM.Strings['recordDetailPasswordFieldTooltipLabel'], value:"this.value()"}; | 142 | scrambledInputElement = {tag:'input', type:'text', cls:'scrambledField', title:Clipperz.PM.Strings['recordDetailPasswordFieldTooltipLabel'], value:"this.value()", autocomplete:"off"}; |
143 | } | 143 | } |
144 | 144 | ||
145 | passwordElementConfiguration = | 145 | passwordElementConfiguration = |
146 | {tag:'table', border:'0', cellspacing:'2', cellpadding:'0', children:[ | 146 | {tag:'table', border:'0', cellspacing:'2', cellpadding:'0', children:[ |
147 | {tag:'tbody', children:[ | 147 | {tag:'tbody', children:[ |
148 | {tag:'tr', children:[ | 148 | {tag:'tr', children:[ |
149 | {tag:'td', valign:'top', children:[ | 149 | {tag:'td', valign:'top', children:[ |
150 | scrambledInputElement, | 150 | scrambledInputElement, |
151 | {tag:'a', cls:'scrambleLink', id:this.getId('scrambleLink'), href:'#', htmlString:Clipperz.PM.Strings['recordDetailPasswordFieldUnscrambleLabel']} | 151 | {tag:'a', cls:'scrambleLink', id:this.getId('scrambleLink'), href:'#', htmlString:Clipperz.PM.Strings['recordDetailPasswordFieldUnscrambleLabel']} |
152 | ]}, | 152 | ]}, |
153 | {tag:'td', valign:'top', children:[ | 153 | {tag:'td', valign:'top', children:[ |
154 | {tag:'span', cls:'scrambledFieldLabel', htmlString:Clipperz.PM.Strings['recordDetailPasswordFieldHelpLabel']} | 154 | {tag:'span', cls:'scrambledFieldLabel', htmlString:Clipperz.PM.Strings['recordDetailPasswordFieldHelpLabel']} |
155 | ]} | 155 | ]} |
156 | ]} | 156 | ]} |
157 | ]} | 157 | ]} |
158 | ]}; | 158 | ]}; |
159 | } else { | 159 | } else { |
160 | passwordElementConfiguration = | 160 | passwordElementConfiguration = |
161 | {tag:'div', children:[ | 161 | {tag:'div', children:[ |
162 | {tag:'input', type:'text', cls:'unscrambledField', value:"this.value()"}, | 162 | {tag:'input', type:'text', cls:'unscrambledField', value:"this.value()", autocomplete:"off"}, |
163 | {tag:'a', cls:'scrambleLink', id:this.getId('scrambleLink'), href:'#', htmlString:Clipperz.PM.Strings['recordDetailPasswordFieldScrambleLabel']} | 163 | {tag:'a', cls:'scrambleLink', id:this.getId('scrambleLink'), href:'#', htmlString:Clipperz.PM.Strings['recordDetailPasswordFieldScrambleLabel']} |
164 | ]}; | 164 | ]}; |
165 | } | 165 | } |
166 | 166 | ||
167 | tableElement = Clipperz.YUI.DomHelper.append(this.element().dom, passwordElementConfiguration, true); | 167 | tableElement = Clipperz.YUI.DomHelper.append(this.element().dom, passwordElementConfiguration, true); |
168 | 168 | ||
169 | inputElement = tableElement.getChildrenByTagName('input')[0]; | 169 | inputElement = tableElement.getChildrenByTagName('input')[0]; |
170 | inputElement.dom.value = this.value(); | 170 | inputElement.dom.value = this.value(); |
171 | inputElement.wrap({tag:'div', cls:'passwordBackground'}).setStyle('background-position', "0px -" + Math.min(128, Clipperz.PM.Crypto.passwordEntropy(this.value())) + "px"); | 171 | inputElement.wrap({tag:'div', cls:'passwordBackground'}).setStyle('background-position', "0px -" + Math.min(128, Clipperz.PM.Crypto.passwordEntropy(this.value())) + "px"); |
172 | 172 | ||
173 | MochiKit.Signal.connect(inputElement.dom, 'onfocus', this, 'selectHiddenFieldOnFocus'); | 173 | MochiKit.Signal.connect(inputElement.dom, 'onfocus', this, 'selectHiddenFieldOnFocus'); |
174 | MochiKit.Signal.connect(this.getDom('scrambleLink'), 'onclick', this, 'toggleScramble'); | 174 | MochiKit.Signal.connect(this.getDom('scrambleLink'), 'onclick', this, 'toggleScramble'); |
175 | } | 175 | } |
176 | }, | 176 | }, |
177 | 177 | ||
178 | //------------------------------------------------------------------------- | 178 | //------------------------------------------------------------------------- |
179 | 179 | ||
180 | 'updateEditMode': function() { | 180 | 'updateEditMode': function() { |
181 | var inputElement; | 181 | var inputElement; |
182 | var scarmbledStatus; | 182 | var scarmbledStatus; |
183 | 183 | ||
184 | scrambledStatus = this.scrambledStatus() || 'SCRAMBLED'; | 184 | scrambledStatus = this.scrambledStatus() || 'SCRAMBLED'; |
185 | 185 | ||
186 | this.element().update(""); | 186 | this.element().update(""); |
187 | switch(this.recordField().type()) { | 187 | switch(this.recordField().type()) { |
188 | case 'TXT': | 188 | case 'TXT': |
189 | case 'URL': | 189 | case 'URL': |
190 | case 'ADDR': | 190 | case 'ADDR': |
191 | inputElement = Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'input', type:'text', value:"this.value()"}, true); | 191 | inputElement = Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'input', type:'text', value:"this.value()", autocomplete:"off"}, true); |
192 | inputElement.dom.value = this.value(); | 192 | inputElement.dom.value = this.value(); |
193 | break; | 193 | break; |
194 | case 'PWD': | 194 | case 'PWD': |
195 | Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'table', width:'100%', cellpadding:'0', cellspacing:'0', children:[ | 195 | Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'table', width:'100%', cellpadding:'0', cellspacing:'0', children:[ |
196 | {tag:'tbody', children:[ | 196 | {tag:'tbody', children:[ |
197 | {tag:'tr', children:[ | 197 | {tag:'tr', children:[ |
198 | {tag:'td', valign:'top', children:[ | 198 | {tag:'td', valign:'top', children:[ |
199 | {tag:'input', type:((scrambledStatus == 'SCRAMBLED') ? 'password' : 'text'), id:this.getId('passwordInputElement'), value:"this.value()"}, | 199 | {tag:'input', type:((scrambledStatus == 'SCRAMBLED') ? 'password' : 'text'), id:this.getId('passwordInputElement'), value:"this.value()", autocomplete:"off"}, |
200 | {tag:'a', cls:'scrambleLink', id:this.getId('scrambleLink'), href:'#', html:(scrambledStatus == 'SCRAMBLED' ? Clipperz.PM.Strings['recordDetailPasswordFieldUnscrambleLabel'] : Clipperz.PM.Strings['recordDetailPasswordFieldScrambleLabel'])} | 200 | {tag:'a', cls:'scrambleLink', id:this.getId('scrambleLink'), href:'#', html:(scrambledStatus == 'SCRAMBLED' ? Clipperz.PM.Strings['recordDetailPasswordFieldUnscrambleLabel'] : Clipperz.PM.Strings['recordDetailPasswordFieldScrambleLabel'])} |
201 | ]}, | 201 | ]}, |
202 | {tag:'td', valign:'top', children:[ | 202 | {tag:'td', valign:'top', children:[ |
203 | {tag:'div', id:this.getId('passwordGenerator'), cls:'Clipperz_PasswordGenerator_button', html:' '} | 203 | {tag:'div', id:this.getId('passwordGenerator'), cls:'Clipperz_PasswordGenerator_button', html:' '} |
204 | ]} | 204 | ]} |
205 | ]} | 205 | ]} |
206 | ]} | 206 | ]} |
207 | ]}) | 207 | ]}) |
208 | inputElement = this.getElement('passwordInputElement'); | 208 | inputElement = this.getElement('passwordInputElement'); |
209 | inputElement.dom.value = this.value(); | 209 | inputElement.dom.value = this.value(); |
210 | new Clipperz.PM.Components.PasswordEntropyDisplay(this.getElement('passwordInputElement')); | 210 | new Clipperz.PM.Components.PasswordEntropyDisplay(this.getElement('passwordInputElement')); |
211 | new Clipperz.PM.Components.PasswordGenerator(this.getElement('passwordGenerator'), this); | 211 | new Clipperz.PM.Components.PasswordGenerator(this.getElement('passwordGenerator'), this); |
212 | MochiKit.Signal.connect(this.getDom('scrambleLink'), 'onclick', this, 'toggleScramble'); | 212 | MochiKit.Signal.connect(this.getDom('scrambleLink'), 'onclick', this, 'toggleScramble'); |
213 | break; | 213 | break; |
214 | // case 'NOTE': | 214 | // case 'NOTE': |
215 | // inputElement = Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'textarea', rows:'5', html:this.value()}, true); | 215 | // inputElement = Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'textarea', rows:'5', html:this.value()}, true); |
216 | // break | 216 | // break |
217 | case 'DATE': | 217 | case 'DATE': |
218 | inputElement = Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'input', type:'text', value:"this.value()"}, true); | 218 | inputElement = Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'input', type:'text', value:"this.value()", autocomplete:"off"}, true); |
219 | inputElement.dom.value = this.value(); | 219 | inputElement.dom.value = this.value(); |
220 | break; | 220 | break; |
221 | } | 221 | } |
222 | 222 | ||
223 | this.setInputElement(inputElement); | 223 | this.setInputElement(inputElement); |
224 | }, | 224 | }, |
225 | 225 | ||
226 | //------------------------------------------------------------------------- | 226 | //------------------------------------------------------------------------- |
227 | 227 | ||
228 | 'synchronizeComponentValues': function() { | 228 | 'synchronizeComponentValues': function() { |
229 | //MochiKit.Logging.logDebug(">>> FieldValueComponent.synchronizeComponentValues"); | 229 | //MochiKit.Logging.logDebug(">>> FieldValueComponent.synchronizeComponentValues"); |
230 | if (this.inputElement() != null) { | 230 | if (this.inputElement() != null) { |
231 | var value; | 231 | var value; |
232 | 232 | ||
233 | switch(this.recordField().type()) { | 233 | switch(this.recordField().type()) { |
234 | case 'TXT': | 234 | case 'TXT': |
235 | case 'URL': | 235 | case 'URL': |
236 | case 'ADDR': | 236 | case 'ADDR': |
237 | case 'PWD': | 237 | case 'PWD': |
238 | case 'DATE': | 238 | case 'DATE': |
239 | value = this.inputElement().dom.value; | 239 | value = this.inputElement().dom.value; |
240 | break; | 240 | break; |
241 | } | 241 | } |
242 | this.setValue(value); | 242 | this.setValue(value); |
243 | } | 243 | } |
244 | //MochiKit.Logging.logDebug("<<< FieldValueComponent.synchronizeComponentValues"); | 244 | //MochiKit.Logging.logDebug("<<< FieldValueComponent.synchronizeComponentValues"); |
245 | }, | 245 | }, |
246 | 246 | ||
247 | //------------------------------------------------------------------------- | 247 | //------------------------------------------------------------------------- |
248 | 248 | ||
249 | 'selectHiddenFieldOnFocus': function(anEvent) { | 249 | 'selectHiddenFieldOnFocus': function(anEvent) { |
250 | anEvent.src().select(); | 250 | anEvent.src().select(); |
251 | }, | 251 | }, |
252 | 252 | ||
253 | //------------------------------------------------------------------------- | 253 | //------------------------------------------------------------------------- |
254 | 254 | ||
255 | 'toggleScramble': function(anEvent) { | 255 | 'toggleScramble': function(anEvent) { |
256 | this.synchronizeComponentValues(); | 256 | this.synchronizeComponentValues(); |
257 | 257 | ||
258 | if (this.scrambledStatus() == 'SCRAMBLED') { | 258 | if (this.scrambledStatus() == 'SCRAMBLED') { |
259 | this.setScrambledStatus('UNSCRAMBLED'); | 259 | this.setScrambledStatus('UNSCRAMBLED'); |
260 | } else { | 260 | } else { |
261 | this.setScrambledStatus('SCRAMBLED'); | 261 | this.setScrambledStatus('SCRAMBLED'); |
262 | }; | 262 | }; |
263 | 263 | ||
264 | this.update(); | 264 | this.update(); |
265 | }, | 265 | }, |
266 | 266 | ||
267 | //------------------------------------------------------------------------- | 267 | //------------------------------------------------------------------------- |
268 | __syntaxFix__: "syntax fix" | 268 | __syntaxFix__: "syntax fix" |
269 | }); | 269 | }); |
270 | 270 | ||