Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
// Can't just fireDismissalEvent formCloseEvent, because it is on the parent component of the dialog
AlloyEvents.run(SystemEvents.dismissRequested(), (comp, se) => {
AlloyTriggers.emit(dialogUi.dialog, formCancelEvent);
}),
]),
...inlineAdditionalBehaviours(editor, isStickyToolbar)
])
}));
inlineDialog.set(inlineDialogComp);
// Position the inline dialog
InlineView.showWithin(
inlineDialogComp,
anchor,
GuiFactory.premade(dialogUi.dialog),
Option.some(Body.body())
);
// Refresh the docking position if not using a sticky toolbar
if (!isStickyToolbar) {
Docking.refresh(inlineDialogComp);
// Bind to the editor resize event and update docking as needed. We don't need to worry about
// 'ResizeWindow` as that's handled by docking already.
editor.on('ResizeEditor', refreshDocking);
}
// Set the initial data in the dialog and focus the first focusable item
dialogUi.instanceApi.setData(initialData);
Keying.focusIn(dialogUi.dialog);
return dialogUi.instanceApi;
* As soon as the window is back to 0 (idle), scroll the toolbar and socket back into place on scroll.
*/
scroller.idle(function () {
IosUpdates.updatePositions(container, outerWindow.pageYOffset).get(function (/* _ */) {
const extraScroll = scrollBounds();
extraScroll.each(function (extra) {
// TODO: Smoothly animate this in a way that doesn't conflict with anything else.
socket.dom().scrollTop = socket.dom().scrollTop + extra.top();
});
scroller.start(0);
structure.refresh();
});
});
}, 1000);
const onScroll = DomEvent.bind(Element.fromDom(outerWindow), 'scroll', function () {
if (outerWindow.pageYOffset < 0) {
return;
}
/*
We've experimented with trying to set the socket scroll (hidden vs. scroll) based on whether the outer body
has scrolled. When the window starts scrolling, we would lock the socket scroll, and we would
unlock it when the window stopped scrolling. This would give a nice rubber-band effect at the end
of the content, but would break the code that tried to position the text in the viewable area
(more details below). Also, as soon as you flicked to outer scroll, if you started scrolling up again,
you would drag the whole window down, because you would still be in outerscroll mode. That's hardly
much of a problem, but it is a minor issue. It also didn't play nicely with keeping the toolbar on the screen.
The big problem was that this was incompatible with the toolbar and scrolling code. We need a padding inside
the socket so that the bottom of the content can be scrolled into the viewable greenzone. If it doesn't
have padding, then unless we move the socket top to some negative value as well, then we can't get
getTabview(dialog).each((tabview) => {
Css.set(tabview, 'visibility', 'hidden');
// Determine the maximum heights of each tab
comp.getSystem().getByDom(tabview).toOption().each((tabviewComp) => {
const heights = measureHeights(allTabs, tabview, tabviewComp);
// Calculate the maximum tab height and store it
const maxTabHeightOpt = getMaxHeight(heights);
maxTabHeight.set(maxTabHeightOpt);
});
// Set an initial height, based on the current size
updateTabviewHeight(dialog, tabview, maxTabHeight);
// Show the tabs
Css.remove(tabview, 'visibility');
showTab(allTabs, comp);
const setEditorSize = () => {
// Set height and width if they were given, though height only applies to iframe mode
const parsedHeight = Utils.numToPx(EditorSize.getHeightWithFallback(editor));
const parsedWidth = Utils.numToPx(EditorSize.getWidthWithFallback(editor));
if (!editor.inline) {
// Update the width
if (Css.isValidValue('div', 'width', parsedWidth)) {
Css.set(outerContainer.element(), 'width', parsedWidth);
}
// Update the height
if (Css.isValidValue('div', 'height', parsedHeight)) {
Css.set(outerContainer.element(), 'height', parsedHeight);
} else {
Css.set(outerContainer.element(), 'height', '200px');
}
}
return parsedHeight;
};
maxTabHeight.get().map((height) => {
// Set the tab view height to 0, so we can calculate the max tabview height, without worrying about overflows
Css.set(tabview, 'height', '0');
Css.set(tabview, 'flex-basis', '0');
return Math.min(height, getMaxTabviewHeight(dialog, tabview, tablist));
}).each((height) => {
setTabviewHeight(tabview, height);
const updatePadding = function (contentBody, socket, dropup) {
const greenzoneHeight = getGreenzone(socket, dropup);
const deltaHeight = (Height.get(socket) + Height.get(dropup)) - greenzoneHeight;
// TBIO-3878 Changed the element that was receiving the padding from the iframe to the body of the
// iframe's document. The reasoning for this is that the syncHeight function of IosSetup.js relies on
// the scrollHeight of the body to set the height of the iframe itself. If we don't set the
// padding-bottom on the body, the scrollHeight is too short, effectively disappearing the content from view.
Css.set(contentBody, 'padding-bottom', deltaHeight + 'px');
};
maxTabHeight.get().map((height) => {
// Set the tab view height to 0, so we can calculate the max tabview height, without worrying about overflows
Css.set(tabview, 'height', '0');
Css.set(tabview, 'flex-basis', '0');
return Math.min(height, getMaxTabviewHeight(dialog, tabview, tablist));
}).each((height) => {
setTabviewHeight(tabview, height);
if (!isSandbox) {
Attr.set(frameComponent.element(), 'src', 'javascript:\'\'');
// IE 6-11 doesn't support data uris on iframeComponents
// and Edge only supports upto ~4000 chars in data uris
// so I guess they will have to be less secure since we can't sandbox on those
// TODO: Use sandbox if future versions of IE/Edge supports iframeComponents with data: uris.
const doc = frameComponent.element().dom().contentWindow.document;
doc.open();
doc.write(html);
doc.close();
} else {
// TINY-3769: We need to use srcdoc here, instead of src with a data URI, otherwise browsers won't retain the Origin.
// See https://bugs.chromium.org/p/chromium/issues/detail?id=58999#c11
Attr.set(frameComponent.element(), 'srcdoc', html);
}
cachedValue.set(html);
}
};
setValue: (frameComponent: AlloyComponent, html: string) => {
if (!isSandbox) {
Attr.set(frameComponent.element(), 'src', 'javascript:\'\'');
// IE 6-11 doesn't support data uris on iframeComponents
// and Edge only supports upto ~4000 chars in data uris
// so I guess they will have to be less secure since we can't sandbox on those
// TODO: Use sandbox if future versions of IE/Edge supports iframeComponents with data: uris.
const doc = frameComponent.element().dom().contentWindow.document;
doc.open();
doc.write(html);
doc.close();
} else {
// TINY-3769: We need to use srcdoc here, instead of src with a data URI, otherwise browsers won't retain the Origin.
// See https://bugs.chromium.org/p/chromium/issues/detail?id=58999#c11
Attr.set(frameComponent.element(), 'srcdoc', html);
}
cachedValue.set(html);
editorApi.getCursorBox().each(function (bounds) {
const cWin = editorApi.win();
// The goal here is to shift as little as required.
const isOutside = bounds.top() > cWin.innerHeight || bounds.bottom() > cWin.innerHeight;
const cScrollBy = isOutside ? bounds.bottom() - cWin.innerHeight + 50 /*EXTRA_SPACING*/ : 0;
if (cScrollBy !== 0) {
cWin.scrollTo(cWin.pageXOffset, cWin.pageYOffset + cScrollBy);
}
});
})
].concat(
isAndroid6 === true ? [ ] : [
DomEvent.bind(Element.fromDom(editorApi.win()), 'blur', function () {
alloy.getByDom(toolstrip).each(Toggling.off);
}),
DomEvent.bind(outerDoc, 'select', updateMargin),
DomEvent.bind(editorApi.doc(), 'selectionchange', updateMargin)
]
);
const destroy = function () {
Arr.each(listeners, function (l) {
l.unbind();
});
};
return {
destroy
};
};