@king-design/vue 3.7.0 → 3.8.0-beta.0
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/__tests__/__snapshots__/Vue Next Demos.md +399 -0
- package/components/bubble/bubble.d.ts +61 -0
- package/components/bubble/bubble.js +81 -0
- package/components/bubble/bubble.vdt.js +85 -0
- package/components/bubble/index.d.ts +1 -0
- package/components/bubble/index.js +1 -0
- package/components/bubble/index.spec.d.ts +1 -0
- package/components/bubble/index.spec.js +771 -0
- package/components/bubble/styles.d.ts +5 -0
- package/components/bubble/styles.js +53 -0
- package/components/bubble/useBubbleDisplay.d.ts +18 -0
- package/components/bubble/useBubbleDisplay.js +300 -0
- package/components/bubbleList/bubbleList.d.ts +87 -0
- package/components/bubbleList/bubbleList.js +75 -0
- package/components/bubbleList/bubbleList.vdt.js +143 -0
- package/components/bubbleList/index.d.ts +1 -0
- package/components/bubbleList/index.js +1 -0
- package/components/bubbleList/index.spec.d.ts +1 -0
- package/components/bubbleList/index.spec.js +1268 -0
- package/components/bubbleList/item.d.ts +16 -0
- package/components/bubbleList/item.js +27 -0
- package/components/bubbleList/item.vdt.js +36 -0
- package/components/bubbleList/styles.d.ts +5 -0
- package/components/bubbleList/styles.js +33 -0
- package/components/bubbleList/useBubbleList.d.ts +28 -0
- package/components/bubbleList/useBubbleList.js +455 -0
- package/components/checkbox/index.d.ts +3 -3
- package/components/fileCard/fileCard.d.ts +65 -0
- package/components/fileCard/fileCard.js +72 -0
- package/components/fileCard/fileCard.vdt.js +161 -0
- package/components/fileCard/fileCardAssets.d.ts +1 -0
- package/components/fileCard/fileCardAssets.js +54 -0
- package/components/fileCard/fileCardUtils.d.ts +14 -0
- package/components/fileCard/fileCardUtils.js +94 -0
- package/components/fileCard/index.d.ts +2 -0
- package/components/fileCard/index.js +2 -0
- package/components/fileCard/index.spec.d.ts +1 -0
- package/components/fileCard/index.spec.js +1096 -0
- package/components/fileCard/list.d.ts +29 -0
- package/components/fileCard/list.js +46 -0
- package/components/fileCard/list.vdt.js +71 -0
- package/components/fileCard/styles.d.ts +5 -0
- package/components/fileCard/styles.js +83 -0
- package/components/fileCard/useFileCard.d.ts +45 -0
- package/components/fileCard/useFileCard.js +330 -0
- package/components/fileCard/useFileCardList.d.ts +14 -0
- package/components/fileCard/useFileCardList.js +49 -0
- package/components/form/form.js +2 -1
- package/components/media/context.d.ts +6 -0
- package/components/media/context.js +2 -0
- package/components/media/group.d.ts +12 -0
- package/components/media/group.js +32 -0
- package/components/media/group.vdt.js +50 -0
- package/components/media/index.d.ts +2 -0
- package/components/media/index.js +2 -0
- package/components/media/index.spec.d.ts +1 -0
- package/components/media/index.spec.js +1691 -0
- package/components/media/media.d.ts +37 -0
- package/components/media/media.js +67 -0
- package/components/media/media.vdt.js +202 -0
- package/components/media/mediaAssets.d.ts +4 -0
- package/components/media/mediaAssets.js +9 -0
- package/components/media/mediaUtils.d.ts +6 -0
- package/components/media/mediaUtils.js +66 -0
- package/components/media/styles.d.ts +13 -0
- package/components/media/styles.js +52 -0
- package/components/media/types.d.ts +37 -0
- package/components/media/types.js +1 -0
- package/components/media/useMedia.d.ts +70 -0
- package/components/media/useMedia.js +471 -0
- package/components/media/useMediaGroup.d.ts +15 -0
- package/components/media/useMediaGroup.js +136 -0
- package/components/media/useMediaViewer.d.ts +14 -0
- package/components/media/useMediaViewer.js +129 -0
- package/components/media/viewer.d.ts +24 -0
- package/components/media/viewer.js +54 -0
- package/components/media/viewer.vdt.js +100 -0
- package/components/radio/index.d.ts +3 -3
- package/components/sender/icons.d.ts +3 -0
- package/components/sender/icons.js +17 -0
- package/components/sender/index.d.ts +1 -0
- package/components/sender/index.js +1 -0
- package/components/sender/index.spec.d.ts +1 -0
- package/components/sender/index.spec.js +1597 -0
- package/components/sender/sender.d.ts +104 -0
- package/components/sender/sender.js +111 -0
- package/components/sender/sender.vdt.js +230 -0
- package/components/sender/styles.d.ts +5 -0
- package/components/sender/styles.js +56 -0
- package/components/sender/useAutoResize.d.ts +4 -0
- package/components/sender/useAutoResize.js +99 -0
- package/components/sender/useSenderDrag.d.ts +6 -0
- package/components/sender/useSenderDrag.js +320 -0
- package/components/sender/useSenderInput.d.ts +16 -0
- package/components/sender/useSenderInput.js +101 -0
- package/components/sender/useSenderPaste.d.ts +5 -0
- package/components/sender/useSenderPaste.js +36 -0
- package/components/sender/useSenderUpload.d.ts +11 -0
- package/components/sender/useSenderUpload.js +395 -0
- package/components/skeleton/skeleton.d.ts +2 -1
- package/components/skeleton/skeleton.js +1 -1
- package/components/think/index.d.ts +1 -0
- package/components/think/index.js +1 -0
- package/components/think/index.spec.d.ts +1 -0
- package/components/think/index.spec.js +345 -0
- package/components/think/index.vdt.js +82 -0
- package/components/think/styles.d.ts +5 -0
- package/components/think/styles.js +25 -0
- package/components/think/think.d.ts +28 -0
- package/components/think/think.js +48 -0
- package/components/think/useThinkExpand.d.ts +10 -0
- package/components/think/useThinkExpand.js +56 -0
- package/components/types.d.ts +4 -2
- package/components/upload/ajaxUploader.d.ts +1 -0
- package/components/upload/ajaxUploader.js +6 -0
- package/components/xmarkdown/index.d.ts +2 -0
- package/components/xmarkdown/index.js +1 -0
- package/components/xmarkdown/index.spec.d.ts +1 -0
- package/components/xmarkdown/index.spec.js +1666 -0
- package/components/xmarkdown/markdown/codeBlockRenderer.d.ts +8 -0
- package/components/xmarkdown/markdown/codeBlockRenderer.js +52 -0
- package/components/xmarkdown/markdown/codeblock.d.ts +8 -0
- package/components/xmarkdown/markdown/codeblock.js +74 -0
- package/components/xmarkdown/markdown/highlight.d.ts +17 -0
- package/components/xmarkdown/markdown/highlight.js +83 -0
- package/components/xmarkdown/markdown/index.d.ts +14 -0
- package/components/xmarkdown/markdown/index.js +14 -0
- package/components/xmarkdown/markdown/mermaid.d.ts +8 -0
- package/components/xmarkdown/markdown/mermaid.js +104 -0
- package/components/xmarkdown/markdown/renderTree.d.ts +54 -0
- package/components/xmarkdown/markdown/renderTree.js +386 -0
- package/components/xmarkdown/markdown/renderer.d.ts +18 -0
- package/components/xmarkdown/markdown/renderer.js +461 -0
- package/components/xmarkdown/markdown/streaming.d.ts +24 -0
- package/components/xmarkdown/markdown/streaming.js +513 -0
- package/components/xmarkdown/markdown/types.d.ts +124 -0
- package/components/xmarkdown/markdown/types.js +6 -0
- package/components/xmarkdown/markdown/utils.d.ts +7 -0
- package/components/xmarkdown/markdown/utils.js +9 -0
- package/components/xmarkdown/markdown.d.ts +1 -0
- package/components/xmarkdown/markdown.js +1 -0
- package/components/xmarkdown/styles.d.ts +5 -0
- package/components/xmarkdown/styles.js +50 -0
- package/components/xmarkdown/useMermaid.d.ts +27 -0
- package/components/xmarkdown/useMermaid.js +745 -0
- package/components/xmarkdown/useXMarkdownContent.d.ts +14 -0
- package/components/xmarkdown/useXMarkdownContent.js +218 -0
- package/components/xmarkdown/useXMarkdownDisplay.d.ts +26 -0
- package/components/xmarkdown/useXMarkdownDisplay.js +569 -0
- package/components/xmarkdown/xmarkdown.d.ts +61 -0
- package/components/xmarkdown/xmarkdown.js +109 -0
- package/components/xmarkdown/xmarkdown.vdt.js +43 -0
- package/dist/fonts/KaTeX_AMS-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_AMS-Regular.woff +0 -0
- package/dist/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
- package/dist/fonts/KaTeX_Fraktur-Bold.woff +0 -0
- package/dist/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
- package/dist/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Fraktur-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Main-Bold.ttf +0 -0
- package/dist/fonts/KaTeX_Main-Bold.woff +0 -0
- package/dist/fonts/KaTeX_Main-Bold.woff2 +0 -0
- package/dist/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
- package/dist/fonts/KaTeX_Main-BoldItalic.woff +0 -0
- package/dist/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
- package/dist/fonts/KaTeX_Main-Italic.ttf +0 -0
- package/dist/fonts/KaTeX_Main-Italic.woff +0 -0
- package/dist/fonts/KaTeX_Main-Italic.woff2 +0 -0
- package/dist/fonts/KaTeX_Main-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Main-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Main-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
- package/dist/fonts/KaTeX_Math-BoldItalic.woff +0 -0
- package/dist/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- package/dist/fonts/KaTeX_Math-Italic.ttf +0 -0
- package/dist/fonts/KaTeX_Math-Italic.woff +0 -0
- package/dist/fonts/KaTeX_Math-Italic.woff2 +0 -0
- package/dist/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
- package/dist/fonts/KaTeX_SansSerif-Bold.woff +0 -0
- package/dist/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
- package/dist/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
- package/dist/fonts/KaTeX_SansSerif-Italic.woff +0 -0
- package/dist/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
- package/dist/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_SansSerif-Regular.woff +0 -0
- package/dist/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Script-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Script-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Script-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Size1-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Size1-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Size2-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Size2-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Size3-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Size3-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Size4-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Size4-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Typewriter-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- package/dist/i18n/en-US.js +29 -1
- package/dist/i18n/en-US.js.map +1 -1
- package/dist/i18n/en-US.min.js +1 -1
- package/dist/index.js +100506 -37457
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1569 -1
- package/dist/kpc.css +4 -0
- package/dist/ksyun.css +4 -0
- package/i18n/en-US.d.ts +27 -0
- package/i18n/en-US.js +29 -1
- package/index.d.ts +9 -2
- package/index.js +9 -2
- package/package.json +8 -2
- package/styles/global.js +12 -6
- package/yarn-error.log +0 -1012
|
@@ -0,0 +1,1691 @@
|
|
|
1
|
+
import _inheritsLoose from "@babel/runtime-corejs3/helpers/inheritsLoose";
|
|
2
|
+
import _asyncToGenerator from "@babel/runtime-corejs3/helpers/asyncToGenerator";
|
|
3
|
+
import _regeneratorRuntime from "@babel/runtime-corejs3/regenerator";
|
|
4
|
+
import _Object$getOwnPropertyDescriptor from "@babel/runtime-corejs3/core-js/object/get-own-property-descriptor";
|
|
5
|
+
import _concatInstanceProperty from "@babel/runtime-corejs3/core-js/instance/concat";
|
|
6
|
+
import { Component } from 'intact-vue-next';
|
|
7
|
+
import { dispatchEvent, getElement, mount, unmount, wait } from '../../test/utils';
|
|
8
|
+
import { Media, MediaGroup } from '.';
|
|
9
|
+
describe('Media', function () {
|
|
10
|
+
afterEach(function () {
|
|
11
|
+
unmount();
|
|
12
|
+
});
|
|
13
|
+
function expectViewerClosed() {
|
|
14
|
+
var viewer = document.querySelector('.k-media-viewer');
|
|
15
|
+
if (!viewer) {
|
|
16
|
+
expect(viewer).to.eql(null);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
expect(viewer.classList.contains('k-fade-leave-active') || viewer.classList.contains('k-fade-leave-to')).to.be.true;
|
|
20
|
+
}
|
|
21
|
+
function dispatchMediaEvent(target, eventName) {
|
|
22
|
+
target.dispatchEvent(new Event(eventName, {
|
|
23
|
+
bubbles: false,
|
|
24
|
+
cancelable: true
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
27
|
+
function getViewerButton(selector) {
|
|
28
|
+
return getElement(selector);
|
|
29
|
+
}
|
|
30
|
+
function stubNativeGetter(prototype, key, value) {
|
|
31
|
+
var descriptor = _Object$getOwnPropertyDescriptor(prototype, key);
|
|
32
|
+
Object.defineProperty(prototype, key, {
|
|
33
|
+
configurable: true,
|
|
34
|
+
get: function get() {
|
|
35
|
+
return typeof value === 'function' ? value() : value;
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
return function () {
|
|
39
|
+
if (descriptor) {
|
|
40
|
+
Object.defineProperty(prototype, key, descriptor);
|
|
41
|
+
} else {
|
|
42
|
+
delete prototype[key];
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
// 覆盖图片、视频、音频三类基础缩略图。
|
|
47
|
+
it('should render image, video and audio thumbnails', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
|
|
48
|
+
var Demo, _mount, element;
|
|
49
|
+
return _regeneratorRuntime.wrap(function _callee$(_context2) {
|
|
50
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
51
|
+
case 0:
|
|
52
|
+
Demo = /*#__PURE__*/function (_Component) {
|
|
53
|
+
_inheritsLoose(Demo, _Component);
|
|
54
|
+
function Demo() {
|
|
55
|
+
var _context;
|
|
56
|
+
var _this;
|
|
57
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
58
|
+
args[_key] = arguments[_key];
|
|
59
|
+
}
|
|
60
|
+
_this = _Component.call.apply(_Component, _concatInstanceProperty(_context = [this]).call(_context, args)) || this;
|
|
61
|
+
_this.Media = Media;
|
|
62
|
+
return _this;
|
|
63
|
+
}
|
|
64
|
+
return Demo;
|
|
65
|
+
}(Component);
|
|
66
|
+
Demo.template = "\n const { Media } = this;\n <div>\n <Media type=\"image\" src=\"https://example.com/cover.png\" />\n <Media type=\"video\" src=\"https://example.com/demo.mp4\" />\n <Media type=\"audio\" src=\"https://example.com/demo.mp3\" />\n </div>\n ";
|
|
67
|
+
_mount = mount(Demo), element = _mount[1];
|
|
68
|
+
expect(element.querySelectorAll('.k-media').length).to.eql(3);
|
|
69
|
+
expect(element.querySelector('.k-media-image')).not.to.eql(null);
|
|
70
|
+
expect(element.querySelector('.k-media-video')).not.to.eql(null);
|
|
71
|
+
expect(element.querySelector('.k-media-audio-loader')).not.to.eql(null);
|
|
72
|
+
expect(element.querySelector('.k-media-audio-card')).not.to.eql(null);
|
|
73
|
+
expect(element.querySelector('.k-media-audio-card-icon').src).to.contain('data:image/svg+xml');
|
|
74
|
+
expect(element.querySelector('.k-media-audio-card-name')).to.eql(null);
|
|
75
|
+
expect(element.querySelectorAll('.k-media-loading').length).to.eql(3);
|
|
76
|
+
expect(element.querySelectorAll('.k-media-loading-indicator').length).to.eql(3);
|
|
77
|
+
expect(element.querySelectorAll('.k-media-loading-spinner').length).to.eql(3);
|
|
78
|
+
expect(element.querySelector('.k-media-status-layer')).to.eql(null);
|
|
79
|
+
case 14:
|
|
80
|
+
case "end":
|
|
81
|
+
return _context2.stop();
|
|
82
|
+
}
|
|
83
|
+
}, _callee);
|
|
84
|
+
})));
|
|
85
|
+
// 视频完成态展示居中的播放入口。
|
|
86
|
+
it('should show play trigger in the center of video thumbnail', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
|
|
87
|
+
var Demo, _mount2, element, video, trigger, icon, overlay;
|
|
88
|
+
return _regeneratorRuntime.wrap(function _callee2$(_context4) {
|
|
89
|
+
while (1) switch (_context4.prev = _context4.next) {
|
|
90
|
+
case 0:
|
|
91
|
+
Demo = /*#__PURE__*/function (_Component2) {
|
|
92
|
+
_inheritsLoose(Demo, _Component2);
|
|
93
|
+
function Demo() {
|
|
94
|
+
var _context3;
|
|
95
|
+
var _this2;
|
|
96
|
+
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
|
97
|
+
args[_key2] = arguments[_key2];
|
|
98
|
+
}
|
|
99
|
+
_this2 = _Component2.call.apply(_Component2, _concatInstanceProperty(_context3 = [this]).call(_context3, args)) || this;
|
|
100
|
+
_this2.Media = Media;
|
|
101
|
+
return _this2;
|
|
102
|
+
}
|
|
103
|
+
return Demo;
|
|
104
|
+
}(Component);
|
|
105
|
+
Demo.template = "\n const { Media } = this;\n <div>\n <Media\n type=\"video\"\n status=\"done\"\n src=\"https://example.com/demo.mp4\"\n poster=\"https://example.com/poster.png\"\n />\n </div>\n ";
|
|
106
|
+
_mount2 = mount(Demo), element = _mount2[1];
|
|
107
|
+
video = element.querySelector('video.k-media-video');
|
|
108
|
+
trigger = element.querySelector('.k-media-preview-trigger');
|
|
109
|
+
icon = trigger.querySelector('.k-media-preview-icon');
|
|
110
|
+
overlay = element.querySelector('.k-media-overlay');
|
|
111
|
+
expect(video).not.to.eql(null);
|
|
112
|
+
expect(video.preload).to.eql('metadata');
|
|
113
|
+
expect(trigger).not.to.eql(null);
|
|
114
|
+
expect(trigger.className).to.contain('k-media-video-preview-trigger');
|
|
115
|
+
expect(trigger.title).to.eql('播放视频');
|
|
116
|
+
expect(trigger.disabled).to.eql(false);
|
|
117
|
+
expect(icon.className).to.contain('ion-ios-play');
|
|
118
|
+
expect(overlay).not.to.eql(null);
|
|
119
|
+
expect(getComputedStyle(overlay).opacity).to.eql('0');
|
|
120
|
+
expect(getComputedStyle(overlay).backgroundColor).to.eql('rgba(15, 23, 42, 0.42)');
|
|
121
|
+
expect(getComputedStyle(trigger).position).to.eql('absolute');
|
|
122
|
+
case 18:
|
|
123
|
+
case "end":
|
|
124
|
+
return _context4.stop();
|
|
125
|
+
}
|
|
126
|
+
}, _callee2);
|
|
127
|
+
})));
|
|
128
|
+
// 无 poster 的视频需等首帧可用后才进入完成态,默认加载态仍展示播放标识。
|
|
129
|
+
it('should wait for video frame when poster is absent', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
|
|
130
|
+
var Demo, _mount3, element, media, video;
|
|
131
|
+
return _regeneratorRuntime.wrap(function _callee3$(_context6) {
|
|
132
|
+
while (1) switch (_context6.prev = _context6.next) {
|
|
133
|
+
case 0:
|
|
134
|
+
Demo = /*#__PURE__*/function (_Component3) {
|
|
135
|
+
_inheritsLoose(Demo, _Component3);
|
|
136
|
+
function Demo() {
|
|
137
|
+
var _context5;
|
|
138
|
+
var _this3;
|
|
139
|
+
for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
|
|
140
|
+
args[_key3] = arguments[_key3];
|
|
141
|
+
}
|
|
142
|
+
_this3 = _Component3.call.apply(_Component3, _concatInstanceProperty(_context5 = [this]).call(_context5, args)) || this;
|
|
143
|
+
_this3.Media = Media;
|
|
144
|
+
return _this3;
|
|
145
|
+
}
|
|
146
|
+
return Demo;
|
|
147
|
+
}(Component);
|
|
148
|
+
Demo.template = "\n const { Media } = this;\n <div>\n <Media\n className=\"video-media\"\n type=\"video\"\n src=\"https://example.com/demo.mp4\"\n />\n </div>\n ";
|
|
149
|
+
_mount3 = mount(Demo), element = _mount3[1];
|
|
150
|
+
media = element.querySelector('.video-media');
|
|
151
|
+
video = element.querySelector('video.k-media-video');
|
|
152
|
+
expect(video.preload).to.eql('auto');
|
|
153
|
+
expect(media.className).to.contain('k-media-loading');
|
|
154
|
+
expect(media.className).not.to.contain('k-media-previewable');
|
|
155
|
+
expect(media.querySelector('.k-media-overlay')).not.to.eql(null);
|
|
156
|
+
expect(media.querySelector('.k-media-preview-trigger').disabled).to.eql(true);
|
|
157
|
+
dispatchMediaEvent(video, 'loadedmetadata');
|
|
158
|
+
_context6.next = 13;
|
|
159
|
+
return wait();
|
|
160
|
+
case 13:
|
|
161
|
+
expect(media.className).to.contain('k-media-loading');
|
|
162
|
+
expect(media.className).not.to.contain('k-media-previewable');
|
|
163
|
+
expect(media.querySelector('.k-media-overlay')).not.to.eql(null);
|
|
164
|
+
expect(media.querySelector('.k-media-preview-trigger').disabled).to.eql(true);
|
|
165
|
+
dispatchMediaEvent(video, 'loadeddata');
|
|
166
|
+
_context6.next = 20;
|
|
167
|
+
return wait();
|
|
168
|
+
case 20:
|
|
169
|
+
expect(media.className).to.contain('k-media-done');
|
|
170
|
+
expect(media.className).to.contain('k-media-previewable');
|
|
171
|
+
expect(media.querySelector('.k-media-preview-trigger').disabled).to.eql(false);
|
|
172
|
+
case 23:
|
|
173
|
+
case "end":
|
|
174
|
+
return _context6.stop();
|
|
175
|
+
}
|
|
176
|
+
}, _callee3);
|
|
177
|
+
})));
|
|
178
|
+
// 有 poster 的视频在 metadata 可用后即可展示预览。
|
|
179
|
+
it('should complete video at metadata when poster is present', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4() {
|
|
180
|
+
var Demo, _mount4, element, media, video;
|
|
181
|
+
return _regeneratorRuntime.wrap(function _callee4$(_context8) {
|
|
182
|
+
while (1) switch (_context8.prev = _context8.next) {
|
|
183
|
+
case 0:
|
|
184
|
+
Demo = /*#__PURE__*/function (_Component4) {
|
|
185
|
+
_inheritsLoose(Demo, _Component4);
|
|
186
|
+
function Demo() {
|
|
187
|
+
var _context7;
|
|
188
|
+
var _this4;
|
|
189
|
+
for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
|
|
190
|
+
args[_key4] = arguments[_key4];
|
|
191
|
+
}
|
|
192
|
+
_this4 = _Component4.call.apply(_Component4, _concatInstanceProperty(_context7 = [this]).call(_context7, args)) || this;
|
|
193
|
+
_this4.Media = Media;
|
|
194
|
+
return _this4;
|
|
195
|
+
}
|
|
196
|
+
return Demo;
|
|
197
|
+
}(Component);
|
|
198
|
+
Demo.template = "\n const { Media } = this;\n <div>\n <Media\n className=\"video-media\"\n type=\"video\"\n src=\"https://example.com/demo.mp4\"\n poster=\"https://example.com/poster.png\"\n />\n </div>\n ";
|
|
199
|
+
_mount4 = mount(Demo), element = _mount4[1];
|
|
200
|
+
media = element.querySelector('.video-media');
|
|
201
|
+
video = element.querySelector('video.k-media-video');
|
|
202
|
+
expect(video.preload).to.eql('metadata');
|
|
203
|
+
dispatchMediaEvent(video, 'loadedmetadata');
|
|
204
|
+
_context8.next = 9;
|
|
205
|
+
return wait();
|
|
206
|
+
case 9:
|
|
207
|
+
expect(media.className).to.contain('k-media-done');
|
|
208
|
+
expect(media.querySelector('.k-media-preview-trigger')).not.to.eql(null);
|
|
209
|
+
case 11:
|
|
210
|
+
case "end":
|
|
211
|
+
return _context8.stop();
|
|
212
|
+
}
|
|
213
|
+
}, _callee4);
|
|
214
|
+
})));
|
|
215
|
+
// 顶层 src/poster 优先于原生 props 中的同名字段。
|
|
216
|
+
it('should keep media-level src and poster ahead of native props', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee5() {
|
|
217
|
+
var Demo, _mount5, element, media, video;
|
|
218
|
+
return _regeneratorRuntime.wrap(function _callee5$(_context10) {
|
|
219
|
+
while (1) switch (_context10.prev = _context10.next) {
|
|
220
|
+
case 0:
|
|
221
|
+
Demo = /*#__PURE__*/function (_Component5) {
|
|
222
|
+
_inheritsLoose(Demo, _Component5);
|
|
223
|
+
function Demo() {
|
|
224
|
+
var _context9;
|
|
225
|
+
var _this5;
|
|
226
|
+
for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
|
|
227
|
+
args[_key5] = arguments[_key5];
|
|
228
|
+
}
|
|
229
|
+
_this5 = _Component5.call.apply(_Component5, _concatInstanceProperty(_context9 = [this]).call(_context9, args)) || this;
|
|
230
|
+
_this5.Media = Media;
|
|
231
|
+
return _this5;
|
|
232
|
+
}
|
|
233
|
+
return Demo;
|
|
234
|
+
}(Component);
|
|
235
|
+
Demo.template = "\n const { Media } = this;\n <div>\n <Media\n className=\"video-media\"\n type=\"video\"\n src=\"https://example.com/demo.mp4\"\n videoProps={{\n src: 'https://example.com/native.mp4',\n poster: 'https://example.com/native-poster.png',\n controls: true,\n 'data-native': 'video',\n }}\n />\n </div>\n ";
|
|
236
|
+
_mount5 = mount(Demo), element = _mount5[1];
|
|
237
|
+
media = element.querySelector('.video-media');
|
|
238
|
+
video = element.querySelector('video.k-media-video');
|
|
239
|
+
expect(video.getAttribute('src')).to.eql('https://example.com/demo.mp4');
|
|
240
|
+
expect(video.getAttribute('poster')).to.eql(null);
|
|
241
|
+
expect(video.controls).to.eql(true);
|
|
242
|
+
expect(video.getAttribute('data-native')).to.eql('video');
|
|
243
|
+
expect(video.preload).to.eql('auto');
|
|
244
|
+
dispatchMediaEvent(video, 'loadedmetadata');
|
|
245
|
+
_context10.next = 13;
|
|
246
|
+
return wait();
|
|
247
|
+
case 13:
|
|
248
|
+
expect(media.className).to.contain('k-media-loading');
|
|
249
|
+
case 14:
|
|
250
|
+
case "end":
|
|
251
|
+
return _context10.stop();
|
|
252
|
+
}
|
|
253
|
+
}, _callee5);
|
|
254
|
+
})));
|
|
255
|
+
// src 变化时重建 video,避免热更新保留旧资源状态。
|
|
256
|
+
it('should remount video when src changes', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee6() {
|
|
257
|
+
var Demo, _mount6, instance, element, media, firstVideo, nextVideo;
|
|
258
|
+
return _regeneratorRuntime.wrap(function _callee6$(_context12) {
|
|
259
|
+
while (1) switch (_context12.prev = _context12.next) {
|
|
260
|
+
case 0:
|
|
261
|
+
Demo = /*#__PURE__*/function (_Component6) {
|
|
262
|
+
_inheritsLoose(Demo, _Component6);
|
|
263
|
+
function Demo() {
|
|
264
|
+
var _context11;
|
|
265
|
+
var _this6;
|
|
266
|
+
for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
|
|
267
|
+
args[_key6] = arguments[_key6];
|
|
268
|
+
}
|
|
269
|
+
_this6 = _Component6.call.apply(_Component6, _concatInstanceProperty(_context11 = [this]).call(_context11, args)) || this;
|
|
270
|
+
_this6.Media = Media;
|
|
271
|
+
return _this6;
|
|
272
|
+
}
|
|
273
|
+
Demo.defaults = function defaults() {
|
|
274
|
+
return {
|
|
275
|
+
src: 'https://example.com/demo.mp4'
|
|
276
|
+
};
|
|
277
|
+
};
|
|
278
|
+
return Demo;
|
|
279
|
+
}(Component);
|
|
280
|
+
Demo.template = "\n const { Media } = this;\n <div>\n <Media\n className=\"video-media\"\n type=\"video\"\n src={this.get('src')}\n />\n </div>\n ";
|
|
281
|
+
_mount6 = mount(Demo), instance = _mount6[0], element = _mount6[1];
|
|
282
|
+
media = element.querySelector('.video-media');
|
|
283
|
+
firstVideo = element.querySelector('video.k-media-video');
|
|
284
|
+
dispatchMediaEvent(firstVideo, 'loadeddata');
|
|
285
|
+
_context12.next = 8;
|
|
286
|
+
return wait();
|
|
287
|
+
case 8:
|
|
288
|
+
expect(media.className).to.contain('k-media-done');
|
|
289
|
+
instance.set('src', 'https://example.com/next.mp4');
|
|
290
|
+
_context12.next = 12;
|
|
291
|
+
return wait();
|
|
292
|
+
case 12:
|
|
293
|
+
nextVideo = element.querySelector('video.k-media-video');
|
|
294
|
+
expect(nextVideo).not.to.eql(firstVideo);
|
|
295
|
+
expect(nextVideo.getAttribute('src')).to.eql('https://example.com/next.mp4');
|
|
296
|
+
expect(media.className).to.contain('k-media-loading');
|
|
297
|
+
case 16:
|
|
298
|
+
case "end":
|
|
299
|
+
return _context12.stop();
|
|
300
|
+
}
|
|
301
|
+
}, _callee6);
|
|
302
|
+
})));
|
|
303
|
+
// poster 变化时重建 video,覆盖有封面和无封面互切。
|
|
304
|
+
it('should remount video when poster changes', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee7() {
|
|
305
|
+
var Demo, _mount7, instance, element, media, videoWithPoster, videoWithoutPoster, videoWithNextPoster;
|
|
306
|
+
return _regeneratorRuntime.wrap(function _callee7$(_context14) {
|
|
307
|
+
while (1) switch (_context14.prev = _context14.next) {
|
|
308
|
+
case 0:
|
|
309
|
+
Demo = /*#__PURE__*/function (_Component7) {
|
|
310
|
+
_inheritsLoose(Demo, _Component7);
|
|
311
|
+
function Demo() {
|
|
312
|
+
var _context13;
|
|
313
|
+
var _this7;
|
|
314
|
+
for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {
|
|
315
|
+
args[_key7] = arguments[_key7];
|
|
316
|
+
}
|
|
317
|
+
_this7 = _Component7.call.apply(_Component7, _concatInstanceProperty(_context13 = [this]).call(_context13, args)) || this;
|
|
318
|
+
_this7.Media = Media;
|
|
319
|
+
return _this7;
|
|
320
|
+
}
|
|
321
|
+
Demo.defaults = function defaults() {
|
|
322
|
+
return {
|
|
323
|
+
poster: 'https://example.com/poster.png'
|
|
324
|
+
};
|
|
325
|
+
};
|
|
326
|
+
return Demo;
|
|
327
|
+
}(Component);
|
|
328
|
+
Demo.template = "\n const { Media } = this;\n <div>\n <Media\n className=\"video-media\"\n type=\"video\"\n src=\"https://example.com/demo.mp4\"\n poster={this.get('poster')}\n />\n </div>\n ";
|
|
329
|
+
_mount7 = mount(Demo), instance = _mount7[0], element = _mount7[1];
|
|
330
|
+
media = element.querySelector('.video-media');
|
|
331
|
+
videoWithPoster = element.querySelector('video.k-media-video');
|
|
332
|
+
dispatchMediaEvent(videoWithPoster, 'loadedmetadata');
|
|
333
|
+
_context14.next = 8;
|
|
334
|
+
return wait();
|
|
335
|
+
case 8:
|
|
336
|
+
expect(media.className).to.contain('k-media-done');
|
|
337
|
+
expect(videoWithPoster.getAttribute('poster')).to.eql('https://example.com/poster.png');
|
|
338
|
+
instance.set('poster', undefined);
|
|
339
|
+
_context14.next = 13;
|
|
340
|
+
return wait();
|
|
341
|
+
case 13:
|
|
342
|
+
videoWithoutPoster = element.querySelector('video.k-media-video');
|
|
343
|
+
expect(videoWithoutPoster).not.to.eql(videoWithPoster);
|
|
344
|
+
expect(videoWithoutPoster.getAttribute('poster')).to.eql(null);
|
|
345
|
+
expect(media.className).to.contain('k-media-loading');
|
|
346
|
+
instance.set('poster', 'https://example.com/next-poster.png');
|
|
347
|
+
_context14.next = 20;
|
|
348
|
+
return wait();
|
|
349
|
+
case 20:
|
|
350
|
+
videoWithNextPoster = element.querySelector('video.k-media-video');
|
|
351
|
+
expect(videoWithNextPoster).not.to.eql(videoWithoutPoster);
|
|
352
|
+
expect(videoWithNextPoster.getAttribute('poster')).to.eql('https://example.com/next-poster.png');
|
|
353
|
+
expect(media.className).to.contain('k-media-loading');
|
|
354
|
+
case 24:
|
|
355
|
+
case "end":
|
|
356
|
+
return _context14.stop();
|
|
357
|
+
}
|
|
358
|
+
}, _callee7);
|
|
359
|
+
})));
|
|
360
|
+
// 完成态媒体默认允许展示预览遮罩。
|
|
361
|
+
it('should render preview overlay for done media', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee8() {
|
|
362
|
+
var Demo, _mount8, element;
|
|
363
|
+
return _regeneratorRuntime.wrap(function _callee8$(_context16) {
|
|
364
|
+
while (1) switch (_context16.prev = _context16.next) {
|
|
365
|
+
case 0:
|
|
366
|
+
Demo = /*#__PURE__*/function (_Component8) {
|
|
367
|
+
_inheritsLoose(Demo, _Component8);
|
|
368
|
+
function Demo() {
|
|
369
|
+
var _context15;
|
|
370
|
+
var _this8;
|
|
371
|
+
for (var _len8 = arguments.length, args = new Array(_len8), _key8 = 0; _key8 < _len8; _key8++) {
|
|
372
|
+
args[_key8] = arguments[_key8];
|
|
373
|
+
}
|
|
374
|
+
_this8 = _Component8.call.apply(_Component8, _concatInstanceProperty(_context15 = [this]).call(_context15, args)) || this;
|
|
375
|
+
_this8.Media = Media;
|
|
376
|
+
return _this8;
|
|
377
|
+
}
|
|
378
|
+
return Demo;
|
|
379
|
+
}(Component);
|
|
380
|
+
Demo.template = "\n const { Media } = this;\n <div>\n <Media className=\"done-image\" type=\"image\" status=\"done\" src=\"https://example.com/cover.png\" />\n <Media className=\"done-video\" type=\"video\" status=\"done\" src=\"https://example.com/demo.mp4\" />\n <Media className=\"done-audio\" type=\"audio\" status=\"done\" src=\"https://example.com/demo.mp3\" />\n </div>\n ";
|
|
381
|
+
_mount8 = mount(Demo), element = _mount8[1];
|
|
382
|
+
['done-image', 'done-video', 'done-audio'].forEach(function (className) {
|
|
383
|
+
var media = element.querySelector("." + className);
|
|
384
|
+
expect(media.className).to.contain('k-media-previewable');
|
|
385
|
+
expect(media.querySelector('.k-media-overlay')).not.to.eql(null);
|
|
386
|
+
expect(media.querySelector('.k-media-preview-trigger')).not.to.eql(null);
|
|
387
|
+
});
|
|
388
|
+
case 4:
|
|
389
|
+
case "end":
|
|
390
|
+
return _context16.stop();
|
|
391
|
+
}
|
|
392
|
+
}, _callee8);
|
|
393
|
+
})));
|
|
394
|
+
// showPreview=false 时完成态也不生成预览入口。
|
|
395
|
+
it('should hide preview overlay when showPreview is false', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee9() {
|
|
396
|
+
var Demo, _mount9, element, media;
|
|
397
|
+
return _regeneratorRuntime.wrap(function _callee9$(_context18) {
|
|
398
|
+
while (1) switch (_context18.prev = _context18.next) {
|
|
399
|
+
case 0:
|
|
400
|
+
Demo = /*#__PURE__*/function (_Component9) {
|
|
401
|
+
_inheritsLoose(Demo, _Component9);
|
|
402
|
+
function Demo() {
|
|
403
|
+
var _context17;
|
|
404
|
+
var _this9;
|
|
405
|
+
for (var _len9 = arguments.length, args = new Array(_len9), _key9 = 0; _key9 < _len9; _key9++) {
|
|
406
|
+
args[_key9] = arguments[_key9];
|
|
407
|
+
}
|
|
408
|
+
_this9 = _Component9.call.apply(_Component9, _concatInstanceProperty(_context17 = [this]).call(_context17, args)) || this;
|
|
409
|
+
_this9.Media = Media;
|
|
410
|
+
return _this9;
|
|
411
|
+
}
|
|
412
|
+
return Demo;
|
|
413
|
+
}(Component);
|
|
414
|
+
Demo.template = "\n const { Media } = this;\n <div>\n <Media\n className=\"no-preview\"\n type=\"image\"\n status=\"done\"\n showPreview={false}\n src=\"https://example.com/cover.png\"\n />\n </div>\n ";
|
|
415
|
+
_mount9 = mount(Demo), element = _mount9[1];
|
|
416
|
+
media = element.querySelector('.no-preview');
|
|
417
|
+
expect(media.className).not.to.contain('k-media-previewable');
|
|
418
|
+
expect(media.querySelector('.k-media-overlay')).to.eql(null);
|
|
419
|
+
expect(media.querySelector('.k-media-preview-trigger')).to.eql(null);
|
|
420
|
+
case 7:
|
|
421
|
+
case "end":
|
|
422
|
+
return _context18.stop();
|
|
423
|
+
}
|
|
424
|
+
}, _callee9);
|
|
425
|
+
})));
|
|
426
|
+
// mask 插槽仅在 default/done 状态生效,loading/error 不展示。
|
|
427
|
+
it('should render mask slot only in default and done status', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee10() {
|
|
428
|
+
var _element$querySelecto, _element$querySelecto2;
|
|
429
|
+
var Demo, _mount10, element;
|
|
430
|
+
return _regeneratorRuntime.wrap(function _callee10$(_context20) {
|
|
431
|
+
while (1) switch (_context20.prev = _context20.next) {
|
|
432
|
+
case 0:
|
|
433
|
+
Demo = /*#__PURE__*/function (_Component10) {
|
|
434
|
+
_inheritsLoose(Demo, _Component10);
|
|
435
|
+
function Demo() {
|
|
436
|
+
var _context19;
|
|
437
|
+
var _this10;
|
|
438
|
+
for (var _len10 = arguments.length, args = new Array(_len10), _key10 = 0; _key10 < _len10; _key10++) {
|
|
439
|
+
args[_key10] = arguments[_key10];
|
|
440
|
+
}
|
|
441
|
+
_this10 = _Component10.call.apply(_Component10, _concatInstanceProperty(_context19 = [this]).call(_context19, args)) || this;
|
|
442
|
+
_this10.Media = Media;
|
|
443
|
+
return _this10;
|
|
444
|
+
}
|
|
445
|
+
return Demo;
|
|
446
|
+
}(Component);
|
|
447
|
+
Demo.template = "\n const { Media } = this;\n <div>\n <Media className=\"mask-default\" type=\"image\">\n <b:mask args=\"media\">\n <div class=\"mask-slot-default\">{media.status}</div>\n </b:mask>\n </Media>\n <Media className=\"mask-done\" type=\"image\" status=\"done\" src=\"https://example.com/cover.png\">\n <b:mask args=\"media\">\n <div class=\"mask-slot-done\">{media.status}</div>\n </b:mask>\n </Media>\n <Media className=\"mask-loading\" type=\"image\" status=\"loading\" src=\"https://example.com/cover.png\">\n <b:mask args=\"media\">\n <div class=\"mask-slot-loading\">{media.status}</div>\n </b:mask>\n </Media>\n <Media className=\"mask-error\" type=\"image\" status=\"error\" src=\"https://example.com/cover.png\">\n <b:mask args=\"media\">\n <div class=\"mask-slot-error\">{media.status}</div>\n </b:mask>\n </Media>\n </div>\n ";
|
|
448
|
+
_mount10 = mount(Demo), element = _mount10[1];
|
|
449
|
+
expect(element.querySelector('.mask-default').className).to.contain('k-media-custom-mask');
|
|
450
|
+
expect(element.querySelector('.mask-done').className).to.contain('k-media-custom-mask');
|
|
451
|
+
expect(element.querySelector('.mask-loading').className).not.to.contain('k-media-custom-mask');
|
|
452
|
+
expect(element.querySelector('.mask-error').className).not.to.contain('k-media-custom-mask');
|
|
453
|
+
expect((_element$querySelecto = element.querySelector('.mask-slot-default')) == null ? void 0 : _element$querySelecto.textContent).to.contain('default');
|
|
454
|
+
expect((_element$querySelecto2 = element.querySelector('.mask-slot-done')) == null ? void 0 : _element$querySelecto2.textContent).to.contain('done');
|
|
455
|
+
expect(element.querySelector('.mask-slot-loading')).to.eql(null);
|
|
456
|
+
expect(element.querySelector('.mask-slot-error')).to.eql(null);
|
|
457
|
+
case 11:
|
|
458
|
+
case "end":
|
|
459
|
+
return _context20.stop();
|
|
460
|
+
}
|
|
461
|
+
}, _callee10);
|
|
462
|
+
})));
|
|
463
|
+
// mask 生效时接管预览入口,不再显示默认预览按钮。
|
|
464
|
+
it('should hide default preview trigger when mask slot is active', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee11() {
|
|
465
|
+
var Demo, _mount11, element, media;
|
|
466
|
+
return _regeneratorRuntime.wrap(function _callee11$(_context22) {
|
|
467
|
+
while (1) switch (_context22.prev = _context22.next) {
|
|
468
|
+
case 0:
|
|
469
|
+
Demo = /*#__PURE__*/function (_Component11) {
|
|
470
|
+
_inheritsLoose(Demo, _Component11);
|
|
471
|
+
function Demo() {
|
|
472
|
+
var _context21;
|
|
473
|
+
var _this11;
|
|
474
|
+
for (var _len11 = arguments.length, args = new Array(_len11), _key11 = 0; _key11 < _len11; _key11++) {
|
|
475
|
+
args[_key11] = arguments[_key11];
|
|
476
|
+
}
|
|
477
|
+
_this11 = _Component11.call.apply(_Component11, _concatInstanceProperty(_context21 = [this]).call(_context21, args)) || this;
|
|
478
|
+
_this11.Media = Media;
|
|
479
|
+
return _this11;
|
|
480
|
+
}
|
|
481
|
+
return Demo;
|
|
482
|
+
}(Component);
|
|
483
|
+
Demo.template = "\n const { Media } = this;\n <div>\n <Media className=\"mask-preview\" type=\"image\" status=\"done\" src=\"https://example.com/cover.png\">\n <b:mask args=\"media\">\n <button class=\"mask-action\" type=\"button\">{media.name || 'mask'}</button>\n </b:mask>\n </Media>\n </div>\n ";
|
|
484
|
+
_mount11 = mount(Demo), element = _mount11[1];
|
|
485
|
+
media = element.querySelector('.mask-preview');
|
|
486
|
+
expect(media.querySelector('.mask-action')).not.to.eql(null);
|
|
487
|
+
expect(media.querySelector('.k-media-preview-trigger')).to.eql(null);
|
|
488
|
+
case 6:
|
|
489
|
+
case "end":
|
|
490
|
+
return _context22.stop();
|
|
491
|
+
}
|
|
492
|
+
}, _callee11);
|
|
493
|
+
})));
|
|
494
|
+
// mask 插槽可以通过 preview(event) 主动触发预览。
|
|
495
|
+
it('should open preview by custom mask preview handler', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee12() {
|
|
496
|
+
var _getElement;
|
|
497
|
+
var previewCalls, Demo, _mount12, element, maskOpen;
|
|
498
|
+
return _regeneratorRuntime.wrap(function _callee12$(_context24) {
|
|
499
|
+
while (1) switch (_context24.prev = _context24.next) {
|
|
500
|
+
case 0:
|
|
501
|
+
previewCalls = [];
|
|
502
|
+
Demo = /*#__PURE__*/function (_Component12) {
|
|
503
|
+
_inheritsLoose(Demo, _Component12);
|
|
504
|
+
function Demo() {
|
|
505
|
+
var _context23;
|
|
506
|
+
var _this12;
|
|
507
|
+
for (var _len12 = arguments.length, args = new Array(_len12), _key12 = 0; _key12 < _len12; _key12++) {
|
|
508
|
+
args[_key12] = arguments[_key12];
|
|
509
|
+
}
|
|
510
|
+
_this12 = _Component12.call.apply(_Component12, _concatInstanceProperty(_context23 = [this]).call(_context23, args)) || this;
|
|
511
|
+
_this12.Media = Media;
|
|
512
|
+
_this12.onPreview = function (media, e) {
|
|
513
|
+
previewCalls.push({
|
|
514
|
+
media: media,
|
|
515
|
+
eventType: e.type
|
|
516
|
+
});
|
|
517
|
+
};
|
|
518
|
+
return _this12;
|
|
519
|
+
}
|
|
520
|
+
return Demo;
|
|
521
|
+
}(Component);
|
|
522
|
+
Demo.template = "\n const { Media } = this;\n <div>\n <Media\n className=\"mask-preview-open\"\n type=\"image\"\n status=\"done\"\n name=\"\u5C01\u9762\u56FE\"\n src=\"https://example.com/cover.png\"\n ev-preview={this.onPreview}\n >\n <b:mask args=\"media\">\n <button\n class=\"mask-open\"\n type=\"button\"\n disabled={!media.canPreview}\n ev-click={media.preview}\n >open</button>\n </b:mask>\n </Media>\n </div>\n ";
|
|
523
|
+
_mount12 = mount(Demo), element = _mount12[1];
|
|
524
|
+
maskOpen = element.querySelector('.mask-open');
|
|
525
|
+
maskOpen.click();
|
|
526
|
+
_context24.next = 8;
|
|
527
|
+
return wait(0);
|
|
528
|
+
case 8:
|
|
529
|
+
expect(previewCalls.length).to.eql(1);
|
|
530
|
+
expect(previewCalls[0].eventType).to.eql('click');
|
|
531
|
+
expect(previewCalls[0].media).to.include({
|
|
532
|
+
name: '封面图',
|
|
533
|
+
resolvedType: 'image',
|
|
534
|
+
status: 'done',
|
|
535
|
+
src: 'https://example.com/cover.png'
|
|
536
|
+
});
|
|
537
|
+
expect(getElement('.k-media-viewer')).not.to.eql(null);
|
|
538
|
+
expect((_getElement = getElement('.k-media-viewer-title')) == null ? void 0 : _getElement.textContent).to.contain('封面图');
|
|
539
|
+
case 13:
|
|
540
|
+
case "end":
|
|
541
|
+
return _context24.stop();
|
|
542
|
+
}
|
|
543
|
+
}, _callee12);
|
|
544
|
+
})));
|
|
545
|
+
// 无 src 且无外部状态时展示默认占位,不进入 loading。
|
|
546
|
+
it('should render default placeholder when src and status are absent', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee13() {
|
|
547
|
+
var Demo, _mount13, element, media;
|
|
548
|
+
return _regeneratorRuntime.wrap(function _callee13$(_context26) {
|
|
549
|
+
while (1) switch (_context26.prev = _context26.next) {
|
|
550
|
+
case 0:
|
|
551
|
+
Demo = /*#__PURE__*/function (_Component13) {
|
|
552
|
+
_inheritsLoose(Demo, _Component13);
|
|
553
|
+
function Demo() {
|
|
554
|
+
var _context25;
|
|
555
|
+
var _this13;
|
|
556
|
+
for (var _len13 = arguments.length, args = new Array(_len13), _key13 = 0; _key13 < _len13; _key13++) {
|
|
557
|
+
args[_key13] = arguments[_key13];
|
|
558
|
+
}
|
|
559
|
+
_this13 = _Component13.call.apply(_Component13, _concatInstanceProperty(_context25 = [this]).call(_context25, args)) || this;
|
|
560
|
+
_this13.Media = Media;
|
|
561
|
+
return _this13;
|
|
562
|
+
}
|
|
563
|
+
return Demo;
|
|
564
|
+
}(Component);
|
|
565
|
+
Demo.template = "\n const { Media } = this;\n <div>\n <Media className=\"empty-media\" />\n </div>\n ";
|
|
566
|
+
_mount13 = mount(Demo), element = _mount13[1];
|
|
567
|
+
media = element.querySelector('.empty-media');
|
|
568
|
+
expect(media.className).to.contain('k-media-image');
|
|
569
|
+
expect(media.className).to.contain('k-media-default');
|
|
570
|
+
expect(media.className).not.to.contain('k-media-previewable');
|
|
571
|
+
expect(media.getAttribute('title')).to.eql('未命名文件');
|
|
572
|
+
expect(media.querySelector('.k-media-placeholder')).not.to.eql(null);
|
|
573
|
+
expect(media.querySelector('.k-media-image')).to.eql(null);
|
|
574
|
+
expect(media.querySelector('.k-media-loading-indicator')).to.eql(null);
|
|
575
|
+
expect(media.querySelector('.k-media-preview-trigger')).to.eql(null);
|
|
576
|
+
case 12:
|
|
577
|
+
case "end":
|
|
578
|
+
return _context26.stop();
|
|
579
|
+
}
|
|
580
|
+
}, _callee13);
|
|
581
|
+
})));
|
|
582
|
+
// 未传 type 时根据 name/src 文件名推断媒体类型。
|
|
583
|
+
it('should infer media type from name or src', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee14() {
|
|
584
|
+
var Demo, _mount14, element, image, video, audio;
|
|
585
|
+
return _regeneratorRuntime.wrap(function _callee14$(_context28) {
|
|
586
|
+
while (1) switch (_context28.prev = _context28.next) {
|
|
587
|
+
case 0:
|
|
588
|
+
Demo = /*#__PURE__*/function (_Component14) {
|
|
589
|
+
_inheritsLoose(Demo, _Component14);
|
|
590
|
+
function Demo() {
|
|
591
|
+
var _context27;
|
|
592
|
+
var _this14;
|
|
593
|
+
for (var _len14 = arguments.length, args = new Array(_len14), _key14 = 0; _key14 < _len14; _key14++) {
|
|
594
|
+
args[_key14] = arguments[_key14];
|
|
595
|
+
}
|
|
596
|
+
_this14 = _Component14.call.apply(_Component14, _concatInstanceProperty(_context27 = [this]).call(_context27, args)) || this;
|
|
597
|
+
_this14.Media = Media;
|
|
598
|
+
return _this14;
|
|
599
|
+
}
|
|
600
|
+
return Demo;
|
|
601
|
+
}(Component);
|
|
602
|
+
Demo.template = "\n const { Media } = this;\n <div>\n <Media className=\"infer-image\" status=\"done\" src=\"https://example.com/cover.webp?x=1\" />\n <Media className=\"infer-video\" name=\"clip.webm\" status=\"done\" src=\"https://example.com/resource\" />\n <Media className=\"infer-audio\" status=\"done\" src=\"https://example.com/audio.m4a#hash\" />\n </div>\n ";
|
|
603
|
+
_mount14 = mount(Demo), element = _mount14[1];
|
|
604
|
+
image = element.querySelector('.infer-image');
|
|
605
|
+
video = element.querySelector('.infer-video');
|
|
606
|
+
audio = element.querySelector('.infer-audio');
|
|
607
|
+
expect(image.className).to.contain('k-media-image');
|
|
608
|
+
expect(image.querySelector('img.k-media-image')).not.to.eql(null);
|
|
609
|
+
expect(video.className).to.contain('k-media-video');
|
|
610
|
+
expect(video.querySelector('video.k-media-video')).not.to.eql(null);
|
|
611
|
+
expect(audio.className).to.contain('k-media-audio');
|
|
612
|
+
expect(audio.querySelector('.k-media-audio-card')).not.to.eql(null);
|
|
613
|
+
case 12:
|
|
614
|
+
case "end":
|
|
615
|
+
return _context28.stop();
|
|
616
|
+
}
|
|
617
|
+
}, _callee14);
|
|
618
|
+
})));
|
|
619
|
+
// click 和 preview 事件分别返回缩略图信息和预览信息。
|
|
620
|
+
it('should trigger click and preview events with media payload', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee15() {
|
|
621
|
+
var _getElement2;
|
|
622
|
+
var clickCalls, previewCalls, Demo, _mount15, element, media, trigger;
|
|
623
|
+
return _regeneratorRuntime.wrap(function _callee15$(_context30) {
|
|
624
|
+
while (1) switch (_context30.prev = _context30.next) {
|
|
625
|
+
case 0:
|
|
626
|
+
clickCalls = [];
|
|
627
|
+
previewCalls = [];
|
|
628
|
+
Demo = /*#__PURE__*/function (_Component15) {
|
|
629
|
+
_inheritsLoose(Demo, _Component15);
|
|
630
|
+
function Demo() {
|
|
631
|
+
var _context29;
|
|
632
|
+
var _this15;
|
|
633
|
+
for (var _len15 = arguments.length, args = new Array(_len15), _key15 = 0; _key15 < _len15; _key15++) {
|
|
634
|
+
args[_key15] = arguments[_key15];
|
|
635
|
+
}
|
|
636
|
+
_this15 = _Component15.call.apply(_Component15, _concatInstanceProperty(_context29 = [this]).call(_context29, args)) || this;
|
|
637
|
+
_this15.Media = Media;
|
|
638
|
+
_this15.onClick = function (media, e) {
|
|
639
|
+
clickCalls.push({
|
|
640
|
+
media: media,
|
|
641
|
+
eventType: e.type
|
|
642
|
+
});
|
|
643
|
+
};
|
|
644
|
+
_this15.onPreview = function (media, e) {
|
|
645
|
+
previewCalls.push({
|
|
646
|
+
media: media,
|
|
647
|
+
eventType: e.type
|
|
648
|
+
});
|
|
649
|
+
};
|
|
650
|
+
return _this15;
|
|
651
|
+
}
|
|
652
|
+
return Demo;
|
|
653
|
+
}(Component);
|
|
654
|
+
Demo.template = "\n const { Media } = this;\n <div>\n <Media\n className=\"event-media\"\n name=\"\u5C01\u9762\u56FE\"\n type=\"image\"\n status=\"done\"\n src=\"https://example.com/cover.png\"\n ev-click={this.onClick}\n ev-preview={this.onPreview}\n />\n </div>\n ";
|
|
655
|
+
_mount15 = mount(Demo), element = _mount15[1];
|
|
656
|
+
media = element.querySelector('.event-media');
|
|
657
|
+
trigger = element.querySelector('.k-media-preview-trigger');
|
|
658
|
+
media.click();
|
|
659
|
+
_context30.next = 10;
|
|
660
|
+
return wait();
|
|
661
|
+
case 10:
|
|
662
|
+
expect(clickCalls.length).to.eql(1);
|
|
663
|
+
expect(clickCalls[0].media).to.include({
|
|
664
|
+
name: '封面图',
|
|
665
|
+
type: 'image',
|
|
666
|
+
resolvedType: 'image',
|
|
667
|
+
status: 'done',
|
|
668
|
+
src: 'https://example.com/cover.png',
|
|
669
|
+
size: 'default'
|
|
670
|
+
});
|
|
671
|
+
expect(clickCalls[0].eventType).to.eql('click');
|
|
672
|
+
trigger.click();
|
|
673
|
+
_context30.next = 16;
|
|
674
|
+
return wait();
|
|
675
|
+
case 16:
|
|
676
|
+
expect(clickCalls.length).to.eql(1);
|
|
677
|
+
expect(previewCalls.length).to.eql(1);
|
|
678
|
+
expect(previewCalls[0].media).to.include({
|
|
679
|
+
name: '封面图',
|
|
680
|
+
type: 'image',
|
|
681
|
+
resolvedType: 'image',
|
|
682
|
+
status: 'done',
|
|
683
|
+
src: 'https://example.com/cover.png',
|
|
684
|
+
size: 'default'
|
|
685
|
+
});
|
|
686
|
+
expect(previewCalls[0].eventType).to.eql('click');
|
|
687
|
+
expect((_getElement2 = getElement('.k-media-viewer-title')) == null ? void 0 : _getElement2.textContent).to.contain('封面图');
|
|
688
|
+
case 21:
|
|
689
|
+
case "end":
|
|
690
|
+
return _context30.stop();
|
|
691
|
+
}
|
|
692
|
+
}, _callee15);
|
|
693
|
+
})));
|
|
694
|
+
// imageProps/audioProps 透传原生属性,并移除被组件接管的事件属性。
|
|
695
|
+
it('should pass native image and audio props without leaking handled events', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee16() {
|
|
696
|
+
var calls, Demo, _mount16, element, image, audio;
|
|
697
|
+
return _regeneratorRuntime.wrap(function _callee16$(_context32) {
|
|
698
|
+
while (1) switch (_context32.prev = _context32.next) {
|
|
699
|
+
case 0:
|
|
700
|
+
calls = [];
|
|
701
|
+
Demo = /*#__PURE__*/function (_Component16) {
|
|
702
|
+
_inheritsLoose(Demo, _Component16);
|
|
703
|
+
function Demo() {
|
|
704
|
+
var _context31;
|
|
705
|
+
var _this16;
|
|
706
|
+
for (var _len16 = arguments.length, args = new Array(_len16), _key16 = 0; _key16 < _len16; _key16++) {
|
|
707
|
+
args[_key16] = arguments[_key16];
|
|
708
|
+
}
|
|
709
|
+
_this16 = _Component16.call.apply(_Component16, _concatInstanceProperty(_context31 = [this]).call(_context31, args)) || this;
|
|
710
|
+
_this16.Media = Media;
|
|
711
|
+
_this16.onImageError = function () {
|
|
712
|
+
calls.push('image-error');
|
|
713
|
+
};
|
|
714
|
+
_this16.onAudioLoad = function () {
|
|
715
|
+
calls.push('audio-load');
|
|
716
|
+
};
|
|
717
|
+
return _this16;
|
|
718
|
+
}
|
|
719
|
+
return Demo;
|
|
720
|
+
}(Component);
|
|
721
|
+
Demo.template = "\n const { Media } = this;\n <div>\n <Media\n type=\"image\"\n src=\"https://example.com/cover.png\"\n imageProps={{\n onerror: this.onImageError,\n 'data-native': 'image',\n }}\n />\n <Media\n type=\"audio\"\n src=\"https://example.com/demo.mp3\"\n audioProps={{\n onloadedmetadata: this.onAudioLoad,\n preload: 'auto',\n 'data-native': 'audio',\n }}\n />\n </div>\n ";
|
|
722
|
+
_mount16 = mount(Demo), element = _mount16[1];
|
|
723
|
+
image = element.querySelector('img.k-media-image');
|
|
724
|
+
audio = element.querySelector('audio.k-media-audio-loader');
|
|
725
|
+
expect(image.getAttribute('data-native')).to.eql('image');
|
|
726
|
+
expect(image.getAttribute('onerror')).to.eql(null);
|
|
727
|
+
expect(audio.preload).to.eql('auto');
|
|
728
|
+
expect(audio.getAttribute('data-native')).to.eql('audio');
|
|
729
|
+
expect(audio.getAttribute('onloadedmetadata')).to.eql(null);
|
|
730
|
+
dispatchMediaEvent(image, 'error');
|
|
731
|
+
dispatchMediaEvent(audio, 'loadedmetadata');
|
|
732
|
+
_context32.next = 15;
|
|
733
|
+
return wait();
|
|
734
|
+
case 15:
|
|
735
|
+
expect(calls).to.eql(['image-error', 'audio-load']);
|
|
736
|
+
case 16:
|
|
737
|
+
case "end":
|
|
738
|
+
return _context32.stop();
|
|
739
|
+
}
|
|
740
|
+
}, _callee16);
|
|
741
|
+
})));
|
|
742
|
+
// 原生媒体事件驱动内部自动状态切换。
|
|
743
|
+
it('should update automatic status from native media events', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee17() {
|
|
744
|
+
var calls, Demo, _mount17, element, imageMedia, videoMedia, audioMedia;
|
|
745
|
+
return _regeneratorRuntime.wrap(function _callee17$(_context34) {
|
|
746
|
+
while (1) switch (_context34.prev = _context34.next) {
|
|
747
|
+
case 0:
|
|
748
|
+
calls = [];
|
|
749
|
+
Demo = /*#__PURE__*/function (_Component17) {
|
|
750
|
+
_inheritsLoose(Demo, _Component17);
|
|
751
|
+
function Demo() {
|
|
752
|
+
var _context33;
|
|
753
|
+
var _this17;
|
|
754
|
+
for (var _len17 = arguments.length, args = new Array(_len17), _key17 = 0; _key17 < _len17; _key17++) {
|
|
755
|
+
args[_key17] = arguments[_key17];
|
|
756
|
+
}
|
|
757
|
+
_this17 = _Component17.call.apply(_Component17, _concatInstanceProperty(_context33 = [this]).call(_context33, args)) || this;
|
|
758
|
+
_this17.Media = Media;
|
|
759
|
+
_this17.onLoad = function (media) {
|
|
760
|
+
calls.push("load:" + media.resolvedType);
|
|
761
|
+
};
|
|
762
|
+
_this17.onLoadError = function (media) {
|
|
763
|
+
calls.push("error:" + media.resolvedType);
|
|
764
|
+
};
|
|
765
|
+
return _this17;
|
|
766
|
+
}
|
|
767
|
+
return Demo;
|
|
768
|
+
}(Component);
|
|
769
|
+
Demo.template = "\n const { Media } = this;\n <div>\n <Media className=\"image-media\" type=\"image\" src=\"https://example.com/cover.png\" ev-load={this.onLoad} ev-loadError={this.onLoadError} />\n <Media className=\"video-media\" type=\"video\" src=\"https://example.com/demo.mp4\" ev-load={this.onLoad} />\n <Media className=\"audio-media\" type=\"audio\" src=\"https://example.com/demo.mp3\" ev-load={this.onLoad} />\n </div>\n ";
|
|
770
|
+
_mount17 = mount(Demo), element = _mount17[1];
|
|
771
|
+
imageMedia = element.querySelector('.image-media');
|
|
772
|
+
videoMedia = element.querySelector('.video-media');
|
|
773
|
+
audioMedia = element.querySelector('.audio-media');
|
|
774
|
+
expect(imageMedia.className).to.contain('k-media-loading');
|
|
775
|
+
expect(videoMedia.className).to.contain('k-media-loading');
|
|
776
|
+
expect(audioMedia.className).to.contain('k-media-loading');
|
|
777
|
+
dispatchMediaEvent(element.querySelector('img.k-media-image'), 'load');
|
|
778
|
+
dispatchMediaEvent(element.querySelector('video.k-media-video'), 'loadeddata');
|
|
779
|
+
dispatchMediaEvent(element.querySelector('audio.k-media-audio-loader'), 'loadedmetadata');
|
|
780
|
+
_context34.next = 15;
|
|
781
|
+
return wait();
|
|
782
|
+
case 15:
|
|
783
|
+
expect(imageMedia.className).to.contain('k-media-done');
|
|
784
|
+
expect(videoMedia.className).to.contain('k-media-done');
|
|
785
|
+
expect(audioMedia.className).to.contain('k-media-done');
|
|
786
|
+
expect(element.querySelector('.k-media-loading-indicator')).to.eql(null);
|
|
787
|
+
expect(calls).to.eql(['load:image', 'load:video', 'load:audio']);
|
|
788
|
+
dispatchMediaEvent(element.querySelector('img.k-media-image'), 'error');
|
|
789
|
+
_context34.next = 23;
|
|
790
|
+
return wait();
|
|
791
|
+
case 23:
|
|
792
|
+
expect(imageMedia.className).to.contain('k-media-error');
|
|
793
|
+
expect(imageMedia.querySelector('.k-media-error-card')).not.to.eql(null);
|
|
794
|
+
expect(imageMedia.querySelector('.k-media-placeholder')).to.eql(null);
|
|
795
|
+
expect(imageMedia.querySelector('.k-media-status-layer')).to.eql(null);
|
|
796
|
+
expect(imageMedia.querySelector('.k-media-preview-trigger')).to.eql(null);
|
|
797
|
+
expect(calls).to.eql(['load:image', 'load:video', 'load:audio', 'error:image']);
|
|
798
|
+
case 29:
|
|
799
|
+
case "end":
|
|
800
|
+
return _context34.stop();
|
|
801
|
+
}
|
|
802
|
+
}, _callee17);
|
|
803
|
+
})));
|
|
804
|
+
// 原生事件先更新内部状态,再调用用户传入的回调。
|
|
805
|
+
it('should merge native handlers', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee18() {
|
|
806
|
+
var calls, imageMedia, Demo, _mount18, element;
|
|
807
|
+
return _regeneratorRuntime.wrap(function _callee18$(_context36) {
|
|
808
|
+
while (1) switch (_context36.prev = _context36.next) {
|
|
809
|
+
case 0:
|
|
810
|
+
calls = [];
|
|
811
|
+
Demo = /*#__PURE__*/function (_Component18) {
|
|
812
|
+
_inheritsLoose(Demo, _Component18);
|
|
813
|
+
function Demo() {
|
|
814
|
+
var _context35;
|
|
815
|
+
var _this18;
|
|
816
|
+
for (var _len18 = arguments.length, args = new Array(_len18), _key18 = 0; _key18 < _len18; _key18++) {
|
|
817
|
+
args[_key18] = arguments[_key18];
|
|
818
|
+
}
|
|
819
|
+
_this18 = _Component18.call.apply(_Component18, _concatInstanceProperty(_context35 = [this]).call(_context35, args)) || this;
|
|
820
|
+
_this18.Media = Media;
|
|
821
|
+
_this18.onImageLoad = function () {
|
|
822
|
+
calls.push('load');
|
|
823
|
+
};
|
|
824
|
+
return _this18;
|
|
825
|
+
}
|
|
826
|
+
return Demo;
|
|
827
|
+
}(Component);
|
|
828
|
+
Demo.template = "\n const { Media } = this;\n <div>\n <Media\n className=\"image-media\"\n type=\"image\"\n src=\"https://example.com/cover.png\"\n imageProps={{\n onload: this.onImageLoad,\n }}\n />\n </div>\n ";
|
|
829
|
+
_mount18 = mount(Demo), element = _mount18[1];
|
|
830
|
+
imageMedia = element.querySelector('.image-media');
|
|
831
|
+
dispatchMediaEvent(element.querySelector('img.k-media-image'), 'load');
|
|
832
|
+
_context36.next = 8;
|
|
833
|
+
return wait();
|
|
834
|
+
case 8:
|
|
835
|
+
expect(imageMedia.className).to.contain('k-media-done');
|
|
836
|
+
expect(calls).to.eql(['load']);
|
|
837
|
+
expect(element.querySelector('img.k-media-image').getAttribute('onload')).to.eql(null);
|
|
838
|
+
case 11:
|
|
839
|
+
case "end":
|
|
840
|
+
return _context36.stop();
|
|
841
|
+
}
|
|
842
|
+
}, _callee18);
|
|
843
|
+
})));
|
|
844
|
+
// 缓存资源错过事件时,通过原生 ready 状态补齐完成态。
|
|
845
|
+
it('should sync automatic status from native media state', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee19() {
|
|
846
|
+
var restores, Demo, _mount19, element;
|
|
847
|
+
return _regeneratorRuntime.wrap(function _callee19$(_context38) {
|
|
848
|
+
while (1) switch (_context38.prev = _context38.next) {
|
|
849
|
+
case 0:
|
|
850
|
+
restores = [stubNativeGetter(HTMLImageElement.prototype, 'complete', true), stubNativeGetter(HTMLImageElement.prototype, 'naturalWidth', 120), stubNativeGetter(HTMLImageElement.prototype, 'naturalHeight', 80), stubNativeGetter(HTMLMediaElement.prototype, 'readyState', 2)];
|
|
851
|
+
_context38.prev = 1;
|
|
852
|
+
Demo = /*#__PURE__*/function (_Component19) {
|
|
853
|
+
_inheritsLoose(Demo, _Component19);
|
|
854
|
+
function Demo() {
|
|
855
|
+
var _context37;
|
|
856
|
+
var _this19;
|
|
857
|
+
for (var _len19 = arguments.length, args = new Array(_len19), _key19 = 0; _key19 < _len19; _key19++) {
|
|
858
|
+
args[_key19] = arguments[_key19];
|
|
859
|
+
}
|
|
860
|
+
_this19 = _Component19.call.apply(_Component19, _concatInstanceProperty(_context37 = [this]).call(_context37, args)) || this;
|
|
861
|
+
_this19.Media = Media;
|
|
862
|
+
return _this19;
|
|
863
|
+
}
|
|
864
|
+
return Demo;
|
|
865
|
+
}(Component);
|
|
866
|
+
Demo.template = "\n const { Media } = this;\n <div>\n <Media className=\"image-media\" type=\"image\" src=\"https://example.com/cover.png\" />\n <Media className=\"video-media\" type=\"video\" src=\"https://example.com/demo.mp4\" />\n <Media className=\"audio-media\" type=\"audio\" src=\"https://example.com/demo.mp3\" />\n </div>\n ";
|
|
867
|
+
_mount19 = mount(Demo), element = _mount19[1];
|
|
868
|
+
_context38.next = 7;
|
|
869
|
+
return wait();
|
|
870
|
+
case 7:
|
|
871
|
+
expect(element.querySelector('.image-media').className).to.contain('k-media-done');
|
|
872
|
+
expect(element.querySelector('.video-media').className).to.contain('k-media-done');
|
|
873
|
+
expect(element.querySelector('.audio-media').className).to.contain('k-media-done');
|
|
874
|
+
expect(element.querySelector('.k-media-loading-indicator')).to.eql(null);
|
|
875
|
+
expect(element.querySelectorAll('.k-media-preview-trigger').length).to.eql(3);
|
|
876
|
+
case 12:
|
|
877
|
+
_context38.prev = 12;
|
|
878
|
+
restores.forEach(function (restore) {
|
|
879
|
+
return restore();
|
|
880
|
+
});
|
|
881
|
+
return _context38.finish(12);
|
|
882
|
+
case 15:
|
|
883
|
+
case "end":
|
|
884
|
+
return _context38.stop();
|
|
885
|
+
}
|
|
886
|
+
}, _callee19, null, [[1,, 12, 15]]);
|
|
887
|
+
})));
|
|
888
|
+
// 外部 status 优先级高于内部自动状态。
|
|
889
|
+
it('should let status prop override internal status', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee20() {
|
|
890
|
+
var Demo, _mount20, element, loadingMedia, errorMedia, doneMedia;
|
|
891
|
+
return _regeneratorRuntime.wrap(function _callee20$(_context40) {
|
|
892
|
+
while (1) switch (_context40.prev = _context40.next) {
|
|
893
|
+
case 0:
|
|
894
|
+
Demo = /*#__PURE__*/function (_Component20) {
|
|
895
|
+
_inheritsLoose(Demo, _Component20);
|
|
896
|
+
function Demo() {
|
|
897
|
+
var _context39;
|
|
898
|
+
var _this20;
|
|
899
|
+
for (var _len20 = arguments.length, args = new Array(_len20), _key20 = 0; _key20 < _len20; _key20++) {
|
|
900
|
+
args[_key20] = arguments[_key20];
|
|
901
|
+
}
|
|
902
|
+
_this20 = _Component20.call.apply(_Component20, _concatInstanceProperty(_context39 = [this]).call(_context39, args)) || this;
|
|
903
|
+
_this20.Media = Media;
|
|
904
|
+
return _this20;
|
|
905
|
+
}
|
|
906
|
+
return Demo;
|
|
907
|
+
}(Component);
|
|
908
|
+
Demo.template = "\n const { Media } = this;\n <div>\n <Media className=\"loading-media\" type=\"image\" status=\"loading\" src=\"https://example.com/loading.png\" />\n <Media className=\"error-media\" type=\"video\" status=\"error\" src=\"https://example.com/error.mp4\" />\n <Media className=\"done-media\" type=\"audio\" status=\"done\" src=\"https://example.com/done.mp3\" />\n </div>\n ";
|
|
909
|
+
_mount20 = mount(Demo), element = _mount20[1];
|
|
910
|
+
loadingMedia = element.querySelector('.loading-media');
|
|
911
|
+
errorMedia = element.querySelector('.error-media');
|
|
912
|
+
doneMedia = element.querySelector('.done-media');
|
|
913
|
+
dispatchMediaEvent(loadingMedia.querySelector('img.k-media-image'), 'load');
|
|
914
|
+
dispatchMediaEvent(doneMedia.querySelector('audio.k-media-audio-loader'), 'error');
|
|
915
|
+
_context40.next = 10;
|
|
916
|
+
return wait();
|
|
917
|
+
case 10:
|
|
918
|
+
expect(loadingMedia.className).to.contain('k-media-loading');
|
|
919
|
+
expect(loadingMedia.querySelector('.k-media-loading-spinner')).not.to.eql(null);
|
|
920
|
+
expect(loadingMedia.querySelector('.k-media-status-layer')).to.eql(null);
|
|
921
|
+
expect(errorMedia.className).to.contain('k-media-error');
|
|
922
|
+
expect(errorMedia.querySelector('.k-media-error-card')).not.to.eql(null);
|
|
923
|
+
expect(errorMedia.querySelector('.k-media-placeholder')).to.eql(null);
|
|
924
|
+
expect(errorMedia.querySelector('.k-media-status-layer')).to.eql(null);
|
|
925
|
+
expect(doneMedia.className).to.contain('k-media-done');
|
|
926
|
+
expect(doneMedia.querySelector('.k-media-loading-indicator')).to.eql(null);
|
|
927
|
+
expect(doneMedia.querySelector('.k-media-preview-trigger').disabled).to.eql(false);
|
|
928
|
+
case 20:
|
|
929
|
+
case "end":
|
|
930
|
+
return _context40.stop();
|
|
931
|
+
}
|
|
932
|
+
}, _callee20);
|
|
933
|
+
})));
|
|
934
|
+
// 音频 loading 展示居中的音频图标,并和图片/视频一致展示左上角加载圆圈。
|
|
935
|
+
it('should render centered audio icon and loading indicator for loading audio card', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee21() {
|
|
936
|
+
var Demo, _mount21, element, audio, mini, compact, singleWidth, customSize, wide, icon, miniIcon, compactIcon, singleWidthIcon, customSizeIcon, wideIcon;
|
|
937
|
+
return _regeneratorRuntime.wrap(function _callee21$(_context42) {
|
|
938
|
+
while (1) switch (_context42.prev = _context42.next) {
|
|
939
|
+
case 0:
|
|
940
|
+
Demo = /*#__PURE__*/function (_Component21) {
|
|
941
|
+
_inheritsLoose(Demo, _Component21);
|
|
942
|
+
function Demo() {
|
|
943
|
+
var _context41;
|
|
944
|
+
var _this21;
|
|
945
|
+
for (var _len21 = arguments.length, args = new Array(_len21), _key21 = 0; _key21 < _len21; _key21++) {
|
|
946
|
+
args[_key21] = arguments[_key21];
|
|
947
|
+
}
|
|
948
|
+
_this21 = _Component21.call.apply(_Component21, _concatInstanceProperty(_context41 = [this]).call(_context41, args)) || this;
|
|
949
|
+
_this21.Media = Media;
|
|
950
|
+
return _this21;
|
|
951
|
+
}
|
|
952
|
+
return Demo;
|
|
953
|
+
}(Component);
|
|
954
|
+
Demo.template = "\n const { Media } = this;\n <div>\n <Media className=\"audio-loading\" type=\"audio\" status=\"loading\" src=\"https://example.com/loading.mp3\" />\n <Media className=\"audio-loading-mini\" type=\"audio\" size=\"mini\" status=\"loading\" src=\"https://example.com/loading.mp3\" />\n <Media className=\"audio-loading-compact\" type=\"audio\" width={20} height={28} status=\"loading\" src=\"https://example.com/loading.mp3\" />\n <Media className=\"audio-loading-single-width\" type=\"audio\" width={18} status=\"loading\" src=\"https://example.com/loading.mp3\" />\n <Media className=\"audio-loading-custom-size\" type=\"audio\" size={22} status=\"loading\" src=\"https://example.com/loading.mp3\" />\n <Media className=\"audio-loading-wide\" type=\"audio\" width={36} height={40} status=\"loading\" src=\"https://example.com/loading.mp3\" />\n </div>\n ";
|
|
955
|
+
_mount21 = mount(Demo), element = _mount21[1];
|
|
956
|
+
audio = element.querySelector('.audio-loading');
|
|
957
|
+
mini = element.querySelector('.audio-loading-mini');
|
|
958
|
+
compact = element.querySelector('.audio-loading-compact');
|
|
959
|
+
singleWidth = element.querySelector('.audio-loading-single-width');
|
|
960
|
+
customSize = element.querySelector('.audio-loading-custom-size');
|
|
961
|
+
wide = element.querySelector('.audio-loading-wide');
|
|
962
|
+
icon = audio.querySelector('.k-media-audio-card-icon');
|
|
963
|
+
miniIcon = mini.querySelector('.k-media-audio-card-icon');
|
|
964
|
+
compactIcon = compact.querySelector('.k-media-audio-card-icon');
|
|
965
|
+
singleWidthIcon = singleWidth.querySelector('.k-media-audio-card-icon');
|
|
966
|
+
customSizeIcon = customSize.querySelector('.k-media-audio-card-icon');
|
|
967
|
+
wideIcon = wide.querySelector('.k-media-audio-card-icon');
|
|
968
|
+
expect(audio.querySelector('.k-media-audio-card-name')).to.eql(null);
|
|
969
|
+
expect(audio.querySelector('.k-media-loading-indicator')).not.to.eql(null);
|
|
970
|
+
expect(audio.querySelector('.k-media-loading-spinner')).not.to.eql(null);
|
|
971
|
+
expect(mini.querySelector('.k-media-audio-card-name')).to.eql(null);
|
|
972
|
+
expect(getComputedStyle(icon).width).to.eql('32px');
|
|
973
|
+
expect(getComputedStyle(icon).height).to.eql('32px');
|
|
974
|
+
expect(getComputedStyle(miniIcon).width).to.eql('24px');
|
|
975
|
+
expect(getComputedStyle(miniIcon).height).to.eql('24px');
|
|
976
|
+
expect(getComputedStyle(compactIcon).width).to.eql('20px');
|
|
977
|
+
expect(getComputedStyle(compactIcon).height).to.eql('20px');
|
|
978
|
+
expect(getComputedStyle(singleWidthIcon).width).to.eql('18px');
|
|
979
|
+
expect(getComputedStyle(singleWidthIcon).height).to.eql('18px');
|
|
980
|
+
expect(getComputedStyle(customSizeIcon).width).to.eql('22px');
|
|
981
|
+
expect(getComputedStyle(customSizeIcon).height).to.eql('22px');
|
|
982
|
+
expect(getComputedStyle(wideIcon).width).to.eql('32px');
|
|
983
|
+
expect(getComputedStyle(wideIcon).height).to.eql('32px');
|
|
984
|
+
case 31:
|
|
985
|
+
case "end":
|
|
986
|
+
return _context42.stop();
|
|
987
|
+
}
|
|
988
|
+
}, _callee21);
|
|
989
|
+
})));
|
|
990
|
+
// 图片/视频 loading 使用骨架底图和小型加载圆圈。
|
|
991
|
+
it('should render skeleton loading styles with spinner', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee22() {
|
|
992
|
+
var Demo, _mount22, element, shell, indicator, spinner, miniIndicator, miniSpinner, shellStyle;
|
|
993
|
+
return _regeneratorRuntime.wrap(function _callee22$(_context44) {
|
|
994
|
+
while (1) switch (_context44.prev = _context44.next) {
|
|
995
|
+
case 0:
|
|
996
|
+
Demo = /*#__PURE__*/function (_Component22) {
|
|
997
|
+
_inheritsLoose(Demo, _Component22);
|
|
998
|
+
function Demo() {
|
|
999
|
+
var _context43;
|
|
1000
|
+
var _this22;
|
|
1001
|
+
for (var _len22 = arguments.length, args = new Array(_len22), _key22 = 0; _key22 < _len22; _key22++) {
|
|
1002
|
+
args[_key22] = arguments[_key22];
|
|
1003
|
+
}
|
|
1004
|
+
_this22 = _Component22.call.apply(_Component22, _concatInstanceProperty(_context43 = [this]).call(_context43, args)) || this;
|
|
1005
|
+
_this22.Media = Media;
|
|
1006
|
+
return _this22;
|
|
1007
|
+
}
|
|
1008
|
+
return Demo;
|
|
1009
|
+
}(Component);
|
|
1010
|
+
Demo.template = "\n const { Media } = this;\n <div>\n <Media className=\"loading-media\" type=\"image\" status=\"loading\" src=\"https://example.com/loading.png\" />\n <Media className=\"mini-loading-media\" type=\"image\" size=\"mini\" status=\"loading\" src=\"https://example.com/loading.png\" />\n </div>\n ";
|
|
1011
|
+
_mount22 = mount(Demo), element = _mount22[1];
|
|
1012
|
+
shell = element.querySelector('.loading-media .k-media-shell');
|
|
1013
|
+
indicator = element.querySelector('.loading-media .k-media-loading-indicator');
|
|
1014
|
+
spinner = element.querySelector('.loading-media .k-media-loading-spinner');
|
|
1015
|
+
miniIndicator = element.querySelector('.mini-loading-media .k-media-loading-indicator');
|
|
1016
|
+
miniSpinner = element.querySelector('.mini-loading-media .k-media-loading-spinner');
|
|
1017
|
+
shellStyle = getComputedStyle(shell);
|
|
1018
|
+
expect(shellStyle.backgroundImage).to.contain('linear-gradient');
|
|
1019
|
+
expect(shellStyle.backgroundSize).to.eql('400% 100%');
|
|
1020
|
+
expect(getComputedStyle(indicator).top).to.eql('3px');
|
|
1021
|
+
expect(getComputedStyle(indicator).left).to.eql('3px');
|
|
1022
|
+
expect(getComputedStyle(spinner).width).to.eql('12px');
|
|
1023
|
+
expect(getComputedStyle(spinner).height).to.eql('12px');
|
|
1024
|
+
expect(getComputedStyle(miniIndicator).top).to.eql('4px');
|
|
1025
|
+
expect(getComputedStyle(miniSpinner).width).to.eql('10px');
|
|
1026
|
+
case 17:
|
|
1027
|
+
case "end":
|
|
1028
|
+
return _context44.stop();
|
|
1029
|
+
}
|
|
1030
|
+
}, _callee22);
|
|
1031
|
+
})));
|
|
1032
|
+
// loading/error 插槽可接管默认状态层展示。
|
|
1033
|
+
it('should render custom loading and error slots', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee23() {
|
|
1034
|
+
var _loading$querySelecto, _error$querySelector, _audioLoading$querySe, _audioError$querySele;
|
|
1035
|
+
var Demo, _mount23, element, loading, error, audioLoading, audioError;
|
|
1036
|
+
return _regeneratorRuntime.wrap(function _callee23$(_context46) {
|
|
1037
|
+
while (1) switch (_context46.prev = _context46.next) {
|
|
1038
|
+
case 0:
|
|
1039
|
+
Demo = /*#__PURE__*/function (_Component23) {
|
|
1040
|
+
_inheritsLoose(Demo, _Component23);
|
|
1041
|
+
function Demo() {
|
|
1042
|
+
var _context45;
|
|
1043
|
+
var _this23;
|
|
1044
|
+
for (var _len23 = arguments.length, args = new Array(_len23), _key23 = 0; _key23 < _len23; _key23++) {
|
|
1045
|
+
args[_key23] = arguments[_key23];
|
|
1046
|
+
}
|
|
1047
|
+
_this23 = _Component23.call.apply(_Component23, _concatInstanceProperty(_context45 = [this]).call(_context45, args)) || this;
|
|
1048
|
+
_this23.Media = Media;
|
|
1049
|
+
return _this23;
|
|
1050
|
+
}
|
|
1051
|
+
return Demo;
|
|
1052
|
+
}(Component);
|
|
1053
|
+
Demo.template = "\n const { Media } = this;\n <div>\n <Media\n className=\"custom-loading\"\n name=\"\u4E0A\u4F20\u4E2D.png\"\n type=\"image\"\n status=\"loading\"\n src=\"https://example.com/loading.png\"\n >\n <b:loading args=\"media\">\n <div class=\"custom-loading-slot\">\n {media.status} / {media.resolvedType} / {media.name}\n </div>\n </b:loading>\n </Media>\n <Media\n className=\"custom-error\"\n name=\"\u52A0\u8F7D\u5931\u8D25.mp4\"\n type=\"video\"\n status=\"error\"\n src=\"https://example.com/error.mp4\"\n >\n <b:error args=\"media\">\n <button class=\"custom-error-slot\" type=\"button\">\n {media.status} / {media.resolvedType} / {media.name}\n </button>\n </b:error>\n </Media>\n <Media\n className=\"custom-audio-loading\"\n name=\"\u4E0A\u4F20\u4E2D.mp3\"\n type=\"audio\"\n status=\"loading\"\n src=\"https://example.com/loading.mp3\"\n >\n <b:loading args=\"media\">\n <div class=\"custom-audio-loading-slot\">\n {media.status} / {media.resolvedType} / {media.name}\n </div>\n </b:loading>\n </Media>\n <Media\n className=\"custom-audio-error\"\n name=\"\u52A0\u8F7D\u5931\u8D25.mp3\"\n type=\"audio\"\n status=\"error\"\n src=\"https://example.com/error.mp3\"\n >\n <b:error args=\"media\">\n <div class=\"custom-audio-error-slot\">\n {media.status} / {media.resolvedType} / {media.name}\n </div>\n </b:error>\n </Media>\n </div>\n ";
|
|
1054
|
+
_mount23 = mount(Demo), element = _mount23[1];
|
|
1055
|
+
loading = element.querySelector('.custom-loading');
|
|
1056
|
+
error = element.querySelector('.custom-error');
|
|
1057
|
+
audioLoading = element.querySelector('.custom-audio-loading');
|
|
1058
|
+
audioError = element.querySelector('.custom-audio-error');
|
|
1059
|
+
expect((_loading$querySelecto = loading.querySelector('.custom-loading-slot')) == null ? void 0 : _loading$querySelecto.textContent).to.contain('loading / image / 上传中.png');
|
|
1060
|
+
expect(loading.querySelector('.k-media-loading-layer')).not.to.eql(null);
|
|
1061
|
+
expect(loading.querySelector('.k-media-loading-indicator')).to.eql(null);
|
|
1062
|
+
expect(loading.querySelector('.k-media-preview-trigger')).to.eql(null);
|
|
1063
|
+
expect((_error$querySelector = error.querySelector('.custom-error-slot')) == null ? void 0 : _error$querySelector.textContent).to.contain('error / video / 加载失败.mp4');
|
|
1064
|
+
expect(error.querySelector('.k-media-error-layer')).not.to.eql(null);
|
|
1065
|
+
expect(error.querySelector('.k-media-placeholder')).to.eql(null);
|
|
1066
|
+
expect(error.querySelector('.k-media-preview-trigger')).to.eql(null);
|
|
1067
|
+
expect((_audioLoading$querySe = audioLoading.querySelector('.custom-audio-loading-slot')) == null ? void 0 : _audioLoading$querySe.textContent).to.contain('loading / audio / 上传中.mp3');
|
|
1068
|
+
expect(audioLoading.querySelector('.k-media-loading-layer')).not.to.eql(null);
|
|
1069
|
+
expect(audioLoading.querySelector('.k-media-loading-indicator')).to.eql(null);
|
|
1070
|
+
expect(audioLoading.querySelector('.k-media-audio-card')).to.eql(null);
|
|
1071
|
+
expect((_audioError$querySele = audioError.querySelector('.custom-audio-error-slot')) == null ? void 0 : _audioError$querySele.textContent).to.contain('error / audio / 加载失败.mp3');
|
|
1072
|
+
expect(audioError.querySelector('.k-media-error-layer')).not.to.eql(null);
|
|
1073
|
+
expect(audioError.querySelector('.k-media-audio-card')).to.eql(null);
|
|
1074
|
+
case 22:
|
|
1075
|
+
case "end":
|
|
1076
|
+
return _context46.stop();
|
|
1077
|
+
}
|
|
1078
|
+
}, _callee23);
|
|
1079
|
+
})));
|
|
1080
|
+
// loading/error/mask 插槽为空时,不接管默认状态和预览入口。
|
|
1081
|
+
it('should ignore empty state and mask slots', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee24() {
|
|
1082
|
+
var Demo, _mount24, element, loading, error, mask;
|
|
1083
|
+
return _regeneratorRuntime.wrap(function _callee24$(_context48) {
|
|
1084
|
+
while (1) switch (_context48.prev = _context48.next) {
|
|
1085
|
+
case 0:
|
|
1086
|
+
Demo = /*#__PURE__*/function (_Component24) {
|
|
1087
|
+
_inheritsLoose(Demo, _Component24);
|
|
1088
|
+
function Demo() {
|
|
1089
|
+
var _context47;
|
|
1090
|
+
var _this24;
|
|
1091
|
+
for (var _len24 = arguments.length, args = new Array(_len24), _key24 = 0; _key24 < _len24; _key24++) {
|
|
1092
|
+
args[_key24] = arguments[_key24];
|
|
1093
|
+
}
|
|
1094
|
+
_this24 = _Component24.call.apply(_Component24, _concatInstanceProperty(_context47 = [this]).call(_context47, args)) || this;
|
|
1095
|
+
_this24.Media = Media;
|
|
1096
|
+
return _this24;
|
|
1097
|
+
}
|
|
1098
|
+
return Demo;
|
|
1099
|
+
}(Component);
|
|
1100
|
+
Demo.template = "\n const { Media } = this;\n <div>\n <Media className=\"empty-loading\" type=\"image\" status=\"loading\" src=\"https://example.com/loading.png\">\n <b:loading>\n <span v-if={false} class=\"empty-loading-slot\">loading</span>\n </b:loading>\n </Media>\n <Media className=\"empty-error\" type=\"image\" status=\"error\" src=\"https://example.com/error.png\">\n <b:error>\n <span v-if={false} class=\"empty-error-slot\">error</span>\n </b:error>\n </Media>\n <Media className=\"empty-mask\" type=\"image\" status=\"done\" src=\"https://example.com/cover.png\">\n <b:mask>\n <button v-if={false} class=\"empty-mask-slot\" type=\"button\">open</button>\n </b:mask>\n </Media>\n </div>\n ";
|
|
1101
|
+
_mount24 = mount(Demo), element = _mount24[1];
|
|
1102
|
+
loading = element.querySelector('.empty-loading');
|
|
1103
|
+
error = element.querySelector('.empty-error');
|
|
1104
|
+
mask = element.querySelector('.empty-mask');
|
|
1105
|
+
expect(loading.className).not.to.contain('k-media-custom-loading');
|
|
1106
|
+
expect(loading.querySelector('.k-media-loading-layer')).to.eql(null);
|
|
1107
|
+
expect(loading.querySelector('.k-media-loading-indicator')).not.to.eql(null);
|
|
1108
|
+
expect(error.className).not.to.contain('k-media-custom-error');
|
|
1109
|
+
expect(error.querySelector('.k-media-error-layer')).to.eql(null);
|
|
1110
|
+
expect(error.querySelector('.k-media-error-card')).not.to.eql(null);
|
|
1111
|
+
expect(error.querySelector('.k-media-placeholder')).to.eql(null);
|
|
1112
|
+
expect(mask.className).not.to.contain('k-media-custom-mask');
|
|
1113
|
+
expect(mask.querySelector('.k-media-preview-trigger')).not.to.eql(null);
|
|
1114
|
+
case 15:
|
|
1115
|
+
case "end":
|
|
1116
|
+
return _context48.stop();
|
|
1117
|
+
}
|
|
1118
|
+
}, _callee24);
|
|
1119
|
+
})));
|
|
1120
|
+
// 图片/视频/音频 error 展示居中的灰色类型图标,不展示默认失败文案。
|
|
1121
|
+
it('should render centered gray media icons for failed media cards', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee25() {
|
|
1122
|
+
var Demo, _mount25, element, image, imageCompact, video, audio, mini, imageIcon, compactIcon, videoIcon, audioIcon, miniIcon;
|
|
1123
|
+
return _regeneratorRuntime.wrap(function _callee25$(_context50) {
|
|
1124
|
+
while (1) switch (_context50.prev = _context50.next) {
|
|
1125
|
+
case 0:
|
|
1126
|
+
Demo = /*#__PURE__*/function (_Component25) {
|
|
1127
|
+
_inheritsLoose(Demo, _Component25);
|
|
1128
|
+
function Demo() {
|
|
1129
|
+
var _context49;
|
|
1130
|
+
var _this25;
|
|
1131
|
+
for (var _len25 = arguments.length, args = new Array(_len25), _key25 = 0; _key25 < _len25; _key25++) {
|
|
1132
|
+
args[_key25] = arguments[_key25];
|
|
1133
|
+
}
|
|
1134
|
+
_this25 = _Component25.call.apply(_Component25, _concatInstanceProperty(_context49 = [this]).call(_context49, args)) || this;
|
|
1135
|
+
_this25.Media = Media;
|
|
1136
|
+
return _this25;
|
|
1137
|
+
}
|
|
1138
|
+
return Demo;
|
|
1139
|
+
}(Component);
|
|
1140
|
+
Demo.template = "\n const { Media } = this;\n <div>\n <Media className=\"image-error\" type=\"image\" status=\"error\" src=\"https://example.com/error.png\" />\n <Media className=\"image-error-compact\" type=\"image\" width={20} height={28} status=\"error\" src=\"https://example.com/error.png\" />\n <Media className=\"video-error\" type=\"video\" status=\"error\" src=\"https://example.com/error.mp4\" />\n <Media className=\"audio-error\" type=\"audio\" status=\"error\" src=\"https://example.com/error.mp3\" />\n <Media className=\"audio-error-mini\" type=\"audio\" size=\"mini\" status=\"error\" src=\"https://example.com/error.mp3\" />\n </div>\n ";
|
|
1141
|
+
_mount25 = mount(Demo), element = _mount25[1];
|
|
1142
|
+
image = element.querySelector('.image-error');
|
|
1143
|
+
imageCompact = element.querySelector('.image-error-compact');
|
|
1144
|
+
video = element.querySelector('.video-error');
|
|
1145
|
+
audio = element.querySelector('.audio-error');
|
|
1146
|
+
mini = element.querySelector('.audio-error-mini');
|
|
1147
|
+
imageIcon = image.querySelector('.k-media-error-card-icon');
|
|
1148
|
+
compactIcon = imageCompact.querySelector('.k-media-error-card-icon');
|
|
1149
|
+
videoIcon = video.querySelector('.k-media-error-card-icon');
|
|
1150
|
+
audioIcon = audio.querySelector('.k-media-error-card-icon');
|
|
1151
|
+
miniIcon = mini.querySelector('.k-media-error-card-icon');
|
|
1152
|
+
expect(element.querySelectorAll('.k-media-error-card').length).to.eql(5);
|
|
1153
|
+
expect(element.querySelector('.k-media-placeholder')).to.eql(null);
|
|
1154
|
+
expect(imageIcon.src).to.contain('ECECEC');
|
|
1155
|
+
expect(imageIcon.src).to.contain('D6DCE7');
|
|
1156
|
+
expect(videoIcon.src).to.contain('ECECEC');
|
|
1157
|
+
expect(videoIcon.src).to.contain('D6DCE7');
|
|
1158
|
+
expect(audioIcon.src).to.contain('ECECEC');
|
|
1159
|
+
expect(audioIcon.src).to.contain('D6DCE7');
|
|
1160
|
+
expect(getComputedStyle(imageIcon).width).to.eql('32px');
|
|
1161
|
+
expect(getComputedStyle(imageIcon).height).to.eql('32px');
|
|
1162
|
+
expect(getComputedStyle(compactIcon).width).to.eql('20px');
|
|
1163
|
+
expect(getComputedStyle(compactIcon).height).to.eql('20px');
|
|
1164
|
+
expect(getComputedStyle(miniIcon).width).to.eql('24px');
|
|
1165
|
+
expect(getComputedStyle(miniIcon).height).to.eql('24px');
|
|
1166
|
+
expect(element.querySelector('.k-media-status-layer')).to.eql(null);
|
|
1167
|
+
case 28:
|
|
1168
|
+
case "end":
|
|
1169
|
+
return _context50.stop();
|
|
1170
|
+
}
|
|
1171
|
+
}, _callee25);
|
|
1172
|
+
})));
|
|
1173
|
+
// 名称 Tooltip 默认关闭,显式开启后图片/视频/音频缩略图 hover 时展示最大 160px 的名称。
|
|
1174
|
+
it('should hide media name tooltip by default and allow enabling it', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee26() {
|
|
1175
|
+
var Demo, _mount26, element, imageWithTooltip, videoWithTooltip, audioWithTooltip, withoutTooltip, imageTooltipTrigger, videoTooltipTrigger, audioTooltipTrigger, icon, content, name, videoPreviewTrigger;
|
|
1176
|
+
return _regeneratorRuntime.wrap(function _callee26$(_context52) {
|
|
1177
|
+
while (1) switch (_context52.prev = _context52.next) {
|
|
1178
|
+
case 0:
|
|
1179
|
+
Demo = /*#__PURE__*/function (_Component26) {
|
|
1180
|
+
_inheritsLoose(Demo, _Component26);
|
|
1181
|
+
function Demo() {
|
|
1182
|
+
var _context51;
|
|
1183
|
+
var _this26;
|
|
1184
|
+
for (var _len26 = arguments.length, args = new Array(_len26), _key26 = 0; _key26 < _len26; _key26++) {
|
|
1185
|
+
args[_key26] = arguments[_key26];
|
|
1186
|
+
}
|
|
1187
|
+
_this26 = _Component26.call.apply(_Component26, _concatInstanceProperty(_context51 = [this]).call(_context51, args)) || this;
|
|
1188
|
+
_this26.Media = Media;
|
|
1189
|
+
return _this26;
|
|
1190
|
+
}
|
|
1191
|
+
return Demo;
|
|
1192
|
+
}(Component);
|
|
1193
|
+
Demo.template = "\n const { Media } = this;\n <div>\n <Media\n className=\"image-with-tooltip\"\n name=\"\u5F88\u957F\u5F88\u957F\u5F88\u957F\u5F88\u957F\u5F88\u957F\u5F88\u957F\u7684\u56FE\u7247\u540D\u79F0.png\"\n type=\"image\"\n status=\"done\"\n src=\"https://example.com/cover.png\"\n showNameTooltip={true}\n nameTooltipProps={{position: 'bottom'}}\n />\n <Media\n className=\"video-with-tooltip\"\n name=\"\u4EA7\u54C1\u9884\u544A.mp4\"\n type=\"video\"\n status=\"done\"\n src=\"https://example.com/demo.mp4\"\n showNameTooltip={true}\n />\n <Media\n className=\"audio-with-tooltip\"\n name=\"\u5F88\u957F\u5F88\u957F\u5F88\u957F\u5F88\u957F\u5F88\u957F\u5F88\u957F\u7684\u97F3\u9891\u540D\u79F0.mp3\"\n type=\"audio\"\n status=\"done\"\n src=\"https://example.com/demo.mp3\"\n showNameTooltip={true}\n />\n <Media\n className=\"audio-without-tooltip\"\n name=\"\u666E\u901A\u97F3\u9891.mp3\"\n type=\"audio\"\n status=\"done\"\n src=\"https://example.com/normal.mp3\"\n showNameTooltip={false}\n />\n </div>\n ";
|
|
1194
|
+
_mount26 = mount(Demo), element = _mount26[1];
|
|
1195
|
+
imageWithTooltip = element.querySelector('.image-with-tooltip');
|
|
1196
|
+
videoWithTooltip = element.querySelector('.video-with-tooltip');
|
|
1197
|
+
audioWithTooltip = element.querySelector('.audio-with-tooltip');
|
|
1198
|
+
withoutTooltip = element.querySelector('.audio-without-tooltip');
|
|
1199
|
+
imageTooltipTrigger = imageWithTooltip.querySelector('.k-media-name-tooltip-trigger');
|
|
1200
|
+
videoTooltipTrigger = videoWithTooltip.querySelector('.k-media-name-tooltip-trigger');
|
|
1201
|
+
audioTooltipTrigger = audioWithTooltip.querySelector('.k-media-name-tooltip-trigger');
|
|
1202
|
+
icon = audioWithTooltip.querySelector('.k-media-audio-card-icon');
|
|
1203
|
+
expect(imageWithTooltip.getAttribute('title')).to.eql(null);
|
|
1204
|
+
expect(videoWithTooltip.getAttribute('title')).to.eql(null);
|
|
1205
|
+
expect(audioWithTooltip.getAttribute('title')).to.eql(null);
|
|
1206
|
+
expect(withoutTooltip.getAttribute('title')).to.eql('普通音频.mp3');
|
|
1207
|
+
expect(audioWithTooltip.querySelector('.k-media-audio-card-name')).to.eql(null);
|
|
1208
|
+
expect(imageTooltipTrigger).not.to.eql(null);
|
|
1209
|
+
expect(videoTooltipTrigger).not.to.eql(null);
|
|
1210
|
+
expect(audioTooltipTrigger).not.to.eql(null);
|
|
1211
|
+
expect(withoutTooltip.querySelector('.k-media-name-tooltip-trigger')).to.eql(null);
|
|
1212
|
+
expect(getComputedStyle(icon).width).to.eql('32px');
|
|
1213
|
+
expect(getComputedStyle(icon).height).to.eql('32px');
|
|
1214
|
+
dispatchEvent(imageTooltipTrigger, 'mouseenter');
|
|
1215
|
+
_context52.next = 25;
|
|
1216
|
+
return wait(0);
|
|
1217
|
+
case 25:
|
|
1218
|
+
content = getElement('.k-tooltip-content');
|
|
1219
|
+
name = content.querySelector('.k-media-name-tooltip-content');
|
|
1220
|
+
expect(content).not.to.eql(null);
|
|
1221
|
+
expect(content.textContent).to.contain('很长很长很长很长很长很长的图片名称.png');
|
|
1222
|
+
expect(content.className).to.contain('k-light');
|
|
1223
|
+
expect(name.style.maxWidth).to.eql('160px');
|
|
1224
|
+
expect(getComputedStyle(name).textOverflow).to.eql('ellipsis');
|
|
1225
|
+
expect(content.querySelector('.k-tooltip-arrow').className).to.contain('k-top');
|
|
1226
|
+
dispatchEvent(imageTooltipTrigger, 'mouseleave');
|
|
1227
|
+
_context52.next = 36;
|
|
1228
|
+
return wait(0);
|
|
1229
|
+
case 36:
|
|
1230
|
+
videoPreviewTrigger = videoWithTooltip.querySelector('.k-media-video-preview-trigger');
|
|
1231
|
+
dispatchEvent(videoPreviewTrigger, 'mouseenter');
|
|
1232
|
+
_context52.next = 40;
|
|
1233
|
+
return wait(0);
|
|
1234
|
+
case 40:
|
|
1235
|
+
content = getElement('.k-tooltip-content');
|
|
1236
|
+
expect(content.textContent).to.contain('产品预告.mp4');
|
|
1237
|
+
expect(content.className).to.contain('k-light');
|
|
1238
|
+
dispatchEvent(videoPreviewTrigger, 'mouseleave');
|
|
1239
|
+
_context52.next = 46;
|
|
1240
|
+
return wait(0);
|
|
1241
|
+
case 46:
|
|
1242
|
+
dispatchEvent(audioTooltipTrigger, 'mouseenter');
|
|
1243
|
+
_context52.next = 49;
|
|
1244
|
+
return wait(0);
|
|
1245
|
+
case 49:
|
|
1246
|
+
content = getElement('.k-tooltip-content');
|
|
1247
|
+
name = content.querySelector('.k-media-name-tooltip-content');
|
|
1248
|
+
expect(content.textContent).to.contain('很长很长很长很长很长很长的音频名称.mp3');
|
|
1249
|
+
expect(name.style.maxWidth).to.eql('160px');
|
|
1250
|
+
case 53:
|
|
1251
|
+
case "end":
|
|
1252
|
+
return _context52.stop();
|
|
1253
|
+
}
|
|
1254
|
+
}, _callee26);
|
|
1255
|
+
})));
|
|
1256
|
+
// size 支持预设尺寸和自定义正方形尺寸。
|
|
1257
|
+
it('should support named and custom sizes', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee27() {
|
|
1258
|
+
var Demo, _mount27, element, small, custom;
|
|
1259
|
+
return _regeneratorRuntime.wrap(function _callee27$(_context54) {
|
|
1260
|
+
while (1) switch (_context54.prev = _context54.next) {
|
|
1261
|
+
case 0:
|
|
1262
|
+
Demo = /*#__PURE__*/function (_Component27) {
|
|
1263
|
+
_inheritsLoose(Demo, _Component27);
|
|
1264
|
+
function Demo() {
|
|
1265
|
+
var _context53;
|
|
1266
|
+
var _this27;
|
|
1267
|
+
for (var _len27 = arguments.length, args = new Array(_len27), _key27 = 0; _key27 < _len27; _key27++) {
|
|
1268
|
+
args[_key27] = arguments[_key27];
|
|
1269
|
+
}
|
|
1270
|
+
_this27 = _Component27.call.apply(_Component27, _concatInstanceProperty(_context53 = [this]).call(_context53, args)) || this;
|
|
1271
|
+
_this27.Media = Media;
|
|
1272
|
+
return _this27;
|
|
1273
|
+
}
|
|
1274
|
+
return Demo;
|
|
1275
|
+
}(Component);
|
|
1276
|
+
Demo.template = "\n const { Media } = this;\n <div>\n <Media className=\"small-media\" type=\"image\" size=\"small\" src=\"https://example.com/a.png\" />\n <Media className=\"custom-media\" type=\"image\" size={88} src=\"https://example.com/b.png\" />\n </div>\n ";
|
|
1277
|
+
_mount27 = mount(Demo), element = _mount27[1];
|
|
1278
|
+
small = element.querySelector('.small-media');
|
|
1279
|
+
custom = element.querySelector('.custom-media');
|
|
1280
|
+
expect(small.className).to.contain('k-media-small');
|
|
1281
|
+
expect(custom.style.width).to.eql('88px');
|
|
1282
|
+
expect(custom.style.height).to.eql('88px');
|
|
1283
|
+
case 8:
|
|
1284
|
+
case "end":
|
|
1285
|
+
return _context54.stop();
|
|
1286
|
+
}
|
|
1287
|
+
}, _callee27);
|
|
1288
|
+
})));
|
|
1289
|
+
// width/height 单边传入时镜像另一边,双边传入时各自生效。
|
|
1290
|
+
it('should mirror single width or height and respect explicit dimensions', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee28() {
|
|
1291
|
+
var Demo, _mount28, element, widthOnly, heightOnly, both;
|
|
1292
|
+
return _regeneratorRuntime.wrap(function _callee28$(_context56) {
|
|
1293
|
+
while (1) switch (_context56.prev = _context56.next) {
|
|
1294
|
+
case 0:
|
|
1295
|
+
Demo = /*#__PURE__*/function (_Component28) {
|
|
1296
|
+
_inheritsLoose(Demo, _Component28);
|
|
1297
|
+
function Demo() {
|
|
1298
|
+
var _context55;
|
|
1299
|
+
var _this28;
|
|
1300
|
+
for (var _len28 = arguments.length, args = new Array(_len28), _key28 = 0; _key28 < _len28; _key28++) {
|
|
1301
|
+
args[_key28] = arguments[_key28];
|
|
1302
|
+
}
|
|
1303
|
+
_this28 = _Component28.call.apply(_Component28, _concatInstanceProperty(_context55 = [this]).call(_context55, args)) || this;
|
|
1304
|
+
_this28.Media = Media;
|
|
1305
|
+
return _this28;
|
|
1306
|
+
}
|
|
1307
|
+
return Demo;
|
|
1308
|
+
}(Component);
|
|
1309
|
+
Demo.template = "\n const { Media } = this;\n <div>\n <Media className=\"width-only\" type=\"image\" width={120} src=\"https://example.com/a.png\" />\n <Media className=\"height-only\" type=\"image\" height=\"48px\" src=\"https://example.com/b.png\" />\n <Media className=\"both-dimensions\" type=\"image\" width={120} height={80} src=\"https://example.com/c.png\" />\n </div>\n ";
|
|
1310
|
+
_mount28 = mount(Demo), element = _mount28[1];
|
|
1311
|
+
widthOnly = element.querySelector('.width-only');
|
|
1312
|
+
heightOnly = element.querySelector('.height-only');
|
|
1313
|
+
both = element.querySelector('.both-dimensions');
|
|
1314
|
+
expect(widthOnly.style.width).to.eql('120px');
|
|
1315
|
+
expect(widthOnly.style.height).to.eql('120px');
|
|
1316
|
+
expect(heightOnly.style.width).to.eql('48px');
|
|
1317
|
+
expect(heightOnly.style.height).to.eql('48px');
|
|
1318
|
+
expect(both.style.width).to.eql('120px');
|
|
1319
|
+
expect(both.style.height).to.eql('80px');
|
|
1320
|
+
case 12:
|
|
1321
|
+
case "end":
|
|
1322
|
+
return _context56.stop();
|
|
1323
|
+
}
|
|
1324
|
+
}, _callee28);
|
|
1325
|
+
})));
|
|
1326
|
+
// 根节点透传 class/style/data/aria 等通用属性。
|
|
1327
|
+
it('should pass rest props to root element', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee29() {
|
|
1328
|
+
var Demo, _mount29, element, media;
|
|
1329
|
+
return _regeneratorRuntime.wrap(function _callee29$(_context58) {
|
|
1330
|
+
while (1) switch (_context58.prev = _context58.next) {
|
|
1331
|
+
case 0:
|
|
1332
|
+
Demo = /*#__PURE__*/function (_Component29) {
|
|
1333
|
+
_inheritsLoose(Demo, _Component29);
|
|
1334
|
+
function Demo() {
|
|
1335
|
+
var _context57;
|
|
1336
|
+
var _this29;
|
|
1337
|
+
for (var _len29 = arguments.length, args = new Array(_len29), _key29 = 0; _key29 < _len29; _key29++) {
|
|
1338
|
+
args[_key29] = arguments[_key29];
|
|
1339
|
+
}
|
|
1340
|
+
_this29 = _Component29.call.apply(_Component29, _concatInstanceProperty(_context57 = [this]).call(_context57, args)) || this;
|
|
1341
|
+
_this29.Media = Media;
|
|
1342
|
+
return _this29;
|
|
1343
|
+
}
|
|
1344
|
+
return Demo;
|
|
1345
|
+
}(Component);
|
|
1346
|
+
Demo.template = "\n const { Media } = this;\n <div>\n <Media\n className=\"rest-media\"\n type=\"image\"\n status=\"done\"\n src=\"https://example.com/cover.png\"\n style={{marginTop: '3px'}}\n data-id=\"media\"\n aria-label=\"\u5A92\u4F53\u7F29\u7565\u56FE\"\n />\n </div>\n ";
|
|
1347
|
+
_mount29 = mount(Demo), element = _mount29[1];
|
|
1348
|
+
media = element.querySelector('.rest-media');
|
|
1349
|
+
expect(media.style.marginTop).to.eql('3px');
|
|
1350
|
+
expect(media.getAttribute('data-id')).to.eql('media');
|
|
1351
|
+
expect(media.getAttribute('aria-label')).to.eql('媒体缩略图');
|
|
1352
|
+
case 7:
|
|
1353
|
+
case "end":
|
|
1354
|
+
return _context58.stop();
|
|
1355
|
+
}
|
|
1356
|
+
}, _callee29);
|
|
1357
|
+
})));
|
|
1358
|
+
// 单项预览可打开并通过关闭按钮关闭。
|
|
1359
|
+
it('should open and close standalone preview', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee30() {
|
|
1360
|
+
var _getElement3;
|
|
1361
|
+
var Demo, _mount30, element, trigger, viewer;
|
|
1362
|
+
return _regeneratorRuntime.wrap(function _callee30$(_context60) {
|
|
1363
|
+
while (1) switch (_context60.prev = _context60.next) {
|
|
1364
|
+
case 0:
|
|
1365
|
+
Demo = /*#__PURE__*/function (_Component30) {
|
|
1366
|
+
_inheritsLoose(Demo, _Component30);
|
|
1367
|
+
function Demo() {
|
|
1368
|
+
var _context59;
|
|
1369
|
+
var _this30;
|
|
1370
|
+
for (var _len30 = arguments.length, args = new Array(_len30), _key30 = 0; _key30 < _len30; _key30++) {
|
|
1371
|
+
args[_key30] = arguments[_key30];
|
|
1372
|
+
}
|
|
1373
|
+
_this30 = _Component30.call.apply(_Component30, _concatInstanceProperty(_context59 = [this]).call(_context59, args)) || this;
|
|
1374
|
+
_this30.Media = Media;
|
|
1375
|
+
return _this30;
|
|
1376
|
+
}
|
|
1377
|
+
return Demo;
|
|
1378
|
+
}(Component);
|
|
1379
|
+
Demo.template = "\n const { Media } = this;\n <div>\n <Media\n name=\"\u5C01\u9762\u56FE\"\n type=\"image\"\n status=\"done\"\n src=\"https://example.com/cover.png\"\n />\n </div>\n ";
|
|
1380
|
+
_mount30 = mount(Demo), element = _mount30[1];
|
|
1381
|
+
trigger = element.querySelector('.k-media-preview-trigger');
|
|
1382
|
+
trigger.click();
|
|
1383
|
+
_context60.next = 7;
|
|
1384
|
+
return wait();
|
|
1385
|
+
case 7:
|
|
1386
|
+
viewer = getElement('.k-media-viewer');
|
|
1387
|
+
expect(viewer).not.to.eql(null);
|
|
1388
|
+
expect(getComputedStyle(viewer).position).to.eql('fixed');
|
|
1389
|
+
expect(getComputedStyle(viewer).display).to.eql('flex');
|
|
1390
|
+
expect((_getElement3 = getElement('.k-media-viewer-title')) == null ? void 0 : _getElement3.textContent).to.contain('封面图');
|
|
1391
|
+
getElement('.k-media-viewer-close').click();
|
|
1392
|
+
_context60.next = 15;
|
|
1393
|
+
return wait(400);
|
|
1394
|
+
case 15:
|
|
1395
|
+
expectViewerClosed();
|
|
1396
|
+
case 16:
|
|
1397
|
+
case "end":
|
|
1398
|
+
return _context60.stop();
|
|
1399
|
+
}
|
|
1400
|
+
}, _callee30);
|
|
1401
|
+
})));
|
|
1402
|
+
// 单项预览支持挂载到指定 Portal 容器。
|
|
1403
|
+
it('should mount standalone preview into custom container', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee31() {
|
|
1404
|
+
var Demo, _mount31, element, container;
|
|
1405
|
+
return _regeneratorRuntime.wrap(function _callee31$(_context62) {
|
|
1406
|
+
while (1) switch (_context62.prev = _context62.next) {
|
|
1407
|
+
case 0:
|
|
1408
|
+
Demo = /*#__PURE__*/function (_Component31) {
|
|
1409
|
+
_inheritsLoose(Demo, _Component31);
|
|
1410
|
+
function Demo() {
|
|
1411
|
+
var _context61;
|
|
1412
|
+
var _this31;
|
|
1413
|
+
for (var _len31 = arguments.length, args = new Array(_len31), _key31 = 0; _key31 < _len31; _key31++) {
|
|
1414
|
+
args[_key31] = arguments[_key31];
|
|
1415
|
+
}
|
|
1416
|
+
_this31 = _Component31.call.apply(_Component31, _concatInstanceProperty(_context61 = [this]).call(_context61, args)) || this;
|
|
1417
|
+
_this31.Media = Media;
|
|
1418
|
+
return _this31;
|
|
1419
|
+
}
|
|
1420
|
+
return Demo;
|
|
1421
|
+
}(Component);
|
|
1422
|
+
Demo.template = "\n const { Media } = this;\n <div>\n <div id=\"media-preview-container\"></div>\n <Media\n type=\"image\"\n status=\"done\"\n src=\"https://example.com/cover.png\"\n container=\"#media-preview-container\"\n />\n </div>\n ";
|
|
1423
|
+
_mount31 = mount(Demo), element = _mount31[1];
|
|
1424
|
+
element.querySelector('.k-media-preview-trigger').click();
|
|
1425
|
+
_context62.next = 6;
|
|
1426
|
+
return wait();
|
|
1427
|
+
case 6:
|
|
1428
|
+
container = element.querySelector('#media-preview-container');
|
|
1429
|
+
expect(container.querySelector('.k-media-viewer')).not.to.eql(null);
|
|
1430
|
+
case 8:
|
|
1431
|
+
case "end":
|
|
1432
|
+
return _context62.stop();
|
|
1433
|
+
}
|
|
1434
|
+
}, _callee31);
|
|
1435
|
+
})));
|
|
1436
|
+
// 点击真实预览内容不关闭,点击内容空白区或遮罩关闭。
|
|
1437
|
+
it('should close standalone preview on mask click only', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee32() {
|
|
1438
|
+
var Demo, _mount32, element, previewTrigger, stage, content, viewer;
|
|
1439
|
+
return _regeneratorRuntime.wrap(function _callee32$(_context64) {
|
|
1440
|
+
while (1) switch (_context64.prev = _context64.next) {
|
|
1441
|
+
case 0:
|
|
1442
|
+
Demo = /*#__PURE__*/function (_Component32) {
|
|
1443
|
+
_inheritsLoose(Demo, _Component32);
|
|
1444
|
+
function Demo() {
|
|
1445
|
+
var _context63;
|
|
1446
|
+
var _this32;
|
|
1447
|
+
for (var _len32 = arguments.length, args = new Array(_len32), _key32 = 0; _key32 < _len32; _key32++) {
|
|
1448
|
+
args[_key32] = arguments[_key32];
|
|
1449
|
+
}
|
|
1450
|
+
_this32 = _Component32.call.apply(_Component32, _concatInstanceProperty(_context63 = [this]).call(_context63, args)) || this;
|
|
1451
|
+
_this32.Media = Media;
|
|
1452
|
+
return _this32;
|
|
1453
|
+
}
|
|
1454
|
+
return Demo;
|
|
1455
|
+
}(Component);
|
|
1456
|
+
Demo.template = "\n const { Media } = this;\n <div>\n <Media\n type=\"image\"\n status=\"done\"\n src=\"https://example.com/cover.png\"\n />\n </div>\n ";
|
|
1457
|
+
_mount32 = mount(Demo), element = _mount32[1];
|
|
1458
|
+
previewTrigger = element.querySelector('.k-media-preview-trigger');
|
|
1459
|
+
expect(previewTrigger).to.exist;
|
|
1460
|
+
previewTrigger.click();
|
|
1461
|
+
_context64.next = 8;
|
|
1462
|
+
return wait(60);
|
|
1463
|
+
case 8:
|
|
1464
|
+
stage = getElement('.k-media-viewer-stage');
|
|
1465
|
+
expect(stage).to.exist;
|
|
1466
|
+
content = stage.querySelector('.k-media-viewer-image, .k-media-viewer-video, .k-media-viewer-audio');
|
|
1467
|
+
expect(content).to.exist;
|
|
1468
|
+
content.click();
|
|
1469
|
+
_context64.next = 15;
|
|
1470
|
+
return wait();
|
|
1471
|
+
case 15:
|
|
1472
|
+
expect(getElement('.k-media-viewer')).not.to.eql(null);
|
|
1473
|
+
viewer = getElement('.k-media-viewer');
|
|
1474
|
+
expect(viewer).to.exist;
|
|
1475
|
+
viewer.click();
|
|
1476
|
+
_context64.next = 21;
|
|
1477
|
+
return wait(400);
|
|
1478
|
+
case 21:
|
|
1479
|
+
expectViewerClosed();
|
|
1480
|
+
case 22:
|
|
1481
|
+
case "end":
|
|
1482
|
+
return _context64.stop();
|
|
1483
|
+
}
|
|
1484
|
+
}, _callee32);
|
|
1485
|
+
})));
|
|
1486
|
+
// 预览层关闭、上一张、下一张按钮带有无障碍文案。
|
|
1487
|
+
it('should render accessibility labels for viewer buttons', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee33() {
|
|
1488
|
+
var Demo, _mount33, element;
|
|
1489
|
+
return _regeneratorRuntime.wrap(function _callee33$(_context66) {
|
|
1490
|
+
while (1) switch (_context66.prev = _context66.next) {
|
|
1491
|
+
case 0:
|
|
1492
|
+
Demo = /*#__PURE__*/function (_Component33) {
|
|
1493
|
+
_inheritsLoose(Demo, _Component33);
|
|
1494
|
+
function Demo() {
|
|
1495
|
+
var _context65;
|
|
1496
|
+
var _this33;
|
|
1497
|
+
for (var _len33 = arguments.length, args = new Array(_len33), _key33 = 0; _key33 < _len33; _key33++) {
|
|
1498
|
+
args[_key33] = arguments[_key33];
|
|
1499
|
+
}
|
|
1500
|
+
_this33 = _Component33.call.apply(_Component33, _concatInstanceProperty(_context65 = [this]).call(_context65, args)) || this;
|
|
1501
|
+
_this33.Media = Media;
|
|
1502
|
+
_this33.MediaGroup = MediaGroup;
|
|
1503
|
+
return _this33;
|
|
1504
|
+
}
|
|
1505
|
+
return Demo;
|
|
1506
|
+
}(Component);
|
|
1507
|
+
Demo.template = "\n const { Media, MediaGroup } = this;\n <MediaGroup>\n <Media name=\"\u7B2C\u4E00\u5F20\" type=\"image\" status=\"done\" src=\"https://example.com/1.png\" />\n <Media name=\"\u7B2C\u4E8C\u5F20\" type=\"image\" status=\"done\" src=\"https://example.com/2.png\" />\n </MediaGroup>\n ";
|
|
1508
|
+
_mount33 = mount(Demo), element = _mount33[1];
|
|
1509
|
+
element.querySelector('.k-media-preview-trigger').click();
|
|
1510
|
+
_context66.next = 6;
|
|
1511
|
+
return wait();
|
|
1512
|
+
case 6:
|
|
1513
|
+
expect(getViewerButton('.k-media-viewer-close').getAttribute('aria-label')).to.eql('关闭预览');
|
|
1514
|
+
expect(getViewerButton('.k-media-viewer-close').title).to.eql('关闭预览');
|
|
1515
|
+
expect(getViewerButton('.k-media-viewer-prev').getAttribute('aria-label')).to.eql('上一个');
|
|
1516
|
+
expect(getViewerButton('.k-media-viewer-prev').title).to.eql('上一个');
|
|
1517
|
+
expect(getViewerButton('.k-media-viewer-next').getAttribute('aria-label')).to.eql('下一个');
|
|
1518
|
+
expect(getViewerButton('.k-media-viewer-next').title).to.eql('下一个');
|
|
1519
|
+
case 12:
|
|
1520
|
+
case "end":
|
|
1521
|
+
return _context66.stop();
|
|
1522
|
+
}
|
|
1523
|
+
}, _callee33);
|
|
1524
|
+
})));
|
|
1525
|
+
// 音频预览复用缩略图中的默认音频封面素材。
|
|
1526
|
+
it('should use the same audio asset in standalone preview', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee34() {
|
|
1527
|
+
var Demo, _mount34, element, trigger, cover;
|
|
1528
|
+
return _regeneratorRuntime.wrap(function _callee34$(_context68) {
|
|
1529
|
+
while (1) switch (_context68.prev = _context68.next) {
|
|
1530
|
+
case 0:
|
|
1531
|
+
Demo = /*#__PURE__*/function (_Component34) {
|
|
1532
|
+
_inheritsLoose(Demo, _Component34);
|
|
1533
|
+
function Demo() {
|
|
1534
|
+
var _context67;
|
|
1535
|
+
var _this34;
|
|
1536
|
+
for (var _len34 = arguments.length, args = new Array(_len34), _key34 = 0; _key34 < _len34; _key34++) {
|
|
1537
|
+
args[_key34] = arguments[_key34];
|
|
1538
|
+
}
|
|
1539
|
+
_this34 = _Component34.call.apply(_Component34, _concatInstanceProperty(_context67 = [this]).call(_context67, args)) || this;
|
|
1540
|
+
_this34.Media = Media;
|
|
1541
|
+
return _this34;
|
|
1542
|
+
}
|
|
1543
|
+
return Demo;
|
|
1544
|
+
}(Component);
|
|
1545
|
+
Demo.template = "\n const { Media } = this;\n <div>\n <Media\n name=\"\u64AD\u5BA2\u7247\u6BB5.mp3\"\n type=\"audio\"\n status=\"done\"\n src=\"https://example.com/demo.mp3\"\n />\n </div>\n ";
|
|
1546
|
+
_mount34 = mount(Demo), element = _mount34[1];
|
|
1547
|
+
trigger = element.querySelector('.k-media-preview-trigger');
|
|
1548
|
+
trigger.click();
|
|
1549
|
+
_context68.next = 7;
|
|
1550
|
+
return wait();
|
|
1551
|
+
case 7:
|
|
1552
|
+
cover = getElement('.k-media-viewer-audio-cover-image');
|
|
1553
|
+
expect(cover).not.to.eql(null);
|
|
1554
|
+
expect(cover.src).to.contain('data:image/svg+xml');
|
|
1555
|
+
getElement('.k-media-viewer-close').click();
|
|
1556
|
+
_context68.next = 13;
|
|
1557
|
+
return wait(400);
|
|
1558
|
+
case 13:
|
|
1559
|
+
expectViewerClosed();
|
|
1560
|
+
case 14:
|
|
1561
|
+
case "end":
|
|
1562
|
+
return _context68.stop();
|
|
1563
|
+
}
|
|
1564
|
+
}, _callee34);
|
|
1565
|
+
})));
|
|
1566
|
+
// MediaGroup 支持前后切换,并在首尾正确禁用按钮。
|
|
1567
|
+
it('should switch preview items in media group and disable boundary buttons', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee35() {
|
|
1568
|
+
var _getElement4, _getElement5, _getElement6, _getElement7, _getElement8, _getElement9, _getElement10, _getElement11;
|
|
1569
|
+
var Demo, _mount35, element, group, firstMedia, triggers;
|
|
1570
|
+
return _regeneratorRuntime.wrap(function _callee35$(_context70) {
|
|
1571
|
+
while (1) switch (_context70.prev = _context70.next) {
|
|
1572
|
+
case 0:
|
|
1573
|
+
Demo = /*#__PURE__*/function (_Component35) {
|
|
1574
|
+
_inheritsLoose(Demo, _Component35);
|
|
1575
|
+
function Demo() {
|
|
1576
|
+
var _context69;
|
|
1577
|
+
var _this35;
|
|
1578
|
+
for (var _len35 = arguments.length, args = new Array(_len35), _key35 = 0; _key35 < _len35; _key35++) {
|
|
1579
|
+
args[_key35] = arguments[_key35];
|
|
1580
|
+
}
|
|
1581
|
+
_this35 = _Component35.call.apply(_Component35, _concatInstanceProperty(_context69 = [this]).call(_context69, args)) || this;
|
|
1582
|
+
_this35.Media = Media;
|
|
1583
|
+
_this35.MediaGroup = MediaGroup;
|
|
1584
|
+
return _this35;
|
|
1585
|
+
}
|
|
1586
|
+
return Demo;
|
|
1587
|
+
}(Component);
|
|
1588
|
+
Demo.template = "\n const { Media, MediaGroup } = this;\n <MediaGroup>\n <Media name=\"\u7B2C\u4E00\u5F20\" type=\"image\" status=\"done\" src=\"https://example.com/1.png\" />\n <Media name=\"\u7B2C\u4E8C\u5F20\" type=\"image\" status=\"done\" src=\"https://example.com/2.png\" />\n <Media name=\"\u7B2C\u4E09\u5F20\" type=\"image\" status=\"done\" src=\"https://example.com/3.png\" />\n </MediaGroup>\n ";
|
|
1589
|
+
_mount35 = mount(Demo), element = _mount35[1];
|
|
1590
|
+
group = getElement('.k-media-group');
|
|
1591
|
+
firstMedia = element.querySelector('.k-media');
|
|
1592
|
+
triggers = element.querySelectorAll('.k-media-preview-trigger');
|
|
1593
|
+
expect(getComputedStyle(group).display).to.eql('inline-flex');
|
|
1594
|
+
expect(getComputedStyle(firstMedia).width).to.eql('64px');
|
|
1595
|
+
expect(getComputedStyle(firstMedia).height).to.eql('64px');
|
|
1596
|
+
triggers[0].click();
|
|
1597
|
+
_context70.next = 12;
|
|
1598
|
+
return wait();
|
|
1599
|
+
case 12:
|
|
1600
|
+
expect((_getElement4 = getElement('.k-media-viewer-title')) == null ? void 0 : _getElement4.textContent).to.contain('第一张');
|
|
1601
|
+
expect((_getElement5 = getElement('.k-media-viewer-counter')) == null ? void 0 : _getElement5.textContent).to.contain('1 / 3');
|
|
1602
|
+
expect(getViewerButton('.k-media-viewer-prev').disabled).to.eql(true);
|
|
1603
|
+
expect(getViewerButton('.k-media-viewer-next').disabled).to.eql(false);
|
|
1604
|
+
getViewerButton('.k-media-viewer-prev').click();
|
|
1605
|
+
_context70.next = 19;
|
|
1606
|
+
return wait();
|
|
1607
|
+
case 19:
|
|
1608
|
+
expect((_getElement6 = getElement('.k-media-viewer-title')) == null ? void 0 : _getElement6.textContent).to.contain('第一张');
|
|
1609
|
+
getViewerButton('.k-media-viewer-next').click();
|
|
1610
|
+
_context70.next = 23;
|
|
1611
|
+
return wait();
|
|
1612
|
+
case 23:
|
|
1613
|
+
expect((_getElement7 = getElement('.k-media-viewer-title')) == null ? void 0 : _getElement7.textContent).to.contain('第二张');
|
|
1614
|
+
expect(getViewerButton('.k-media-viewer-prev').disabled).to.eql(false);
|
|
1615
|
+
expect(getViewerButton('.k-media-viewer-next').disabled).to.eql(false);
|
|
1616
|
+
getViewerButton('.k-media-viewer-prev').click();
|
|
1617
|
+
_context70.next = 29;
|
|
1618
|
+
return wait();
|
|
1619
|
+
case 29:
|
|
1620
|
+
expect((_getElement8 = getElement('.k-media-viewer-title')) == null ? void 0 : _getElement8.textContent).to.contain('第一张');
|
|
1621
|
+
expect(getViewerButton('.k-media-viewer-prev').disabled).to.eql(true);
|
|
1622
|
+
getViewerButton('.k-media-viewer-next').click();
|
|
1623
|
+
_context70.next = 34;
|
|
1624
|
+
return wait();
|
|
1625
|
+
case 34:
|
|
1626
|
+
dispatchEvent(document, 'keydown', {
|
|
1627
|
+
keyCode: 39
|
|
1628
|
+
});
|
|
1629
|
+
_context70.next = 37;
|
|
1630
|
+
return wait();
|
|
1631
|
+
case 37:
|
|
1632
|
+
expect((_getElement9 = getElement('.k-media-viewer-title')) == null ? void 0 : _getElement9.textContent).to.contain('第三张');
|
|
1633
|
+
expect((_getElement10 = getElement('.k-media-viewer-counter')) == null ? void 0 : _getElement10.textContent).to.contain('3 / 3');
|
|
1634
|
+
expect(getViewerButton('.k-media-viewer-prev').disabled).to.eql(false);
|
|
1635
|
+
expect(getViewerButton('.k-media-viewer-next').disabled).to.eql(true);
|
|
1636
|
+
getViewerButton('.k-media-viewer-next').click();
|
|
1637
|
+
_context70.next = 44;
|
|
1638
|
+
return wait();
|
|
1639
|
+
case 44:
|
|
1640
|
+
expect((_getElement11 = getElement('.k-media-viewer-title')) == null ? void 0 : _getElement11.textContent).to.contain('第三张');
|
|
1641
|
+
dispatchEvent(document, 'keydown', {
|
|
1642
|
+
keyCode: 27
|
|
1643
|
+
});
|
|
1644
|
+
_context70.next = 48;
|
|
1645
|
+
return wait(400);
|
|
1646
|
+
case 48:
|
|
1647
|
+
expectViewerClosed();
|
|
1648
|
+
case 49:
|
|
1649
|
+
case "end":
|
|
1650
|
+
return _context70.stop();
|
|
1651
|
+
}
|
|
1652
|
+
}, _callee35);
|
|
1653
|
+
})));
|
|
1654
|
+
// MediaGroup 的预览层同样支持挂载到指定 Portal 容器。
|
|
1655
|
+
it('should mount media group preview into custom container', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee36() {
|
|
1656
|
+
var _container$querySelec;
|
|
1657
|
+
var Demo, _mount36, element, container;
|
|
1658
|
+
return _regeneratorRuntime.wrap(function _callee36$(_context72) {
|
|
1659
|
+
while (1) switch (_context72.prev = _context72.next) {
|
|
1660
|
+
case 0:
|
|
1661
|
+
Demo = /*#__PURE__*/function (_Component36) {
|
|
1662
|
+
_inheritsLoose(Demo, _Component36);
|
|
1663
|
+
function Demo() {
|
|
1664
|
+
var _context71;
|
|
1665
|
+
var _this36;
|
|
1666
|
+
for (var _len36 = arguments.length, args = new Array(_len36), _key36 = 0; _key36 < _len36; _key36++) {
|
|
1667
|
+
args[_key36] = arguments[_key36];
|
|
1668
|
+
}
|
|
1669
|
+
_this36 = _Component36.call.apply(_Component36, _concatInstanceProperty(_context71 = [this]).call(_context71, args)) || this;
|
|
1670
|
+
_this36.Media = Media;
|
|
1671
|
+
_this36.MediaGroup = MediaGroup;
|
|
1672
|
+
return _this36;
|
|
1673
|
+
}
|
|
1674
|
+
return Demo;
|
|
1675
|
+
}(Component);
|
|
1676
|
+
Demo.template = "\n const { Media, MediaGroup } = this;\n <div>\n <div id=\"media-group-preview-container\"></div>\n <MediaGroup container=\"#media-group-preview-container\">\n <Media name=\"\u7B2C\u4E00\u5F20\" type=\"image\" status=\"done\" src=\"https://example.com/1.png\" />\n <Media name=\"\u7B2C\u4E8C\u5F20\" type=\"image\" status=\"done\" src=\"https://example.com/2.png\" />\n </MediaGroup>\n </div>\n ";
|
|
1677
|
+
_mount36 = mount(Demo), element = _mount36[1];
|
|
1678
|
+
element.querySelector('.k-media-preview-trigger').click();
|
|
1679
|
+
_context72.next = 6;
|
|
1680
|
+
return wait();
|
|
1681
|
+
case 6:
|
|
1682
|
+
container = element.querySelector('#media-group-preview-container');
|
|
1683
|
+
expect(container.querySelector('.k-media-viewer')).not.to.eql(null);
|
|
1684
|
+
expect((_container$querySelec = container.querySelector('.k-media-viewer-counter')) == null ? void 0 : _container$querySelec.textContent).to.contain('1 / 2');
|
|
1685
|
+
case 9:
|
|
1686
|
+
case "end":
|
|
1687
|
+
return _context72.stop();
|
|
1688
|
+
}
|
|
1689
|
+
}, _callee36);
|
|
1690
|
+
})));
|
|
1691
|
+
});
|