Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
7c363fd
dart side of implementation
bparrishMines May 11, 2022
2e55266
objc side of callback impl
bparrishMines May 12, 2022
4a12eaa
documentation and a test messenger
bparrishMines May 12, 2022
6bc048b
dart side update
bparrishMines May 16, 2022
4efa9a1
objc side
bparrishMines May 16, 2022
f9d54e2
formatting
bparrishMines May 16, 2022
2f73074
Merge branch 'main' of github.com:flutter/plugins into callbacks
bparrishMines May 16, 2022
ddfde5c
handles
bparrishMines May 17, 2022
96c21ae
some fixes for PR comments
bparrishMines May 18, 2022
f2a3504
new instance manager
bparrishMines May 19, 2022
77da52f
bunch of work
bparrishMines May 19, 2022
e388090
instance manager tests
bparrishMines May 19, 2022
ac3a2de
fix foundation tests
bparrishMines May 19, 2022
696c25c
dart touchups
bparrishMines May 19, 2022
88816c9
finish dart standardization and support earlier versions
bparrishMines May 19, 2022
9d25ab1
fix dart instance manager
bparrishMines May 19, 2022
4d7ebc4
instance manager ish
bparrishMines May 19, 2022
81b201f
most tests passing
bparrishMines May 19, 2022
62581ba
instance manager tests
bparrishMines May 20, 2022
f0d2498
formatting and one last test
bparrishMines May 20, 2022
4bd6d2a
formatting
bparrishMines May 20, 2022
7974d56
naming
bparrishMines May 20, 2022
ad9b4e6
better comment
bparrishMines May 20, 2022
d8b720e
update comment with info about platform/flutter
bparrishMines May 23, 2022
3c98004
fix bug from instance manager identifier
bparrishMines May 24, 2022
368fb30
limits on identifiers
bparrishMines May 25, 2022
a6980c5
use removeReference name instead
bparrishMines May 25, 2022
179f109
maybe an even better name?
bparrishMines May 25, 2022
e966816
use init constructor
bparrishMines May 25, 2022
3897535
version bump
bparrishMines May 25, 2022
312825a
update name
bparrishMines May 25, 2022
36fa0a0
Merge branch 'main' of github.com:flutter/plugins into callbacks
bparrishMines May 25, 2022
2b7a9af
undo changes to webview_flutter
bparrishMines May 25, 2022
86b193a
add api impls
bparrishMines May 25, 2022
61d5f8a
undo changes to create methods
bparrishMines May 25, 2022
29e8ad0
changes and stuff
bparrishMines May 25, 2022
2be09aa
some updates
bparrishMines May 26, 2022
e212aa4
Merge branch 'main' of github.com:flutter/plugins into callbacks
bparrishMines May 26, 2022
ea0fe93
method names
bparrishMines May 26, 2022
9e47dda
more docs, yay
bparrishMines May 26, 2022
8076bed
spelling and docs
bparrishMines May 31, 2022
0fa7a14
pr comments
bparrishMines Jun 2, 2022
797d448
format and issue
bparrishMines Jun 2, 2022
ba8161a
Merge branch 'main' of github.com:flutter/plugins into callbacks
bparrishMines Jun 2, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
dart side update
  • Loading branch information
bparrishMines committed May 16, 2022
commit 6bc048b3d9bbcbe0b33e54eb0029190dc44bbe44

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ - (instancetype)initWithBinaryMessenger:(id<FlutterBinaryMessenger>)binaryMessen
[[FWFNavigationDelegateFlutterApiImpl alloc] initWithBinaryMessenger:binaryMessenger
instanceManager:instanceManager];

FWFNavigationDelegate __weak __block *weakSelf = self;
FWFNavigationDelegate __weak *weakSelf = self;
_didFinishNavigation = ^(WKWebView *webView, NSString *URL) {
[weakSelf.navigationDelegateApi didFinishNavigationFunction:weakSelf.didFinishNavigation
webView:webView
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
/// Maintains instances stored to communicate with Objective-C objects.
class InstanceManager {
final Map<int, Object> _instanceIdsToInstances = <int, Object>{};
final Map<Object, int> _instancesToInstanceIds = <Object, int>{};
final Expando<Object> _instancesToInstanceIds = Expando<Object>();

int _nextInstanceId = 0;

Expand All @@ -17,7 +17,7 @@ class InstanceManager {
/// Returns new if [instance] has already been added. Otherwise, it is added
/// with a new instance id.
int? tryAddInstance(Object instance) {
if (_instancesToInstanceIds.containsKey(instance)) {
if (getInstanceId(instance) != null) {
return null;
}

Expand All @@ -27,14 +27,21 @@ class InstanceManager {
return instanceId;
}

/// Store a copy of an instance with the same instance id.
void addCopy(Object original, Object copy) {
assert(original.runtimeType == copy.runtimeType);
_instancesToInstanceIds[copy] = _instancesToInstanceIds[original];
assert(original == copy);
}

/// Remove the instance from the manager.
///
/// Returns null if the instance is removed. Otherwise, return the instanceId
/// of the removed instance.
int? removeInstance<T extends Object>(T instance) {
final int? instanceId = _instancesToInstanceIds[instance];
final int? instanceId = _instancesToInstanceIds[instance] as int?;
if (instanceId != null) {
_instancesToInstanceIds.remove(instance);
_instancesToInstanceIds[instance] = null;
_instanceIdsToInstances.remove(instanceId);
}
return instanceId;
Expand All @@ -47,6 +54,6 @@ class InstanceManager {

/// Retrieve the instanceId paired with instance.
int? getInstanceId(Object instance) {
return _instancesToInstanceIds[instance];
return _instancesToInstanceIds[instance] as int?;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1051,14 +1051,12 @@ class WKNavigationDelegateHostApi {
static const MessageCodec<Object?> codec =
_WKNavigationDelegateHostApiCodec();

Future<void> create(
int arg_instanceId, int? arg_didFinishNavigationInstanceId) async {
Future<void> create(int arg_instanceId) async {
final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
'dev.flutter.pigeon.WKNavigationDelegateHostApi.create', codec,
binaryMessenger: _binaryMessenger);
final Map<Object?, Object?>? replyMap = await channel
.send(<Object?>[arg_instanceId, arg_didFinishNavigationInstanceId])
as Map<Object?, Object?>?;
final Map<Object?, Object?>? replyMap =
await channel.send(<Object?>[arg_instanceId]) as Map<Object?, Object?>?;
if (replyMap == null) {
throw PlatformException(
code: 'channel-error',
Expand Down Expand Up @@ -1086,8 +1084,7 @@ abstract class WKNavigationDelegateFlutterApi {
static const MessageCodec<Object?> codec =
_WKNavigationDelegateFlutterApiCodec();

void didFinishNavigation(
int functionInstanceId, int webViewInstanceId, String? url);
void didFinishNavigation(int instanceId, int webViewInstanceId, String? url);
static void setup(WKNavigationDelegateFlutterApi? api,
{BinaryMessenger? binaryMessenger}) {
{
Expand All @@ -1102,15 +1099,15 @@ abstract class WKNavigationDelegateFlutterApi {
assert(message != null,
'Argument for dev.flutter.pigeon.WKNavigationDelegateFlutterApi.didFinishNavigation was null.');
final List<Object?> args = (message as List<Object?>?)!;
final int? arg_functionInstanceId = (args[0] as int?);
assert(arg_functionInstanceId != null,
final int? arg_instanceId = (args[0] as int?);
assert(arg_instanceId != null,
'Argument for dev.flutter.pigeon.WKNavigationDelegateFlutterApi.didFinishNavigation was null, expected non-null int.');
final int? arg_webViewInstanceId = (args[1] as int?);
assert(arg_webViewInstanceId != null,
'Argument for dev.flutter.pigeon.WKNavigationDelegateFlutterApi.didFinishNavigation was null, expected non-null int.');
final String? arg_url = (args[2] as String?);
api.didFinishNavigation(
arg_functionInstanceId!, arg_webViewInstanceId!, arg_url);
arg_instanceId!, arg_webViewInstanceId!, arg_url);
return;
});
}
Expand Down Expand Up @@ -1247,38 +1244,6 @@ abstract class NSObjectFlutterApi {
{BinaryMessenger? binaryMessenger}) {}
}

class _FunctionFlutterApiCodec extends StandardMessageCodec {
const _FunctionFlutterApiCodec();
}

abstract class FunctionFlutterApi {
static const MessageCodec<Object?> codec = _FunctionFlutterApiCodec();

void dispose(int instanceId);
static void setup(FunctionFlutterApi? api,
{BinaryMessenger? binaryMessenger}) {
{
final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
'dev.flutter.pigeon.FunctionFlutterApi.dispose', codec,
binaryMessenger: binaryMessenger);
if (api == null) {
channel.setMessageHandler(null);
} else {
channel.setMessageHandler((Object? message) async {
assert(message != null,
'Argument for dev.flutter.pigeon.FunctionFlutterApi.dispose was null.');
final List<Object?> args = (message as List<Object?>?)!;
final int? arg_instanceId = (args[0] as int?);
assert(arg_instanceId != null,
'Argument for dev.flutter.pigeon.FunctionFlutterApi.dispose was null, expected non-null int.');
api.dispose(arg_instanceId!);
return;
});
}
}
}
}

class _WKWebViewHostApiCodec extends StandardMessageCodec {
const _WKWebViewHostApiCodec();
@override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -232,8 +232,16 @@ class NSHttpCookie {
final Map<NSHttpCookiePropertyKey, Object> properties;
}

/// An object that can provide functional copies of themselves.
@immutable
mixin Copyable {
/// Instantiates and returns a functionally identical object to oneself.
Copyable copy();
}

/// The root class of most Objective-C class hierarchies.
class NSObject {
@immutable
class NSObject with Copyable {
/// Constructs an [NSObject].
NSObject({BinaryMessenger? binaryMessenger, InstanceManager? instanceManager})
: _api = NSObjectHostApiImpl(
Expand Down Expand Up @@ -283,4 +291,27 @@ class NSObject {
) {
throw UnimplementedError();
}

@override
Copyable copy() {
final NSObject copy = NSObject(
binaryMessenger: _api.binaryMessenger,
instanceManager: _api.instanceManager,
);
_api.instanceManager.addCopy(this, copy);
return copy;
}

@override
int get hashCode {
return Object.hash(_api, _api.instanceManager.getInstanceId(this));
}

@override
bool operator ==(Object other) {
return other is NSObject &&
_api == other._api &&
_api.instanceManager.getInstanceId(this) ==
other._api.instanceManager.getInstanceId(other);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';

import '../common/function_flutter_api_impls.dart';
import '../common/instance_manager.dart';
import '../common/web_kit.pigeon.dart';
import 'foundation.dart';
Expand Down Expand Up @@ -43,11 +42,9 @@ class FoundationFlutterApis {
@visibleForTesting
FoundationFlutterApis({
BinaryMessenger? binaryMessenger,
// ignore: avoid_unused_constructor_parameters
InstanceManager? instanceManager,
}) : _binaryMessenger = binaryMessenger {
functionFlutterApi =
FunctionFlutterApiImpl(instanceManager: instanceManager);
}
}) : _binaryMessenger = binaryMessenger;

static FoundationFlutterApis _instance = FoundationFlutterApis();

Expand All @@ -62,38 +59,34 @@ class FoundationFlutterApis {
return _instance;
}

// ignore: unused_field
final BinaryMessenger? _binaryMessenger;
bool _hasBeenSetUp = false;

/// Flutter Api for disposing functions.
///
/// This FlutterApi is placed here because [FoundationFlutterApis.ensureSetUp]
/// is called inside [NSObject] and [NSObject] is the parent class of all
/// objects.
@visibleForTesting
late final FunctionFlutterApiImpl functionFlutterApi;

/// Ensures all the Flutter APIs have been set up to receive calls from native code.
void ensureSetUp() {
if (!_hasBeenSetUp) {
FunctionFlutterApi.setup(
functionFlutterApi,
binaryMessenger: _binaryMessenger,
);
_hasBeenSetUp = true;
}
}
}

/// Host api implementation for [NSObject].
@immutable
class NSObjectHostApiImpl extends NSObjectHostApi {
/// Constructs an [NSObjectHostApiImpl].
NSObjectHostApiImpl({
BinaryMessenger? binaryMessenger,
this.binaryMessenger,
InstanceManager? instanceManager,
}) : instanceManager = instanceManager ?? InstanceManager.instance,
super(binaryMessenger: binaryMessenger);

/// Sends binary data across the Flutter platform barrier.
///
/// If it is null, the default BinaryMessenger will be used which routes to
/// the host platform.
final BinaryMessenger? binaryMessenger;

/// Maintains instances stored to communicate with Objective-C objects.
final InstanceManager instanceManager;

Expand Down Expand Up @@ -132,4 +125,16 @@ class NSObjectHostApiImpl extends NSObjectHostApi {
await dispose(instanceId);
}
}

@override
int get hashCode {
return Object.hash(binaryMessenger, instanceManager);
}

@override
bool operator ==(Object other) {
return other is NSObjectHostApiImpl &&
binaryMessenger == other.binaryMessenger &&
instanceManager == other.instanceManager;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -597,6 +597,7 @@ class WKUIDelegate {
/// coordinate changes in your web view’s main frame.
///
/// Wraps [WKNavigationDelegate](https://developer.apple.com/documentation/webkit/wknavigationdelegate?language=objc).
@immutable
class WKNavigationDelegate extends NSObject {
/// Constructs a [WKNavigationDelegate].
WKNavigationDelegate({
Expand Down Expand Up @@ -662,6 +663,32 @@ class WKNavigationDelegate extends NSObject {
) {
throw UnimplementedError();
}

@override
Copyable copy() {
final WKNavigationDelegate copy = WKNavigationDelegate(
didFinishNavigation: didFinishNavigation,
binaryMessenger: _navigationDelegateApi.binaryMessenger,
instanceManager: _navigationDelegateApi.instanceManager,
);
_navigationDelegateApi.instanceManager.addCopy(this, copy);
return copy;
}

@override
int get hashCode {
return Object.hash(didFinishNavigation, _navigationDelegateApi,
_navigationDelegateApi.instanceManager.getInstanceId(this));
}

@override
bool operator ==(Object other) {
return other is WKNavigationDelegate &&
didFinishNavigation == other.didFinishNavigation &&
_navigationDelegateApi == other._navigationDelegateApi &&
_navigationDelegateApi.instanceManager.getInstanceId(this) ==
other._navigationDelegateApi.instanceManager.getInstanceId(other);
}
}

/// Object that displays interactive web content, such as for an in-app browser.
Expand Down
Loading