Skip to content
This repository was archived by the owner on Mar 15, 2018. It is now read-only.

Commit 7c68e04

Browse files
committed
use MMC/MNC to determine region/carrier (bug 867793)
1 parent 746ef92 commit 7c68e04

File tree

11 files changed

+458
-24
lines changed

11 files changed

+458
-24
lines changed

hearth/media/js/cat-dropdown.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
define('cat-dropdown',
2-
['underscore', 'helpers', 'jquery', 'l10n', 'models', 'requests', 'templates', 'urls', 'z'],
2+
// We require `user` here to initialize carrier/region detection so that gets
3+
// set before we pass those values to the API to get the list of categories.
4+
['underscore', 'helpers', 'jquery', 'l10n', 'models', 'requests', 'templates', 'urls', 'z', 'user'],
35
function(_, helpers, $, l10n, models, requests, nunjucks, urls, z) {
46
'use strict';
57

hearth/media/js/marketplace.js

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ require.config({
4141
'lightbox',
4242
'log',
4343
'login',
44+
'mobilenetwork',
4445
'navigation',
4546
'outgoing_links',
4647
'overlay',
@@ -67,11 +68,6 @@ require.config({
6768

6869
nunjucks.env.dev = true;
6970

70-
// Get mobile region and carrier information.
71-
var GET = require('utils').getVars();
72-
settings.mcc = GET.mcc;
73-
settings.mnc = GET.mnc;
74-
7571
z.body.addClass('html-' + require('l10n').getDirection());
7672
if (settings.body_classes) {
7773
z.body.addClass(settings.body_classes);

hearth/media/js/mobilenetwork.js

Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,202 @@
1+
define('mobilenetwork', [], function() {
2+
var regions = {
3+
// United States
4+
310: 'us',
5+
6+
// United Kingdom
7+
235: 'uk',
8+
9+
// Brazil
10+
724: 'br',
11+
12+
// Spain
13+
214: 'es',
14+
15+
// Colombia
16+
732: 'co',
17+
18+
// Venezuela
19+
734: 've',
20+
21+
// Poland
22+
260: 'pl',
23+
24+
// Mexico
25+
334: 'mx',
26+
27+
// Hungary
28+
216: 'hu',
29+
30+
// Germany
31+
262: 'de'
32+
};
33+
34+
var carriers = {
35+
// United States
36+
310: {
37+
26: 'deutsche_telekom',
38+
160: 'deutsche_telekom',
39+
170: 'deutsche_telekom',
40+
200: 'deutsche_telekom',
41+
210: 'deutsche_telekom',
42+
220: 'deutsche_telekom',
43+
230: 'deutsche_telekom',
44+
240: 'deutsche_telekom',
45+
250: 'deutsche_telekom',
46+
260: 'deutsche_telekom',
47+
270: 'deutsche_telekom',
48+
280: 'deutsche_telekom',
49+
290: 'deutsche_telekom',
50+
330: 'deutsche_telekom',
51+
490: 'deutsche_telekom',
52+
580: 'deutsche_telekom',
53+
660: 'deutsche_telekom',
54+
800: 'deutsche_telekom'
55+
},
56+
57+
// United Kingdom
58+
235: {
59+
2: 'telefonica',
60+
10: 'telefonica',
61+
11: 'telefonica',
62+
30: 'deutsche_telekom'
63+
},
64+
65+
// Brazil
66+
724: {
67+
6: 'telefonica',
68+
10: 'telefonica',
69+
11: 'telefonica',
70+
23: 'telefonica'
71+
},
72+
73+
// Spain
74+
214: {
75+
5: 'telefonica',
76+
7: 'telefonica'
77+
},
78+
79+
// Colombia
80+
732: {
81+
123: 'telefonica'
82+
},
83+
84+
// Venezuela
85+
734: {
86+
4: 'telefonica'
87+
},
88+
89+
// Poland
90+
260: {
91+
2: 'deutsche_telekom'
92+
},
93+
94+
// Mexico
95+
334: {
96+
2: 'america_movil',
97+
20: 'america_movil',
98+
300: 'telefonica'
99+
},
100+
101+
// Hungary
102+
216: {
103+
30: 'deutsche_telekom'
104+
},
105+
106+
// Germany
107+
262: {
108+
1: 'deutsche_telekom',
109+
6: 'deutsche_telekom'
110+
},
111+
112+
// Slovakia
113+
231: {
114+
2: 'deutsche_telekom',
115+
4: 'deutsche_telekom',
116+
6: 'telefonica'
117+
},
118+
119+
// Czech Republic
120+
232: {
121+
2: 'telefonica'
122+
},
123+
124+
// Austria
125+
232: {
126+
8: 'telefonica'
127+
},
128+
129+
// Guatemala
130+
704: {
131+
3: 'telefonica'
132+
},
133+
134+
// El Salvador
135+
706: {
136+
4: 'telefonica'
137+
},
138+
139+
// Nicaragua
140+
710: {
141+
3: 'telefonica'
142+
},
143+
144+
// Costa Rica
145+
712: {
146+
4: 'telefonica'
147+
},
148+
149+
// Panama
150+
714: {
151+
2: 'telefonica',
152+
3: 'america_movil'
153+
},
154+
155+
// Chile
156+
730: {
157+
2: 'telefonica'
158+
},
159+
160+
// Ecuador
161+
740: {
162+
1: 'america_movil'
163+
},
164+
165+
// Paraguay
166+
744: {
167+
4: 'telefonica',
168+
},
169+
170+
// Peru
171+
716: {
172+
6: 'telefonica',
173+
10: 'america_movil'
174+
},
175+
176+
// Argentina
177+
722: {
178+
10: 'telefonica',
179+
70: 'telefonica'
180+
},
181+
182+
// Uruguay
183+
748: {
184+
7: 'telefonica'
185+
}
186+
};
187+
188+
function getNetwork(mcc, mnc) {
189+
// Look up region and carrier from MCC (Mobile Country Code)
190+
// and MNC (Mobile Network Code).
191+
mcc = +mcc || 0;
192+
mnc = +mnc || 0;
193+
return {
194+
region: regions[mcc] || null,
195+
carrier: carriers[mcc] && carriers[mcc][mnc] || null
196+
};
197+
}
198+
199+
return {
200+
getNetwork: getNetwork
201+
};
202+
});

hearth/media/js/settings.js

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,6 @@ define('settings', ['settings_local', 'underscore'], function(settings_local, _)
3030
persona: 'https://login.persona.org/include.js',
3131

3232
title_suffix: 'Firefox Marketplace',
33-
carrier: null,
34-
35-
// `MCC`: Mobile Country Code
36-
mcc: null,
37-
38-
// `MNC`: Mobile Network Code
39-
mnc: null
33+
carrier: null
4034
});
4135
});

hearth/media/js/urls.js

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
define('urls',
22
['buckets', 'capabilities', 'format', 'settings', 'underscore', 'user', 'utils'],
3-
function(buckets, caps, format, settings, _) {
3+
function(buckets, caps, format, settings, _, user) {
44

55
var group_pattern = /\(.+\)/;
66
var reverse = function(view_name, args) {
@@ -63,13 +63,14 @@ define('urls',
6363
}
6464
};
6565

66-
var user = require('user');
66+
6767
function _userArgs(func) {
6868
return function() {
6969
var out = func.apply(this, arguments);
7070
var args = {
7171
lang: navigator.language,
7272
region: user.get_setting('region') || '',
73+
carrier: user.get_setting('carrier') || '',
7374
//scr: caps.widescreen() ? 'wide' : 'mobile',
7475
//tch: caps.touch,
7576
dev: _device(),
@@ -78,9 +79,6 @@ define('urls',
7879
if (user.logged_in()) {
7980
args._user = user.get_token();
8081
}
81-
if (settings.carrier) {
82-
args.carrier = settings.carrier.slug;
83-
}
8482
return require('utils').urlparams(out, args);
8583
};
8684
}

hearth/media/js/user.js

Lines changed: 76 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
define('user', ['capabilities', 'log'], function(capabilities, log) {
1+
define('user',
2+
['capabilities', 'log', 'mobilenetwork', 'settings', 'utils'],
3+
function(capabilities, log, mobilenetwork, site_settings, utils) {
24

35
var console = log('user');
46

@@ -15,6 +17,76 @@ define('user', ['capabilities', 'log'], function(capabilities, log) {
1517
permissions = JSON.parse(localStorage.getItem('permissions') || '{}');
1618
}
1719

20+
function detect_mobile_network(navigator) {
21+
navigator = navigator || window.navigator;
22+
23+
var GET = utils.getVars();
24+
var mcc;
25+
var mnc;
26+
var region;
27+
28+
// Hardcoded carrier should never get overridden.
29+
var carrier = site_settings.carrier;
30+
if (carrier && typeof carrier === 'object') {
31+
carrier = carrier.slug;
32+
}
33+
carrier = carrier || GET.carrier || null;
34+
35+
if (!carrier) {
36+
// Get mobile region and carrier information passed via querystring.
37+
mcc = GET.mcc;
38+
mnc = GET.mnc;
39+
}
40+
41+
try {
42+
// When Fireplace is served as a privileged packaged app (and not
43+
// served via Yulelog) our JS will have direct access to this API.
44+
var conn = navigator.mozMobileConnection;
45+
if (conn) {
46+
// `MCC`: Mobile Country Code
47+
// `MNC`: Mobile Network Code
48+
// `lastKnownNetwork`: `{MCC}-{MNC}`
49+
var network = (conn.lastKnownNetwork || conn.lastKnownHomeNetwork || '-').split('-');
50+
mcc = network[0];
51+
mnc = network[1];
52+
console.log('MCC = ' + mcc + ', MNC = ' + mnc);
53+
} else {
54+
console.warn('Error accessing navigator.mozMobileConnection');
55+
}
56+
} catch(e) {
57+
// Fail gracefully if `navigator.mozMobileConnection` gives us problems.
58+
console.warn('Error accessing navigator.mozMobileConnection:', e);
59+
}
60+
61+
if (mcc || mnc) {
62+
// Look up region and carrier from MCC (Mobile Country Code)
63+
// and MNC (Mobile Network Code).
64+
var network = mobilenetwork.getNetwork(mcc, mnc);
65+
region = network.region;
66+
carrier = network.carrier;
67+
}
68+
69+
// Get region from settings saved to localStorage.
70+
region = settings.region || region;
71+
72+
// If it turns out the region is null, when we get a response from an
73+
// API request, we look at the `API-Filter` header to determine the region
74+
// in which Zamboni geolocated the user.
75+
76+
settings.carrier = carrier || null;
77+
settings.region = region || null;
78+
}
79+
80+
detect_mobile_network(navigator);
81+
82+
if (save_to_ls) {
83+
save_settings();
84+
}
85+
86+
function clear_settings() {
87+
settings = {};
88+
}
89+
1890
function clear_token() {
1991
console.log('Clearing user token');
2092

@@ -29,7 +101,7 @@ define('user', ['capabilities', 'log'], function(capabilities, log) {
29101
}
30102

31103
function get_setting(setting) {
32-
return settings[setting];
104+
return settings[setting] || null;
33105
}
34106

35107
function get_permission(setting) {
@@ -96,7 +168,9 @@ define('user', ['capabilities', 'log'], function(capabilities, log) {
96168
}
97169

98170
return {
171+
clear_settings: clear_settings,
99172
clear_token: clear_token,
173+
detect_mobile_network: detect_mobile_network,
100174
get_setting: get_setting,
101175
get_permission: get_permission,
102176
get_settings: get_settings,

hearth/templates/tests.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@ <h2>Unit Tests</h2>
2121
<script type="text/javascript" src="/tests/apps.js"></script>
2222
<script type="text/javascript" src="/tests/cache.js"></script>
2323
<script type="text/javascript" src="/tests/l10n.js"></script>
24+
<script type="text/javascript" src="/tests/mobilenetwork.js"></script>
2425
<script type="text/javascript" src="/tests/models.js"></script>
2526
<script type="text/javascript" src="/tests/requests.js"></script>
2627
<script type="text/javascript" src="/tests/rewriters.js"></script>
2728
<script type="text/javascript" src="/tests/urls.js"></script>
29+
<script type="text/javascript" src="/tests/user.js"></script>
2830
<script type="text/javascript" src="/tests/utils.js"></script>

0 commit comments

Comments
 (0)