170 + '/toolkit/xre' |
170 + '/toolkit/xre' |
171 +] |
171 +] |
172 + |
172 + |
173 with Files('**'): |
173 with Files('**'): |
174 BUG_COMPONENT = ('Toolkit', 'Downloads API') |
174 BUG_COMPONENT = ('Toolkit', 'Downloads API') |
175 diff --git a/toolkit/content/jar.mn b/toolkit/content/jar.mn |
|
176 --- a/toolkit/content/jar.mn |
|
177 +++ b/toolkit/content/jar.mn |
|
178 @@ -63,16 +63,18 @@ toolkit.jar: |
|
179 content/global/widgets.css |
|
180 content/global/bindings/autocomplete.xml (widgets/autocomplete.xml) |
|
181 content/global/bindings/button.xml (widgets/button.xml) |
|
182 content/global/bindings/calendar.js (widgets/calendar.js) |
|
183 content/global/bindings/datekeeper.js (widgets/datekeeper.js) |
|
184 content/global/bindings/datepicker.js (widgets/datepicker.js) |
|
185 content/global/bindings/datetimebox.css (widgets/datetimebox.css) |
|
186 * content/global/bindings/dialog.xml (widgets/dialog.xml) |
|
187 +* content/global/bindings/dialog-kde.xml (widgets/dialog-kde.xml) |
|
188 +% override chrome://global/content/bindings/dialog.xml chrome://global/content/bindings/dialog-kde.xml desktop=kde |
|
189 content/global/bindings/general.xml (widgets/general.xml) |
|
190 content/global/bindings/popup.xml (widgets/popup.xml) |
|
191 content/global/bindings/richlistbox.xml (widgets/richlistbox.xml) |
|
192 content/global/bindings/scrollbox.xml (widgets/scrollbox.xml) |
|
193 content/global/bindings/spinner.js (widgets/spinner.js) |
|
194 content/global/bindings/tabbox.xml (widgets/tabbox.xml) |
|
195 * content/global/bindings/textbox.xml (widgets/textbox.xml) |
|
196 content/global/bindings/timekeeper.js (widgets/timekeeper.js) |
|
197 diff --git a/toolkit/content/widgets/dialog-kde.xml b/toolkit/content/widgets/dialog-kde.xml |
|
198 new file mode 100644 |
|
199 --- /dev/null |
|
200 +++ b/toolkit/content/widgets/dialog-kde.xml |
|
201 @@ -0,0 +1,499 @@ |
|
202 +<?xml version="1.0"?> |
|
203 +<!-- This Source Code Form is subject to the terms of the Mozilla Public |
|
204 + - License, v. 2.0. If a copy of the MPL was not distributed with this |
|
205 + - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> |
|
206 + |
|
207 +<!DOCTYPE bindings [ |
|
208 + <!ENTITY % globalKeysDTD SYSTEM "chrome://global/locale/globalKeys.dtd"> |
|
209 + %globalKeysDTD; |
|
210 +]> |
|
211 + |
|
212 +<bindings id="dialogBindings" |
|
213 + xmlns="http://www.mozilla.org/xbl" |
|
214 + xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" |
|
215 + xmlns:xbl="http://www.mozilla.org/xbl"> |
|
216 + |
|
217 + <binding id="dialog"> |
|
218 + <content> |
|
219 + <xul:vbox class="box-inherit dialog-content-box" flex="1"> |
|
220 + <children/> |
|
221 + </xul:vbox> |
|
222 + |
|
223 + <xul:hbox class="dialog-button-box" anonid="buttons" |
|
224 + xbl:inherits="pack=buttonpack,align=buttonalign,dir=buttondir,orient=buttonorient" |
|
225 +#ifdef XP_UNIX_GNOME |
|
226 + > |
|
227 + <xul:button dlgtype="disclosure" class="dialog-button" hidden="true"/> |
|
228 + <xul:button dlgtype="help" class="dialog-button" hidden="true"/> |
|
229 + <xul:button dlgtype="extra2" class="dialog-button" hidden="true"/> |
|
230 + <xul:button dlgtype="extra1" class="dialog-button" hidden="true"/> |
|
231 + <xul:spacer anonid="spacer" flex="1"/> |
|
232 + <xul:button dlgtype="cancel" class="dialog-button"/> |
|
233 + <xul:button dlgtype="accept" class="dialog-button" xbl:inherits="disabled=buttondisabledaccept"/> |
|
234 +#elif XP_UNIX |
|
235 + > |
|
236 + <xul:button dlgtype="help" class="dialog-button" hidden="true"/> |
|
237 + <xul:button dlgtype="extra2" class="dialog-button" hidden="true"/> |
|
238 + <xul:spacer anonid="spacer" flex="1"/> |
|
239 + <xul:button dlgtype="accept" class="dialog-button" xbl:inherits="disabled=buttondisabledaccept"/> |
|
240 + <xul:button dlgtype="extra1" class="dialog-button" hidden="true"/> |
|
241 + <xul:button dlgtype="cancel" class="dialog-button"/> |
|
242 + <xul:button dlgtype="disclosure" class="dialog-button" hidden="true"/> |
|
243 +#else |
|
244 + pack="end"> |
|
245 + <xul:button dlgtype="extra2" class="dialog-button" hidden="true"/> |
|
246 + <xul:spacer anonid="spacer" flex="1" hidden="true"/> |
|
247 + <xul:button dlgtype="accept" class="dialog-button" xbl:inherits="disabled=buttondisabledaccept"/> |
|
248 + <xul:button dlgtype="extra1" class="dialog-button" hidden="true"/> |
|
249 + <xul:button dlgtype="cancel" class="dialog-button"/> |
|
250 + <xul:button dlgtype="help" class="dialog-button" hidden="true"/> |
|
251 + <xul:button dlgtype="disclosure" class="dialog-button" hidden="true"/> |
|
252 +#endif |
|
253 + </xul:hbox> |
|
254 + |
|
255 + <xul:keyset> |
|
256 + <xul:key phase="capturing" oncommand="document.documentElement.openHelp(event)" |
|
257 +#ifdef XP_MACOSX |
|
258 + key="&openHelpMac.commandkey;" modifiers="accel"/> |
|
259 +#else |
|
260 + keycode="&openHelp.commandkey;"/> |
|
261 +#endif |
|
262 + </xul:keyset> |
|
263 + |
|
264 + </content> |
|
265 + |
|
266 + <implementation> |
|
267 + <field name="_mStrBundle">null</field> |
|
268 + <field name="_closeHandler">(function(event) { |
|
269 + if (!document.documentElement.cancelDialog()) |
|
270 + event.preventDefault(); |
|
271 + })</field> |
|
272 + |
|
273 + <!-- Gets populated by elements that are passed to document.l10n.setAttributes |
|
274 + to localize the dialog buttons. Needed to properly size the dialog after |
|
275 + the asynchronous translation. --> |
|
276 + <field name="_l10nButtons">[]</field> |
|
277 + |
|
278 + <property name="buttons" |
|
279 + onget="return this.getAttribute('buttons');" |
|
280 + onset="this._configureButtons(val); return val;"/> |
|
281 + |
|
282 + <property name="defaultButton"> |
|
283 + <getter> |
|
284 + <![CDATA[ |
|
285 + if (this.hasAttribute("defaultButton")) |
|
286 + return this.getAttribute("defaultButton"); |
|
287 + return "accept"; // default to the accept button |
|
288 + ]]> |
|
289 + </getter> |
|
290 + <setter> |
|
291 + <![CDATA[ |
|
292 + this._setDefaultButton(val); |
|
293 + return val; |
|
294 + ]]> |
|
295 + </setter> |
|
296 + </property> |
|
297 + |
|
298 + <method name="acceptDialog"> |
|
299 + <body> |
|
300 + <![CDATA[ |
|
301 + return this._doButtonCommand("accept"); |
|
302 + ]]> |
|
303 + </body> |
|
304 + </method> |
|
305 + |
|
306 + <method name="cancelDialog"> |
|
307 + <body> |
|
308 + <![CDATA[ |
|
309 + return this._doButtonCommand("cancel"); |
|
310 + ]]> |
|
311 + </body> |
|
312 + </method> |
|
313 + |
|
314 + <method name="getButton"> |
|
315 + <parameter name="aDlgType"/> |
|
316 + <body> |
|
317 + <![CDATA[ |
|
318 + return this._buttons[aDlgType]; |
|
319 + ]]> |
|
320 + </body> |
|
321 + </method> |
|
322 + |
|
323 + <method name="moveToAlertPosition"> |
|
324 + <body> |
|
325 + <![CDATA[ |
|
326 + // hack. we need this so the window has something like its final size |
|
327 + if (window.outerWidth == 1) { |
|
328 + dump("Trying to position a sizeless window; caller should have called sizeToContent() or sizeTo(). See bug 75649.\n"); |
|
329 + sizeToContent(); |
|
330 + } |
|
331 + |
|
332 + if (opener) { |
|
333 + var xOffset = (opener.outerWidth - window.outerWidth) / 2; |
|
334 + var yOffset = opener.outerHeight / 5; |
|
335 + |
|
336 + var newX = opener.screenX + xOffset; |
|
337 + var newY = opener.screenY + yOffset; |
|
338 + } else { |
|
339 + newX = (screen.availWidth - window.outerWidth) / 2; |
|
340 + newY = (screen.availHeight - window.outerHeight) / 2; |
|
341 + } |
|
342 + |
|
343 + // ensure the window is fully onscreen (if smaller than the screen) |
|
344 + if (newX < screen.availLeft) |
|
345 + newX = screen.availLeft + 20; |
|
346 + if ((newX + window.outerWidth) > (screen.availLeft + screen.availWidth)) |
|
347 + newX = (screen.availLeft + screen.availWidth) - window.outerWidth - 20; |
|
348 + |
|
349 + if (newY < screen.availTop) |
|
350 + newY = screen.availTop + 20; |
|
351 + if ((newY + window.outerHeight) > (screen.availTop + screen.availHeight)) |
|
352 + newY = (screen.availTop + screen.availHeight) - window.outerHeight - 60; |
|
353 + |
|
354 + window.moveTo( newX, newY ); |
|
355 + ]]> |
|
356 + </body> |
|
357 + </method> |
|
358 + |
|
359 + <method name="centerWindowOnScreen"> |
|
360 + <body> |
|
361 + <![CDATA[ |
|
362 + var xOffset = screen.availWidth / 2 - window.outerWidth / 2; |
|
363 + var yOffset = screen.availHeight / 2 - window.outerHeight / 2; |
|
364 + |
|
365 + xOffset = xOffset > 0 ? xOffset : 0; |
|
366 + yOffset = yOffset > 0 ? yOffset : 0; |
|
367 + window.moveTo(xOffset, yOffset); |
|
368 + ]]> |
|
369 + </body> |
|
370 + </method> |
|
371 + |
|
372 + <constructor> |
|
373 + <![CDATA[ |
|
374 + this._configureButtons(this.buttons); |
|
375 + |
|
376 + // listen for when window is closed via native close buttons |
|
377 + window.addEventListener("close", this); |
|
378 + |
|
379 + // for things that we need to initialize after onload fires |
|
380 + window.addEventListener("load", this); |
|
381 + |
|
382 + window.moveToAlertPosition = this.moveToAlertPosition; |
|
383 + window.centerWindowOnScreen = this.centerWindowOnScreen; |
|
384 + ]]> |
|
385 + </constructor> |
|
386 + |
|
387 + <method name="handleEvent"> |
|
388 + <parameter name="aEvent"/> |
|
389 + <body><![CDATA[ |
|
390 + switch (aEvent.type) { |
|
391 + case "close": { |
|
392 + this._closeHandler(aEvent); |
|
393 + break; |
|
394 + } |
|
395 + case "load": { |
|
396 + this.postLoadInit(aEvent); |
|
397 + break; |
|
398 + } |
|
399 + } |
|
400 + ]]></body> |
|
401 + </method> |
|
402 + |
|
403 + <method name="postLoadInit"> |
|
404 + <parameter name="aEvent"/> |
|
405 + <body> |
|
406 + <![CDATA[ |
|
407 + function focusInit() { |
|
408 + const dialog = document.documentElement; |
|
409 + const defaultButton = dialog.getButton(dialog.defaultButton); |
|
410 + // give focus to the first focusable element in the dialog |
|
411 + if (!document.commandDispatcher.focusedElement) { |
|
412 + document.commandDispatcher.advanceFocusIntoSubtree(dialog); |
|
413 + |
|
414 + var focusedElt = document.commandDispatcher.focusedElement; |
|
415 + if (focusedElt) { |
|
416 + var initialFocusedElt = focusedElt; |
|
417 + while (focusedElt.localName == "tab" || |
|
418 + focusedElt.getAttribute("noinitialfocus") == "true") { |
|
419 + document.commandDispatcher.advanceFocusIntoSubtree(focusedElt); |
|
420 + focusedElt = document.commandDispatcher.focusedElement; |
|
421 + if (focusedElt == initialFocusedElt) { |
|
422 + if (focusedElt.getAttribute("noinitialfocus") == "true") { |
|
423 + focusedElt.blur(); |
|
424 + } |
|
425 + break; |
|
426 + } |
|
427 + } |
|
428 + |
|
429 + if (initialFocusedElt.localName == "tab") { |
|
430 + if (focusedElt.hasAttribute("dlgtype")) { |
|
431 + // We don't want to focus on anonymous OK, Cancel, etc. buttons, |
|
432 + // so return focus to the tab itself |
|
433 + initialFocusedElt.focus(); |
|
434 + } |
|
435 + } else if (!/Mac/.test(navigator.platform) && |
|
436 + focusedElt.hasAttribute("dlgtype") && focusedElt != defaultButton) { |
|
437 + defaultButton.focus(); |
|
438 + } |
|
439 + } |
|
440 + } |
|
441 + |
|
442 + try { |
|
443 + if (defaultButton) |
|
444 + window.notifyDefaultButtonLoaded(defaultButton); |
|
445 + } catch (e) { } |
|
446 + } |
|
447 + |
|
448 + // Give focus after onload completes, see bug 103197. |
|
449 + setTimeout(focusInit, 0); |
|
450 + |
|
451 + if (this._l10nButtons.length) { |
|
452 + document.l10n.translateElements(this._l10nButtons).then(() => { |
|
453 + window.sizeToContent(); |
|
454 + }); |
|
455 + } |
|
456 + ]]> |
|
457 + </body> |
|
458 + </method> |
|
459 + |
|
460 + <method name="openHelp"> |
|
461 + <parameter name="event"/> |
|
462 + <body> |
|
463 + <![CDATA[ |
|
464 + var helpButton = document.documentElement.getButton("help"); |
|
465 + if (helpButton.disabled || helpButton.hidden) |
|
466 + return; |
|
467 + this._fireButtonEvent("help"); |
|
468 + event.stopPropagation(); |
|
469 + event.preventDefault(); |
|
470 + ]]> |
|
471 + </body> |
|
472 + </method> |
|
473 + |
|
474 + <property name="mStrBundle"> |
|
475 + <getter> |
|
476 + <![CDATA[ |
|
477 + if (!this._mStrBundle) { |
|
478 + // need to create string bundle manually instead of using <xul:stringbundle/> |
|
479 + // see bug 63370 for details |
|
480 + this._mStrBundle = Cc["@mozilla.org/intl/stringbundle;1"] |
|
481 + .getService(Ci.nsIStringBundleService) |
|
482 + .createBundle("chrome://global/locale/dialog.properties"); |
|
483 + } |
|
484 + return this._mStrBundle; |
|
485 + ]]></getter> |
|
486 + </property> |
|
487 + |
|
488 + <method name="_configureButtons"> |
|
489 + <parameter name="aButtons"/> |
|
490 + <body> |
|
491 + <![CDATA[ |
|
492 + // by default, get all the anonymous button elements |
|
493 + var buttons = {}; |
|
494 + this._buttons = buttons; |
|
495 + buttons.accept = document.getAnonymousElementByAttribute(this, "dlgtype", "accept"); |
|
496 + buttons.cancel = document.getAnonymousElementByAttribute(this, "dlgtype", "cancel"); |
|
497 + buttons.extra1 = document.getAnonymousElementByAttribute(this, "dlgtype", "extra1"); |
|
498 + buttons.extra2 = document.getAnonymousElementByAttribute(this, "dlgtype", "extra2"); |
|
499 + buttons.help = document.getAnonymousElementByAttribute(this, "dlgtype", "help"); |
|
500 + buttons.disclosure = document.getAnonymousElementByAttribute(this, "dlgtype", "disclosure"); |
|
501 + |
|
502 + for (let button in buttons) { |
|
503 + customElements.upgrade(buttons[button]); |
|
504 + } |
|
505 + |
|
506 + // look for any overriding explicit button elements |
|
507 + var exBtns = this.getElementsByAttribute("dlgtype", "*"); |
|
508 + var dlgtype; |
|
509 + var i; |
|
510 + for (i = 0; i < exBtns.length; ++i) { |
|
511 + dlgtype = exBtns[i].getAttribute("dlgtype"); |
|
512 + buttons[dlgtype].hidden = true; // hide the anonymous button |
|
513 + buttons[dlgtype] = exBtns[i]; |
|
514 + } |
|
515 + |
|
516 + // add the label and oncommand handler to each button |
|
517 + for (dlgtype in buttons) { |
|
518 + var button = buttons[dlgtype]; |
|
519 + button.addEventListener("command", this._handleButtonCommand, true); |
|
520 + |
|
521 + // don't override custom labels with pre-defined labels on explicit buttons |
|
522 + if (!button.hasAttribute("label")) { |
|
523 + // dialog attributes override the default labels in dialog.properties |
|
524 + if (this.hasAttribute("buttonlabel" + dlgtype)) { |
|
525 + button.setAttribute("label", this.getAttribute("buttonlabel" + dlgtype)); |
|
526 + if (this.hasAttribute("buttonaccesskey" + dlgtype)) |
|
527 + button.setAttribute("accesskey", this.getAttribute("buttonaccesskey" + dlgtype)); |
|
528 + } else if (this.hasAttribute("buttonid" + dlgtype)) { |
|
529 + document.l10n.setAttributes(button, this.getAttribute("buttonid" + dlgtype)); |
|
530 + this._l10nButtons.push(button); |
|
531 + } else if (dlgtype != "extra1" && dlgtype != "extra2") { |
|
532 + button.setAttribute("label", this.mStrBundle.GetStringFromName("button-" + dlgtype)); |
|
533 + var accessKey = this.mStrBundle.GetStringFromName("accesskey-" + dlgtype); |
|
534 + if (accessKey) |
|
535 + button.setAttribute("accesskey", accessKey); |
|
536 + } |
|
537 + } |
|
538 + // allow specifying alternate icons in the dialog header |
|
539 + if (!button.hasAttribute("icon")) { |
|
540 + // if there's an icon specified, use that |
|
541 + if (this.hasAttribute("buttonicon" + dlgtype)) |
|
542 + button.setAttribute("icon", this.getAttribute("buttonicon" + dlgtype)); |
|
543 + // otherwise set defaults |
|
544 + else |
|
545 + switch (dlgtype) { |
|
546 + case "accept": |
|
547 + button.setAttribute("icon", "accept"); |
|
548 + break; |
|
549 + case "cancel": |
|
550 + button.setAttribute("icon", "cancel"); |
|
551 + break; |
|
552 + case "disclosure": |
|
553 + button.setAttribute("icon", "properties"); |
|
554 + break; |
|
555 + case "help": |
|
556 + button.setAttribute("icon", "help"); |
|
557 + break; |
|
558 + default: |
|
559 + break; |
|
560 + } |
|
561 + } |
|
562 + } |
|
563 + |
|
564 + // ensure that hitting enter triggers the default button command |
|
565 + this.defaultButton = this.defaultButton; |
|
566 + |
|
567 + // if there is a special button configuration, use it |
|
568 + if (aButtons) { |
|
569 + // expect a comma delimited list of dlgtype values |
|
570 + var list = aButtons.split(","); |
|
571 + |
|
572 + // mark shown dlgtypes as true |
|
573 + var shown = { accept: false, cancel: false, help: false, |
|
574 + disclosure: false, extra1: false, extra2: false }; |
|
575 + for (i = 0; i < list.length; ++i) |
|
576 + shown[list[i].replace(/ /g, "")] = true; |
|
577 + |
|
578 + // hide/show the buttons we want |
|
579 + for (dlgtype in buttons) |
|
580 + buttons[dlgtype].hidden = !shown[dlgtype]; |
|
581 + |
|
582 + // show the spacer on Windows only when the extra2 button is present |
|
583 + if (/Win/.test(navigator.platform)) { |
|
584 + var spacer = document.getAnonymousElementByAttribute(this, "anonid", "spacer"); |
|
585 + spacer.removeAttribute("hidden"); |
|
586 + spacer.setAttribute("flex", shown.extra2 ? "1" : "0"); |
|
587 + } |
|
588 + } |
|
589 + ]]> |
|
590 + </body> |
|
591 + </method> |
|
592 + |
|
593 + <method name="_setDefaultButton"> |
|
594 + <parameter name="aNewDefault"/> |
|
595 + <body> |
|
596 + <![CDATA[ |
|
597 + // remove the default attribute from the previous default button, if any |
|
598 + var oldDefaultButton = this.getButton(this.defaultButton); |
|
599 + if (oldDefaultButton) |
|
600 + oldDefaultButton.removeAttribute("default"); |
|
601 + |
|
602 + var newDefaultButton = this.getButton(aNewDefault); |
|
603 + if (newDefaultButton) { |
|
604 + this.setAttribute("defaultButton", aNewDefault); |
|
605 + newDefaultButton.setAttribute("default", "true"); |
|
606 + } else { |
|
607 + this.setAttribute("defaultButton", "none"); |
|
608 + if (aNewDefault != "none") |
|
609 + dump("invalid new default button: " + aNewDefault + ", assuming: none\n"); |
|
610 + } |
|
611 + ]]> |
|
612 + </body> |
|
613 + </method> |
|
614 + |
|
615 + <method name="_handleButtonCommand"> |
|
616 + <parameter name="aEvent"/> |
|
617 + <body> |
|
618 + <![CDATA[ |
|
619 + return document.documentElement._doButtonCommand( |
|
620 + aEvent.target.getAttribute("dlgtype")); |
|
621 + ]]> |
|
622 + </body> |
|
623 + </method> |
|
624 + |
|
625 + <method name="_doButtonCommand"> |
|
626 + <parameter name="aDlgType"/> |
|
627 + <body> |
|
628 + <![CDATA[ |
|
629 + var button = this.getButton(aDlgType); |
|
630 + if (!button.disabled) { |
|
631 + var noCancel = this._fireButtonEvent(aDlgType); |
|
632 + if (noCancel) { |
|
633 + if (aDlgType == "accept" || aDlgType == "cancel") { |
|
634 + var closingEvent = new CustomEvent("dialogclosing", { |
|
635 + bubbles: true, |
|
636 + detail: { button: aDlgType }, |
|
637 + }); |
|
638 + this.dispatchEvent(closingEvent); |
|
639 + window.close(); |
|
640 + } |
|
641 + } |
|
642 + return noCancel; |
|
643 + } |
|
644 + return true; |
|
645 + ]]> |
|
646 + </body> |
|
647 + </method> |
|
648 + |
|
649 + <method name="_fireButtonEvent"> |
|
650 + <parameter name="aDlgType"/> |
|
651 + <body> |
|
652 + <![CDATA[ |
|
653 + var event = document.createEvent("Events"); |
|
654 + event.initEvent("dialog" + aDlgType, true, true); |
|
655 + |
|
656 + // handle dom event handlers |
|
657 + return this.dispatchEvent(event); |
|
658 + ]]> |
|
659 + </body> |
|
660 + </method> |
|
661 + |
|
662 + <method name="_hitEnter"> |
|
663 + <parameter name="evt"/> |
|
664 + <body> |
|
665 + <![CDATA[ |
|
666 + if (evt.defaultPrevented) |
|
667 + return; |
|
668 + |
|
669 + var btn = this.getButton(this.defaultButton); |
|
670 + if (btn) |
|
671 + this._doButtonCommand(this.defaultButton); |
|
672 + ]]> |
|
673 + </body> |
|
674 + </method> |
|
675 + |
|
676 + </implementation> |
|
677 + |
|
678 + <handlers> |
|
679 + <handler event="keypress" keycode="VK_RETURN" |
|
680 + group="system" action="this._hitEnter(event);"/> |
|
681 + <handler event="keypress" keycode="VK_ESCAPE" group="system"> |
|
682 + if (!event.defaultPrevented) |
|
683 + this.cancelDialog(); |
|
684 + </handler> |
|
685 +#ifdef XP_MACOSX |
|
686 + <handler event="keypress" key="." modifiers="meta" phase="capturing" action="this.cancelDialog();"/> |
|
687 +#else |
|
688 + <handler event="focus" phase="capturing"> |
|
689 + var btn = this.getButton(this.defaultButton); |
|
690 + if (btn) |
|
691 + btn.setAttribute("default", event.originalTarget == btn || |
|
692 + !(event.originalTarget.localName == "button" || |
|
693 + event.originalTarget.localName == "toolbarbutton")); |
|
694 + </handler> |
|
695 +#endif |
|
696 + </handlers> |
|
697 + |
|
698 + </binding> |
|
699 + |
|
700 +</bindings> |
|
701 diff --git a/toolkit/mozapps/downloads/HelperAppDlg.jsm b/toolkit/mozapps/downloads/HelperAppDlg.jsm |
175 diff --git a/toolkit/mozapps/downloads/HelperAppDlg.jsm b/toolkit/mozapps/downloads/HelperAppDlg.jsm |
702 --- a/toolkit/mozapps/downloads/HelperAppDlg.jsm |
176 --- a/toolkit/mozapps/downloads/HelperAppDlg.jsm |
703 +++ b/toolkit/mozapps/downloads/HelperAppDlg.jsm |
177 +++ b/toolkit/mozapps/downloads/HelperAppDlg.jsm |
704 @@ -1204,36 +1204,66 @@ nsUnknownContentTypeDialog.prototype = { |
178 @@ -1204,36 +1204,66 @@ nsUnknownContentTypeDialog.prototype = { |
705 params.handlerApp && |
179 params.handlerApp && |