|
14 | 14 | } |
15 | 15 | }; |
16 | 16 |
|
| 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 | + |
17 | 60 | AblePlayer.prototype.getPref = function() { |
18 | 61 |
|
19 | 62 | var defaultPrefs = { |
|
28 | 71 | if ( typeof Cookies !== 'undefined' ) { |
29 | 72 | preferences = JSON.parse( Cookies.get('Able-Player') ); |
30 | 73 | } else { |
| 74 | + this.migrateCookiePrefs(); |
31 | 75 | preferences = JSON.parse( localStorage.getItem('Able-Player') ); |
32 | 76 | } |
33 | 77 | } |
|
0 commit comments