// Mocks generated by Mockito 5.3.2 from annotations
// in webview_flutter_android/test/android_webview_controller_test.dart.
// Do not manually edit this file.

// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'dart:async' as _i9;
import 'dart:typed_data' as _i14;
import 'dart:ui' as _i4;

import 'package:flutter/foundation.dart' as _i11;
import 'package:flutter/gestures.dart' as _i12;
import 'package:flutter/material.dart' as _i13;
import 'package:flutter/services.dart' as _i7;
import 'package:mockito/mockito.dart' as _i1;
import 'package:webview_flutter_android/src/android_proxy.dart' as _i10;
import 'package:webview_flutter_android/src/android_webview.dart' as _i2;
import 'package:webview_flutter_android/src/android_webview_controller.dart'
    as _i8;
import 'package:webview_flutter_android/src/instance_manager.dart' as _i5;
import 'package:webview_flutter_android/src/platform_views_service_proxy.dart'
    as _i6;
import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart'
    as _i3;

// ignore_for_file: type=lint
// ignore_for_file: avoid_redundant_argument_values
// ignore_for_file: avoid_setters_without_getters
// ignore_for_file: comment_references
// ignore_for_file: implementation_imports
// ignore_for_file: invalid_use_of_visible_for_testing_member
// ignore_for_file: prefer_const_constructors
// ignore_for_file: unnecessary_parenthesis
// ignore_for_file: camel_case_types
// ignore_for_file: subtype_of_sealed_class

class _FakeWebChromeClient_0 extends _i1.SmartFake
    implements _i2.WebChromeClient {
  _FakeWebChromeClient_0(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeWebViewClient_1 extends _i1.SmartFake implements _i2.WebViewClient {
  _FakeWebViewClient_1(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeDownloadListener_2 extends _i1.SmartFake
    implements _i2.DownloadListener {
  _FakeDownloadListener_2(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakePlatformNavigationDelegateCreationParams_3 extends _i1.SmartFake
    implements _i3.PlatformNavigationDelegateCreationParams {
  _FakePlatformNavigationDelegateCreationParams_3(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakePlatformWebViewControllerCreationParams_4 extends _i1.SmartFake
    implements _i3.PlatformWebViewControllerCreationParams {
  _FakePlatformWebViewControllerCreationParams_4(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeObject_5 extends _i1.SmartFake implements Object {
  _FakeObject_5(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeOffset_6 extends _i1.SmartFake implements _i4.Offset {
  _FakeOffset_6(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeWebView_7 extends _i1.SmartFake implements _i2.WebView {
  _FakeWebView_7(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeFlutterAssetManager_8 extends _i1.SmartFake
    implements _i2.FlutterAssetManager {
  _FakeFlutterAssetManager_8(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeJavaScriptChannel_9 extends _i1.SmartFake
    implements _i2.JavaScriptChannel {
  _FakeJavaScriptChannel_9(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeInstanceManager_10 extends _i1.SmartFake
    implements _i5.InstanceManager {
  _FakeInstanceManager_10(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakePlatformViewsServiceProxy_11 extends _i1.SmartFake
    implements _i6.PlatformViewsServiceProxy {
  _FakePlatformViewsServiceProxy_11(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakePlatformWebViewController_12 extends _i1.SmartFake
    implements _i3.PlatformWebViewController {
  _FakePlatformWebViewController_12(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeSize_13 extends _i1.SmartFake implements _i4.Size {
  _FakeSize_13(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeExpensiveAndroidViewController_14 extends _i1.SmartFake
    implements _i7.ExpensiveAndroidViewController {
  _FakeExpensiveAndroidViewController_14(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeSurfaceAndroidViewController_15 extends _i1.SmartFake
    implements _i7.SurfaceAndroidViewController {
  _FakeSurfaceAndroidViewController_15(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeWebSettings_16 extends _i1.SmartFake implements _i2.WebSettings {
  _FakeWebSettings_16(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeWebStorage_17 extends _i1.SmartFake implements _i2.WebStorage {
  _FakeWebStorage_17(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

/// A class which mocks [AndroidNavigationDelegate].
///
/// See the documentation for Mockito's code generation for more information.
class MockAndroidNavigationDelegate extends _i1.Mock
    implements _i8.AndroidNavigationDelegate {
  @override
  _i2.WebChromeClient get androidWebChromeClient => (super.noSuchMethod(
        Invocation.getter(#androidWebChromeClient),
        returnValue: _FakeWebChromeClient_0(
          this,
          Invocation.getter(#androidWebChromeClient),
        ),
        returnValueForMissingStub: _FakeWebChromeClient_0(
          this,
          Invocation.getter(#androidWebChromeClient),
        ),
      ) as _i2.WebChromeClient);
  @override
  _i2.WebViewClient get androidWebViewClient => (super.noSuchMethod(
        Invocation.getter(#androidWebViewClient),
        returnValue: _FakeWebViewClient_1(
          this,
          Invocation.getter(#androidWebViewClient),
        ),
        returnValueForMissingStub: _FakeWebViewClient_1(
          this,
          Invocation.getter(#androidWebViewClient),
        ),
      ) as _i2.WebViewClient);
  @override
  _i2.DownloadListener get androidDownloadListener => (super.noSuchMethod(
        Invocation.getter(#androidDownloadListener),
        returnValue: _FakeDownloadListener_2(
          this,
          Invocation.getter(#androidDownloadListener),
        ),
        returnValueForMissingStub: _FakeDownloadListener_2(
          this,
          Invocation.getter(#androidDownloadListener),
        ),
      ) as _i2.DownloadListener);
  @override
  _i3.PlatformNavigationDelegateCreationParams get params =>
      (super.noSuchMethod(
        Invocation.getter(#params),
        returnValue: _FakePlatformNavigationDelegateCreationParams_3(
          this,
          Invocation.getter(#params),
        ),
        returnValueForMissingStub:
            _FakePlatformNavigationDelegateCreationParams_3(
          this,
          Invocation.getter(#params),
        ),
      ) as _i3.PlatformNavigationDelegateCreationParams);
  @override
  _i9.Future<void> setOnLoadRequest(_i8.LoadRequestCallback? onLoadRequest) =>
      (super.noSuchMethod(
        Invocation.method(
          #setOnLoadRequest,
          [onLoadRequest],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setOnNavigationRequest(
          _i3.NavigationRequestCallback? onNavigationRequest) =>
      (super.noSuchMethod(
        Invocation.method(
          #setOnNavigationRequest,
          [onNavigationRequest],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setOnPageStarted(_i3.PageEventCallback? onPageStarted) =>
      (super.noSuchMethod(
        Invocation.method(
          #setOnPageStarted,
          [onPageStarted],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setOnPageFinished(_i3.PageEventCallback? onPageFinished) =>
      (super.noSuchMethod(
        Invocation.method(
          #setOnPageFinished,
          [onPageFinished],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setOnProgress(_i3.ProgressCallback? onProgress) =>
      (super.noSuchMethod(
        Invocation.method(
          #setOnProgress,
          [onProgress],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setOnWebResourceError(
          _i3.WebResourceErrorCallback? onWebResourceError) =>
      (super.noSuchMethod(
        Invocation.method(
          #setOnWebResourceError,
          [onWebResourceError],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
}

/// A class which mocks [AndroidWebViewController].
///
/// See the documentation for Mockito's code generation for more information.
class MockAndroidWebViewController extends _i1.Mock
    implements _i8.AndroidWebViewController {
  @override
  _i3.PlatformWebViewControllerCreationParams get params => (super.noSuchMethod(
        Invocation.getter(#params),
        returnValue: _FakePlatformWebViewControllerCreationParams_4(
          this,
          Invocation.getter(#params),
        ),
        returnValueForMissingStub:
            _FakePlatformWebViewControllerCreationParams_4(
          this,
          Invocation.getter(#params),
        ),
      ) as _i3.PlatformWebViewControllerCreationParams);
  @override
  _i9.Future<void> loadFile(String? absoluteFilePath) => (super.noSuchMethod(
        Invocation.method(
          #loadFile,
          [absoluteFilePath],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> loadFlutterAsset(String? key) => (super.noSuchMethod(
        Invocation.method(
          #loadFlutterAsset,
          [key],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> loadHtmlString(
    String? html, {
    String? baseUrl,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #loadHtmlString,
          [html],
          {#baseUrl: baseUrl},
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> loadRequest(_i3.LoadRequestParams? params) =>
      (super.noSuchMethod(
        Invocation.method(
          #loadRequest,
          [params],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<String?> currentUrl() => (super.noSuchMethod(
        Invocation.method(
          #currentUrl,
          [],
        ),
        returnValue: _i9.Future<String?>.value(),
        returnValueForMissingStub: _i9.Future<String?>.value(),
      ) as _i9.Future<String?>);
  @override
  _i9.Future<bool> canGoBack() => (super.noSuchMethod(
        Invocation.method(
          #canGoBack,
          [],
        ),
        returnValue: _i9.Future<bool>.value(false),
        returnValueForMissingStub: _i9.Future<bool>.value(false),
      ) as _i9.Future<bool>);
  @override
  _i9.Future<bool> canGoForward() => (super.noSuchMethod(
        Invocation.method(
          #canGoForward,
          [],
        ),
        returnValue: _i9.Future<bool>.value(false),
        returnValueForMissingStub: _i9.Future<bool>.value(false),
      ) as _i9.Future<bool>);
  @override
  _i9.Future<void> goBack() => (super.noSuchMethod(
        Invocation.method(
          #goBack,
          [],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> goForward() => (super.noSuchMethod(
        Invocation.method(
          #goForward,
          [],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> reload() => (super.noSuchMethod(
        Invocation.method(
          #reload,
          [],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> clearCache() => (super.noSuchMethod(
        Invocation.method(
          #clearCache,
          [],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> clearLocalStorage() => (super.noSuchMethod(
        Invocation.method(
          #clearLocalStorage,
          [],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setPlatformNavigationDelegate(
          _i3.PlatformNavigationDelegate? handler) =>
      (super.noSuchMethod(
        Invocation.method(
          #setPlatformNavigationDelegate,
          [handler],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> runJavaScript(String? javaScript) => (super.noSuchMethod(
        Invocation.method(
          #runJavaScript,
          [javaScript],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<Object> runJavaScriptReturningResult(String? javaScript) =>
      (super.noSuchMethod(
        Invocation.method(
          #runJavaScriptReturningResult,
          [javaScript],
        ),
        returnValue: _i9.Future<Object>.value(_FakeObject_5(
          this,
          Invocation.method(
            #runJavaScriptReturningResult,
            [javaScript],
          ),
        )),
        returnValueForMissingStub: _i9.Future<Object>.value(_FakeObject_5(
          this,
          Invocation.method(
            #runJavaScriptReturningResult,
            [javaScript],
          ),
        )),
      ) as _i9.Future<Object>);
  @override
  _i9.Future<void> addJavaScriptChannel(
          _i3.JavaScriptChannelParams? javaScriptChannelParams) =>
      (super.noSuchMethod(
        Invocation.method(
          #addJavaScriptChannel,
          [javaScriptChannelParams],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> removeJavaScriptChannel(String? javaScriptChannelName) =>
      (super.noSuchMethod(
        Invocation.method(
          #removeJavaScriptChannel,
          [javaScriptChannelName],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<String?> getTitle() => (super.noSuchMethod(
        Invocation.method(
          #getTitle,
          [],
        ),
        returnValue: _i9.Future<String?>.value(),
        returnValueForMissingStub: _i9.Future<String?>.value(),
      ) as _i9.Future<String?>);
  @override
  _i9.Future<void> scrollTo(
    int? x,
    int? y,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #scrollTo,
          [
            x,
            y,
          ],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> scrollBy(
    int? x,
    int? y,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #scrollBy,
          [
            x,
            y,
          ],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<_i4.Offset> getScrollPosition() => (super.noSuchMethod(
        Invocation.method(
          #getScrollPosition,
          [],
        ),
        returnValue: _i9.Future<_i4.Offset>.value(_FakeOffset_6(
          this,
          Invocation.method(
            #getScrollPosition,
            [],
          ),
        )),
        returnValueForMissingStub: _i9.Future<_i4.Offset>.value(_FakeOffset_6(
          this,
          Invocation.method(
            #getScrollPosition,
            [],
          ),
        )),
      ) as _i9.Future<_i4.Offset>);
  @override
  _i9.Future<void> enableZoom(bool? enabled) => (super.noSuchMethod(
        Invocation.method(
          #enableZoom,
          [enabled],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setBackgroundColor(_i4.Color? color) => (super.noSuchMethod(
        Invocation.method(
          #setBackgroundColor,
          [color],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setJavaScriptMode(_i3.JavaScriptMode? javaScriptMode) =>
      (super.noSuchMethod(
        Invocation.method(
          #setJavaScriptMode,
          [javaScriptMode],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setUserAgent(String? userAgent) => (super.noSuchMethod(
        Invocation.method(
          #setUserAgent,
          [userAgent],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setMediaPlaybackRequiresUserGesture(bool? require) =>
      (super.noSuchMethod(
        Invocation.method(
          #setMediaPlaybackRequiresUserGesture,
          [require],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setOnShowFileSelector(
          _i9.Future<List<String>> Function(_i8.FileSelectorParams)?
              onShowFileSelectorCallback) =>
      (super.noSuchMethod(
        Invocation.method(
          #setOnShowFileSelector,
          [onShowFileSelectorCallback],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
}

/// A class which mocks [AndroidWebViewProxy].
///
/// See the documentation for Mockito's code generation for more information.
class MockAndroidWebViewProxy extends _i1.Mock
    implements _i10.AndroidWebViewProxy {
  @override
  _i2.WebView Function({required bool useHybridComposition})
      get createAndroidWebView => (super.noSuchMethod(
            Invocation.getter(#createAndroidWebView),
            returnValue: ({required bool useHybridComposition}) =>
                _FakeWebView_7(
              this,
              Invocation.getter(#createAndroidWebView),
            ),
            returnValueForMissingStub: ({required bool useHybridComposition}) =>
                _FakeWebView_7(
              this,
              Invocation.getter(#createAndroidWebView),
            ),
          ) as _i2.WebView Function({required bool useHybridComposition}));
  @override
  _i2.WebChromeClient Function({
    void Function(
      _i2.WebView,
      int,
    )?
        onProgressChanged,
    _i9.Future<List<String>> Function(
      _i2.WebView,
      _i2.FileChooserParams,
    )?
        onShowFileChooser,
  }) get createAndroidWebChromeClient => (super.noSuchMethod(
        Invocation.getter(#createAndroidWebChromeClient),
        returnValue: ({
          void Function(
            _i2.WebView,
            int,
          )?
              onProgressChanged,
          _i9.Future<List<String>> Function(
            _i2.WebView,
            _i2.FileChooserParams,
          )?
              onShowFileChooser,
        }) =>
            _FakeWebChromeClient_0(
          this,
          Invocation.getter(#createAndroidWebChromeClient),
        ),
        returnValueForMissingStub: ({
          void Function(
            _i2.WebView,
            int,
          )?
              onProgressChanged,
          _i9.Future<List<String>> Function(
            _i2.WebView,
            _i2.FileChooserParams,
          )?
              onShowFileChooser,
        }) =>
            _FakeWebChromeClient_0(
          this,
          Invocation.getter(#createAndroidWebChromeClient),
        ),
      ) as _i2.WebChromeClient Function({
        void Function(
          _i2.WebView,
          int,
        )?
            onProgressChanged,
        _i9.Future<List<String>> Function(
          _i2.WebView,
          _i2.FileChooserParams,
        )?
            onShowFileChooser,
      }));
  @override
  _i2.WebViewClient Function({
    void Function(
      _i2.WebView,
      String,
    )?
        onPageFinished,
    void Function(
      _i2.WebView,
      String,
    )?
        onPageStarted,
    void Function(
      _i2.WebView,
      int,
      String,
      String,
    )?
        onReceivedError,
    void Function(
      _i2.WebView,
      _i2.WebResourceRequest,
      _i2.WebResourceError,
    )?
        onReceivedRequestError,
    void Function(
      _i2.WebView,
      _i2.WebResourceRequest,
    )?
        requestLoading,
    void Function(
      _i2.WebView,
      String,
    )?
        urlLoading,
  }) get createAndroidWebViewClient => (super.noSuchMethod(
        Invocation.getter(#createAndroidWebViewClient),
        returnValue: ({
          void Function(
            _i2.WebView,
            String,
          )?
              onPageFinished,
          void Function(
            _i2.WebView,
            String,
          )?
              onPageStarted,
          void Function(
            _i2.WebView,
            int,
            String,
            String,
          )?
              onReceivedError,
          void Function(
            _i2.WebView,
            _i2.WebResourceRequest,
            _i2.WebResourceError,
          )?
              onReceivedRequestError,
          void Function(
            _i2.WebView,
            _i2.WebResourceRequest,
          )?
              requestLoading,
          void Function(
            _i2.WebView,
            String,
          )?
              urlLoading,
        }) =>
            _FakeWebViewClient_1(
          this,
          Invocation.getter(#createAndroidWebViewClient),
        ),
        returnValueForMissingStub: ({
          void Function(
            _i2.WebView,
            String,
          )?
              onPageFinished,
          void Function(
            _i2.WebView,
            String,
          )?
              onPageStarted,
          void Function(
            _i2.WebView,
            int,
            String,
            String,
          )?
              onReceivedError,
          void Function(
            _i2.WebView,
            _i2.WebResourceRequest,
            _i2.WebResourceError,
          )?
              onReceivedRequestError,
          void Function(
            _i2.WebView,
            _i2.WebResourceRequest,
          )?
              requestLoading,
          void Function(
            _i2.WebView,
            String,
          )?
              urlLoading,
        }) =>
            _FakeWebViewClient_1(
          this,
          Invocation.getter(#createAndroidWebViewClient),
        ),
      ) as _i2.WebViewClient Function({
        void Function(
          _i2.WebView,
          String,
        )?
            onPageFinished,
        void Function(
          _i2.WebView,
          String,
        )?
            onPageStarted,
        void Function(
          _i2.WebView,
          int,
          String,
          String,
        )?
            onReceivedError,
        void Function(
          _i2.WebView,
          _i2.WebResourceRequest,
          _i2.WebResourceError,
        )?
            onReceivedRequestError,
        void Function(
          _i2.WebView,
          _i2.WebResourceRequest,
        )?
            requestLoading,
        void Function(
          _i2.WebView,
          String,
        )?
            urlLoading,
      }));
  @override
  _i2.FlutterAssetManager Function() get createFlutterAssetManager =>
      (super.noSuchMethod(
        Invocation.getter(#createFlutterAssetManager),
        returnValue: () => _FakeFlutterAssetManager_8(
          this,
          Invocation.getter(#createFlutterAssetManager),
        ),
        returnValueForMissingStub: () => _FakeFlutterAssetManager_8(
          this,
          Invocation.getter(#createFlutterAssetManager),
        ),
      ) as _i2.FlutterAssetManager Function());
  @override
  _i2.JavaScriptChannel Function(
    String, {
    required void Function(String) postMessage,
  }) get createJavaScriptChannel => (super.noSuchMethod(
        Invocation.getter(#createJavaScriptChannel),
        returnValue: (
          String channelName, {
          required void Function(String) postMessage,
        }) =>
            _FakeJavaScriptChannel_9(
          this,
          Invocation.getter(#createJavaScriptChannel),
        ),
        returnValueForMissingStub: (
          String channelName, {
          required void Function(String) postMessage,
        }) =>
            _FakeJavaScriptChannel_9(
          this,
          Invocation.getter(#createJavaScriptChannel),
        ),
      ) as _i2.JavaScriptChannel Function(
        String, {
        required void Function(String) postMessage,
      }));
  @override
  _i2.DownloadListener Function(
      {required void Function(
        String,
        String,
        String,
        String,
        int,
      )
          onDownloadStart}) get createDownloadListener => (super.noSuchMethod(
        Invocation.getter(#createDownloadListener),
        returnValue: (
                {required void Function(
                  String,
                  String,
                  String,
                  String,
                  int,
                )
                    onDownloadStart}) =>
            _FakeDownloadListener_2(
          this,
          Invocation.getter(#createDownloadListener),
        ),
        returnValueForMissingStub: (
                {required void Function(
                  String,
                  String,
                  String,
                  String,
                  int,
                )
                    onDownloadStart}) =>
            _FakeDownloadListener_2(
          this,
          Invocation.getter(#createDownloadListener),
        ),
      ) as _i2.DownloadListener Function(
          {required void Function(
            String,
            String,
            String,
            String,
            int,
          )
              onDownloadStart}));
  @override
  _i9.Future<void> setWebContentsDebuggingEnabled(bool? enabled) =>
      (super.noSuchMethod(
        Invocation.method(
          #setWebContentsDebuggingEnabled,
          [enabled],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
}

/// A class which mocks [AndroidWebViewWidgetCreationParams].
///
/// See the documentation for Mockito's code generation for more information.
// ignore: must_be_immutable
class MockAndroidWebViewWidgetCreationParams extends _i1.Mock
    implements _i8.AndroidWebViewWidgetCreationParams {
  @override
  _i5.InstanceManager get instanceManager => (super.noSuchMethod(
        Invocation.getter(#instanceManager),
        returnValue: _FakeInstanceManager_10(
          this,
          Invocation.getter(#instanceManager),
        ),
        returnValueForMissingStub: _FakeInstanceManager_10(
          this,
          Invocation.getter(#instanceManager),
        ),
      ) as _i5.InstanceManager);
  @override
  _i6.PlatformViewsServiceProxy get platformViewsServiceProxy =>
      (super.noSuchMethod(
        Invocation.getter(#platformViewsServiceProxy),
        returnValue: _FakePlatformViewsServiceProxy_11(
          this,
          Invocation.getter(#platformViewsServiceProxy),
        ),
        returnValueForMissingStub: _FakePlatformViewsServiceProxy_11(
          this,
          Invocation.getter(#platformViewsServiceProxy),
        ),
      ) as _i6.PlatformViewsServiceProxy);
  @override
  bool get displayWithHybridComposition => (super.noSuchMethod(
        Invocation.getter(#displayWithHybridComposition),
        returnValue: false,
        returnValueForMissingStub: false,
      ) as bool);
  @override
  _i3.PlatformWebViewController get controller => (super.noSuchMethod(
        Invocation.getter(#controller),
        returnValue: _FakePlatformWebViewController_12(
          this,
          Invocation.getter(#controller),
        ),
        returnValueForMissingStub: _FakePlatformWebViewController_12(
          this,
          Invocation.getter(#controller),
        ),
      ) as _i3.PlatformWebViewController);
  @override
  _i4.TextDirection get layoutDirection => (super.noSuchMethod(
        Invocation.getter(#layoutDirection),
        returnValue: _i4.TextDirection.rtl,
        returnValueForMissingStub: _i4.TextDirection.rtl,
      ) as _i4.TextDirection);
  @override
  Set<_i11.Factory<_i12.OneSequenceGestureRecognizer>> get gestureRecognizers =>
      (super.noSuchMethod(
        Invocation.getter(#gestureRecognizers),
        returnValue: <_i11.Factory<_i12.OneSequenceGestureRecognizer>>{},
        returnValueForMissingStub: <
            _i11.Factory<_i12.OneSequenceGestureRecognizer>>{},
      ) as Set<_i11.Factory<_i12.OneSequenceGestureRecognizer>>);
}

/// A class which mocks [ExpensiveAndroidViewController].
///
/// See the documentation for Mockito's code generation for more information.
class MockExpensiveAndroidViewController extends _i1.Mock
    implements _i7.ExpensiveAndroidViewController {
  @override
  bool get requiresViewComposition => (super.noSuchMethod(
        Invocation.getter(#requiresViewComposition),
        returnValue: false,
        returnValueForMissingStub: false,
      ) as bool);
  @override
  int get viewId => (super.noSuchMethod(
        Invocation.getter(#viewId),
        returnValue: 0,
        returnValueForMissingStub: 0,
      ) as int);
  @override
  bool get awaitingCreation => (super.noSuchMethod(
        Invocation.getter(#awaitingCreation),
        returnValue: false,
        returnValueForMissingStub: false,
      ) as bool);
  @override
  _i7.PointTransformer get pointTransformer => (super.noSuchMethod(
        Invocation.getter(#pointTransformer),
        returnValue: (_i4.Offset position) => _FakeOffset_6(
          this,
          Invocation.getter(#pointTransformer),
        ),
        returnValueForMissingStub: (_i4.Offset position) => _FakeOffset_6(
          this,
          Invocation.getter(#pointTransformer),
        ),
      ) as _i7.PointTransformer);
  @override
  set pointTransformer(_i7.PointTransformer? transformer) => super.noSuchMethod(
        Invocation.setter(
          #pointTransformer,
          transformer,
        ),
        returnValueForMissingStub: null,
      );
  @override
  bool get isCreated => (super.noSuchMethod(
        Invocation.getter(#isCreated),
        returnValue: false,
        returnValueForMissingStub: false,
      ) as bool);
  @override
  List<_i7.PlatformViewCreatedCallback> get createdCallbacks =>
      (super.noSuchMethod(
        Invocation.getter(#createdCallbacks),
        returnValue: <_i7.PlatformViewCreatedCallback>[],
        returnValueForMissingStub: <_i7.PlatformViewCreatedCallback>[],
      ) as List<_i7.PlatformViewCreatedCallback>);
  @override
  _i9.Future<void> setOffset(_i4.Offset? off) => (super.noSuchMethod(
        Invocation.method(
          #setOffset,
          [off],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> create({
    _i4.Size? size,
    _i4.Offset? position,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #create,
          [],
          {
            #size: size,
            #position: position,
          },
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<_i4.Size> setSize(_i4.Size? size) => (super.noSuchMethod(
        Invocation.method(
          #setSize,
          [size],
        ),
        returnValue: _i9.Future<_i4.Size>.value(_FakeSize_13(
          this,
          Invocation.method(
            #setSize,
            [size],
          ),
        )),
        returnValueForMissingStub: _i9.Future<_i4.Size>.value(_FakeSize_13(
          this,
          Invocation.method(
            #setSize,
            [size],
          ),
        )),
      ) as _i9.Future<_i4.Size>);
  @override
  _i9.Future<void> sendMotionEvent(_i7.AndroidMotionEvent? event) =>
      (super.noSuchMethod(
        Invocation.method(
          #sendMotionEvent,
          [event],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  void addOnPlatformViewCreatedListener(
          _i7.PlatformViewCreatedCallback? listener) =>
      super.noSuchMethod(
        Invocation.method(
          #addOnPlatformViewCreatedListener,
          [listener],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void removeOnPlatformViewCreatedListener(
          _i7.PlatformViewCreatedCallback? listener) =>
      super.noSuchMethod(
        Invocation.method(
          #removeOnPlatformViewCreatedListener,
          [listener],
        ),
        returnValueForMissingStub: null,
      );
  @override
  _i9.Future<void> setLayoutDirection(_i4.TextDirection? layoutDirection) =>
      (super.noSuchMethod(
        Invocation.method(
          #setLayoutDirection,
          [layoutDirection],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> dispatchPointerEvent(_i13.PointerEvent? event) =>
      (super.noSuchMethod(
        Invocation.method(
          #dispatchPointerEvent,
          [event],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> clearFocus() => (super.noSuchMethod(
        Invocation.method(
          #clearFocus,
          [],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> dispose() => (super.noSuchMethod(
        Invocation.method(
          #dispose,
          [],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
}

/// A class which mocks [FlutterAssetManager].
///
/// See the documentation for Mockito's code generation for more information.
class MockFlutterAssetManager extends _i1.Mock
    implements _i2.FlutterAssetManager {
  @override
  _i9.Future<List<String?>> list(String? path) => (super.noSuchMethod(
        Invocation.method(
          #list,
          [path],
        ),
        returnValue: _i9.Future<List<String?>>.value(<String?>[]),
        returnValueForMissingStub: _i9.Future<List<String?>>.value(<String?>[]),
      ) as _i9.Future<List<String?>>);
  @override
  _i9.Future<String> getAssetFilePathByName(String? name) =>
      (super.noSuchMethod(
        Invocation.method(
          #getAssetFilePathByName,
          [name],
        ),
        returnValue: _i9.Future<String>.value(''),
        returnValueForMissingStub: _i9.Future<String>.value(''),
      ) as _i9.Future<String>);
}

/// A class which mocks [JavaScriptChannel].
///
/// See the documentation for Mockito's code generation for more information.
class MockJavaScriptChannel extends _i1.Mock implements _i2.JavaScriptChannel {
  @override
  String get channelName => (super.noSuchMethod(
        Invocation.getter(#channelName),
        returnValue: '',
        returnValueForMissingStub: '',
      ) as String);
  @override
  void Function(String) get postMessage => (super.noSuchMethod(
        Invocation.getter(#postMessage),
        returnValue: (String message) {},
        returnValueForMissingStub: (String message) {},
      ) as void Function(String));
  @override
  _i2.JavaScriptChannel copy() => (super.noSuchMethod(
        Invocation.method(
          #copy,
          [],
        ),
        returnValue: _FakeJavaScriptChannel_9(
          this,
          Invocation.method(
            #copy,
            [],
          ),
        ),
        returnValueForMissingStub: _FakeJavaScriptChannel_9(
          this,
          Invocation.method(
            #copy,
            [],
          ),
        ),
      ) as _i2.JavaScriptChannel);
}

/// A class which mocks [PlatformViewsServiceProxy].
///
/// See the documentation for Mockito's code generation for more information.
// ignore: must_be_immutable
class MockPlatformViewsServiceProxy extends _i1.Mock
    implements _i6.PlatformViewsServiceProxy {
  @override
  _i7.ExpensiveAndroidViewController initExpensiveAndroidView({
    required int? id,
    required String? viewType,
    required _i4.TextDirection? layoutDirection,
    dynamic creationParams,
    _i7.MessageCodec<dynamic>? creationParamsCodec,
    _i4.VoidCallback? onFocus,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #initExpensiveAndroidView,
          [],
          {
            #id: id,
            #viewType: viewType,
            #layoutDirection: layoutDirection,
            #creationParams: creationParams,
            #creationParamsCodec: creationParamsCodec,
            #onFocus: onFocus,
          },
        ),
        returnValue: _FakeExpensiveAndroidViewController_14(
          this,
          Invocation.method(
            #initExpensiveAndroidView,
            [],
            {
              #id: id,
              #viewType: viewType,
              #layoutDirection: layoutDirection,
              #creationParams: creationParams,
              #creationParamsCodec: creationParamsCodec,
              #onFocus: onFocus,
            },
          ),
        ),
        returnValueForMissingStub: _FakeExpensiveAndroidViewController_14(
          this,
          Invocation.method(
            #initExpensiveAndroidView,
            [],
            {
              #id: id,
              #viewType: viewType,
              #layoutDirection: layoutDirection,
              #creationParams: creationParams,
              #creationParamsCodec: creationParamsCodec,
              #onFocus: onFocus,
            },
          ),
        ),
      ) as _i7.ExpensiveAndroidViewController);
  @override
  _i7.SurfaceAndroidViewController initSurfaceAndroidView({
    required int? id,
    required String? viewType,
    required _i4.TextDirection? layoutDirection,
    dynamic creationParams,
    _i7.MessageCodec<dynamic>? creationParamsCodec,
    _i4.VoidCallback? onFocus,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #initSurfaceAndroidView,
          [],
          {
            #id: id,
            #viewType: viewType,
            #layoutDirection: layoutDirection,
            #creationParams: creationParams,
            #creationParamsCodec: creationParamsCodec,
            #onFocus: onFocus,
          },
        ),
        returnValue: _FakeSurfaceAndroidViewController_15(
          this,
          Invocation.method(
            #initSurfaceAndroidView,
            [],
            {
              #id: id,
              #viewType: viewType,
              #layoutDirection: layoutDirection,
              #creationParams: creationParams,
              #creationParamsCodec: creationParamsCodec,
              #onFocus: onFocus,
            },
          ),
        ),
        returnValueForMissingStub: _FakeSurfaceAndroidViewController_15(
          this,
          Invocation.method(
            #initSurfaceAndroidView,
            [],
            {
              #id: id,
              #viewType: viewType,
              #layoutDirection: layoutDirection,
              #creationParams: creationParams,
              #creationParamsCodec: creationParamsCodec,
              #onFocus: onFocus,
            },
          ),
        ),
      ) as _i7.SurfaceAndroidViewController);
}

/// A class which mocks [SurfaceAndroidViewController].
///
/// See the documentation for Mockito's code generation for more information.
class MockSurfaceAndroidViewController extends _i1.Mock
    implements _i7.SurfaceAndroidViewController {
  @override
  bool get requiresViewComposition => (super.noSuchMethod(
        Invocation.getter(#requiresViewComposition),
        returnValue: false,
        returnValueForMissingStub: false,
      ) as bool);
  @override
  int get viewId => (super.noSuchMethod(
        Invocation.getter(#viewId),
        returnValue: 0,
        returnValueForMissingStub: 0,
      ) as int);
  @override
  bool get awaitingCreation => (super.noSuchMethod(
        Invocation.getter(#awaitingCreation),
        returnValue: false,
        returnValueForMissingStub: false,
      ) as bool);
  @override
  _i7.PointTransformer get pointTransformer => (super.noSuchMethod(
        Invocation.getter(#pointTransformer),
        returnValue: (_i4.Offset position) => _FakeOffset_6(
          this,
          Invocation.getter(#pointTransformer),
        ),
        returnValueForMissingStub: (_i4.Offset position) => _FakeOffset_6(
          this,
          Invocation.getter(#pointTransformer),
        ),
      ) as _i7.PointTransformer);
  @override
  set pointTransformer(_i7.PointTransformer? transformer) => super.noSuchMethod(
        Invocation.setter(
          #pointTransformer,
          transformer,
        ),
        returnValueForMissingStub: null,
      );
  @override
  bool get isCreated => (super.noSuchMethod(
        Invocation.getter(#isCreated),
        returnValue: false,
        returnValueForMissingStub: false,
      ) as bool);
  @override
  List<_i7.PlatformViewCreatedCallback> get createdCallbacks =>
      (super.noSuchMethod(
        Invocation.getter(#createdCallbacks),
        returnValue: <_i7.PlatformViewCreatedCallback>[],
        returnValueForMissingStub: <_i7.PlatformViewCreatedCallback>[],
      ) as List<_i7.PlatformViewCreatedCallback>);
  @override
  _i9.Future<void> setOffset(_i4.Offset? off) => (super.noSuchMethod(
        Invocation.method(
          #setOffset,
          [off],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> create({
    _i4.Size? size,
    _i4.Offset? position,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #create,
          [],
          {
            #size: size,
            #position: position,
          },
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<_i4.Size> setSize(_i4.Size? size) => (super.noSuchMethod(
        Invocation.method(
          #setSize,
          [size],
        ),
        returnValue: _i9.Future<_i4.Size>.value(_FakeSize_13(
          this,
          Invocation.method(
            #setSize,
            [size],
          ),
        )),
        returnValueForMissingStub: _i9.Future<_i4.Size>.value(_FakeSize_13(
          this,
          Invocation.method(
            #setSize,
            [size],
          ),
        )),
      ) as _i9.Future<_i4.Size>);
  @override
  _i9.Future<void> sendMotionEvent(_i7.AndroidMotionEvent? event) =>
      (super.noSuchMethod(
        Invocation.method(
          #sendMotionEvent,
          [event],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  void addOnPlatformViewCreatedListener(
          _i7.PlatformViewCreatedCallback? listener) =>
      super.noSuchMethod(
        Invocation.method(
          #addOnPlatformViewCreatedListener,
          [listener],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void removeOnPlatformViewCreatedListener(
          _i7.PlatformViewCreatedCallback? listener) =>
      super.noSuchMethod(
        Invocation.method(
          #removeOnPlatformViewCreatedListener,
          [listener],
        ),
        returnValueForMissingStub: null,
      );
  @override
  _i9.Future<void> setLayoutDirection(_i4.TextDirection? layoutDirection) =>
      (super.noSuchMethod(
        Invocation.method(
          #setLayoutDirection,
          [layoutDirection],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> dispatchPointerEvent(_i13.PointerEvent? event) =>
      (super.noSuchMethod(
        Invocation.method(
          #dispatchPointerEvent,
          [event],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> clearFocus() => (super.noSuchMethod(
        Invocation.method(
          #clearFocus,
          [],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> dispose() => (super.noSuchMethod(
        Invocation.method(
          #dispose,
          [],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
}

/// A class which mocks [WebChromeClient].
///
/// See the documentation for Mockito's code generation for more information.
class MockWebChromeClient extends _i1.Mock implements _i2.WebChromeClient {
  @override
  _i9.Future<void> setSynchronousReturnValueForOnShowFileChooser(bool? value) =>
      (super.noSuchMethod(
        Invocation.method(
          #setSynchronousReturnValueForOnShowFileChooser,
          [value],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i2.WebChromeClient copy() => (super.noSuchMethod(
        Invocation.method(
          #copy,
          [],
        ),
        returnValue: _FakeWebChromeClient_0(
          this,
          Invocation.method(
            #copy,
            [],
          ),
        ),
        returnValueForMissingStub: _FakeWebChromeClient_0(
          this,
          Invocation.method(
            #copy,
            [],
          ),
        ),
      ) as _i2.WebChromeClient);
}

/// A class which mocks [WebSettings].
///
/// See the documentation for Mockito's code generation for more information.
class MockWebSettings extends _i1.Mock implements _i2.WebSettings {
  @override
  _i9.Future<void> setDomStorageEnabled(bool? flag) => (super.noSuchMethod(
        Invocation.method(
          #setDomStorageEnabled,
          [flag],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setJavaScriptCanOpenWindowsAutomatically(bool? flag) =>
      (super.noSuchMethod(
        Invocation.method(
          #setJavaScriptCanOpenWindowsAutomatically,
          [flag],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setSupportMultipleWindows(bool? support) =>
      (super.noSuchMethod(
        Invocation.method(
          #setSupportMultipleWindows,
          [support],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setJavaScriptEnabled(bool? flag) => (super.noSuchMethod(
        Invocation.method(
          #setJavaScriptEnabled,
          [flag],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setUserAgentString(String? userAgentString) =>
      (super.noSuchMethod(
        Invocation.method(
          #setUserAgentString,
          [userAgentString],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setMediaPlaybackRequiresUserGesture(bool? require) =>
      (super.noSuchMethod(
        Invocation.method(
          #setMediaPlaybackRequiresUserGesture,
          [require],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setSupportZoom(bool? support) => (super.noSuchMethod(
        Invocation.method(
          #setSupportZoom,
          [support],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setLoadWithOverviewMode(bool? overview) =>
      (super.noSuchMethod(
        Invocation.method(
          #setLoadWithOverviewMode,
          [overview],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setUseWideViewPort(bool? use) => (super.noSuchMethod(
        Invocation.method(
          #setUseWideViewPort,
          [use],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setDisplayZoomControls(bool? enabled) => (super.noSuchMethod(
        Invocation.method(
          #setDisplayZoomControls,
          [enabled],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setBuiltInZoomControls(bool? enabled) => (super.noSuchMethod(
        Invocation.method(
          #setBuiltInZoomControls,
          [enabled],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setAllowFileAccess(bool? enabled) => (super.noSuchMethod(
        Invocation.method(
          #setAllowFileAccess,
          [enabled],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i2.WebSettings copy() => (super.noSuchMethod(
        Invocation.method(
          #copy,
          [],
        ),
        returnValue: _FakeWebSettings_16(
          this,
          Invocation.method(
            #copy,
            [],
          ),
        ),
        returnValueForMissingStub: _FakeWebSettings_16(
          this,
          Invocation.method(
            #copy,
            [],
          ),
        ),
      ) as _i2.WebSettings);
}

/// A class which mocks [WebView].
///
/// See the documentation for Mockito's code generation for more information.
class MockWebView extends _i1.Mock implements _i2.WebView {
  @override
  bool get useHybridComposition => (super.noSuchMethod(
        Invocation.getter(#useHybridComposition),
        returnValue: false,
        returnValueForMissingStub: false,
      ) as bool);
  @override
  _i2.WebSettings get settings => (super.noSuchMethod(
        Invocation.getter(#settings),
        returnValue: _FakeWebSettings_16(
          this,
          Invocation.getter(#settings),
        ),
        returnValueForMissingStub: _FakeWebSettings_16(
          this,
          Invocation.getter(#settings),
        ),
      ) as _i2.WebSettings);
  @override
  _i9.Future<void> loadData({
    required String? data,
    String? mimeType,
    String? encoding,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #loadData,
          [],
          {
            #data: data,
            #mimeType: mimeType,
            #encoding: encoding,
          },
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> loadDataWithBaseUrl({
    String? baseUrl,
    required String? data,
    String? mimeType,
    String? encoding,
    String? historyUrl,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #loadDataWithBaseUrl,
          [],
          {
            #baseUrl: baseUrl,
            #data: data,
            #mimeType: mimeType,
            #encoding: encoding,
            #historyUrl: historyUrl,
          },
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> loadUrl(
    String? url,
    Map<String, String>? headers,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #loadUrl,
          [
            url,
            headers,
          ],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> postUrl(
    String? url,
    _i14.Uint8List? data,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #postUrl,
          [
            url,
            data,
          ],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<String?> getUrl() => (super.noSuchMethod(
        Invocation.method(
          #getUrl,
          [],
        ),
        returnValue: _i9.Future<String?>.value(),
        returnValueForMissingStub: _i9.Future<String?>.value(),
      ) as _i9.Future<String?>);
  @override
  _i9.Future<bool> canGoBack() => (super.noSuchMethod(
        Invocation.method(
          #canGoBack,
          [],
        ),
        returnValue: _i9.Future<bool>.value(false),
        returnValueForMissingStub: _i9.Future<bool>.value(false),
      ) as _i9.Future<bool>);
  @override
  _i9.Future<bool> canGoForward() => (super.noSuchMethod(
        Invocation.method(
          #canGoForward,
          [],
        ),
        returnValue: _i9.Future<bool>.value(false),
        returnValueForMissingStub: _i9.Future<bool>.value(false),
      ) as _i9.Future<bool>);
  @override
  _i9.Future<void> goBack() => (super.noSuchMethod(
        Invocation.method(
          #goBack,
          [],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> goForward() => (super.noSuchMethod(
        Invocation.method(
          #goForward,
          [],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> reload() => (super.noSuchMethod(
        Invocation.method(
          #reload,
          [],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> clearCache(bool? includeDiskFiles) => (super.noSuchMethod(
        Invocation.method(
          #clearCache,
          [includeDiskFiles],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<String?> evaluateJavascript(String? javascriptString) =>
      (super.noSuchMethod(
        Invocation.method(
          #evaluateJavascript,
          [javascriptString],
        ),
        returnValue: _i9.Future<String?>.value(),
        returnValueForMissingStub: _i9.Future<String?>.value(),
      ) as _i9.Future<String?>);
  @override
  _i9.Future<String?> getTitle() => (super.noSuchMethod(
        Invocation.method(
          #getTitle,
          [],
        ),
        returnValue: _i9.Future<String?>.value(),
        returnValueForMissingStub: _i9.Future<String?>.value(),
      ) as _i9.Future<String?>);
  @override
  _i9.Future<void> scrollTo(
    int? x,
    int? y,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #scrollTo,
          [
            x,
            y,
          ],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> scrollBy(
    int? x,
    int? y,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #scrollBy,
          [
            x,
            y,
          ],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<int> getScrollX() => (super.noSuchMethod(
        Invocation.method(
          #getScrollX,
          [],
        ),
        returnValue: _i9.Future<int>.value(0),
        returnValueForMissingStub: _i9.Future<int>.value(0),
      ) as _i9.Future<int>);
  @override
  _i9.Future<int> getScrollY() => (super.noSuchMethod(
        Invocation.method(
          #getScrollY,
          [],
        ),
        returnValue: _i9.Future<int>.value(0),
        returnValueForMissingStub: _i9.Future<int>.value(0),
      ) as _i9.Future<int>);
  @override
  _i9.Future<_i4.Offset> getScrollPosition() => (super.noSuchMethod(
        Invocation.method(
          #getScrollPosition,
          [],
        ),
        returnValue: _i9.Future<_i4.Offset>.value(_FakeOffset_6(
          this,
          Invocation.method(
            #getScrollPosition,
            [],
          ),
        )),
        returnValueForMissingStub: _i9.Future<_i4.Offset>.value(_FakeOffset_6(
          this,
          Invocation.method(
            #getScrollPosition,
            [],
          ),
        )),
      ) as _i9.Future<_i4.Offset>);
  @override
  _i9.Future<void> setWebViewClient(_i2.WebViewClient? webViewClient) =>
      (super.noSuchMethod(
        Invocation.method(
          #setWebViewClient,
          [webViewClient],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> addJavaScriptChannel(
          _i2.JavaScriptChannel? javaScriptChannel) =>
      (super.noSuchMethod(
        Invocation.method(
          #addJavaScriptChannel,
          [javaScriptChannel],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> removeJavaScriptChannel(
          _i2.JavaScriptChannel? javaScriptChannel) =>
      (super.noSuchMethod(
        Invocation.method(
          #removeJavaScriptChannel,
          [javaScriptChannel],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setDownloadListener(_i2.DownloadListener? listener) =>
      (super.noSuchMethod(
        Invocation.method(
          #setDownloadListener,
          [listener],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setWebChromeClient(_i2.WebChromeClient? client) =>
      (super.noSuchMethod(
        Invocation.method(
          #setWebChromeClient,
          [client],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i9.Future<void> setBackgroundColor(_i4.Color? color) => (super.noSuchMethod(
        Invocation.method(
          #setBackgroundColor,
          [color],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i2.WebView copy() => (super.noSuchMethod(
        Invocation.method(
          #copy,
          [],
        ),
        returnValue: _FakeWebView_7(
          this,
          Invocation.method(
            #copy,
            [],
          ),
        ),
        returnValueForMissingStub: _FakeWebView_7(
          this,
          Invocation.method(
            #copy,
            [],
          ),
        ),
      ) as _i2.WebView);
}

/// A class which mocks [WebViewClient].
///
/// See the documentation for Mockito's code generation for more information.
class MockWebViewClient extends _i1.Mock implements _i2.WebViewClient {
  @override
  _i9.Future<void> setSynchronousReturnValueForShouldOverrideUrlLoading(
          bool? value) =>
      (super.noSuchMethod(
        Invocation.method(
          #setSynchronousReturnValueForShouldOverrideUrlLoading,
          [value],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i2.WebViewClient copy() => (super.noSuchMethod(
        Invocation.method(
          #copy,
          [],
        ),
        returnValue: _FakeWebViewClient_1(
          this,
          Invocation.method(
            #copy,
            [],
          ),
        ),
        returnValueForMissingStub: _FakeWebViewClient_1(
          this,
          Invocation.method(
            #copy,
            [],
          ),
        ),
      ) as _i2.WebViewClient);
}

/// A class which mocks [WebStorage].
///
/// See the documentation for Mockito's code generation for more information.
class MockWebStorage extends _i1.Mock implements _i2.WebStorage {
  @override
  _i9.Future<void> deleteAllData() => (super.noSuchMethod(
        Invocation.method(
          #deleteAllData,
          [],
        ),
        returnValue: _i9.Future<void>.value(),
        returnValueForMissingStub: _i9.Future<void>.value(),
      ) as _i9.Future<void>);
  @override
  _i2.WebStorage copy() => (super.noSuchMethod(
        Invocation.method(
          #copy,
          [],
        ),
        returnValue: _FakeWebStorage_17(
          this,
          Invocation.method(
            #copy,
            [],
          ),
        ),
        returnValueForMissingStub: _FakeWebStorage_17(
          this,
          Invocation.method(
            #copy,
            [],
          ),
        ),
      ) as _i2.WebStorage);
}

/// A class which mocks [InstanceManager].
///
/// See the documentation for Mockito's code generation for more information.
class MockInstanceManager extends _i1.Mock implements _i5.InstanceManager {
  @override
  void Function(int) get onWeakReferenceRemoved => (super.noSuchMethod(
        Invocation.getter(#onWeakReferenceRemoved),
        returnValue: (int __p0) {},
        returnValueForMissingStub: (int __p0) {},
      ) as void Function(int));
  @override
  set onWeakReferenceRemoved(void Function(int)? _onWeakReferenceRemoved) =>
      super.noSuchMethod(
        Invocation.setter(
          #onWeakReferenceRemoved,
          _onWeakReferenceRemoved,
        ),
        returnValueForMissingStub: null,
      );
  @override
  int addDartCreatedInstance(_i5.Copyable? instance) => (super.noSuchMethod(
        Invocation.method(
          #addDartCreatedInstance,
          [instance],
        ),
        returnValue: 0,
        returnValueForMissingStub: 0,
      ) as int);
  @override
  int? removeWeakReference(_i5.Copyable? instance) => (super.noSuchMethod(
        Invocation.method(
          #removeWeakReference,
          [instance],
        ),
        returnValueForMissingStub: null,
      ) as int?);
  @override
  T? remove<T extends _i5.Copyable>(int? identifier) => (super.noSuchMethod(
        Invocation.method(
          #remove,
          [identifier],
        ),
        returnValueForMissingStub: null,
      ) as T?);
  @override
  T? getInstanceWithWeakReference<T extends _i5.Copyable>(int? identifier) =>
      (super.noSuchMethod(
        Invocation.method(
          #getInstanceWithWeakReference,
          [identifier],
        ),
        returnValueForMissingStub: null,
      ) as T?);
  @override
  int? getIdentifier(_i5.Copyable? instance) => (super.noSuchMethod(
        Invocation.method(
          #getIdentifier,
          [instance],
        ),
        returnValueForMissingStub: null,
      ) as int?);
  @override
  void addHostCreatedInstance(
    _i5.Copyable? instance,
    int? identifier,
  ) =>
      super.noSuchMethod(
        Invocation.method(
          #addHostCreatedInstance,
          [
            instance,
            identifier,
          ],
        ),
        returnValueForMissingStub: null,
      );
  @override
  bool containsIdentifier(int? identifier) => (super.noSuchMethod(
        Invocation.method(
          #containsIdentifier,
          [identifier],
        ),
        returnValue: false,
        returnValueForMissingStub: false,
      ) as bool);
}
