next-csrf
Version:
CSRF mitigation library for Next.js
105 lines (85 loc) • 3.8 kB
JavaScript
(/* istanbul ignore next */ function (global, factory) {
if (typeof define === "function" && define.amd) {
define(['module', 'exports', '../get/focus-target', '../util/decorate-context', '../util/element-matches', '../util/platform'], factory);
} else if (typeof exports !== "undefined") {
factory(module, exports, require('../get/focus-target'), require('../util/decorate-context'), require('../util/element-matches'), require('../util/platform'));
} else {
var mod = {
exports: {}
};
factory(mod, mod.exports, global.focusTarget, global.decorateContext, global.elementMatches, global.platform);
global.pointerFocusInput = mod.exports;
}
})(this, function (module, exports, _focusTarget, _decorateContext, _elementMatches, _platform) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _focusTarget2 = _interopRequireDefault(_focusTarget);
var _decorateContext2 = _interopRequireDefault(_decorateContext);
var _elementMatches2 = _interopRequireDefault(_elementMatches);
var _platform2 = _interopRequireDefault(_platform);
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
/*
Clicking on form field does not necessarily assign it focus in Safari and Firefox on Mac OS X.
While not a browser bug, it may be considered undesired behavior.
https://bugs.webkit.org/show_bug.cgi?id=22261
https://bugs.webkit.org/show_bug.cgi?id=118043
Note: This behavior can be turned off in Firefox by changing the
option `accessibility.mouse_focuses_formcontrol` in about:config
*/
var engage = void 0;
var disengage = void 0;
// This fix is only relevant to Safari and Firefox on OSX
var relevantToCurrentBrowser = _platform2.default.is.OSX && (_platform2.default.is.GECKO || _platform2.default.is.WEBKIT);
if (!relevantToCurrentBrowser) {
engage = function engage() {};
} else {
(function () {
var handleMouseDownEvent = function handleMouseDownEvent(event) {
if (event.defaultPrevented || !(0, _elementMatches2.default)(event.target, 'input, button, button *')) {
// abort if the mousedown event was cancelled,
// or we're not dealing with an affected form control
return;
}
var target = (0, _focusTarget2.default)({
context: event.target
});
// we need to set focus AFTER the mousedown finished, otherwise WebKit will ignore the call
(window.setImmediate || window.setTimeout)(function () {
target.focus();
});
};
var handleMouseUpEvent = function handleMouseUpEvent(event) {
if (event.defaultPrevented || !(0, _elementMatches2.default)(event.target, 'label, label *')) {
// abort if the mouseup event was cancelled,
// or we're not dealing with a <label>
return;
}
var target = (0, _focusTarget2.default)({
context: event.target
});
if (!target) {
return;
}
target.focus();
};
engage = function engage(element) {
element.addEventListener('mousedown', handleMouseDownEvent, false);
// <label> elements redirect focus upon mouseup, not mousedown
element.addEventListener('mouseup', handleMouseUpEvent, false);
};
disengage = function disengage(element) {
element.removeEventListener('mousedown', handleMouseDownEvent, false);
element.removeEventListener('mouseup', handleMouseUpEvent, false);
};
})();
}
exports.default = (0, _decorateContext2.default)({ engage: engage, disengage: disengage });
module.exports = exports['default'];
});
//# sourceMappingURL=pointer-focus-input.js.map