react-safe-src-doc-iframe
Version:
A component which applies guards to srcdoc iframes, providing a predictable and safe experience to the user.
92 lines (87 loc) • 12.4 kB
JavaScript
import React from 'react';
import { shallow, mount } from 'enzyme';
import SafeSrcDocIframe from './safe-src-doc-iframe';
describe('<SafeSrcDocIframe />', function () {
var mockDocument = '\n <!DOCTYPE html>\n <html>\n <head></head>\n <body>\n mock html page\n </body>\n </html>\n ';
var testIframe = function testIframe() {
return React.createElement(SafeSrcDocIframe, { title: 'some-title', srcDoc: mockDocument });
};
var renderShallowSafeframe = function renderShallowSafeframe() {
return shallow(testIframe());
};
var renderMountedSafeIframe = function renderMountedSafeIframe() {
return mount(testIframe());
};
beforeEach(function () {
jest.clearAllMocks();
});
it('renders as expected', function () {
expect(renderShallowSafeframe()).toMatchSnapshot();
});
it('will not configure onload for iframe during componentDidMount if ref does not exist', function () {
var wrapper = renderMountedSafeIframe();
expect(function () {
return wrapper.instance().componentDidMount.call({});
}).not.toThrow();
});
it('will configure onload for iframe', function () {
var applySafeguardsSpy = jest.spyOn(SafeSrcDocIframe.prototype, 'applySafeguards');
var wrapper = renderMountedSafeIframe();
expect(wrapper.instance().iframeElement.onload).toBeDefined();
wrapper.instance().iframeElement.onload();
expect(applySafeguardsSpy).toHaveBeenCalled();
});
it('will not apply safeguard styles if contentDocument does not exist', function () {
var wrapper = renderMountedSafeIframe();
var disableStyleTag = document.createElement('style');
expect(function () {
return wrapper.instance().applySafeguards.call({
iframeElement: {},
disableStyleTag: disableStyleTag
});
}).not.toThrow();
});
it('will not apply safeguard styles if contentDocument.body does not exist', function () {
var wrapper = renderMountedSafeIframe();
var disableStyleTag = document.createElement('style');
var mockContentDocument = {
getElementsByTagName: jest.fn().mockReturnValue([])
};
expect(function () {
return wrapper.instance().applySafeguards.call({
iframeElement: {
contentDocument: mockContentDocument
},
disableStyleTag: disableStyleTag
});
}).not.toThrow();
expect(mockContentDocument.getElementsByTagName).toHaveBeenCalledWith('body');
});
it('will apply safeguard styles if contentDocument and contentDocument.body exists', function () {
var wrapper = renderMountedSafeIframe();
var mockBody = {
appendChild: jest.fn()
};
var mockContentDocument = {
getElementsByTagName: jest.fn().mockReturnValue([mockBody])
};
var disableStyleTag = document.createElement('style');
wrapper.instance().applySafeguards.call({
iframeElement: {
contentDocument: mockContentDocument
},
disableStyleTag: disableStyleTag
});
expect(mockBody.appendChild).toHaveBeenCalledWith(disableStyleTag);
});
it('will dereference the style tag and text node when the component will unmount', function () {
var wrapper = renderMountedSafeIframe();
expect(wrapper.instance().disableStyleTag).toBeDefined();
expect(wrapper.instance().disableStylesTextNode).toBeDefined();
wrapper.instance().componentWillUnmount();
expect(wrapper.instance().disableStyleTag).toBe(null);
expect(wrapper.instance().disableStylesTextNode).toBe(null);
wrapper.unmount();
});
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9zYWZlLXNyYy1kb2MtaWZyYW1lLnRlc3QuanMiXSwibmFtZXMiOlsiUmVhY3QiLCJzaGFsbG93IiwibW91bnQiLCJTYWZlU3JjRG9jSWZyYW1lIiwiZGVzY3JpYmUiLCJtb2NrRG9jdW1lbnQiLCJ0ZXN0SWZyYW1lIiwicmVuZGVyU2hhbGxvd1NhZmVmcmFtZSIsInJlbmRlck1vdW50ZWRTYWZlSWZyYW1lIiwiYmVmb3JlRWFjaCIsImplc3QiLCJjbGVhckFsbE1vY2tzIiwiaXQiLCJleHBlY3QiLCJ0b01hdGNoU25hcHNob3QiLCJ3cmFwcGVyIiwiaW5zdGFuY2UiLCJjb21wb25lbnREaWRNb3VudCIsImNhbGwiLCJub3QiLCJ0b1Rocm93IiwiYXBwbHlTYWZlZ3VhcmRzU3B5Iiwic3B5T24iLCJwcm90b3R5cGUiLCJpZnJhbWVFbGVtZW50Iiwib25sb2FkIiwidG9CZURlZmluZWQiLCJ0b0hhdmVCZWVuQ2FsbGVkIiwiZGlzYWJsZVN0eWxlVGFnIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiYXBwbHlTYWZlZ3VhcmRzIiwibW9ja0NvbnRlbnREb2N1bWVudCIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiZm4iLCJtb2NrUmV0dXJuVmFsdWUiLCJjb250ZW50RG9jdW1lbnQiLCJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsIm1vY2tCb2R5IiwiYXBwZW5kQ2hpbGQiLCJkaXNhYmxlU3R5bGVzVGV4dE5vZGUiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsInRvQmUiLCJ1bm1vdW50Il0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxLQUFQLE1BQWtCLE9BQWxCO0FBQ0EsU0FBU0MsT0FBVCxFQUFrQkMsS0FBbEIsUUFBK0IsUUFBL0I7QUFDQSxPQUFPQyxnQkFBUCxNQUE2Qix1QkFBN0I7O0FBRUFDLFNBQVMsc0JBQVQsRUFBaUMsWUFBTTtBQUNyQyxNQUFNQywrSEFBTjs7QUFVQSxNQUFNQyxhQUFhLFNBQWJBLFVBQWE7QUFBQSxXQUFNLG9CQUFD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QixFQUE2QkYsb0JBQTdCLENBQWtEVCxlQUFsRDtBQUNELEdBaEJEO0FBaUJBaEIsS0FBRyw4RUFBSCxFQUFtRixZQUFNO0FBQ3ZGLFFBQU1HLFVBQVVQLHlCQUFoQjtBQUNBSyxXQUFPRSxRQUFRQyxRQUFSLEdBQW1CWSxlQUExQixFQUEyQ0YsV0FBM0M7QUFDQWIsV0FBT0UsUUFBUUMsUUFBUixHQUFtQndCLHFCQUExQixFQUFpRGQsV0FBakQ7QUFDQVgsWUFBUUMsUUFBUixHQUFtQnlCLG9CQUFuQjtBQUNBNUIsV0FBT0UsUUFBUUMsUUFBUixHQUFtQlksZUFBMUIsRUFBMkNjLElBQTNDLENBQWdELElBQWhEO0FBQ0E3QixXQUFPRSxRQUFRQyxRQUFSLEdBQW1Cd0IscUJBQTFCLEVBQWlERSxJQUFqRCxDQUFzRCxJQUF0RDtBQUNBM0IsWUFBUTRCLE9BQVI7QUFDRCxHQVJEO0FBU0QsQ0FuR0QiLCJmaWxlIjoic2FmZS1zcmMtZG9jLWlmcmFtZS50ZXN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHNoYWxsb3csIG1vdW50IH0gZnJvbSAnZW56eW1lJztcbmltcG9ydCBTYWZlU3JjRG9jSWZyYW1lIGZyb20gJy4vc2FmZS1zcmMtZG9jLWlmcmFtZSc7XG5cbmRlc2NyaWJlKCc8U2FmZVNyY0RvY0lmcmFtZSAvPicsICgpID0+IHtcbiAgY29uc3QgbW9ja0RvY3VtZW50ID0gYFxuICA8IURPQ1RZUEUgaHRtbD5cbiAgPGh0bWw+XG4gICAgPGhlYWQ+PC9oZWFkPlxuICAgIDxib2R5PlxuICAgICAgbW9jayBodG1sIHBhZ2VcbiAgICA8L2JvZHk+XG4gIDwvaHRtbD5cbiAgYDtcblxuICBjb25zdCB0ZXN0SWZyYW1lID0gKCkgPT4gPFNhZmVTcmNEb2NJZnJhbWUgdGl0bGU9J3NvbWUtdGl0bGUnIHNyY0RvYz17IG1vY2tEb2N1bWVudCB9IC8+O1xuXG4gIGNvbnN0IHJlbmRlclNoYWxsb3dTYWZlZnJhbWUgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHNoYWxsb3codGVzdElmcmFtZSgpKTtcbiAgfTtcblxuICBjb25zdCByZW5kZXJNb3VudGVkU2FmZUlmcmFtZSA9ICgpID0+IHtcbiAgICByZXR1cm4gbW91bnQodGVzdElmcmFtZSgpKTtcbiAgfTtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBqZXN0LmNsZWFyQWxsTW9ja3MoKTtcbiAgfSk7XG4gIGl0KCdyZW5kZXJzIGFzIGV4cGVjdGVkJywgKCkgPT4ge1xuICAgIGV4cGVjdChcbiAgICAgIHJlbmRlclNoYWxsb3dTYWZlZnJhbWUoKVxuICAgICkudG9NYXRjaFNuYXBzaG90KCk7XG4gIH0pO1xuICBpdCgnd2lsbCBub3QgY29uZmlndXJlIG9ubG9hZCBmb3IgaWZyYW1lIGR1cmluZyBjb21wb25lbnREaWRNb3VudCBpZiByZWYgZG9lcyBub3QgZXhpc3QnLCAoKSA9PiB7XG4gICAgY29uc3Qgd3JhcHBlciA9IHJlbmRlck1vdW50ZWRTYWZlSWZyYW1lKCk7XG4gICAgZXhwZWN0KCgpID0+XG4gICAgICB3cmFwcGVyLmluc3RhbmNlKCkuY29tcG9uZW50RGlkTW91bnQuY2FsbCh7fSlcbiAgICApLm5vdC50b1Rocm93KCk7XG4gIH0pO1xuICBpdCgnd2lsbCBjb25maWd1cmUgb25sb2FkIGZvciBpZnJhbWUnLCAoKSA9PiB7XG4gICAgY29uc3QgYXBwbHlTYWZlZ3VhcmRzU3B5ID0gamVzdC5zcHlPbihcbiAgICAgIFNhZmVTcmNEb2NJZnJhbWUucHJvdG90eXBlLFxuICAgICAgJ2FwcGx5U2FmZWd1YXJkcydcbiAgICApO1xuICAgIGNvbnN0IHdyYXBwZXIgPSByZW5kZXJNb3VudGVkU2FmZUlmcmFtZSgpO1xuICAgIGV4cGVjdCh3cmFwcGVyLmluc3RhbmNlKCkuaWZyYW1lRWxlbWVudC5vbmxvYWQpLnRvQmVEZWZpbmVkKCk7XG4gICAgd3JhcHBlci5pbnN0YW5jZSgpLmlmcmFtZUVsZW1lbnQub25sb2FkKCk7XG4gICAgZXhwZWN0KGFwcGx5U2FmZWd1YXJkc1NweSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICB9KTtcbiAgaXQoJ3dpbGwgbm90IGFwcGx5IHNhZmVndWFyZCBzdHlsZXMgaWYgY29udGVudERvY3VtZW50IGRvZXMgbm90IGV4aXN0JywgKCkgPT4ge1xuICAgIGNvbnN0IHdyYXBwZXIgPSByZW5kZXJNb3VudGVkU2FmZUlmcmFtZSgpO1xuICAgIGNvbnN0IGRpc2FibGVTdHlsZVRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgZXhwZWN0KCgpID0+XG4gICAgICB3cmFwcGVyLmluc3RhbmNlKCkuYXBwbHlTYWZlZ3VhcmRzLmNhbGwoe1xuICAgICAgICBpZnJhbWVFbGVtZW50OiB7fSxcbiAgICAgICAgZGlzYWJsZVN0eWxlVGFnXG4gICAgICB9KVxuICAgICkubm90LnRvVGhyb3coKTtcbiAgfSk7XG4gIGl0KCd3aWxsIG5vdCBhcHBseSBzYWZlZ3VhcmQgc3R5bGVzIGlmIGNvbnRlbnREb2N1bWVudC5ib2R5IGRvZXMgbm90IGV4aXN0JywgKCkgPT4ge1xuICAgIGNvbnN0IHdyYXBwZXIgPSByZW5kZXJNb3VudGVkU2FmZUlmcmFtZSgpO1xuICAgIGNvbnN0IGRpc2FibGVTdHlsZVRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgY29uc3QgbW9ja0NvbnRlbnREb2N1bWVudCA9IHtcbiAgICAgIGdldEVsZW1lbnRzQnlUYWdOYW1lOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKFtdKVxuICAgIH07XG4gICAgZXhwZWN0KCgpID0+XG4gICAgICB3cmFwcGVyLmluc3RhbmNlKCkuYXBwbHlTYWZlZ3VhcmRzLmNhbGwoe1xuICAgICAgICBpZnJhbWVFbGVtZW50OiB7XG4gICAgICAgICAgY29udGVudERvY3VtZW50OiBtb2NrQ29udGVudERvY3VtZW50XG4gICAgICAgIH0sXG4gICAgICAgIGRpc2FibGVTdHlsZVRhZ1xuICAgICAgfSlcbiAgICApLm5vdC50b1Rocm93KCk7XG4gICAgZXhwZWN0KG1vY2tDb250ZW50RG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgJ2JvZHknXG4gICAgKTtcbiAgfSk7XG4gIGl0KCd3aWxsIGFwcGx5IHNhZmVndWFyZCBzdHlsZXMgaWYgY29udGVudERvY3VtZW50IGFuZCBjb250ZW50RG9jdW1lbnQuYm9keSBleGlzdHMnLCAoKSA9PiB7XG4gICAgY29uc3Qgd3JhcHBlciA9IHJlbmRlck1vdW50ZWRTYWZlSWZyYW1lKCk7XG4gICAgY29uc3QgbW9ja0JvZHkgPSB7XG4gICAgICBhcHBlbmRDaGlsZDogamVzdC5mbigpXG4gICAgfTtcbiAgICBjb25zdCBtb2NrQ29udGVudERvY3VtZW50ID0ge1xuICAgICAgZ2V0RWxlbWVudHNCeVRhZ05hbWU6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoW21vY2tCb2R5XSlcbiAgICB9O1xuICAgIGNvbnN0IGRpc2FibGVTdHlsZVRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgd3JhcHBlci5pbnN0YW5jZSgpLmFwcGx5U2FmZWd1YXJkcy5jYWxsKHtcbiAgICAgIGlmcmFtZUVsZW1lbnQ6IHtcbiAgICAgICAgY29udGVudERvY3VtZW50OiBtb2NrQ29udGVudERvY3VtZW50XG4gICAgICB9LFxuICAgICAgZGlzYWJsZVN0eWxlVGFnXG4gICAgfSk7XG4gICAgZXhwZWN0KG1vY2tCb2R5LmFwcGVuZENoaWxkKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChkaXNhYmxlU3R5bGVUYWcpO1xuICB9KTtcbiAgaXQoJ3dpbGwgZGVyZWZlcmVuY2UgdGhlIHN0eWxlIHRhZyBhbmQgdGV4dCBub2RlIHdoZW4gdGhlIGNvbXBvbmVudCB3aWxsIHVubW91bnQnLCAoKSA9PiB7XG4gICAgY29uc3Qgd3JhcHBlciA9IHJlbmRlck1vdW50ZWRTYWZlSWZyYW1lKCk7XG4gICAgZXhwZWN0KHdyYXBwZXIuaW5zdGFuY2UoKS5kaXNhYmxlU3R5bGVUYWcpLnRvQmVEZWZpbmVkKCk7XG4gICAgZXhwZWN0KHdyYXBwZXIuaW5zdGFuY2UoKS5kaXNhYmxlU3R5bGVzVGV4dE5vZGUpLnRvQmVEZWZpbmVkKCk7XG4gICAgd3JhcHBlci5pbnN0YW5jZSgpLmNvbXBvbmVudFdpbGxVbm1vdW50KCk7XG4gICAgZXhwZWN0KHdyYXBwZXIuaW5zdGFuY2UoKS5kaXNhYmxlU3R5bGVUYWcpLnRvQmUobnVsbCk7XG4gICAgZXhwZWN0KHdyYXBwZXIuaW5zdGFuY2UoKS5kaXNhYmxlU3R5bGVzVGV4dE5vZGUpLnRvQmUobnVsbCk7XG4gICAgd3JhcHBlci51bm1vdW50KCk7XG4gIH0pO1xufSk7XG4iXX0=