ember-source
Version:
A JavaScript framework for creating ambitious web applications
206 lines (185 loc) • 5.83 kB
JavaScript
import { getOwner } from '../../../owner/index.js';
import { g as guidFor } from '../../../../../shared-chunks/mandatory-setter-BiXq-dpN.js';
import { isDevelopingApp } from '@embroider/macros';
import '../../../../debug/index.js';
import { assert } from '../../../../debug/lib/assert.js';
/**
@module ember
*/
function isSimpleClick(event) {
if (!(event instanceof MouseEvent)) {
return false;
}
let modifier = event.shiftKey || event.metaKey || event.altKey || event.ctrlKey;
let secondaryClick = event.which > 1; // IE9 may return undefined
return !modifier && !secondaryClick;
}
function constructStyleDeprecationMessage(affectedStyle) {
return '' + 'Binding style attributes may introduce cross-site scripting vulnerabilities; ' + 'please ensure that values being bound are properly escaped. For more information, ' + 'including how to disable this warning, see ' + 'https://deprecations.emberjs.com/v1.x/#toc_binding-style-attributes. ' + 'Style affected: "' + affectedStyle + '"';
}
/**
@private
@method getRootViews
@param {Object} owner
*/
function getRootViews(owner) {
let registry = owner.lookup('-view-registry:main');
let rootViews = [];
Object.keys(registry).forEach(id => {
let view = registry[id];
(isDevelopingApp() && !(view) && assert('expected view', view));
if (view.parentView === null) {
rootViews.push(view);
}
});
return rootViews;
}
/**
@private
@method getViewId
@param {Ember.View} view
*/
function getViewId(view) {
if (view.tagName !== '' && view.elementId) {
return view.elementId;
} else {
return guidFor(view);
}
}
const ELEMENT_VIEW = new WeakMap();
const VIEW_ELEMENT = new WeakMap();
function getElementView(element) {
return ELEMENT_VIEW.get(element) || null;
}
/**
@private
@method getViewElement
@param {Ember.View} view
*/
function getViewElement(view) {
return VIEW_ELEMENT.get(view) || null;
}
function setElementView(element, view) {
ELEMENT_VIEW.set(element, view);
}
function setViewElement(view, element) {
VIEW_ELEMENT.set(view, element);
}
// These are not needed for GC, but for correctness. We want to be able to
// null-out these links while the objects are still live. Specifically, in
// this case, we want to prevent access to the element (and vice verse) during
// destruction.
function clearElementView(element) {
ELEMENT_VIEW.delete(element);
}
function clearViewElement(view) {
VIEW_ELEMENT.delete(view);
}
const CHILD_VIEW_IDS = new WeakMap();
/**
@private
@method getChildViews
@param {Ember.View} view
*/
function getChildViews(view) {
let owner = getOwner(view);
(isDevelopingApp() && !(owner) && assert('View is unexpectedly missing an owner', owner));
let registry = owner.lookup('-view-registry:main');
return collectChildViews(view, registry);
}
function initChildViews(view) {
let childViews = new Set();
CHILD_VIEW_IDS.set(view, childViews);
return childViews;
}
function addChildView(parent, child) {
let childViews = CHILD_VIEW_IDS.get(parent);
if (childViews === undefined) {
childViews = initChildViews(parent);
}
childViews.add(getViewId(child));
}
function collectChildViews(view, registry) {
let views = [];
let childViews = CHILD_VIEW_IDS.get(view);
if (childViews !== undefined) {
childViews.forEach(id => {
let view = registry[id];
if (view && !view.isDestroying && !view.isDestroyed) {
views.push(view);
}
});
}
return views;
}
/**
@private
@method getViewBounds
@param {Ember.View} view
*/
function getViewBounds(view) {
return view.renderer.getBounds(view);
}
/**
@private
@method getViewRange
@param {Ember.View} view
*/
function getViewRange(view) {
let bounds = getViewBounds(view);
let range = document.createRange();
range.setStartBefore(bounds.firstNode);
range.setEndAfter(bounds.lastNode);
return range;
}
/**
`getViewClientRects` provides information about the position of the border
box edges of a view relative to the viewport.
It is only intended to be used by development tools like the Ember Inspector
and may not work on older browsers.
@private
@method getViewClientRects
@param {Ember.View} view
*/
function getViewClientRects(view) {
let range = getViewRange(view);
return range.getClientRects();
}
/**
`getViewBoundingClientRect` provides information about the position of the
bounding border box edges of a view relative to the viewport.
It is only intended to be used by development tools like the Ember Inspector
and may not work on older browsers.
@private
@method getViewBoundingClientRect
@param {Ember.View} view
*/
function getViewBoundingClientRect(view) {
let range = getViewRange(view);
return range.getBoundingClientRect();
}
/**
Determines if the element matches the specified selector.
@private
@method matches
@param {DOMElement} el
@param {String} selector
*/
const elMatches = typeof Element !== 'undefined' ? Element.prototype.matches : undefined;
function matches(el, selector) {
(isDevelopingApp() && !(elMatches !== undefined) && assert('cannot call `matches` in fastboot mode', elMatches !== undefined));
return elMatches.call(el, selector);
}
function contains(a, b) {
if (a.contains !== undefined) {
return a.contains(b);
}
let current = b.parentNode;
while (current && (current = current.parentNode)) {
if (current === a) {
return true;
}
}
return false;
}
export { addChildView, clearElementView, clearViewElement, collectChildViews, constructStyleDeprecationMessage, contains, elMatches, getChildViews, getElementView, getRootViews, getViewBoundingClientRect, getViewBounds, getViewClientRects, getViewElement, getViewId, getViewRange, initChildViews, isSimpleClick, matches, setElementView, setViewElement };