@atlassian/atlassian-connect-js 5.3.190
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.depcheckrc.json +16 -0
- package/.editorconfig +9 -0
- package/.envrc +5 -0
- package/.eslintignore +12 -0
- package/.eslintrc +31 -0
- package/.husky/pre-commit +11 -0
- package/.lintstagedrc.js +6 -0
- package/.netrc +1 -0
- package/.npmrc-public +4 -0
- package/.nvmrc +1 -0
- package/LICENSE +3 -0
- package/README.md +281 -0
- package/bitbucket-pipelines.yml +33 -0
- package/build/bin/bin-helper.js +29 -0
- package/build/bin/npm-postinstall.js +9 -0
- package/build/configs/append-sourcemapping.js +13 -0
- package/build/configs/availabletasks.js +15 -0
- package/build/configs/clean.js +12 -0
- package/build/configs/concat.js +44 -0
- package/build/configs/copy.js +32 -0
- package/build/configs/index.js +19 -0
- package/build/configs/jshint.js +9 -0
- package/build/configs/karma.js +11 -0
- package/build/configs/replace.js +10 -0
- package/build/configs/requirejs.js +187 -0
- package/build/configs/saucelabs-launchers.js +30 -0
- package/build/configs/shell.js +24 -0
- package/build/configs/uglify.js +15 -0
- package/build/configs/watch.js +45 -0
- package/build/end.frag +13 -0
- package/build/start.frag +18 -0
- package/bundlesize.config.json +14 -0
- package/dist/connect-host.css +225 -0
- package/dist/connect-host.js +13908 -0
- package/dist/connect-host.min.css +1 -0
- package/dist/iframe-fedramp.js +13663 -0
- package/dist/iframe.js +13663 -0
- package/dist/legacy-text-colors.css +245 -0
- package/dist/surfaces.css +11 -0
- package/dist/themes/atlaskit-tokens_dark-future.css +6 -0
- package/dist/themes/atlaskit-tokens_dark.css +394 -0
- package/dist/themes/atlaskit-tokens_legacy-dark.css +394 -0
- package/dist/themes/atlaskit-tokens_legacy-light.css +394 -0
- package/dist/themes/atlaskit-tokens_light-future.css +6 -0
- package/dist/themes/atlaskit-tokens_light.css +394 -0
- package/dist/themes/atlaskit-tokens_shape.css +14 -0
- package/dist/themes/atlaskit-tokens_spacing.css +26 -0
- package/dist/themes/atlaskit-tokens_typography-adg3.css +25 -0
- package/dist/themes/atlaskit-tokens_typography-modernized.css +25 -0
- package/dist/themes/atlaskit-tokens_typography-refreshed.css +25 -0
- package/gulpfile.js +204 -0
- package/memleak-check/app.html +10 -0
- package/memleak-check/index.html +31 -0
- package/memleak-check/index.js +33 -0
- package/package.json +102 -0
- package/renovate.json +11 -0
- package/security-assistant.yml +2 -0
- package/spec/.eslintrc +10 -0
- package/spec/config/karma.base.conf.js +200 -0
- package/spec/config/karma.conf.js +20 -0
- package/spec/fixtures/base_dialog_component_tests.js +180 -0
- package/spec/mocks/mock_feature_flag.js +23 -0
- package/spec/tests/amd_spec.js +122 -0
- package/spec/tests/analytics_dispatcher_spec.js +429 -0
- package/spec/tests/analytics_performance_spec.js +41 -0
- package/spec/tests/button_spec.js +143 -0
- package/spec/tests/dialog_extension_spec.js +59 -0
- package/spec/tests/dialog_module_provider_spec.js +499 -0
- package/spec/tests/dialog_module_spec.js +395 -0
- package/spec/tests/dialog_spec.js +296 -0
- package/spec/tests/dialog_webitem_spec.js +183 -0
- package/spec/tests/dropdown_module_spec.js +77 -0
- package/spec/tests/env_module_spec.js +153 -0
- package/spec/tests/events_spec.js +77 -0
- package/spec/tests/extension_configuration_options_store_spec.js +25 -0
- package/spec/tests/flag_module_provider_spec.js +79 -0
- package/spec/tests/flag_module_spec.js +118 -0
- package/spec/tests/flag_spec.js +243 -0
- package/spec/tests/host-api_spec.js +220 -0
- package/spec/tests/iframe-create_spec.js +43 -0
- package/spec/tests/iframe_container_spec.js +19 -0
- package/spec/tests/iframe_spec.js +265 -0
- package/spec/tests/inline_dialog_spec.js +41 -0
- package/spec/tests/inline_dialog_webitem_spec.js +331 -0
- package/spec/tests/loading_indicator_spec.js +48 -0
- package/spec/tests/messages_module_spec.js +108 -0
- package/spec/tests/meta_spec.js +71 -0
- package/spec/tests/module_args_spec.js +52 -0
- package/spec/tests/observe_spec.js +73 -0
- package/spec/tests/public_events.spec.js +102 -0
- package/spec/tests/scroll_position_spec.js +109 -0
- package/spec/tests/theming_spec.js +594 -0
- package/spec/tests/util_spec.js +55 -0
- package/spec/tests/utils/base64_spec.js +20 -0
- package/spec/tests/utils/button_spec.js +11 -0
- package/spec/tests/utils/cookie_spec.js +19 -0
- package/spec/tests/utils/deprecate_spec.js +22 -0
- package/spec/tests/utils/dialog_spec.js +297 -0
- package/spec/tests/utils/host_util_spec.js +45 -0
- package/spec/tests/utils/iframe_spec.js +41 -0
- package/spec/tests/utils/jwt_spec.js +135 -0
- package/spec/tests/utils/url_spec.js +37 -0
- package/spec/tests/utils/waitUntilReadyNextTick.js +5 -0
- package/spec/tests/utils/webitem.js +219 -0
- package/spec/tests/webitem_spec.js +131 -0
- package/src/css/host/dialog.css +144 -0
- package/src/css/host/flags.css +5 -0
- package/src/css/host/host.css +64 -0
- package/src/css/host/messages.css +12 -0
- package/src/css/plugin/legacy-text-colors.less +55 -0
- package/src/css/plugin/surfaces.css +11 -0
- package/src/host/ACJSFrameworkAdaptor.js +44 -0
- package/src/host/actions/analytics_action.js +35 -0
- package/src/host/actions/button_actions.js +21 -0
- package/src/host/actions/dialog_actions.js +27 -0
- package/src/host/actions/dialog_extension_actions.js +25 -0
- package/src/host/actions/dom_event_actions.js +32 -0
- package/src/host/actions/dropdown_actions.js +12 -0
- package/src/host/actions/env_actions.js +57 -0
- package/src/host/actions/event_actions.js +33 -0
- package/src/host/actions/flag_actions.js +22 -0
- package/src/host/actions/iframe_actions.js +27 -0
- package/src/host/actions/inline_dialog_actions.js +26 -0
- package/src/host/actions/inline_dialog_webitem_actions.js +10 -0
- package/src/host/actions/jwt_actions.js +51 -0
- package/src/host/actions/loading_indicator_actions.js +10 -0
- package/src/host/actions/module_actions.js +14 -0
- package/src/host/actions/webitem_actions.js +29 -0
- package/src/host/components/button.js +112 -0
- package/src/host/components/dialog.js +447 -0
- package/src/host/components/dialog_extension.js +106 -0
- package/src/host/components/dialog_webitem.js +69 -0
- package/src/host/components/flag.js +102 -0
- package/src/host/components/iframe.js +130 -0
- package/src/host/components/iframe_container.js +38 -0
- package/src/host/components/inline_dialog.js +108 -0
- package/src/host/components/inline_dialog_webitem.js +157 -0
- package/src/host/components/loading_indicator.js +110 -0
- package/src/host/components/webitem.js +227 -0
- package/src/host/deprecate.js +20 -0
- package/src/host/dispatchers/analytics_dispatcher.js +512 -0
- package/src/host/dispatchers/event_dispatcher.js +46 -0
- package/src/host/dollar.js +8 -0
- package/src/host/host-api.js +325 -0
- package/src/host/iframe-create.js +7 -0
- package/src/host/index.js +108 -0
- package/src/host/module-providers.js +13 -0
- package/src/host/modules/_featureFlag.js +42 -0
- package/src/host/modules/_performance.js +54 -0
- package/src/host/modules/analytics.js +17 -0
- package/src/host/modules/dialog.js +496 -0
- package/src/host/modules/dropdown.js +255 -0
- package/src/host/modules/env.js +156 -0
- package/src/host/modules/events.js +28 -0
- package/src/host/modules/flag.js +170 -0
- package/src/host/modules/host.js +19 -0
- package/src/host/modules/inline-dialog.js +33 -0
- package/src/host/modules/messages.js +309 -0
- package/src/host/modules/page.js +29 -0
- package/src/host/modules/scroll-position.js +102 -0
- package/src/host/modules/theming.js +114 -0
- package/src/host/stores/extension_configuration_options_store.js +24 -0
- package/src/host/util.js +98 -0
- package/src/host/utils/access-narrowing-context.js +18 -0
- package/src/host/utils/base64.js +22 -0
- package/src/host/utils/button.js +10 -0
- package/src/host/utils/cookie.js +14 -0
- package/src/host/utils/dialog.js +239 -0
- package/src/host/utils/feature-flag.js +27 -0
- package/src/host/utils/iframe.js +23 -0
- package/src/host/utils/jwt.js +60 -0
- package/src/host/utils/observe.js +34 -0
- package/src/host/utils/removal-observer.js +30 -0
- package/src/host/utils/simplexdm.js +58 -0
- package/src/host/utils/url.js +23 -0
- package/src/host/utils/webitem.js +214 -0
- package/src/plugin/amd.js +115 -0
- package/src/plugin/analytics.js +84 -0
- package/src/plugin/deprecate.js +16 -0
- package/src/plugin/dialog.js +197 -0
- package/src/plugin/dollar.js +77 -0
- package/src/plugin/events-instance.js +2 -0
- package/src/plugin/events.js +246 -0
- package/src/plugin/extension_configuration_options_store.js +27 -0
- package/src/plugin/featureFlag.js +8 -0
- package/src/plugin/index.js +118 -0
- package/src/plugin/meta.js +14 -0
- package/src/plugin/public-events.js +73 -0
- package/src/plugin/theming.js +211 -0
- package/src/plugin/util.js +104 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import MessagesModule from 'src/host/modules/messages';
|
|
2
|
+
import _ from 'lodash';
|
|
3
|
+
|
|
4
|
+
describe('messages module', () => {
|
|
5
|
+
var msgCallback = function () { };
|
|
6
|
+
msgCallback._id = 'abc123';
|
|
7
|
+
msgCallback._context = {
|
|
8
|
+
extension: {}
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
$('.aui-message').remove();
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
describe('constructor', () => {
|
|
16
|
+
it('creates a generic flag', () => {
|
|
17
|
+
var testTitle = 'some test title';
|
|
18
|
+
var testBody = 'some test body';
|
|
19
|
+
MessagesModule.generic.constructor(testTitle, testBody, {}, msgCallback);
|
|
20
|
+
expect($('.aui-message-generic').length).toEqual(1);
|
|
21
|
+
expect(_.includes($('.aui-message-generic').first().text(), testTitle)).toBe(true);
|
|
22
|
+
expect(_.includes($('.aui-message-generic').first().text(), testBody)).toBe(true);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it('creates a error flag', () => {
|
|
26
|
+
var testTitle = 'some test title';
|
|
27
|
+
var testBody = 'some test body';
|
|
28
|
+
MessagesModule.error.constructor(testTitle, testBody, {}, msgCallback);
|
|
29
|
+
expect($('.aui-message-error').length).toEqual(1);
|
|
30
|
+
expect(_.includes($('.aui-message-error').first().text(), testTitle)).toBe(true);
|
|
31
|
+
expect(_.includes($('.aui-message-error').first().text(), testBody)).toBe(true);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('creates a warning flag', () => {
|
|
35
|
+
var testTitle = 'some test title';
|
|
36
|
+
var testBody = 'some test body';
|
|
37
|
+
MessagesModule.warning.constructor(testTitle, testBody, {}, msgCallback);
|
|
38
|
+
expect($('.aui-message-warning').length).toEqual(1);
|
|
39
|
+
expect(_.includes($('.aui-message-warning').first().text(), testTitle)).toBe(true);
|
|
40
|
+
expect(_.includes($('.aui-message-warning').first().text(), testBody)).toBe(true);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('creates a success flag', () => {
|
|
44
|
+
var testTitle = 'some test title';
|
|
45
|
+
var testBody = 'some test body';
|
|
46
|
+
MessagesModule.success.constructor(testTitle, testBody, {}, msgCallback);
|
|
47
|
+
expect($('.aui-message-success').length).toEqual(1);
|
|
48
|
+
expect(_.includes($('.aui-message-success').first().text(), testTitle)).toBe(true);
|
|
49
|
+
expect(_.includes($('.aui-message-success').first().text(), testBody)).toBe(true);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it('creates a info flag', () => {
|
|
53
|
+
var testTitle = 'some test title';
|
|
54
|
+
var testBody = 'some test body';
|
|
55
|
+
MessagesModule.info.constructor(testTitle, testBody, {}, msgCallback);
|
|
56
|
+
expect($('.aui-message-info').length).toEqual(1);
|
|
57
|
+
expect(_.includes($('.aui-message-info').first().text(), testTitle)).toBe(true);
|
|
58
|
+
expect(_.includes($('.aui-message-info').first().text(), testBody)).toBe(true);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it('creates a hint flag', () => {
|
|
62
|
+
var testTitle = 'some test title';
|
|
63
|
+
var testBody = 'some test body';
|
|
64
|
+
MessagesModule.hint.constructor(testTitle, testBody, {}, msgCallback);
|
|
65
|
+
expect($('.aui-message-hint').length).toEqual(1);
|
|
66
|
+
expect(_.includes($('.aui-message-hint').first().text(), testTitle)).toBe(true);
|
|
67
|
+
expect(_.includes($('.aui-message-hint').first().text(), testBody)).toBe(true);
|
|
68
|
+
expect($('.aui-message-hint').first().attr('id')).toEqual(`ap-message-${msgCallback._id}`);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
describe('clear', () => {
|
|
73
|
+
it('closes the message', () => {
|
|
74
|
+
MessagesModule.info.constructor('testTitle', 'testBody', {}, msgCallback);
|
|
75
|
+
try {
|
|
76
|
+
MessagesModule.clear({ _id: msgCallback._id });
|
|
77
|
+
} catch (e) {
|
|
78
|
+
// this is needed because _destroy will not be available
|
|
79
|
+
}
|
|
80
|
+
expect($('.aui-message').length).toEqual(0);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it('does not close the message if not the correct id', () => {
|
|
84
|
+
MessagesModule.info.constructor('testTitle', 'testBody', {}, msgCallback);
|
|
85
|
+
try {
|
|
86
|
+
MessagesModule.clear({ _id: 'not the right one' });
|
|
87
|
+
} catch (e) {
|
|
88
|
+
// this is needed because _destroy will not be available
|
|
89
|
+
}
|
|
90
|
+
expect($('.aui-message').length).toEqual(1);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
describe('onClose', () => {
|
|
95
|
+
it('calls the callback when message closes', () => {
|
|
96
|
+
MessagesModule.info.constructor('testTitle', 'testBody', {}, msgCallback);
|
|
97
|
+
var callbackSpy = jasmine.createSpy('callback');
|
|
98
|
+
MessagesModule.onClose({ _id: msgCallback._id }, callbackSpy);
|
|
99
|
+
try {
|
|
100
|
+
MessagesModule.clear({ _id: msgCallback._id });
|
|
101
|
+
} catch (e) {
|
|
102
|
+
// this is needed because _destroy will not be available
|
|
103
|
+
}
|
|
104
|
+
expect(callbackSpy).toHaveBeenCalled();
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
});
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import Meta from 'src/plugin/meta';
|
|
2
|
+
|
|
3
|
+
describe('meta', () => {
|
|
4
|
+
beforeEach(()=> {
|
|
5
|
+
var apMetaTag = document.createElement('meta');
|
|
6
|
+
var otherMetaTag = document.createElement('meta');
|
|
7
|
+
var contentlessMetaTag = document.createElement('meta');
|
|
8
|
+
apMetaTag.setAttribute('name', 'ap-test-meta');
|
|
9
|
+
apMetaTag.setAttribute('content', 'some content');
|
|
10
|
+
otherMetaTag.setAttribute('name', 'other-meta');
|
|
11
|
+
otherMetaTag.setAttribute('content', 'some other content');
|
|
12
|
+
contentlessMetaTag.setAttribute('name', 'ap-contentless-meta');
|
|
13
|
+
document.head.appendChild(apMetaTag);
|
|
14
|
+
document.head.appendChild(otherMetaTag);
|
|
15
|
+
document.head.appendChild(contentlessMetaTag);
|
|
16
|
+
});
|
|
17
|
+
describe('getMeta', () => {
|
|
18
|
+
it('should return content of existing meta tags', () => {
|
|
19
|
+
expect(Meta.getMeta('test-meta')).toEqual('some content');
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it('should return undefined for non-existent meta tags', () => {
|
|
23
|
+
expect(Meta.getMeta('non-existent')).not.toBeDefined();
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('should only get meta tags that are prefixed with ap', () => {
|
|
27
|
+
expect(Meta.getMeta('other-meta')).not.toBeDefined();
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it('should return null when content of meta tag is not defined', () => {
|
|
31
|
+
expect(Meta.getMeta('contentless-meta')).toBeNull();
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
describe('localUrl', () => {
|
|
36
|
+
beforeEach(() => {
|
|
37
|
+
var localUrlMetaTag = document.createElement('meta');
|
|
38
|
+
localUrlMetaTag.id = 'localUrlMetaTag';
|
|
39
|
+
localUrlMetaTag.setAttribute('name', 'ap-local-base-url');
|
|
40
|
+
localUrlMetaTag.setAttribute('content', 'https://connect.atlassian.com');
|
|
41
|
+
document.body.appendChild(localUrlMetaTag);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
afterEach(() => {
|
|
45
|
+
var el = document.getElementById('localUrlMetaTag');
|
|
46
|
+
if (el) {
|
|
47
|
+
el.parentNode.removeChild(el);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it('gets the correct local base url', () => {
|
|
52
|
+
expect(Meta.localUrl()).toEqual('https://connect.atlassian.com');
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('gets the correct local base url appended with the path', () => {
|
|
56
|
+
expect(Meta.localUrl('/some-path')).toEqual('https://connect.atlassian.com/some-path');
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('returns undefined when local base url meta tag does not exist', () => {
|
|
60
|
+
var el = document.getElementById('localUrlMetaTag');
|
|
61
|
+
el.parentNode.removeChild(el);
|
|
62
|
+
expect(Meta.localUrl()).not.toBeDefined();
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('returns undefined when local base url meta tag does not exist (with path)', () => {
|
|
66
|
+
var el = document.getElementById('localUrlMetaTag');
|
|
67
|
+
el.parentNode.removeChild(el);
|
|
68
|
+
expect(Meta.localUrl('some-path')).not.toBeDefined();
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
});
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import messages from 'src/host/modules/messages';
|
|
2
|
+
import analytics from 'src/host/modules/analytics';
|
|
3
|
+
import events from 'src/host/modules/events';
|
|
4
|
+
import flag from 'src/host/modules/flag';
|
|
5
|
+
import scrollPosition from 'src/host/modules/scroll-position';
|
|
6
|
+
|
|
7
|
+
var modules = {
|
|
8
|
+
'messages': messages,
|
|
9
|
+
'analytics': analytics,
|
|
10
|
+
'events': events,
|
|
11
|
+
'flag': flag,
|
|
12
|
+
'scroll-position': scrollPosition
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
describe('Module methods with variable args', () => {
|
|
16
|
+
Object.getOwnPropertyNames(modules).forEach((moduleName) => {
|
|
17
|
+
describe(moduleName + ' module', () => {
|
|
18
|
+
Object.getOwnPropertyNames(modules[moduleName]).forEach((methodName) => {
|
|
19
|
+
it(methodName + ' should work', () => {
|
|
20
|
+
var fn = modules[moduleName][methodName];
|
|
21
|
+
var isClass = false;
|
|
22
|
+
// class proxy
|
|
23
|
+
if(typeof fn === 'object') {
|
|
24
|
+
fn = fn.constructor;
|
|
25
|
+
isClass = true;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
var fakeCallback = jasmine.createSpy('spy');
|
|
29
|
+
fakeCallback._id = 'abc123';
|
|
30
|
+
fakeCallback._context = {
|
|
31
|
+
extension: {}
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
// -1 because last arg is always callback
|
|
35
|
+
for(var i=0; i<fn.length-1; i++) {
|
|
36
|
+
var args = [];
|
|
37
|
+
args = (i > 0) ? args.concat(new Array(i)) : args;
|
|
38
|
+
args.push(fakeCallback);
|
|
39
|
+
expect(function(){
|
|
40
|
+
if(isClass) {
|
|
41
|
+
new modules[moduleName][methodName].constructor(...args);
|
|
42
|
+
} else {
|
|
43
|
+
fn.apply(null, args);
|
|
44
|
+
}
|
|
45
|
+
}).not.toThrow();
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
}, this);
|
|
51
|
+
|
|
52
|
+
});
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import observe from 'src/host/utils/observe';
|
|
2
|
+
|
|
3
|
+
describe('observe', () => {
|
|
4
|
+
it('fires for visible iframe', (done) => {
|
|
5
|
+
const spy = jasmine.createSpy('observed');
|
|
6
|
+
const iframe = document.createElement('iframe');
|
|
7
|
+
document.body.appendChild(iframe);
|
|
8
|
+
observe(iframe, spy);
|
|
9
|
+
setTimeout(() => {
|
|
10
|
+
expect(spy).toHaveBeenCalled();
|
|
11
|
+
document.body.removeChild(iframe);
|
|
12
|
+
done();
|
|
13
|
+
}, 1000);
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it('fires when iframe scrolls into view', (done) => {
|
|
17
|
+
const spy = jasmine.createSpy('observed');
|
|
18
|
+
const iframe = document.createElement('iframe');
|
|
19
|
+
iframe.style.position = 'absolute';
|
|
20
|
+
iframe.style.top = '100%';
|
|
21
|
+
document.body.appendChild(iframe);
|
|
22
|
+
observe(iframe, spy);
|
|
23
|
+
setTimeout(() => {
|
|
24
|
+
expect(spy).not.toHaveBeenCalled();
|
|
25
|
+
iframe.scrollIntoView();
|
|
26
|
+
setTimeout(() => {
|
|
27
|
+
expect(spy).toHaveBeenCalled();
|
|
28
|
+
document.body.removeChild(iframe);
|
|
29
|
+
done();
|
|
30
|
+
}, 1000);
|
|
31
|
+
}, 1000);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('fires when iframe becomes visible', (done) => {
|
|
35
|
+
const spy = jasmine.createSpy('observed');
|
|
36
|
+
const iframe = document.createElement('iframe');
|
|
37
|
+
iframe.style.display = 'none';
|
|
38
|
+
document.body.appendChild(iframe);
|
|
39
|
+
observe(iframe, spy);
|
|
40
|
+
setTimeout(() => {
|
|
41
|
+
expect(spy).not.toHaveBeenCalled();
|
|
42
|
+
iframe.style.display = 'block';
|
|
43
|
+
setTimeout(() => {
|
|
44
|
+
expect(spy).toHaveBeenCalled();
|
|
45
|
+
document.body.removeChild(iframe);
|
|
46
|
+
done();
|
|
47
|
+
}, 1000);
|
|
48
|
+
}, 1000);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it('doesn\'t fire for invisible iframe', (done) => {
|
|
52
|
+
const spy = jasmine.createSpy('observed');
|
|
53
|
+
const iframe = document.createElement('iframe');
|
|
54
|
+
iframe.style.display = 'none';
|
|
55
|
+
document.body.appendChild(iframe);
|
|
56
|
+
observe(iframe, spy);
|
|
57
|
+
setTimeout(() => {
|
|
58
|
+
expect(spy).not.toHaveBeenCalled();
|
|
59
|
+
document.body.removeChild(iframe);
|
|
60
|
+
done();
|
|
61
|
+
}, 1000);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it('doesn\'t fire for detached iframe', (done) => {
|
|
65
|
+
const spy = jasmine.createSpy('observed');
|
|
66
|
+
const iframe = document.createElement('iframe');
|
|
67
|
+
observe(iframe, spy);
|
|
68
|
+
setTimeout(() => {
|
|
69
|
+
expect(spy).not.toHaveBeenCalled();
|
|
70
|
+
done();
|
|
71
|
+
}, 1000);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import AP from 'simple-xdm/plugin';
|
|
2
|
+
AP._data.origin = '*'; // prevent AP._registerOnUnload() from failing
|
|
3
|
+
|
|
4
|
+
import events from 'src/plugin/public-events';
|
|
5
|
+
|
|
6
|
+
describe('Public plugin events shim', function(){
|
|
7
|
+
beforeEach(function(){
|
|
8
|
+
events._events = {};
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
it('on binds an event', function(){
|
|
12
|
+
var spy = jasmine.createSpy('spy');
|
|
13
|
+
events.on('something', spy);
|
|
14
|
+
expect(events._events['something'].length).toEqual(1);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('on accepts a filter', function(){
|
|
18
|
+
var spy = jasmine.createSpy('spy');
|
|
19
|
+
events.on('something', spy, {addonKey: 'abc'});
|
|
20
|
+
events._events['something'][0].call({}, {
|
|
21
|
+
sender: {
|
|
22
|
+
addonKey: 'abc'
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
expect(spy).toHaveBeenCalled();
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('on is not called if filter doesnt match', function(){
|
|
29
|
+
var spy = jasmine.createSpy('spy');
|
|
30
|
+
events.on('something', spy, {addonKey: 'abc'});
|
|
31
|
+
events._events['something'][0].call({}, {
|
|
32
|
+
sender: {
|
|
33
|
+
addonKey: 'zxt'
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
expect(spy).not.toHaveBeenCalled();
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
it('on is not called if filter function doesnt match', function(){
|
|
41
|
+
var spy = jasmine.createSpy('spy');
|
|
42
|
+
events.on('something', spy, function(){
|
|
43
|
+
return false;
|
|
44
|
+
});
|
|
45
|
+
events._events['something'][0].call({}, {
|
|
46
|
+
sender: {
|
|
47
|
+
addonKey: ''
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
expect(spy).not.toHaveBeenCalled();
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
it('on is called if filter function matches', function(){
|
|
55
|
+
var spy = jasmine.createSpy('spy');
|
|
56
|
+
events.on('something', spy, function(){
|
|
57
|
+
return true;
|
|
58
|
+
});
|
|
59
|
+
events._events['something'][0].call({}, {
|
|
60
|
+
sender: {
|
|
61
|
+
addonKey: ''
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
expect(spy).toHaveBeenCalled();
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it('off unbinds an event', function(){
|
|
68
|
+
var spy = jasmine.createSpy('spy');
|
|
69
|
+
events.on('something', spy);
|
|
70
|
+
events.off('something', spy);
|
|
71
|
+
expect(events._events['something']).toEqual(undefined);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it('once only emits the event once', function(){
|
|
75
|
+
var spy = jasmine.createSpy('spy');
|
|
76
|
+
var eventName = 'zxy';
|
|
77
|
+
expect(events._events[eventName]).toEqual(undefined);
|
|
78
|
+
events.once(eventName, spy, {});
|
|
79
|
+
expect(events._events[eventName].length).toEqual(1);
|
|
80
|
+
events._events[eventName][0].apply(null, [{sender: {}}]);
|
|
81
|
+
expect(events._events[eventName]).toEqual(undefined);
|
|
82
|
+
expect(spy).toHaveBeenCalled();
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it('onAny binds on to any trigger', function(){
|
|
86
|
+
var spy = jasmine.createSpy('spy');
|
|
87
|
+
expect(events._events[events.ANY_PREFIX]).toEqual(undefined);
|
|
88
|
+
events.onAny(spy);
|
|
89
|
+
expect(events._events[events.ANY_PREFIX].length).toEqual(1);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
it('offAll unbinds all events with the specified name', function(){
|
|
93
|
+
var eventName = 'abc123';
|
|
94
|
+
expect(events._events[eventName]).toEqual(undefined);
|
|
95
|
+
events.on(eventName, jasmine.createSpy('spy'));
|
|
96
|
+
events.on(eventName, jasmine.createSpy('spy'));
|
|
97
|
+
expect(events._events[eventName].length).toEqual(2);
|
|
98
|
+
events.offAll(eventName);
|
|
99
|
+
expect(events._events[eventName]).toEqual(undefined);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
});
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import ScrollPosition from 'src/host/modules/scroll-position';
|
|
2
|
+
import EventDispatcher from 'src/host/dispatchers/event_dispatcher';
|
|
3
|
+
|
|
4
|
+
describe('scroll position', () => {
|
|
5
|
+
beforeEach(() => {
|
|
6
|
+
window.document.body.style.overflow = 'visible';
|
|
7
|
+
$('iframe').remove();
|
|
8
|
+
});
|
|
9
|
+
afterEach(() => {
|
|
10
|
+
$('iframe').remove();
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it('gets the scroll position of parent page', (done) => {
|
|
14
|
+
var elementId = Math.random().toString(36).substring(2, 8);
|
|
15
|
+
var callback = function (position) {
|
|
16
|
+
expect(position).toEqual({
|
|
17
|
+
scrollY: 2400,
|
|
18
|
+
scrollX: -100,
|
|
19
|
+
width: window.innerWidth,
|
|
20
|
+
height: window.innerHeight
|
|
21
|
+
});
|
|
22
|
+
done();
|
|
23
|
+
};
|
|
24
|
+
callback._context = {
|
|
25
|
+
extension: {
|
|
26
|
+
options: {
|
|
27
|
+
isFullPage: true
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
extension_id: elementId
|
|
31
|
+
};
|
|
32
|
+
$('<iframe>').attr({id: elementId}).appendTo('body');
|
|
33
|
+
$('body').css({
|
|
34
|
+
height: 5000,
|
|
35
|
+
margin: 100
|
|
36
|
+
});
|
|
37
|
+
window.scrollTo(0, 2500);
|
|
38
|
+
ScrollPosition.getPosition(callback);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('sets the scroll position of the page', (done) => {
|
|
42
|
+
var elementId = Math.random().toString(36).substring(2, 8);
|
|
43
|
+
var $window = $(window);
|
|
44
|
+
var scrollPosition = 10;
|
|
45
|
+
var callback = function (position) {
|
|
46
|
+
expect(position.scrollY).toEqual($window.scrollTop() - $(document.getElementById(elementId)).offset().top);
|
|
47
|
+
done();
|
|
48
|
+
};
|
|
49
|
+
callback._context = {
|
|
50
|
+
extension: {
|
|
51
|
+
options: {
|
|
52
|
+
isFullPage: true
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
extension_id: elementId
|
|
56
|
+
};
|
|
57
|
+
$('<iframe>').attr({id: elementId}).css({
|
|
58
|
+
width: '300px',
|
|
59
|
+
height: '5000px'
|
|
60
|
+
}).appendTo('body');
|
|
61
|
+
window.scrollTo(0, 0);
|
|
62
|
+
ScrollPosition.setVerticalPosition(scrollPosition, callback);
|
|
63
|
+
ScrollPosition.getPosition(callback);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it('scroll.nearTop is triggered when scrolling near the top', (done) => {
|
|
67
|
+
var extension = {
|
|
68
|
+
options: {isFullPage: true},
|
|
69
|
+
id: 'abc123',
|
|
70
|
+
addon_key: 'some-addon-key',
|
|
71
|
+
key: 'some-module-key'
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
EventDispatcher.registerOnce('event-dispatch', (data) => {
|
|
75
|
+
expect(data.type).toEqual('scroll.nearTop');
|
|
76
|
+
expect(data.targetSpec).toEqual({id: extension.id});
|
|
77
|
+
expect(data.event).toEqual({});
|
|
78
|
+
done();
|
|
79
|
+
});
|
|
80
|
+
EventDispatcher.dispatch('iframe-bridge-established', {
|
|
81
|
+
extension: extension
|
|
82
|
+
});
|
|
83
|
+
window.scrollTo(0,2);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it('scroll.nearBottom is triggered when scrolling near the bottom', (done) => {
|
|
87
|
+
var extension = {
|
|
88
|
+
options: {isFullPage: true},
|
|
89
|
+
id: 'abc123',
|
|
90
|
+
addon_key: 'some-addon-key',
|
|
91
|
+
key: 'some-module-key'
|
|
92
|
+
};
|
|
93
|
+
EventDispatcher.dispatch('iframe-bridge-established', {
|
|
94
|
+
extension: extension
|
|
95
|
+
});
|
|
96
|
+
window.scrollTo(0,2);
|
|
97
|
+
EventDispatcher.registerOnce('event-dispatch', (data) => {
|
|
98
|
+
expect(data.type).toEqual('scroll.nearBottom');
|
|
99
|
+
expect(data.targetSpec).toEqual({id: extension.id});
|
|
100
|
+
expect(data.event).toEqual({});
|
|
101
|
+
done();
|
|
102
|
+
});
|
|
103
|
+
window.scrollTo(0,100000);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
});
|