canvas-lms/public/javascripts/jquery.instructure_jquery_p...

96 lines
3.8 KiB
JavaScript

/*
* Copyright (C) 2011 - present Instructure, Inc.
*
* This file is part of Canvas.
*
* Canvas is free software: you can redistribute it and/or modify it under
* the terms of the GNU Affero General Public License as published by the Free
* Software Foundation, version 3 of the License.
*
* Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
* A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
* details.
*
* You should have received a copy of the GNU Affero General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import $ from 'jquery'
import getCookie from '../../app/jsx/shared/helpers/getCookie'
// this is a patch so you can set the "method" atribute on rails' REST-ful forms.
$.attrHooks.method = $.extend($.attrHooks.method, {
set(elem, value) {
const orginalVal = value
value = value.toUpperCase() === 'GET' ? 'GET' : 'POST'
if (value === 'POST') {
let $input = $(elem).find("input[name='_method']")
if (!$input.length) {
$input = $("<input type='hidden' name='_method'/>").prependTo(elem)
}
$input.val(orginalVal)
}
elem.setAttribute('method', value)
return value
}
})
$.fn.originalScrollTop = $.fn.scrollTop
$.fn.scrollTop = function() {
if (this.selector == 'html,body' && arguments.length === 0) {
console.error(
"$('html,body').scrollTop() is not cross-browser compatible... use $.windowScrollTop() instead"
)
}
return $.fn.originalScrollTop.apply(this, arguments)
}
// Different browsers (and even different versions of the same browser) differ
// on whether <body> or <html> is the scrolling element for a window. This is a
// utility that returns the correct scroll y-position of the window in every
// browser and version.
//
// see https://drafts.csswg.org/cssom-view/#dom-element-scrolltop for morbid
// details of how the scrollTop attribute is calculated.
$.windowScrollTop = function() {
// $.browser.safari is true for chrome.
// with chrome 61, we want the documentElement.scrollTop, so the
// original code (now the else block) always returns 0.
// if chrome > 60, force it to return documentElement.scrollTop
const chromeVer = window.navigator.userAgent.match(/Chrome\/(\d+)/)
// edge 42+ also reports as chrome 64+, so exclude it explicitly. yay user agent sniffing.
const edgeVer = window.navigator.userAgent.match(/Edge\/(\d+)/)
if (!edgeVer && chromeVer && parseInt(chromeVer[1], 10) > 60) {
return $('html').scrollTop()
} else if ($.browser.safari) {
// Safari 13 has changed document.scrollingElement from <body> => <html>.
// As a result, it is now reporting $('body').scrollTop() == 0 as the <body>
// element no longer has a scrolling area.
// $('html').scrollTop() is now returning the scroll position like other
// browsers that use <html> as the scrolling element.
const safariVer = window.navigator.userAgent.match(/Version\/(\d+).*Safari/)
return (safariVer && parseInt(safariVer[1], 10) < 13 ? $('body') : $('html')).scrollTop()
} else {
return $('html').scrollTop()
}
}
// indicate we want stringified IDs for JSON responses
$.ajaxPrefilter('json', (options, originalOptions, jqXHR) => {
if (options.accepts.json)
options.accepts.json = options.accepts.json + ', application/json+canvas-string-ids'
else options.accepts.json = 'application/json+canvas-string-ids'
})
// see: https://github.com/rails/jquery-ujs/blob/master/src/rails.js#L80
const CSRFProtection = function(xhr) {
const csrfToken = getCookie('_csrf_token')
if (csrfToken) xhr.setRequestHeader('X-CSRF-Token', csrfToken)
}
$.ajaxPrefilter((options, originalOptions, jqXHR) => {
if (!options.crossDomain) CSRFProtection(jqXHR)
})
export default $