[e2e] make test bindings friendlier to integration tests (#58210)

diff --git a/packages/flutter_test/lib/src/_binding_web.dart b/packages/flutter_test/lib/src/_binding_web.dart
index 9e84965..9f80713 100644
--- a/packages/flutter_test/lib/src/_binding_web.dart
+++ b/packages/flutter_test/lib/src/_binding_web.dart
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
- import 'package:flutter/widgets.dart';
+import 'package:flutter/widgets.dart';
 
- import 'binding.dart';
+import 'binding.dart';
 
  /// Ensure the [WidgetsBinding] is initialized.
 WidgetsBinding ensureInitialized([@visibleForTesting Map<String, String> environment]) {
diff --git a/packages/flutter_test/lib/src/binding.dart b/packages/flutter_test/lib/src/binding.dart
index d8b98dd..6e90dc1 100644
--- a/packages/flutter_test/lib/src/binding.dart
+++ b/packages/flutter_test/lib/src/binding.dart
@@ -205,6 +205,27 @@
   @protected
   bool get disableShadows => false;
 
+  /// Determines whether the Dart [HttpClient] class should be overriden to
+  /// always return a failure response.
+  ///
+  /// By default, this value is true, so that unit tests will not become flaky
+  /// due to intermitten network errors. The value may be overriden by a binding
+  /// intended for use in integration tests that do end to end application
+  /// testing, including working with real network responses.
+  @protected
+  bool get overrideHttpClient => true;
+
+  /// Determines whether the binding automatically registers [testTextInput].
+  ///
+  /// Unit tests make use of this to mock out text input communication for
+  /// widgets. An integration test would set this to false, to test real IME
+  /// or keyboard input.
+  ///
+  /// [TestTextInput.isRegistered] reports whether the text input mock is
+  /// registered or not.
+  @protected
+  bool get registerTestTextInput => true;
+
   /// Increase the timeout for the current test by the given duration.
   ///
   /// This only matters if the test has an `initialTimeout` set on
@@ -269,8 +290,13 @@
   void initInstances() {
     super.initInstances();
     timeDilation = 1.0; // just in case the developer has artificially changed it for development
-    binding.setupHttpOverrides();
-    _testTextInput = TestTextInput(onCleared: _resetFocusedEditable)..register();
+    if (overrideHttpClient) {
+      binding.setupHttpOverrides();
+    }
+    _testTextInput = TestTextInput(onCleared: _resetFocusedEditable);
+    if (registerTestTextInput) {
+      _testTextInput.register();
+    }
   }
 
   @override
diff --git a/packages/flutter_test/test/bindings_test.dart b/packages/flutter_test/test/bindings_test.dart
index 5406c29..4e38dc1 100644
--- a/packages/flutter_test/test/bindings_test.dart
+++ b/packages/flutter_test/test/bindings_test.dart
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+import 'dart:io';
+
 import 'package:flutter/material.dart';
 import 'package:flutter/widgets.dart';
 import 'package:flutter_test/flutter_test.dart';
@@ -24,4 +26,10 @@
       expect(binding.defaultTestTimeout.duration, const Duration(minutes: 5));
     });
   });
+
+  test('Initializes httpOverrides and testTextInput', () async {
+    final TestWidgetsFlutterBinding binding = TestWidgetsFlutterBinding.ensureInitialized() as TestWidgetsFlutterBinding;
+    expect(binding.testTextInput.isRegistered, true);
+    expect(HttpOverrides.current, isNotNull);
+  });
 }
diff --git a/packages/flutter_test/test/integration_bindings_test.dart b/packages/flutter_test/test/integration_bindings_test.dart
new file mode 100644
index 0000000..fd5f342
--- /dev/null
+++ b/packages/flutter_test/test/integration_bindings_test.dart
@@ -0,0 +1,26 @@
+// Copyright 2014 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'dart:io';
+
+import 'package:flutter/widgets.dart';
+import 'package:flutter_test/flutter_test.dart';
+
+void main() {
+  test('Initializes httpOverrides and testTextInput', () async {
+    expect(HttpOverrides.current, null);
+    final TestWidgetsFlutterBinding binding = CustomBindings();
+    expect(WidgetsBinding.instance, isA<CustomBindings>());
+    expect(binding.testTextInput.isRegistered, false);
+    expect(HttpOverrides.current, null);
+  });
+}
+
+class CustomBindings extends AutomatedTestWidgetsFlutterBinding {
+  @override
+  bool get overrideHttpClient => false;
+
+  @override
+  bool get registerTestTextInput => false;
+}