src/cm/media/js/lib/yui/yui3-3.15.0/build/event-contextmenu/event-contextmenu-debug.js
author Yves-Marie Haussonne <ymh.work+github@gmail.com>
Fri, 09 May 2014 18:35:26 +0200
changeset 656 a84519031134
parent 602 e16a97fb364a
permissions -rw-r--r--
add link to "privacy policy" in the header test
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
602
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     1
YUI.add('event-contextmenu', function (Y, NAME) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     2
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     3
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     4
 * Provides extended keyboard support for the "contextmenu" event such that:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     5
 * <ul>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     6
 * <li>The browser's default context menu is suppressed regardless of how the event is triggered.</li>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     7
 * <li>On Windows the "contextmenu" event is fired consistently regardless of whether the user
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     8
 * pressed the Menu key or Shift + F10.</li>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     9
 * <li>When the "contextmenu" event is fired via the keyboard, the pageX, pageY, clientX and clientY
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    10
 * properties reference the center of the event target. This makes it easy for "contextmenu" event listeners
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    11
 * to position an overlay in response to the event by not having to worry about special handling of the x
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    12
 * and y coordinates based on the device that fired the event.</li>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    13
 * <li>For Webkit and Gecko on the Mac it enables the use of the Shift + Control + Option + M keyboard
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    14
 * shortcut to fire the "contextmenu" event, which (by default) is only available when VoiceOver
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    15
 * (the screen reader on the Mac) is enabled.</li>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    16
 * <li>For Opera on the Mac it ensures the "contextmenu" event is fired when the user presses
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    17
 * Shift + Command + M (Opera's context menu keyboard shortcut).</li>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    18
 * </ul>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    19
 * @module event-contextmenu
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    20
 * @requires event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    21
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    22
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    23
var Event = Y.Event,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    24
    DOM = Y.DOM,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    25
    UA = Y.UA,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    26
    OS = Y.UA.os,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    27
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    28
    ie = UA.ie,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    29
    gecko = UA.gecko,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    30
    webkit = UA.webkit,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    31
    opera = UA.opera,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    32
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    33
    isWin = (OS === "windows"),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    34
    isMac = (OS === "macintosh"),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    35
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    36
    eventData = {},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    37
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    38
    conf = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    39
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    40
        on: function (node, subscription, notifier, filter) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    41
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    42
            var handles = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    43
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    44
            handles.push(Event._attach(["contextmenu", function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    45
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    46
                // Any developer listening for the "contextmenu" event is likely
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    47
                // going to call preventDefault() to prevent the display of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    48
                // the browser's context menu. So, you know, save them a step.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    49
                e.preventDefault();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    50
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    51
                var id = Y.stamp(node),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    52
                    data = eventData[id];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    53
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    54
                if (data) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    55
                    e.clientX = data.clientX;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    56
                    e.clientY = data.clientY;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    57
                    e.pageX = data.pageX;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    58
                    e.pageY = data.pageY;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    59
                    delete eventData[id];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    60
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    61
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    62
                notifier.fire(e);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    63
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    64
            }, node]));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    65
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    66
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    67
            handles.push(node[filter ? "delegate" : "on"]("keydown", function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    68
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    69
                var target = this.getDOMNode(),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    70
                    shiftKey = e.shiftKey,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    71
                    keyCode = e.keyCode,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    72
                    shiftF10 = (shiftKey && keyCode == 121),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    73
                    menuKey = (isWin && keyCode == 93),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    74
                    ctrlKey = e.ctrlKey,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    75
                    mKey = (keyCode === 77),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    76
                    macWebkitAndGeckoShortcut = (isMac && (webkit || gecko) && ctrlKey && shiftKey && e.altKey && mKey),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    77
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    78
                    // Note: The context menu keyboard shortcut for Opera on the Mac is Shift + Cmd (metaKey) + M,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    79
                    // but e.metaKey is false for Opera, and Opera sets e.ctrlKey to true instead.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    80
                    macOperaShortcut = (isMac && opera && ctrlKey && shiftKey && mKey),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    81
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    82
                    clientX = 0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    83
                    clientY = 0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    84
                    scrollX,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    85
                    scrollY,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    86
                    pageX,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    87
                    pageY,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    88
                    xy,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    89
                    x,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    90
                    y;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    91
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    92
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    93
                if ((isWin && (shiftF10 || menuKey)) ||
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    94
                        (macWebkitAndGeckoShortcut || macOperaShortcut)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    95
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    96
                    // Need to call preventDefault() here b/c:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    97
                    // 1) To prevent IE's menubar from gaining focus when the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    98
                    // user presses Shift + F10
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    99
                    // 2) In Firefox and Opera for Win, Shift + F10 will display a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   100
                    // context menu, but won't fire the "contextmenu" event. So, need
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   101
                    // to call preventDefault() to prevent the display of the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   102
                    // browser's context menu
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   103
                    // 3) For Opera on the Mac the context menu keyboard shortcut
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   104
                    // (Shift + Cmd + M) will display a context menu, but like Firefox
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   105
                    // and Opera on windows, Opera doesn't fire a "contextmenu" event,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   106
                    // so preventDefault() is just used to supress Opera's
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   107
                    // default context menu.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   108
                    if (((ie || (isWin && (gecko || opera))) && shiftF10) || macOperaShortcut) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   109
                        e.preventDefault();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   110
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   111
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   112
                    xy = DOM.getXY(target);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   113
                    x = xy[0];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   114
                    y = xy[1];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   115
                    scrollX = DOM.docScrollX();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   116
                    scrollY = DOM.docScrollY();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   117
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   118
                    // Protect against instances where xy and might not be returned,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   119
                    // for example if the target is the document.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   120
                    if (!Y.Lang.isUndefined(x)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   121
                        clientX = (x + (target.offsetWidth/2)) - scrollX;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   122
                        clientY = (y + (target.offsetHeight/2)) - scrollY;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   123
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   124
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   125
                    pageX = clientX + scrollX;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   126
                    pageY = clientY + scrollY;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   127
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   128
                    // When the "contextmenu" event is fired from the keyboard
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   129
                    // clientX, clientY, pageX or pageY aren't set to useful
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   130
                    // values. So, we follow Safari's model here of setting
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   131
                    // the x & x coords to the center of the event target.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   132
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   133
                    if (menuKey || (isWin && webkit && shiftF10)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   134
                        eventData[Y.stamp(node)] = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   135
                            clientX: clientX,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   136
                            clientY: clientY,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   137
                            pageX: pageX,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   138
                            pageY: pageY
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   139
                        };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   140
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   141
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   142
                    // Don't need to call notifier.fire(e) when the Menu key
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   143
                    // is pressed as it fires the "contextmenu" event by default.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   144
                    //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   145
                    // In IE the call to preventDefault() for Shift + F10
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   146
                    // prevents the "contextmenu" event from firing, so we need
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   147
                    // to call notifier.fire(e)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   148
                    //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   149
                    // Need to also call notifier.fire(e) for Gecko and Opera since
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   150
                    // neither Shift + F10 or Shift + Cmd + M fire the "contextmenu" event.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   151
                    //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   152
                    // Lastly, also need to call notifier.fire(e) for all Mac browsers
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   153
                    // since neither Shift + Ctrl + Option + M (Webkit and Gecko) or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   154
                    // Shift + Command + M (Opera) fire the "contextmenu" event.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   155
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   156
                    if (((ie || (isWin && (gecko || opera))) && shiftF10) || isMac) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   157
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   158
                        e.clientX = clientX;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   159
                        e.clientY = clientY;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   160
                        e.pageX = pageX;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   161
                        e.pageY = pageY;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   162
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   163
                        notifier.fire(e);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   164
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   165
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   166
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   167
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   168
            }, filter));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   169
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   170
            subscription._handles = handles;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   171
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   172
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   173
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   174
        detach: function (node, subscription, notifier) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   175
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   176
            Y.each(subscription._handles, function (handle) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   177
                handle.detach();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   178
            });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   179
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   180
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   181
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   182
    };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   183
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   184
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   185
conf.delegate = conf.on;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   186
conf.detachDelegate = conf.detach;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   187
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   188
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   189
Event.define("contextmenu", conf, true);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   190
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   191
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   192
}, '@VERSION@', {"requires": ["event-synthetic", "dom-screen"]});