Skip to content

Commit 4cb5be0

Browse files
authored
[web] remove references to IE11 and old Edge; treat Samsung browser as Blink (flutter#35205)
1 parent 7e27b92 commit 4cb5be0

17 files changed

+48
-181
lines changed

lib/web_ui/lib/src/engine/browser_detection.dart

Lines changed: 7 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -16,25 +16,16 @@ bool get _workAroundBug91333 => operatingSystem == OperatingSystem.iOs;
1616
enum BrowserEngine {
1717
/// The engine that powers Chrome, Samsung Internet Browser, UC Browser,
1818
/// Microsoft Edge, Opera, and others.
19+
///
20+
/// Blink is assumed in case when a more precise browser engine wasn't
21+
/// detected.
1922
blink,
2023

2124
/// The engine that powers Safari.
2225
webkit,
2326

2427
/// The engine that powers Firefox.
2528
firefox,
26-
27-
/// The engine that powers Edge.
28-
edge,
29-
30-
/// The engine that powers Internet Explorer 11.
31-
ie11,
32-
33-
/// The engine that powers Samsung stock browser. It is based on blink.
34-
samsung,
35-
36-
/// We were unable to detect the current browser engine.
37-
unknown,
3829
}
3930

4031
/// html webgl version qualifier constants.
@@ -70,51 +61,28 @@ BrowserEngine _detectBrowserEngine() {
7061
return detectBrowserEngineByVendorAgent(vendor, agent);
7162
}
7263

73-
/// Detects samsung blink variants.
74-
///
75-
/// Example patterns:
76-
/// Note 2 : GT-N7100
77-
/// Note 3 : SM-N900T
78-
/// Tab 4 : SM-T330NU
79-
/// Galaxy S4: SHV-E330S
80-
/// Galaxy Note2: SHV-E250L
81-
/// Note: SAMSUNG-SGH-I717
82-
/// SPH/SCH are very old Palm models.
83-
bool _isSamsungBrowser(String agent) {
84-
final RegExp exp = RegExp(
85-
r'SAMSUNG|SGH-[I|N|T]|GT-[I|N]|SM-[A|N|P|T|Z]|SHV-E|SCH-[I|J|R|S]|SPH-L');
86-
return exp.hasMatch(agent.toUpperCase());
87-
}
88-
8964
/// Detects browser engine for a given vendor and agent string.
9065
///
9166
/// Used for testing this library.
9267
@visibleForTesting
9368
BrowserEngine detectBrowserEngineByVendorAgent(String vendor, String agent) {
9469
if (vendor == 'Google Inc.') {
95-
// Samsung browser is based on blink, check for variant.
96-
if (_isSamsungBrowser(agent)) {
97-
return BrowserEngine.samsung;
98-
}
9970
return BrowserEngine.blink;
10071
} else if (vendor == 'Apple Computer, Inc.') {
10172
return BrowserEngine.webkit;
102-
} else if (agent.contains('edge/')) {
103-
return BrowserEngine.edge;
10473
} else if (agent.contains('Edg/')) {
10574
// Chromium based Microsoft Edge has `Edg` in the user-agent.
10675
// https://docs.microsoft.com/en-us/microsoft-edge/web-platform/user-agent-string
10776
return BrowserEngine.blink;
108-
} else if (agent.contains('trident/7.0')) {
109-
return BrowserEngine.ie11;
11077
} else if (vendor == '' && agent.contains('firefox')) {
11178
// An empty string means firefox:
11279
// https://developer.mozilla.org/en-US/docs/Web/API/Navigator/vendor
11380
return BrowserEngine.firefox;
11481
}
115-
// Assume unknown otherwise, but issue a warning.
116-
print('WARNING: failed to detect current browser engine.');
117-
return BrowserEngine.unknown;
82+
83+
// Assume Blink otherwise, but issue a warning.
84+
print('WARNING: failed to detect current browser engine. Assuming this is a Chromium-compatible browser.');
85+
return BrowserEngine.blink;
11886
}
11987

12088
/// Operating system where the current browser runs.

lib/web_ui/lib/src/engine/html_image_codec.dart

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,7 @@ class HtmlCodec implements ui.Codec {
5656
int naturalWidth = imgElement.naturalWidth;
5757
int naturalHeight = imgElement.naturalHeight;
5858
// Workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=700533.
59-
if (naturalWidth == 0 && naturalHeight == 0 && (
60-
browserEngine == BrowserEngine.firefox ||
61-
browserEngine == BrowserEngine.ie11)) {
59+
if (naturalWidth == 0 && naturalHeight == 0 && browserEngine == BrowserEngine.firefox) {
6260
const int kDefaultImageSizeFallback = 300;
6361
naturalWidth = kDefaultImageSizeFallback;
6462
naturalHeight = kDefaultImageSizeFallback;

lib/web_ui/lib/src/engine/semantics/text_field.dart

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -252,11 +252,7 @@ class TextField extends RoleManager {
252252

253253
switch (browserEngine) {
254254
case BrowserEngine.blink:
255-
case BrowserEngine.samsung:
256-
case BrowserEngine.edge:
257-
case BrowserEngine.ie11:
258255
case BrowserEngine.firefox:
259-
case BrowserEngine.unknown:
260256
_initializeForBlink();
261257
break;
262258
case BrowserEngine.webkit:

lib/web_ui/lib/src/engine/text/font_collection.dart

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import 'dart:typed_data';
99
import 'package:ui/src/engine/fonts.dart';
1010

1111
import '../assets.dart';
12-
import '../browser_detection.dart';
1312
import '../dom.dart';
1413
import '../safe_browser_api.dart';
1514
import '../util.dart';
@@ -252,8 +251,7 @@ class _PolyfillFontManager extends FontManager {
252251
paragraph.style.position = 'absolute';
253252
paragraph.style.visibility = 'hidden';
254253
paragraph.style.fontSize = '72px';
255-
final String fallbackFontName =
256-
browserEngine == BrowserEngine.ie11 ? 'Times New Roman' : 'sans-serif';
254+
const String fallbackFontName = 'sans-serif';
257255
paragraph.style.fontFamily = fallbackFontName;
258256
if (descriptors['style'] != null) {
259257
paragraph.style.fontStyle = descriptors['style']!;

lib/web_ui/lib/src/engine/text_editing/text_editing.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ const int _kReturnKeyCode = 13;
3737
/// is autofilled.
3838
bool browserHasAutofillOverlay() =>
3939
browserEngine == BrowserEngine.blink ||
40-
browserEngine == BrowserEngine.samsung ||
4140
browserEngine == BrowserEngine.webkit;
4241

4342
/// `transparentTextEditing` class is configured to make the autofill overlay

lib/web_ui/test/browser_detect_test.dart

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,6 @@ void testMain() {
3737
'(khtml, like gecko) version/14.0.3 safari/605.1.15');
3838
expect(browserEngine, BrowserEngine.webkit);
3939
});
40-
41-
test('Should detect Samsung browser', () {
42-
// Samsung 13.2.1.70 on Galaxy Tab S6.
43-
final BrowserEngine browserEngine = detectBrowserEngineByVendorAgent(
44-
'Google Inc.',
45-
'mozilla/5.0 (x11; linux x86_64) applewebkit/537.36 (khtml, like gecko)'
46-
' samsungbrowser/13.2 chrome/83.0.4103.106 safari/537.36');
47-
expect(browserEngine, BrowserEngine.samsung);
48-
});
4940
});
5041

5142
group('detectOperatingSystem', () {

lib/web_ui/test/embedder_test.dart

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,7 @@ void testMain() {
4040
embedder.reset();
4141
},
4242
// TODO(ferhat): https://github.com/flutter/flutter/issues/46638
43-
// TODO(ferhat): https://github.com/flutter/flutter/issues/50828
44-
skip: browserEngine == BrowserEngine.firefox ||
45-
browserEngine == BrowserEngine.edge);
43+
skip: browserEngine == BrowserEngine.firefox);
4644

4745
test('accesibility placeholder is attached after creation', () {
4846
final FlutterViewEmbedder embedder = FlutterViewEmbedder();

lib/web_ui/test/engine/history_test.dart

Lines changed: 10 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -117,9 +117,7 @@ void testMain() {
117117

118118
// The flutter entry is the current entry.
119119
expect(strategy.currentEntry, flutterEntry);
120-
},
121-
// TODO(mdebbar): https://github.com/flutter/flutter/issues/50836
122-
skip: browserEngine == BrowserEngine.edge);
120+
});
123121

124122
test('disposes of its listener without touching history', () async {
125123
const String unwrappedOriginState = 'initial state';
@@ -216,9 +214,7 @@ void testMain() {
216214
// The url of the current entry (flutter entry) should go back to /home.
217215
expect(strategy.currentEntry.state, flutterState);
218216
expect(strategy.currentEntry.url, '/home');
219-
},
220-
// TODO(mdebbar): https://github.com/flutter/flutter/issues/50836
221-
skip: browserEngine == BrowserEngine.edge);
217+
});
222218

223219
test('multiple browser back clicks', () async {
224220
final TestUrlStrategy strategy = TestUrlStrategy.fromEntry(
@@ -284,10 +280,7 @@ void testMain() {
284280
// 3. The active entry doesn't belong to our history anymore because we
285281
// navigated past it.
286282
expect(originalStrategy.currentEntryIndex, -1);
287-
},
288-
// TODO(mdebbar): https://github.com/flutter/flutter/issues/50836
289-
skip: browserEngine == BrowserEngine.edge ||
290-
browserEngine == BrowserEngine.webkit);
283+
}, skip: browserEngine == BrowserEngine.webkit);
291284

292285
test('handle user-provided url', () async {
293286
final TestUrlStrategy strategy = TestUrlStrategy.fromEntry(
@@ -328,9 +321,7 @@ void testMain() {
328321
expect(strategy.currentEntryIndex, 1);
329322
expect(strategy.currentEntry.state, flutterState);
330323
expect(strategy.currentEntry.url, '/home');
331-
},
332-
// TODO(mdebbar): https://github.com/flutter/flutter/issues/50836
333-
skip: browserEngine == BrowserEngine.edge);
324+
});
334325

335326
test('user types unknown url', () async {
336327
final TestUrlStrategy strategy = TestUrlStrategy.fromEntry(
@@ -354,9 +345,7 @@ void testMain() {
354345
expect(strategy.currentEntryIndex, 1);
355346
expect(strategy.currentEntry.state, flutterState);
356347
expect(strategy.currentEntry.url, '/home');
357-
},
358-
// TODO(mdebbar): https://github.com/flutter/flutter/issues/50836
359-
skip: browserEngine == BrowserEngine.edge);
348+
});
360349
});
361350

362351
group('$MultiEntriesBrowserHistory', () {
@@ -384,9 +373,7 @@ void testMain() {
384373
final TestHistoryEntry taggedOriginEntry = strategy.history[0];
385374
expect(taggedOriginEntry.state, _tagStateWithSerialCount('initial state', 0));
386375
expect(taggedOriginEntry.url, '/initial');
387-
},
388-
// TODO(mdebbar): https://github.com/flutter/flutter/issues/50836
389-
skip: browserEngine == BrowserEngine.edge);
376+
});
390377

391378
test('disposes of its listener without touching history', () async {
392379
const String untaggedState = 'initial state';
@@ -481,9 +468,7 @@ void testMain() {
481468
expect(strategy.currentEntryIndex, 0);
482469
expect(strategy.currentEntry.state, _tagStateWithSerialCount('initial state', 0));
483470
expect(strategy.currentEntry.url, '/home');
484-
},
485-
// TODO(mdebbar): https://github.com/flutter/flutter/issues/50836
486-
skip: browserEngine == BrowserEngine.edge);
471+
});
487472

488473
test('multiple browser back clicks', () async {
489474
final TestUrlStrategy strategy = TestUrlStrategy.fromEntry(
@@ -532,10 +517,7 @@ void testMain() {
532517
expect(strategy.currentEntryIndex, 0);
533518
expect(strategy.currentEntry.state, _tagStateWithSerialCount('initial state', 0));
534519
expect(strategy.currentEntry.url, '/home');
535-
},
536-
// TODO(mdebbar): https://github.com/flutter/flutter/issues/50836
537-
skip: browserEngine == BrowserEngine.edge ||
538-
browserEngine == BrowserEngine.webkit);
520+
}, skip: browserEngine == BrowserEngine.webkit);
539521

540522
test('handle user-provided url', () async {
541523
final TestUrlStrategy strategy = TestUrlStrategy.fromEntry(
@@ -578,9 +560,7 @@ void testMain() {
578560
expect(strategy.currentEntryIndex, 0);
579561
expect(strategy.currentEntry.state, _tagStateWithSerialCount('initial state', 0));
580562
expect(strategy.currentEntry.url, '/home');
581-
},
582-
// TODO(mdebbar): https://github.com/flutter/flutter/issues/50836
583-
skip: browserEngine == BrowserEngine.edge);
563+
});
584564

585565
test('forward button works', () async {
586566
final TestUrlStrategy strategy = TestUrlStrategy.fromEntry(
@@ -630,9 +610,7 @@ void testMain() {
630610
expect(strategy.currentEntryIndex, 2);
631611
expect(strategy.currentEntry.state, _tagStateWithSerialCount('page2 state', 2));
632612
expect(strategy.currentEntry.url, '/page2');
633-
},
634-
// TODO(mdebbar): https://github.com/flutter/flutter/issues/50836
635-
skip: browserEngine == BrowserEngine.edge);
613+
});
636614
});
637615

638616
group('$HashUrlStrategy', () {

lib/web_ui/test/engine/image/html_image_codec_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ Future<void> testMain() async {
8181
expect(buffer.toString(), '0/100,100/100,');
8282
});
8383

84-
/// Regression test for Firefox/ie11
84+
/// Regression test for Firefox
8585
/// https://github.com/flutter/flutter/issues/66412
8686
test('Returns nonzero natural width/height', () async {
8787
final HtmlCodec codec = HtmlCodec(

lib/web_ui/test/engine/semantics/semantics_tester.dart

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import 'dart:async';
66
import 'dart:typed_data';
77

88
import 'package:test/test.dart';
9-
import 'package:ui/src/engine/browser_detection.dart';
109
import 'package:ui/src/engine/dom.dart';
1110
import 'package:ui/src/engine/embedder.dart';
1211
import 'package:ui/src/engine/host_node.dart';
@@ -28,9 +27,7 @@ HostNode get appHostNode => flutterViewEmbedder.glassPaneShadow!;
2827
/// CSS style applied to the root of the semantics tree.
2928
// TODO(yjbanov): this should be handled internally by [expectSemanticsTree].
3029
// No need for every test to inject it.
31-
final String rootSemanticStyle = browserEngine != BrowserEngine.edge
32-
? 'filter: opacity(0%); color: rgba(0, 0, 0, 0)'
33-
: 'color: rgba(0, 0, 0, 0); filter: opacity(0%)';
30+
const String rootSemanticStyle = 'filter: opacity(0%); color: rgba(0, 0, 0, 0)';
3431

3532
/// A convenience wrapper of the semantics API for building and inspecting the
3633
/// semantics tree in unit tests.

0 commit comments

Comments
 (0)