OXIESEC PANEL
- Current Dir:
/
/
var
/
www
/
reader
/
_backup
/
tinymce
/
tinymce
/
src
/
core
/
main
/
ts
/
api
/
dom
Server IP: 139.59.38.164
Upload:
Create Dir:
Name
Size
Modified
Perms
📁
..
-
02/20/2020 06:12:10 AM
rwxr-xr-x
📄
BookmarkManager.ts
3.08 KB
02/20/2020 06:46:08 AM
rw-r--r--
📄
ControlSelection.ts
15.61 KB
02/20/2020 06:46:09 AM
rw-r--r--
📄
DOMUtils.ts
59.57 KB
02/20/2020 06:46:12 AM
rw-r--r--
📄
DomQuery.ts
42.98 KB
02/20/2020 06:46:10 AM
rw-r--r--
📄
ElementUtils.ts
3.21 KB
02/20/2020 06:46:12 AM
rw-r--r--
📄
EventUtils.ts
19.46 KB
02/20/2020 06:46:13 AM
rw-r--r--
📄
NativeTypes.ts
401 bytes
02/20/2020 06:11:47 AM
rw-r--r--
📄
RangeUtils.ts
3.2 KB
02/20/2020 06:11:47 AM
rw-r--r--
📄
ScriptLoader.ts
9.41 KB
02/20/2020 06:11:48 AM
rw-r--r--
📄
Selection.ts
20.32 KB
02/20/2020 06:11:49 AM
rw-r--r--
📄
SelectorChanged.ts
2.74 KB
02/20/2020 06:11:49 AM
rw-r--r--
📄
Serializer.ts
4.05 KB
02/20/2020 06:11:50 AM
rw-r--r--
📄
Sizzle.ts
58.67 KB
02/20/2020 06:11:54 AM
rw-r--r--
📄
TreeWalker.ts
3.59 KB
02/20/2020 06:11:51 AM
rw-r--r--
Editing: SelectorChanged.ts
Close
/** * Copyright (c) Tiny Technologies, Inc. All rights reserved. * Licensed under the LGPL or a commercial license. * For LGPL see License.txt in the project root for license information. * For commercial licenses see https://www.tiny.cloud/ */ import { Node, Element } from '@ephox/dom-globals'; import { Arr } from '@ephox/katamari'; import Editor from '../Editor'; import DOMUtils from './DOMUtils'; import Tools from '../util/Tools'; const deleteFromCallbackMap = (callbackMap, selector, callback) => { if (callbackMap && callbackMap.hasOwnProperty(selector)) { const newCallbacks = Arr.filter(callbackMap[selector], (cb) => cb !== callback); if (newCallbacks.length === 0) { delete callbackMap[selector]; } else { callbackMap[selector] = newCallbacks; } } }; export default (dom: DOMUtils, editor: Editor) => { let selectorChangedData, currentSelectors; return { selectorChangedWithUnbind(selector: string, callback: (active: boolean, args: { node: Node, selector: String, parents: Element[] }) => void): { unbind: () => void } { if (!selectorChangedData) { selectorChangedData = {}; currentSelectors = {}; editor.on('NodeChange', function (e) { const node = e.element, parents = dom.getParents(node, null, dom.getRoot()), matchedSelectors = {}; // Check for new matching selectors Tools.each(selectorChangedData, function (callbacks, selector) { Tools.each(parents, function (node) { if (dom.is(node, selector)) { if (!currentSelectors[selector]) { // Execute callbacks Tools.each(callbacks, function (callback) { callback(true, { node, selector, parents }); }); currentSelectors[selector] = callbacks; } matchedSelectors[selector] = callbacks; return false; } }); }); // Check if current selectors still match Tools.each(currentSelectors, function (callbacks, selector) { if (!matchedSelectors[selector]) { delete currentSelectors[selector]; Tools.each(callbacks, function (callback) { callback(false, { node, selector, parents }); }); } }); }); } // Add selector listeners if (!selectorChangedData[selector]) { selectorChangedData[selector] = []; } selectorChangedData[selector].push(callback); return { unbind() { deleteFromCallbackMap(selectorChangedData, selector, callback); deleteFromCallbackMap(currentSelectors, selector, callback); } }; } }; };