Skip to content

Commit 5d6ce9c

Browse files
committed
Add function that migrates preferences from legacy cookie to local storage when cookies disabled.
1 parent 0b3f1c8 commit 5d6ce9c

1 file changed

Lines changed: 44 additions & 0 deletions

File tree

‎scripts/preference.js‎

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,49 @@
1414
}
1515
};
1616

17+
// Migrate a legacy Able-Player cookie into localStorage, then delete the cookie.
18+
// Only used when the Cookies library is unavailable.
19+
AblePlayer.prototype.migrateCookiePrefs = function() {
20+
var match = document.cookie.match( /(?:^|;\s*)Able-Player=([^;]*)/ );
21+
if ( ! match ) {
22+
return;
23+
}
24+
try {
25+
var parsed = JSON.parse( decodeURIComponent( match[1] ) );
26+
if ( parsed && typeof parsed === 'object' && ! Array.isArray( parsed ) ) {
27+
// Copy only expected keys, with expected types.
28+
var clean = {
29+
preferences: {},
30+
sign: {},
31+
transcript: {},
32+
voices: []
33+
};
34+
[ 'preferences', 'sign', 'transcript' ].forEach( function( key ) {
35+
if ( parsed[key] && typeof parsed[key] === 'object' && ! Array.isArray( parsed[key] ) ) {
36+
Object.keys( parsed[key] ).forEach( function( k ) {
37+
if ( k !== '__proto__' && k !== 'constructor' && k !== 'prototype' ) {
38+
clean[key][k] = parsed[key][k];
39+
}
40+
} );
41+
}
42+
} );
43+
if ( Array.isArray( parsed.voices ) ) {
44+
clean.voices = parsed.voices;
45+
}
46+
// Don't overwrite preferences already in localStorage.
47+
if ( localStorage.getItem( 'Able-Player' ) === null ) {
48+
localStorage.setItem( 'Able-Player', JSON.stringify( clean ) );
49+
}
50+
}
51+
} catch ( err ) {
52+
// Invalid cookie; discard it.
53+
}
54+
var secure = location.protocol === 'https:' ? '; Secure' : '';
55+
var expired = 'Able-Player=; expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Strict' + secure;
56+
document.cookie = expired + '; path=/';
57+
document.cookie = expired;
58+
};
59+
1760
AblePlayer.prototype.getPref = function() {
1861

1962
var defaultPrefs = {
@@ -28,6 +71,7 @@
2871
if ( typeof Cookies !== 'undefined' ) {
2972
preferences = JSON.parse( Cookies.get('Able-Player') );
3073
} else {
74+
this.migrateCookiePrefs();
3175
preferences = JSON.parse( localStorage.getItem('Able-Player') );
3276
}
3377
}

0 commit comments

Comments
 (0)