%PDF- %PDF-
Direktori : /var/www/html/news/public/bower_components/chart.js/src/platforms/ |
Current File : /var/www/html/news/public/bower_components/chart.js/src/platforms/platform.dom.js |
'use strict'; // Chart.Platform implementation for targeting a web browser module.exports = function(Chart) { var helpers = Chart.helpers; // DOM event types -> Chart.js event types. // Note: only events with different types are mapped. // https://developer.mozilla.org/en-US/docs/Web/Events var eventTypeMap = { // Touch events touchstart: 'mousedown', touchmove: 'mousemove', touchend: 'mouseup', // Pointer events pointerenter: 'mouseenter', pointerdown: 'mousedown', pointermove: 'mousemove', pointerup: 'mouseup', pointerleave: 'mouseout', pointerout: 'mouseout' }; /** * The "used" size is the final value of a dimension property after all calculations have * been performed. This method uses the computed style of `element` but returns undefined * if the computed style is not expressed in pixels. That can happen in some cases where * `element` has a size relative to its parent and this last one is not yet displayed, * for example because of `display: none` on a parent node. * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value * @returns {Number} Size in pixels or undefined if unknown. */ function readUsedSize(element, property) { var value = helpers.getStyle(element, property); var matches = value && value.match(/^(\d+)(\.\d+)?px$/); return matches? Number(matches[1]) : undefined; } /** * Initializes the canvas style and render size without modifying the canvas display size, * since responsiveness is handled by the controller.resize() method. The config is used * to determine the aspect ratio to apply in case no explicit height has been specified. */ function initCanvas(canvas, config) { var style = canvas.style; // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it // returns null or '' if no explicit value has been set to the canvas attribute. var renderHeight = canvas.getAttribute('height'); var renderWidth = canvas.getAttribute('width'); // Chart.js modifies some canvas values that we want to restore on destroy canvas._chartjs = { initial: { height: renderHeight, width: renderWidth, style: { display: style.display, height: style.height, width: style.width } } }; // Force canvas to display as block to avoid extra space caused by inline // elements, which would interfere with the responsive resize process. // https://github.com/chartjs/Chart.js/issues/2538 style.display = style.display || 'block'; if (renderWidth === null || renderWidth === '') { var displayWidth = readUsedSize(canvas, 'width'); if (displayWidth !== undefined) { canvas.width = displayWidth; } } if (renderHeight === null || renderHeight === '') { if (canvas.style.height === '') { // If no explicit render height and style height, let's apply the aspect ratio, // which one can be specified by the user but also by charts as default option // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2. canvas.height = canvas.width / (config.options.aspectRatio || 2); } else { var displayHeight = readUsedSize(canvas, 'height'); if (displayWidth !== undefined) { canvas.height = displayHeight; } } } return canvas; } function createEvent(type, chart, x, y, nativeEvent) { return { type: type, chart: chart, native: nativeEvent || null, x: x !== undefined? x : null, y: y !== undefined? y : null, }; } function fromNativeEvent(event, chart) { var type = eventTypeMap[event.type] || event.type; var pos = helpers.getRelativePosition(event, chart); return createEvent(type, chart, pos.x, pos.y, event); } function createResizer(handler) { var iframe = document.createElement('iframe'); iframe.className = 'chartjs-hidden-iframe'; iframe.style.cssText = 'display:block;'+ 'overflow:hidden;'+ 'border:0;'+ 'margin:0;'+ 'top:0;'+ 'left:0;'+ 'bottom:0;'+ 'right:0;'+ 'height:100%;'+ 'width:100%;'+ 'position:absolute;'+ 'pointer-events:none;'+ 'z-index:-1;'; // Prevent the iframe to gain focus on tab. // https://github.com/chartjs/Chart.js/issues/3090 iframe.tabIndex = -1; // If the iframe is re-attached to the DOM, the resize listener is removed because the // content is reloaded, so make sure to install the handler after the iframe is loaded. // https://github.com/chartjs/Chart.js/issues/3521 helpers.addEvent(iframe, 'load', function() { helpers.addEvent(iframe.contentWindow || iframe, 'resize', handler); // The iframe size might have changed while loading, which can also // happen if the size has been changed while detached from the DOM. handler(); }); return iframe; } function addResizeListener(node, listener, chart) { var stub = node._chartjs = { ticking: false }; // Throttle the callback notification until the next animation frame. var notify = function() { if (!stub.ticking) { stub.ticking = true; helpers.requestAnimFrame.call(window, function() { if (stub.resizer) { stub.ticking = false; return listener(createEvent('resize', chart)); } }); } }; // Let's keep track of this added iframe and thus avoid DOM query when removing it. stub.resizer = createResizer(notify); node.insertBefore(stub.resizer, node.firstChild); } function removeResizeListener(node) { if (!node || !node._chartjs) { return; } var resizer = node._chartjs.resizer; if (resizer) { resizer.parentNode.removeChild(resizer); node._chartjs.resizer = null; } delete node._chartjs; } return { acquireContext: function(item, config) { if (typeof item === 'string') { item = document.getElementById(item); } else if (item.length) { // Support for array based queries (such as jQuery) item = item[0]; } if (item && item.canvas) { // Support for any object associated to a canvas (including a context2d) item = item.canvas; } // To prevent canvas fingerprinting, some add-ons undefine the getContext // method, for example: https://github.com/kkapsner/CanvasBlocker // https://github.com/chartjs/Chart.js/issues/2807 var context = item && item.getContext && item.getContext('2d'); // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the item is // inside an iframe or when running in a protected environment. We could guess the // types from their toString() value but let's keep things flexible and assume it's // a sufficient condition if the item has a context2D which has item as `canvas`. // https://github.com/chartjs/Chart.js/issues/3887 // https://github.com/chartjs/Chart.js/issues/4102 // https://github.com/chartjs/Chart.js/issues/4152 if (context && context.canvas === item) { initCanvas(item, config); return context; } return null; }, releaseContext: function(context) { var canvas = context.canvas; if (!canvas._chartjs) { return; } var initial = canvas._chartjs.initial; ['height', 'width'].forEach(function(prop) { var value = initial[prop]; if (value === undefined || value === null) { canvas.removeAttribute(prop); } else { canvas.setAttribute(prop, value); } }); helpers.each(initial.style || {}, function(value, key) { canvas.style[key] = value; }); // The canvas render size might have been changed (and thus the state stack discarded), // we can't use save() and restore() to restore the initial state. So make sure that at // least the canvas context is reset to the default state by setting the canvas width. // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html canvas.width = canvas.width; delete canvas._chartjs; }, addEventListener: function(chart, type, listener) { var canvas = chart.canvas; if (type === 'resize') { // Note: the resize event is not supported on all browsers. addResizeListener(canvas.parentNode, listener, chart); return; } var stub = listener._chartjs || (listener._chartjs = {}); var proxies = stub.proxies || (stub.proxies = {}); var proxy = proxies[chart.id + '_' + type] = function(event) { listener(fromNativeEvent(event, chart)); }; helpers.addEvent(canvas, type, proxy); }, removeEventListener: function(chart, type, listener) { var canvas = chart.canvas; if (type === 'resize') { // Note: the resize event is not supported on all browsers. removeResizeListener(canvas.parentNode, listener); return; } var stub = listener._chartjs || {}; var proxies = stub.proxies || {}; var proxy = proxies[chart.id + '_' + type]; if (!proxy) { return; } helpers.removeEvent(canvas, type, proxy); } }; };