bigscreen-player 8.2.0 → 8.2.2
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/dist/esm/{imscsubtitles-119375e3.js → imscsubtitles-1ade53b5.js} +1 -1
- package/dist/esm/{legacysubtitles-6de060f9.js → legacysubtitles-c0af01e0.js} +1 -1
- package/dist/esm/{main-3159416c.js → main-98c741f8.js} +21 -15
- package/dist/esm/main.d.ts +13 -8
- package/dist/esm/main.js +1 -1
- package/dist/esm/{msestrategy-01ed7ba0.js → msestrategy-9bfd05cd.js} +12 -11
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { fromXML, generateISD, renderHTML } from 'smp-imsc';
|
|
2
|
-
import { f as findSegmentTemplate, L as LoadUrl, a as DebugToolInstance, P as Plugins, U as Utils, D as DOMHelpers } from './main-
|
|
2
|
+
import { f as findSegmentTemplate, L as LoadUrl, a as DebugToolInstance, P as Plugins, U as Utils, D as DOMHelpers } from './main-98c741f8.js';
|
|
3
3
|
|
|
4
4
|
const SEGMENTS_BUFFER_SIZE = 3;
|
|
5
5
|
const LOAD_ERROR_COUNT_MAX = 3;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { D as DOMHelpers, a as DebugToolInstance, P as Plugins, L as LoadUrl, T as TransportControlPosition } from './main-
|
|
1
|
+
import { D as DOMHelpers, a as DebugToolInstance, P as Plugins, L as LoadUrl, T as TransportControlPosition } from './main-98c741f8.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Safely checks if an attribute exists on an element.
|
|
@@ -903,8 +903,7 @@ function DebugTool() {
|
|
|
903
903
|
chronicle.setCurrentElementTime(seconds);
|
|
904
904
|
}
|
|
905
905
|
function apicall(functionName, functionArgs = []) {
|
|
906
|
-
|
|
907
|
-
debug(`Called '${functionName}${argsPart}'`);
|
|
906
|
+
chronicle.trace("apicall", { functionName, functionArgs });
|
|
908
907
|
}
|
|
909
908
|
function buffered(kind, buffered) {
|
|
910
909
|
chronicle.trace("buffered-ranges", { kind, buffered });
|
|
@@ -1118,6 +1117,8 @@ function LegacyPlayerAdapter(mediaSources, windowType, playbackElement, isUHD, p
|
|
|
1118
1117
|
}
|
|
1119
1118
|
|
|
1120
1119
|
function onTimeUpdate(event) {
|
|
1120
|
+
DebugToolInstance.updateElementTime(event.currentTime);
|
|
1121
|
+
|
|
1121
1122
|
isPaused = false;
|
|
1122
1123
|
|
|
1123
1124
|
// Note: Multiple consecutive CDN failover logic
|
|
@@ -1130,6 +1131,7 @@ function LegacyPlayerAdapter(mediaSources, windowType, playbackElement, isUHD, p
|
|
|
1130
1131
|
// Must publish this time update before checkSeekSucceded - which could cause a pause event
|
|
1131
1132
|
// This is a device specific event ordering issue.
|
|
1132
1133
|
publishTimeUpdate();
|
|
1134
|
+
|
|
1133
1135
|
if ((handleErrorOnExitingSeek || delayPauseOnExitSeek) && exitingSeek) {
|
|
1134
1136
|
checkSeekSucceeded(event.seekableRange.start, event.currentTime);
|
|
1135
1137
|
}
|
|
@@ -5679,14 +5681,16 @@ function BasicStrategy(mediaSources, windowType, mediaKind, playbackElement) {
|
|
|
5679
5681
|
}
|
|
5680
5682
|
|
|
5681
5683
|
function load(_mimeType, startTime) {
|
|
5682
|
-
if (
|
|
5684
|
+
if (mediaElement == null) {
|
|
5683
5685
|
setUpMediaElement(startTime);
|
|
5684
5686
|
setUpMediaListeners();
|
|
5685
|
-
|
|
5686
|
-
|
|
5687
|
-
setStartTime(startTime);
|
|
5688
|
-
mediaElement.load();
|
|
5687
|
+
|
|
5688
|
+
return
|
|
5689
5689
|
}
|
|
5690
|
+
|
|
5691
|
+
mediaElement.src = mediaSources.currentSource();
|
|
5692
|
+
setStartTime(startTime);
|
|
5693
|
+
mediaElement.load();
|
|
5690
5694
|
}
|
|
5691
5695
|
|
|
5692
5696
|
function setUpMediaElement(startTime) {
|
|
@@ -5756,6 +5760,8 @@ function BasicStrategy(mediaSources, windowType, mediaKind, playbackElement) {
|
|
|
5756
5760
|
}
|
|
5757
5761
|
|
|
5758
5762
|
function onTimeUpdate() {
|
|
5763
|
+
DebugToolInstance.updateElementTime(mediaElement.currentTime);
|
|
5764
|
+
|
|
5759
5765
|
publishTimeUpdate();
|
|
5760
5766
|
}
|
|
5761
5767
|
|
|
@@ -5928,7 +5934,7 @@ BasicStrategy.getLiveSupport = () => LiveSupport.SEEKABLE;
|
|
|
5928
5934
|
function StrategyPicker() {
|
|
5929
5935
|
return new Promise((resolve, reject) => {
|
|
5930
5936
|
if (window.bigscreenPlayer.playbackStrategy === PlaybackStrategy.MSE) {
|
|
5931
|
-
return import('./msestrategy-
|
|
5937
|
+
return import('./msestrategy-9bfd05cd.js')
|
|
5932
5938
|
.then(({ default: MSEStrategy }) => resolve(MSEStrategy))
|
|
5933
5939
|
.catch(() => {
|
|
5934
5940
|
reject({ error: "strategyDynamicLoadError" });
|
|
@@ -6375,7 +6381,7 @@ function CallCallbacks(callbacks, data) {
|
|
|
6375
6381
|
}
|
|
6376
6382
|
}
|
|
6377
6383
|
|
|
6378
|
-
var Version = "8.2.
|
|
6384
|
+
var Version = "8.2.2";
|
|
6379
6385
|
|
|
6380
6386
|
var sourceList;
|
|
6381
6387
|
var source;
|
|
@@ -7726,7 +7732,7 @@ function Subtitles(mediaPlayer, autoStart, playbackElement, defaultStyleOpts, me
|
|
|
7726
7732
|
|
|
7727
7733
|
if (available()) {
|
|
7728
7734
|
if (useLegacySubs) {
|
|
7729
|
-
import('./legacysubtitles-
|
|
7735
|
+
import('./legacysubtitles-c0af01e0.js')
|
|
7730
7736
|
.then(({ default: LegacySubtitles }) => {
|
|
7731
7737
|
subtitlesContainer = LegacySubtitles(mediaPlayer, autoStart, playbackElement, mediaSources, defaultStyleOpts);
|
|
7732
7738
|
callback(subtitlesEnabled);
|
|
@@ -7735,7 +7741,7 @@ function Subtitles(mediaPlayer, autoStart, playbackElement, defaultStyleOpts, me
|
|
|
7735
7741
|
Plugins.interface.onSubtitlesDynamicLoadError();
|
|
7736
7742
|
});
|
|
7737
7743
|
} else {
|
|
7738
|
-
import('./imscsubtitles-
|
|
7744
|
+
import('./imscsubtitles-1ade53b5.js')
|
|
7739
7745
|
.then(({ default: IMSCSubtitles }) => {
|
|
7740
7746
|
subtitlesContainer = IMSCSubtitles(mediaPlayer, autoStart, playbackElement, mediaSources, defaultStyleOpts);
|
|
7741
7747
|
callback(subtitlesEnabled);
|
|
@@ -8000,10 +8006,10 @@ function BigscreenPlayer() {
|
|
|
8000
8006
|
* @function
|
|
8001
8007
|
* @name init
|
|
8002
8008
|
* @param {HTMLDivElement} playbackElement - The Div element where content elements should be rendered
|
|
8003
|
-
* @param {
|
|
8009
|
+
* @param {InitData} bigscreenPlayerData
|
|
8004
8010
|
* @param {WindowTypes} newWindowType
|
|
8005
8011
|
* @param {boolean} enableSubtitles - Enable subtitles on initialisation
|
|
8006
|
-
* @param {
|
|
8012
|
+
* @param {InitCallbacks} callbacks
|
|
8007
8013
|
*/
|
|
8008
8014
|
init: (newPlaybackElement, bigscreenPlayerData, newWindowType, enableSubtitles, callbacks = {}) => {
|
|
8009
8015
|
playbackElement = newPlaybackElement;
|
|
@@ -8327,7 +8333,7 @@ function BigscreenPlayer() {
|
|
|
8327
8333
|
/**
|
|
8328
8334
|
* Customise the rendered subitles style
|
|
8329
8335
|
*
|
|
8330
|
-
* @param {
|
|
8336
|
+
* @param {SubtitlesCustomisationOptions} styleOpts
|
|
8331
8337
|
*/
|
|
8332
8338
|
customiseSubtitles: (styleOpts) => {
|
|
8333
8339
|
if (subtitles) {
|
|
@@ -8339,7 +8345,7 @@ function BigscreenPlayer() {
|
|
|
8339
8345
|
* Render an example subtitles string with a given style and location
|
|
8340
8346
|
*
|
|
8341
8347
|
* @param {string} xmlString - EBU-TT-D compliant XML String
|
|
8342
|
-
* @param {
|
|
8348
|
+
* @param {SubtitlesCustomisationOptions} styleOpts
|
|
8343
8349
|
* @param {DOMRect} safePosition
|
|
8344
8350
|
*/
|
|
8345
8351
|
renderSubtitleExample: (xmlString, styleOpts, safePosition) => {
|
package/dist/esm/main.d.ts
CHANGED
|
@@ -73,10 +73,10 @@ declare function BigscreenPlayer(): {
|
|
|
73
73
|
* @function
|
|
74
74
|
* @name init
|
|
75
75
|
* @param {HTMLDivElement} playbackElement - The Div element where content elements should be rendered
|
|
76
|
-
* @param {
|
|
76
|
+
* @param {InitData} bigscreenPlayerData
|
|
77
77
|
* @param {WindowTypes} newWindowType
|
|
78
78
|
* @param {boolean} enableSubtitles - Enable subtitles on initialisation
|
|
79
|
-
* @param {
|
|
79
|
+
* @param {InitCallbacks} callbacks
|
|
80
80
|
*/
|
|
81
81
|
init: (newPlaybackElement: any, bigscreenPlayerData: InitData, newWindowType: WindowTypes, enableSubtitles: boolean, callbacks?: InitCallbacks) => void;
|
|
82
82
|
/**
|
|
@@ -244,14 +244,14 @@ declare function BigscreenPlayer(): {
|
|
|
244
244
|
/**
|
|
245
245
|
* Customise the rendered subitles style
|
|
246
246
|
*
|
|
247
|
-
* @param {
|
|
247
|
+
* @param {SubtitlesCustomisationOptions} styleOpts
|
|
248
248
|
*/
|
|
249
249
|
customiseSubtitles: (styleOpts: SubtitlesCustomisationOptions) => void;
|
|
250
250
|
/**
|
|
251
251
|
* Render an example subtitles string with a given style and location
|
|
252
252
|
*
|
|
253
253
|
* @param {string} xmlString - EBU-TT-D compliant XML String
|
|
254
|
-
* @param {
|
|
254
|
+
* @param {SubtitlesCustomisationOptions} styleOpts
|
|
255
255
|
* @param {DOMRect} safePosition
|
|
256
256
|
*/
|
|
257
257
|
renderSubtitleExample: (xmlString: string, styleOpts: SubtitlesCustomisationOptions, safePosition: DOMRect) => void;
|
|
@@ -481,6 +481,7 @@ type FramesDropped = CreateMetric<"frames-dropped", number>;
|
|
|
481
481
|
type InitialPlaybackTime = CreateMetric<"initial-playback-time", number>;
|
|
482
482
|
type MediaElementEnded = CreateMetric<"ended", HTMLMediaElement["ended"]>;
|
|
483
483
|
type MediaElementPaused = CreateMetric<"paused", HTMLMediaElement["paused"]>;
|
|
484
|
+
type MediaElementPlaybackRate = CreateMetric<"playback-rate", HTMLMediaElement["playbackRate"]>;
|
|
484
485
|
type MediaElementReadyState = CreateMetric<"ready-state", HTMLMediaElement["readyState"]>;
|
|
485
486
|
type MediaElementSeeking = CreateMetric<"seeking", HTMLMediaElement["seeking"]>;
|
|
486
487
|
type PlaybackStrategy = CreateMetric<"strategy", string>;
|
|
@@ -490,7 +491,7 @@ type SeekableRange = CreateMetric<"seekable-range", [start: number, end: number]
|
|
|
490
491
|
type SubtitleCDNsAvailable = CreateMetric<"subtitle-cdns-available", string[]>;
|
|
491
492
|
type SubtitleCurrentUrl = CreateMetric<"subtitle-current-url", string>;
|
|
492
493
|
type Version = CreateMetric<"version", string>;
|
|
493
|
-
type Metric = AutoResume | BitRate | BufferLength | CDNsAvailable | CurrentUrl | Duration | FramesDropped | InitialPlaybackTime | MediaElementEnded | MediaElementPaused | MediaElementReadyState | MediaElementSeeking | PlaybackStrategy | RepresentationAudio | RepresentationVideo | SeekableRange | SubtitleCDNsAvailable | SubtitleCurrentUrl | Version;
|
|
494
|
+
type Metric = AutoResume | BitRate | BufferLength | CDNsAvailable | CurrentUrl | Duration | FramesDropped | InitialPlaybackTime | MediaElementEnded | MediaElementPaused | MediaElementPlaybackRate | MediaElementReadyState | MediaElementSeeking | PlaybackStrategy | RepresentationAudio | RepresentationVideo | SeekableRange | SubtitleCDNsAvailable | SubtitleCurrentUrl | Version;
|
|
494
495
|
type MetricKind = Metric["kind"];
|
|
495
496
|
type MetricForKind<Kind extends MetricKind> = Extract<Metric, {
|
|
496
497
|
kind: Kind;
|
|
@@ -501,6 +502,10 @@ type CreateTrace<Kind extends string, Data extends Primitives | Record<string, P
|
|
|
501
502
|
kind: Kind;
|
|
502
503
|
data: Data;
|
|
503
504
|
};
|
|
505
|
+
type ApiCall = CreateTrace<"apicall", {
|
|
506
|
+
functionName: string;
|
|
507
|
+
functionArgs: any[];
|
|
508
|
+
}>;
|
|
504
509
|
type BufferedRanges = CreateTrace<"buffered-ranges", {
|
|
505
510
|
kind: MediaKinds;
|
|
506
511
|
buffered: [start: number, end: number][];
|
|
@@ -524,7 +529,7 @@ type QuotaExceeded = CreateTrace<"quota-exceeded", {
|
|
|
524
529
|
type SessionStart = CreateTrace<"session-start", number>;
|
|
525
530
|
type SessionEnd = CreateTrace<"session-end", number>;
|
|
526
531
|
type StateChange = CreateTrace<"state-change", MediaState>;
|
|
527
|
-
type Trace = BufferedRanges | Error | Event | Gap | QuotaExceeded | SessionStart | SessionEnd | StateChange;
|
|
532
|
+
type Trace = ApiCall | BufferedRanges | Error | Event | Gap | QuotaExceeded | SessionStart | SessionEnd | StateChange;
|
|
528
533
|
type TraceKind = Trace["kind"];
|
|
529
534
|
type TraceForKind<Kind extends TraceKind> = Extract<Trace, {
|
|
530
535
|
kind: Kind;
|
|
@@ -576,8 +581,8 @@ declare const DebugToolInstance: {
|
|
|
576
581
|
info: (...parts: any[]) => void;
|
|
577
582
|
statechange: (value: MediaState) => void;
|
|
578
583
|
warn: (...parts: any[]) => void;
|
|
579
|
-
dynamicMetric: <Kind extends "auto-resume" | "bitrate" | "buffer-length" | "cdns-available" | "current-url" | "duration" | "frames-dropped" | "initial-playback-time" | "ended" | "paused" | "ready-state" | "seeking" | "strategy" | "representation-audio" | "representation-video" | "seekable-range" | "subtitle-cdns-available" | "subtitle-current-url" | "version">(kind: Kind, data: MetricForKind<Kind>["data"]) => void;
|
|
580
|
-
staticMetric: <Kind_1 extends "auto-resume" | "bitrate" | "buffer-length" | "cdns-available" | "current-url" | "duration" | "frames-dropped" | "initial-playback-time" | "ended" | "paused" | "ready-state" | "seeking" | "strategy" | "representation-audio" | "representation-video" | "seekable-range" | "subtitle-cdns-available" | "subtitle-current-url" | "version">(kind: Kind_1, data: MetricForKind<Kind_1>["data"]) => void;
|
|
584
|
+
dynamicMetric: <Kind extends "auto-resume" | "bitrate" | "buffer-length" | "cdns-available" | "current-url" | "duration" | "frames-dropped" | "initial-playback-time" | "ended" | "paused" | "playback-rate" | "ready-state" | "seeking" | "strategy" | "representation-audio" | "representation-video" | "seekable-range" | "subtitle-cdns-available" | "subtitle-current-url" | "version">(kind: Kind, data: MetricForKind<Kind>["data"]) => void;
|
|
585
|
+
staticMetric: <Kind_1 extends "auto-resume" | "bitrate" | "buffer-length" | "cdns-available" | "current-url" | "duration" | "frames-dropped" | "initial-playback-time" | "ended" | "paused" | "playback-rate" | "ready-state" | "seeking" | "strategy" | "representation-audio" | "representation-video" | "seekable-range" | "subtitle-cdns-available" | "subtitle-current-url" | "version">(kind: Kind_1, data: MetricForKind<Kind_1>["data"]) => void;
|
|
581
586
|
hide: () => void;
|
|
582
587
|
show: () => void;
|
|
583
588
|
setRootElement: (element: HTMLElement) => void;
|
package/dist/esm/main.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { B as BigscreenPlayer, a as DebugTool, E as EntryCategory, b as LiveSupport, c as MediaKinds, M as MediaState, g as MockBigscreenPlayer, h as PauseTriggers, i as PlaybackStrategy, j as TransferFormat, T as TransportControlPosition, W as WindowTypes, k as isMessage, l as isMetric, m as isTrace } from './main-
|
|
1
|
+
export { B as BigscreenPlayer, a as DebugTool, E as EntryCategory, b as LiveSupport, c as MediaKinds, M as MediaState, g as MockBigscreenPlayer, h as PauseTriggers, i as PlaybackStrategy, j as TransferFormat, T as TransportControlPosition, W as WindowTypes, k as isMessage, l as isMetric, m as isTrace } from './main-98c741f8.js';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { MediaPlayer } from 'dashjs/index_mediaplayerOnly';
|
|
2
|
-
import { W as WindowTypes, U as Utils, D as DOMHelpers, b as LiveSupport, a as DebugToolInstance, M as MediaState, P as Plugins, c as MediaKinds, d as TimeUtils, e as DynamicWindowUtils } from './main-
|
|
2
|
+
import { W as WindowTypes, U as Utils, D as DOMHelpers, b as LiveSupport, a as DebugToolInstance, M as MediaState, P as Plugins, c as MediaKinds, d as TimeUtils, e as DynamicWindowUtils } from './main-98c741f8.js';
|
|
3
3
|
|
|
4
4
|
function filter(manifest, representationOptions) {
|
|
5
5
|
const constantFps = representationOptions.constantFps;
|
|
@@ -325,13 +325,6 @@ function MSEStrategy(mediaSources, windowType, mediaKind, playbackElement, isUHD
|
|
|
325
325
|
onBuffering();
|
|
326
326
|
}
|
|
327
327
|
|
|
328
|
-
function onStalled() {
|
|
329
|
-
DebugToolInstance.event("stalled", "MediaElement");
|
|
330
|
-
DebugToolInstance.dynamicMetric("ready-state", mediaElement.readyState);
|
|
331
|
-
|
|
332
|
-
getBufferedRanges().map(({ kind, buffered }) => DebugToolInstance.buffered(kind, buffered));
|
|
333
|
-
}
|
|
334
|
-
|
|
335
328
|
function onEnded() {
|
|
336
329
|
DebugToolInstance.event("ended", "MediaElement");
|
|
337
330
|
DebugToolInstance.dynamicMetric("ended", mediaElement.ended);
|
|
@@ -341,7 +334,13 @@ function MSEStrategy(mediaSources, windowType, mediaKind, playbackElement, isUHD
|
|
|
341
334
|
publishMediaState(MediaState.ENDED);
|
|
342
335
|
}
|
|
343
336
|
|
|
337
|
+
function onRateChange() {
|
|
338
|
+
DebugToolInstance.dynamicMetric("playback-rate", mediaElement.playbackRate);
|
|
339
|
+
}
|
|
340
|
+
|
|
344
341
|
function onTimeUpdate() {
|
|
342
|
+
DebugToolInstance.updateElementTime(mediaElement.currentTime);
|
|
343
|
+
|
|
345
344
|
const currentMpdTimeSeconds =
|
|
346
345
|
windowType === WindowTypes.SLIDING
|
|
347
346
|
? mediaPlayer.getDashMetrics().getCurrentDVRInfo(mediaKind)?.time
|
|
@@ -368,7 +367,8 @@ function MSEStrategy(mediaSources, windowType, mediaKind, playbackElement, isUHD
|
|
|
368
367
|
}
|
|
369
368
|
|
|
370
369
|
if (event.error && event.error.message) {
|
|
371
|
-
DebugToolInstance.
|
|
370
|
+
DebugToolInstance.error(`${event.error.message} (code: ${event.error.code})`);
|
|
371
|
+
|
|
372
372
|
lastError = event.error;
|
|
373
373
|
|
|
374
374
|
// Don't raise an error on fragment download error
|
|
@@ -648,6 +648,7 @@ function MSEStrategy(mediaSources, windowType, mediaKind, playbackElement, isUHD
|
|
|
648
648
|
function setUpMediaListeners() {
|
|
649
649
|
DebugToolInstance.dynamicMetric("ended", mediaElement.ended);
|
|
650
650
|
DebugToolInstance.dynamicMetric("paused", mediaElement.paused);
|
|
651
|
+
DebugToolInstance.dynamicMetric("playback-rate", mediaElement.playbackRate);
|
|
651
652
|
DebugToolInstance.dynamicMetric("ready-state", mediaElement.readyState);
|
|
652
653
|
DebugToolInstance.dynamicMetric("seeking", mediaElement.seeking);
|
|
653
654
|
|
|
@@ -661,7 +662,7 @@ function MSEStrategy(mediaSources, windowType, mediaKind, playbackElement, isUHD
|
|
|
661
662
|
mediaElement.addEventListener("seeking", onSeeking);
|
|
662
663
|
mediaElement.addEventListener("seeked", onSeeked);
|
|
663
664
|
mediaElement.addEventListener("ended", onEnded);
|
|
664
|
-
mediaElement.addEventListener("
|
|
665
|
+
mediaElement.addEventListener("ratechange", onRateChange);
|
|
665
666
|
mediaPlayer.on(DashJSEvents.ERROR, onError);
|
|
666
667
|
mediaPlayer.on(DashJSEvents.MANIFEST_LOADED, onManifestLoaded);
|
|
667
668
|
mediaPlayer.on(DashJSEvents.STREAM_INITIALIZED, onStreamInitialised);
|
|
@@ -793,7 +794,7 @@ function MSEStrategy(mediaSources, windowType, mediaKind, playbackElement, isUHD
|
|
|
793
794
|
mediaElement.removeEventListener("seeking", onSeeking);
|
|
794
795
|
mediaElement.removeEventListener("seeked", onSeeked);
|
|
795
796
|
mediaElement.removeEventListener("ended", onEnded);
|
|
796
|
-
mediaElement.removeEventListener("
|
|
797
|
+
mediaElement.removeEventListener("ratechange", onRateChange);
|
|
797
798
|
mediaPlayer.off(DashJSEvents.ERROR, onError);
|
|
798
799
|
mediaPlayer.off(DashJSEvents.MANIFEST_LOADED, onManifestLoaded);
|
|
799
800
|
mediaPlayer.off(DashJSEvents.MANIFEST_VALIDITY_CHANGED, onManifestValidityChange);
|