Skip to content

Commit 703fe16

Browse files
committed
fix(windows): detect windows phone via user agent
1 parent 5358561 commit 703fe16

File tree

3 files changed

+101
-20
lines changed

3 files changed

+101
-20
lines changed

ionic/platform/platform.ts

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -460,14 +460,6 @@ export class Platform {
460460
return valueSplit.indexOf(queryTestValue) > -1;
461461
}
462462

463-
/**
464-
* @private
465-
*/
466-
testUserAgent(userAgentExpression): boolean {
467-
let rgx = new RegExp(userAgentExpression, 'i');
468-
return rgx.test(this._ua || '');
469-
}
470-
471463
/**
472464
* @private
473465
*/
@@ -494,17 +486,28 @@ export class Platform {
494486
/**
495487
* @private
496488
*/
497-
isPlatform(queryTestValue: string, userAgentExpression: string): boolean {
498-
if (!userAgentExpression) {
499-
userAgentExpression = queryTestValue;
500-
}
501-
489+
isPlatformMatch(queryStringName: string, userAgentAtLeastHas?: string[], userAgentMustNotHave: string[] = []): boolean {
502490
let queryValue = this.query('ionicplatform');
503491
if (queryValue) {
504-
return this.testQuery(queryValue, queryTestValue);
492+
return this.testQuery(queryValue, queryStringName);
493+
}
494+
495+
userAgentAtLeastHas = userAgentAtLeastHas || [queryStringName];
496+
497+
let userAgent = this._ua.toLowerCase();
498+
499+
for (var i = 0; i < userAgentAtLeastHas.length; i++) {
500+
if (userAgent.indexOf(userAgentAtLeastHas[i]) > -1) {
501+
for (var j = 0; j < userAgentMustNotHave.length; j++) {
502+
if (userAgent.indexOf(userAgentMustNotHave[j]) > -1) {
503+
return false;
504+
}
505+
}
506+
return true;
507+
}
505508
}
506509

507-
return this.testUserAgent(userAgentExpression);
510+
return false;
508511
}
509512

510513
/**

ionic/platform/registry.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ Platform.register({
7777
scrollAssist: true,
7878
},
7979
isMatch(p: Platform): boolean {
80-
return p.isPlatform('android', 'android|silk');
80+
return p.isPlatformMatch('android', ['android', 'silk'], ['windows phone']);
8181
},
8282
versionParser(p: Platform): any {
8383
return p.matchUserAgentVersion(/Android (\d+).(\d+)?/);
@@ -105,7 +105,7 @@ Platform.register({
105105
tapPolyfill: isIOSDevice,
106106
},
107107
isMatch(p: Platform): boolean {
108-
return p.isPlatform('ios', 'iphone|ipad|ipod');
108+
return p.isPlatformMatch('ios', ['iphone', 'ipad', 'ipod']);
109109
},
110110
versionParser(p: Platform): any {
111111
return p.matchUserAgentVersion(/OS (\d+)_(\d+)?/);
@@ -120,7 +120,7 @@ Platform.register({
120120
keyboardHeight: 500,
121121
},
122122
isMatch(p: Platform): boolean {
123-
return p.isPlatform('ios', 'ipad');
123+
return p.isPlatformMatch('ipad');
124124
}
125125
});
126126

@@ -131,7 +131,7 @@ Platform.register({
131131
'phablet'
132132
],
133133
isMatch(p: Platform): boolean {
134-
return p.isPlatform('ios', 'iphone');
134+
return p.isPlatformMatch('iphone');
135135
}
136136
});
137137

@@ -150,7 +150,7 @@ Platform.register({
150150
hoverCSS: false
151151
},
152152
isMatch(p: Platform): boolean {
153-
return p.isPlatform('windows', 'windows');
153+
return p.isPlatformMatch('windows', ['windows phone']);
154154
},
155155
versionParser(p: Platform): any {
156156
return p.matchUserAgentVersion(/Windows Phone (\d+).(\d+)?/);

ionic/platform/test/platform.spec.ts

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,26 @@ export function run() {
4141
platform.load('ios');
4242

4343
expect(platform.is('android')).toEqual(false);
44+
expect(platform.is('windows')).toEqual(false);
4445
expect(platform.is('ios')).toEqual(true);
4546
});
4647

48+
it('should set windows via platformOverride, despite android querystring', () => {
49+
let platform = new Platform();
50+
platform.setUrl('/?ionicplatform=android');
51+
platform.load('windows');
52+
53+
expect(platform.is('android')).toEqual(false);
54+
expect(platform.is('windows')).toEqual(true);
55+
expect(platform.is('ios')).toEqual(false);
56+
});
57+
4758
it('should set ios via platformOverride', () => {
4859
let platform = new Platform();
4960
platform.load('ios');
5061

5162
expect(platform.is('android')).toEqual(false);
63+
expect(platform.is('windows')).toEqual(false);
5264
expect(platform.is('ios')).toEqual(true);
5365
});
5466

@@ -57,6 +69,18 @@ export function run() {
5769
platform.load('android');
5870

5971
expect(platform.is('android')).toEqual(true);
72+
expect(platform.is('windows')).toEqual(false);
73+
expect(platform.is('ios')).toEqual(false);
74+
});
75+
76+
it('should set windows via querystring', () => {
77+
let platform = new Platform();
78+
platform.setUrl('/?ionicplatform=windows');
79+
platform.load();
80+
81+
expect(platform.is('mobile')).toEqual(true);
82+
expect(platform.is('android')).toEqual(false);
83+
expect(platform.is('windows')).toEqual(true);
6084
expect(platform.is('ios')).toEqual(false);
6185
});
6286

@@ -67,16 +91,29 @@ export function run() {
6791

6892
expect(platform.is('mobile')).toEqual(true);
6993
expect(platform.is('android')).toEqual(false);
94+
expect(platform.is('windows')).toEqual(false);
7095
expect(platform.is('ios')).toEqual(true);
7196
});
7297

98+
it('should set windows via querystring, even with android user agent', () => {
99+
let platform = new Platform();
100+
platform.setUrl('/?ionicplatform=windows');
101+
platform.setUserAgent(ANDROID_UA);
102+
platform.load();
103+
104+
expect(platform.is('android')).toEqual(false);
105+
expect(platform.is('windows')).toEqual(true);
106+
expect(platform.is('ios')).toEqual(false);
107+
});
108+
73109
it('should set ios via querystring, even with android user agent', () => {
74110
let platform = new Platform();
75111
platform.setUrl('/?ionicplatform=ios');
76112
platform.setUserAgent(ANDROID_UA);
77113
platform.load();
78114

79115
expect(platform.is('android')).toEqual(false);
116+
expect(platform.is('windows')).toEqual(false);
80117
expect(platform.is('ios')).toEqual(true);
81118
});
82119

@@ -86,6 +123,7 @@ export function run() {
86123
platform.load();
87124

88125
expect(platform.is('android')).toEqual(true);
126+
expect(platform.is('windows')).toEqual(false);
89127
expect(platform.is('ios')).toEqual(false);
90128
});
91129

@@ -96,6 +134,40 @@ export function run() {
96134
platform.load();
97135

98136
expect(platform.is('android')).toEqual(true);
137+
expect(platform.is('windows')).toEqual(false);
138+
expect(platform.is('ios')).toEqual(false);
139+
});
140+
141+
it('should set windows via user agent', () => {
142+
let platform = new Platform();
143+
platform.setUserAgent(WINDOWS_UA);
144+
platform.load();
145+
146+
expect(platform.is('mobile')).toEqual(true);
147+
expect(platform.is('windows')).toEqual(true);
148+
expect(platform.is('android')).toEqual(false);
149+
expect(platform.is('ios')).toEqual(false);
150+
});
151+
152+
it('should set windows8 via user agent', () => {
153+
let platform = new Platform();
154+
platform.setUserAgent(WINDOWS8_UA);
155+
platform.load();
156+
157+
expect(platform.is('mobile')).toEqual(true);
158+
expect(platform.is('windows')).toEqual(true);
159+
expect(platform.is('android')).toEqual(false);
160+
expect(platform.is('ios')).toEqual(false);
161+
});
162+
163+
it('should set windows7 via user agent', () => {
164+
let platform = new Platform();
165+
platform.setUserAgent(WINDOWS7_UA);
166+
platform.load();
167+
168+
expect(platform.is('mobile')).toEqual(true);
169+
expect(platform.is('windows')).toEqual(true);
170+
expect(platform.is('android')).toEqual(false);
99171
expect(platform.is('ios')).toEqual(false);
100172
});
101173

@@ -105,6 +177,7 @@ export function run() {
105177
platform.load();
106178

107179
expect(platform.is('mobile')).toEqual(true);
180+
expect(platform.is('windows')).toEqual(false);
108181
expect(platform.is('android')).toEqual(true);
109182
expect(platform.is('ios')).toEqual(false);
110183
});
@@ -115,6 +188,7 @@ export function run() {
115188
platform.load();
116189

117190
expect(platform.is('mobile')).toEqual(true);
191+
expect(platform.is('windows')).toEqual(false);
118192
expect(platform.is('android')).toEqual(false);
119193
expect(platform.is('ios')).toEqual(true);
120194
expect(platform.is('iphone')).toEqual(true);
@@ -127,6 +201,7 @@ export function run() {
127201
platform.load();
128202

129203
expect(platform.is('mobile')).toEqual(true);
204+
expect(platform.is('windows')).toEqual(false);
130205
expect(platform.is('android')).toEqual(false);
131206
expect(platform.is('ios')).toEqual(true);
132207
expect(platform.is('ipad')).toEqual(true);
@@ -135,6 +210,9 @@ export function run() {
135210

136211
}
137212

213+
const WINDOWS_UA = 'Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 930) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537';
214+
const WINDOWS8_UA = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920)';
215+
const WINDOWS7_UA = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0; LG; GW910)';
138216
const ANDROID_UA = 'Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.20 Mobile Safari/537.36';
139217
const IPHONE_UA = 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4';
140218
const IPAD_UA = 'Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53';

0 commit comments

Comments
 (0)