@@ -235,6 +235,8 @@ define('mobilenetwork',
235235 } ;
236236
237237 function getNetwork ( mcc , mnc ) {
238+ console . tagged ( 'getNetwork' ) . log ( 'Trying MCC = ' + mcc + ', MNC = ' + mnc ) ;
239+
238240 // Look up region and carrier from MCC (Mobile Country Code)
239241 // and MNC (Mobile Network Code).
240242
@@ -297,6 +299,7 @@ define('mobilenetwork',
297299 }
298300
299301 function detectMobileNetwork ( navigator , fake ) {
302+ var consoleFunc = console . tagged ( 'detectMobileNetwork' ) ;
300303 navigator = navigator || window . navigator ;
301304
302305 var newSettings = { } ;
@@ -306,30 +309,89 @@ define('mobilenetwork',
306309 // Get mobile region and carrier information passed via querystring.
307310 var mcc = GET . mcc ;
308311 var mnc = GET . mnc ;
312+ var mccs = [ ] ;
313+ try {
314+ mccs = JSON . parse ( GET . mccs || '[]' ) ;
315+ } catch ( e ) {
316+ }
309317
310318 var carrier = GET . carrier || user . get_setting ( 'carrier' ) || null ;
311319
312320 try {
321+ // navigator.mozMobileConnections is the new API.
322+ // navigator.mozMobileConnection is the legacy API.
323+
313324 // When Fireplace is served as a privileged packaged app (and not
314325 // served via Yulelog) our JS will have direct access to this API.
315- var conn = navigator . mozMobileConnection ;
316- if ( conn ) {
317- // `MCC`: Mobile Country Code
318- // `MNC`: Mobile Network Code
319- // `lastKnownHomeNetwork`: `{MCC}-{MNC}` (SIM's origin)
320- // `lastKnownNetwork`: `{MCC}-{MNC}` (could be different network if roaming)
321- var lastNetwork = ( conn . lastKnownHomeNetwork || conn . lastKnownNetwork || '-' ) . split ( '-' ) ;
322- mcc = lastNetwork [ 0 ] ;
323- mnc = lastNetwork [ 1 ] ;
324- console . log ( 'lastKnownNetwork' , conn . lastKnownNetwork ) ;
325- console . log ( 'lastKnownHomeNetwork' , conn . lastKnownHomeNetwork ) ;
326- console . log ( 'MCC = ' + mcc + ', MNC = ' + mnc ) ;
326+ // Assignment not comparison below.
327+ if ( conn = navigator . mozMobileConnections ) {
328+ consoleFunc . log ( 'navigator.mozMobileConnections available' ) ;
329+ /*
330+ Example format:
331+
332+ [
333+ {
334+ data: {
335+ network: {
336+ mcc: '260',
337+ mnc: '02'
338+ }
339+ }
340+ },
341+ {
342+ data: {
343+ network: {
344+ mcc: '734',
345+ mnc: '04'
346+ }
347+ }
348+ }
349+ ]
350+
351+ */
352+
353+ if ( mccs . length ) {
354+ consoleFunc . log ( 'Using hardcoded MCCs:' , JSON . stringify ( mccs ) ) ;
355+ } else {
356+ // If we haven't hardcoded a MCC...
357+ mccs = [ ] ;
358+ var connData ;
359+ for ( var i = 0 ; i < conn . length ; i ++ ) {
360+ console . log ( 'navigator.mozMobileConnections[' + i + ']:' , conn [ i ] ) ;
361+ connData = conn [ i ] . data ;
362+ if ( connData && connData . network ) {
363+ mccs . push ( { mcc : connData . network . mcc ,
364+ mnc : connData . network . mnc } ) ;
365+ }
366+ }
367+ consoleFunc . log ( 'Using SIM MCCs:' , JSON . stringify ( mccs ) ) ;
368+ }
327369 } else {
328- console . warn ( 'navigator.mozMobileConnection unavailable' ) ;
370+ consoleFunc . log ( 'navigator.mozMobileConnections unavailable' ) ;
371+
372+ var conn = navigator . mozMobileConnection ;
373+ if ( conn ) {
374+ consoleFunc . log ( 'navigator.mozMobileConnection available' ) ;
375+ // `MCC`: Mobile Country Code
376+ // `MNC`: Mobile Network Code
377+ // `lastKnownHomeNetwork`: `{MCC}-{MNC}` (SIM's origin)
378+ // `lastKnownNetwork`: `{MCC}-{MNC}` (could be different network if roaming)
379+ var lastNetwork = ( conn . lastKnownHomeNetwork || conn . lastKnownNetwork || '-' ) . split ( '-' ) ;
380+ mcc = lastNetwork [ 0 ] ;
381+ mnc = lastNetwork [ 1 ] ;
382+ consoleFunc . log ( 'navigator.mozMobileConnection.lastKnownNetwork:' ,
383+ conn . lastKnownNetwork ) ;
384+ consoleFunc . log ( 'navigator.mozMobileConnection.lastKnownHomeNetwork:' ,
385+ conn . lastKnownHomeNetwork ) ;
386+ consoleFunc . log ( 'MCC:' , mcc , ', MNC:' , mnc ) ;
387+ } else {
388+ consoleFunc . log ( 'navigator.mozMobileConnection unavailable' ) ;
389+ }
329390 }
330391 } catch ( e ) {
331- // Fail gracefully if `navigator.mozMobileConnection` gives us problems.
332- console . warn ( 'Error accessing navigator.mozMobileConnection:' , e ) ;
392+ // Fail gracefully if `navigator.mozMobileConnection(s)`
393+ // gives us problems.
394+ consoleFunc . warn ( 'Error accessing navigator.mozMobileConnection:' , e ) ;
333395 }
334396
335397 newSettings . sim_carrier = GET . carrier ;
@@ -340,15 +402,39 @@ define('mobilenetwork',
340402 // and MNC (Mobile Network Code).
341403 var network = getNetwork ( mcc , mnc ) ;
342404
343- newSettings . sim_carrier = network . carrier ;
344- newSettings . sim_region = network . region ;
345-
346- region = network . region ;
405+ region = newSettings . sim_region = network . region ;
406+ carrier = newSettings . sim_carrier = network . carrier ;
347407
348408 if ( carrier !== network . carrier ) {
349- persistent_console . log ( 'Carrier changed by SIM:' , carrier , '→' , network . carrier ) ;
409+ persistent_console . log (
410+ 'Carrier changed by SIM:' , carrier , '→' , network . carrier ) ;
411+ }
412+ }
413+
414+ if ( mccs . length ) {
415+ var pair ;
416+ for ( var i = 0 ; i < mccs . length ; i ++ ) {
417+ pair = mccs [ i ] ;
418+ consoleFunc . log ( 'mccs[' + i + ']:' , pair ) ;
419+
420+ // Look up region and carrier from MCC (Mobile Country Code)
421+ // and MNC (Mobile Network Code).
422+ network = getNetwork ( pair . mcc , pair . mnc ) ;
423+
424+ region = newSettings . sim_region = network . region ;
425+ carrier = newSettings . sim_carrier = network . carrier ;
426+
427+ if ( carrier !== network . carrier ) {
428+ persistent_console . log (
429+ 'Carrier changed by SIM:' , carrier ,
430+ '→' , network . carrier ) ;
431+ }
432+
433+ // If there's a region, stop looking.
434+ if ( region ) {
435+ break ;
436+ }
350437 }
351- carrier = network . carrier ;
352438 }
353439
354440 var lastRegion = user . get_setting ( 'last_region' ) ;
0 commit comments