From 4dbe858d84c7fcd07509b8b3effb57006cfcaaa1 Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Thu, 15 Oct 2020 12:31:29 -0700 Subject: [PATCH] Revert "Add flag to not publish the observatory port over mDNS (#21632)" This reverts commit dc848f154b9c5534262e5b8d3f0360a1beafdeb5. --- common/settings.cc | 2 - common/settings.h | 5 - shell/common/switches.cc | 4 - shell/common/switches.h | 3 - .../ios/framework/Source/FlutterEngine.mm | 3 +- .../Source/FlutterObservatoryPublisher.h | 5 - .../Source/FlutterObservatoryPublisher.mm | 96 ++++++++++++------- 7 files changed, 62 insertions(+), 56 deletions(-) diff --git a/common/settings.cc b/common/settings.cc index ec8ddf60f9c8d..1508e213bcc6c 100644 --- a/common/settings.cc +++ b/common/settings.cc @@ -46,8 +46,6 @@ std::string Settings::ToString() const { stream << "enable_dart_profiling: " << enable_dart_profiling << std::endl; stream << "disable_dart_asserts: " << disable_dart_asserts << std::endl; stream << "enable_observatory: " << enable_observatory << std::endl; - stream << "enable_observatory_publication: " << enable_observatory_publication - << std::endl; stream << "observatory_host: " << observatory_host << std::endl; stream << "observatory_port: " << observatory_port << std::endl; stream << "use_test_fonts: " << use_test_fonts << std::endl; diff --git a/common/settings.h b/common/settings.h index d85506b946e25..46f88399b407e 100644 --- a/common/settings.h +++ b/common/settings.h @@ -126,11 +126,6 @@ struct Settings { // Whether the Dart VM service should be enabled. bool enable_observatory = false; - // Whether to publish the observatory URL over mDNS. - // On iOS 14 this prompts a local network permission dialog, - // which cannot be accepted or dismissed in a CI environment. - bool enable_observatory_publication = true; - // The IP address to which the Dart VM service is bound. std::string observatory_host; diff --git a/shell/common/switches.cc b/shell/common/switches.cc index 3f80830136cdc..1b2398b942ff0 100644 --- a/shell/common/switches.cc +++ b/shell/common/switches.cc @@ -221,10 +221,6 @@ Settings SettingsFromCommandLine(const fml::CommandLine& command_line) { settings.enable_observatory = !command_line.HasOption(FlagForSwitch(Switch::DisableObservatory)); - // Enable mDNS Observatory Publication - settings.enable_observatory_publication = !command_line.HasOption( - FlagForSwitch(Switch::DisableObservatoryPublication)); - // Set Observatory Host if (command_line.HasOption(FlagForSwitch(Switch::DeviceObservatoryHost))) { command_line.GetOptionValue(FlagForSwitch(Switch::DeviceObservatoryHost), diff --git a/shell/common/switches.h b/shell/common/switches.h index 9a9dea9401d8f..260214db4e8a0 100644 --- a/shell/common/switches.h +++ b/shell/common/switches.h @@ -79,9 +79,6 @@ DEF_SWITCH(DisableObservatory, "disable-observatory", "Disable the Dart Observatory. The observatory is never available " "in release mode.") -DEF_SWITCH(DisableObservatoryPublication, - "disable-observatory-publication", - "Disable mDNS Dart Observatory publication.") DEF_SWITCH(IPv6, "ipv6", "Bind to the IPv6 localhost address for the Dart Observatory. " diff --git a/shell/platform/darwin/ios/framework/Source/FlutterEngine.mm b/shell/platform/darwin/ios/framework/Source/FlutterEngine.mm index 5248f59a98b34..2592537749efa 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterEngine.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterEngine.mm @@ -547,8 +547,7 @@ - (BOOL)createShell:(NSString*)entrypoint if (!_platformViewsController) { _platformViewsController.reset(new flutter::FlutterPlatformViewsController()); } - _publisher.reset([[FlutterObservatoryPublisher alloc] - initWithEnableObservatoryPublication:settings.enable_observatory_publication]); + _publisher.reset([[FlutterObservatoryPublisher alloc] init]); [self maybeSetupPlatformViewChannels]; _shell->GetIsGpuDisabledSyncSwitch()->SetSwitch(_isGpuDisabled ? true : false); if (profilerEnabled) { diff --git a/shell/platform/darwin/ios/framework/Source/FlutterObservatoryPublisher.h b/shell/platform/darwin/ios/framework/Source/FlutterObservatoryPublisher.h index a00c17ad89245..387176f76e25e 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterObservatoryPublisher.h +++ b/shell/platform/darwin/ios/framework/Source/FlutterObservatoryPublisher.h @@ -9,11 +9,6 @@ @interface FlutterObservatoryPublisher : NSObject -- (instancetype)initWithEnableObservatoryPublication:(BOOL)enableObservatoryPublication - NS_DESIGNATED_INITIALIZER; -- (instancetype)init NS_UNAVAILABLE; -+ (instancetype)new NS_UNAVAILABLE; - @property(nonatomic, readonly) NSURL* url; @end diff --git a/shell/platform/darwin/ios/framework/Source/FlutterObservatoryPublisher.mm b/shell/platform/darwin/ios/framework/Source/FlutterObservatoryPublisher.mm index e06ac8ea702a4..072a244a967fc 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterObservatoryPublisher.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterObservatoryPublisher.mm @@ -37,23 +37,26 @@ @implementation FlutterObservatoryPublisher #include #include "flutter/fml/logging.h" +#include "flutter/fml/make_copyable.h" #include "flutter/fml/memory/weak_ptr.h" #include "flutter/fml/message_loop.h" #include "flutter/fml/platform/darwin/scoped_nsobject.h" +#include "flutter/fml/task_runner.h" #include "flutter/runtime/dart_service_isolate.h" @protocol FlutterObservatoryPublisherDelegate -- (void)publishServiceProtocolPort:(NSURL*)uri; +- (instancetype)initWithOwner:(FlutterObservatoryPublisher*)owner; +- (void)publishServiceProtocolPort:(NSString*)uri; - (void)stopService; + +@property(readonly) fml::scoped_nsobject url; @end @interface FlutterObservatoryPublisher () -+ (NSData*)createTxtData:(NSURL*)url; +- (NSData*)createTxtData:(NSURL*)url; -@property(readonly, class) NSString* serviceName; +@property(readonly) NSString* serviceName; @property(readonly) fml::scoped_nsobject> delegate; -@property(nonatomic, readwrite) NSURL* url; -@property(readonly) BOOL enableObservatoryPublication; @end @@ -65,9 +68,19 @@ @interface ObservatoryDNSServiceDelegate : NSObject _owner; DNSServiceRef _dnsServiceRef; } +@synthesize url; + +- (instancetype)initWithOwner:(FlutterObservatoryPublisher*)owner { + self = [super init]; + NSAssert(self, @"Super must not return null on init."); + _owner.reset([owner retain]); + return self; +} + - (void)stopService { if (_dnsServiceRef) { DNSServiceRefDeallocate(_dnsServiceRef); @@ -75,7 +88,11 @@ - (void)stopService { } } -- (void)publishServiceProtocolPort:(NSURL*)url { +- (void)publishServiceProtocolPort:(NSString*)uri { + // uri comes in as something like 'http://127.0.0.1:XXXXX/' where XXXXX is the port + // number. + url.reset([[NSURL alloc] initWithString:uri]); + DNSServiceFlags flags = kDNSServiceFlagsDefault; #if TARGET_IPHONE_SIMULATOR // Simulator needs to use local loopback explicitly to work. @@ -88,11 +105,11 @@ - (void)publishServiceProtocolPort:(NSURL*)url { const char* domain = "local."; // default domain uint16_t port = [[url port] unsignedShortValue]; - NSData* txtData = [FlutterObservatoryPublisher createTxtData:url]; - int err = DNSServiceRegister(&_dnsServiceRef, flags, interfaceIndex, - FlutterObservatoryPublisher.serviceName.UTF8String, registrationType, - domain, NULL, htons(port), txtData.length, txtData.bytes, - registrationCallback, NULL); + NSData* txtData = [_owner createTxtData:url.get()]; + int err = + DNSServiceRegister(&_dnsServiceRef, flags, interfaceIndex, + [_owner.get().serviceName UTF8String], registrationType, domain, NULL, + htons(port), txtData.length, txtData.bytes, registrationCallback, NULL); if (err != 0) { FML_LOG(ERROR) << "Failed to register observatory port with mDNS with error " << err << "."; @@ -105,8 +122,8 @@ - (void)publishServiceProtocolPort:(NSURL*)url { << "to the 'NSBonjourServices' key in your Info.plist for the Debug/" << "Profile configurations. " << "For more information, see " - << "https://flutter.dev/docs/development/add-to-app/ios/" - "project-setup#local-network-privacy-permissions"; + // Update link to a specific header as needed. + << "https://flutter.dev/docs/development/add-to-app/ios/project-setup"; } } else { DNSServiceSetDispatchQueue(_dnsServiceRef, dispatch_get_main_queue()); @@ -145,21 +162,34 @@ static void DNSSD_API registrationCallback(DNSServiceRef sdRef, @end @implementation ObservatoryNSNetServiceDelegate { + fml::scoped_nsobject _owner; fml::scoped_nsobject _netService; } +@synthesize url; + +- (instancetype)initWithOwner:(FlutterObservatoryPublisher*)owner { + self = [super init]; + NSAssert(self, @"Super must not return null on init."); + _owner.reset([owner retain]); + return self; +} + - (void)stopService { [_netService.get() stop]; [_netService.get() setDelegate:nil]; } -- (void)publishServiceProtocolPort:(NSURL*)url { - NSNetService* netServiceTmp = - [[NSNetService alloc] initWithDomain:@"local." - type:@"_dartobservatory._tcp." - name:FlutterObservatoryPublisher.serviceName - port:[[url port] intValue]]; - [netServiceTmp setTXTRecordData:[FlutterObservatoryPublisher createTxtData:url]]; +- (void)publishServiceProtocolPort:(NSString*)uri { + // uri comes in as something like 'http://127.0.0.1:XXXXX/' where XXXXX is the port + // number. + url.reset([[NSURL alloc] initWithString:uri]); + + NSNetService* netServiceTmp = [[NSNetService alloc] initWithDomain:@"local." + type:@"_dartobservatory._tcp." + name:_owner.get().serviceName + port:[[url port] intValue]]; + [netServiceTmp setTXTRecordData:[_owner createTxtData:url.get()]]; _netService.reset(netServiceTmp); [_netService.get() setDelegate:self]; [_netService.get() publish]; @@ -181,16 +211,19 @@ @implementation FlutterObservatoryPublisher { std::unique_ptr> _weakFactory; } -- (instancetype)initWithEnableObservatoryPublication:(BOOL)enableObservatoryPublication { +- (NSURL*)url { + return [_delegate.get().url autorelease]; +} + +- (instancetype)init { self = [super init]; NSAssert(self, @"Super must not return null on init."); if (@available(iOS 9.3, *)) { - _delegate.reset([[ObservatoryDNSServiceDelegate alloc] init]); + _delegate.reset([[ObservatoryDNSServiceDelegate alloc] initWithOwner:self]); } else { - _delegate.reset([[ObservatoryNSNetServiceDelegate alloc] init]); + _delegate.reset([[ObservatoryNSNetServiceDelegate alloc] initWithOwner:self]); } - _enableObservatoryPublication = enableObservatoryPublication; _weakFactory = std::make_unique>(self); fml::MessageLoop::EnsureInitializedForCurrentThread(); @@ -200,15 +233,9 @@ - (instancetype)initWithEnableObservatoryPublication:(BOOL)enableObservatoryPubl runner = fml::MessageLoop::GetCurrent().GetTaskRunner()](const std::string& uri) { if (!uri.empty()) { runner->PostTask([weak, uri]() { - // uri comes in as something like 'http://127.0.0.1:XXXXX/' where XXXXX is the port - // number. if (weak) { - NSURL* url = - [[NSURL alloc] initWithString:[NSString stringWithUTF8String:uri.c_str()]]; - weak.get().url = url; - if (weak.get().enableObservatoryPublication) { - [[weak.get() delegate] publishServiceProtocolPort:url]; - } + [[weak.get() delegate] + publishServiceProtocolPort:[NSString stringWithUTF8String:uri.c_str()]]; } }); } @@ -217,11 +244,11 @@ - (instancetype)initWithEnableObservatoryPublication:(BOOL)enableObservatoryPubl return self; } -+ (NSString*)serviceName { +- (NSString*)serviceName { return NSBundle.mainBundle.bundleIdentifier; } -+ (NSData*)createTxtData:(NSURL*)url { +- (NSData*)createTxtData:(NSURL*)url { // Check to see if there's an authentication code. If there is, we'll provide // it as a txt record so flutter tools can establish a connection. NSString* path = [[url path] substringFromIndex:MIN(1, [[url path] length])]; @@ -234,7 +261,6 @@ + (NSData*)createTxtData:(NSURL*)url { - (void)dealloc { [_delegate stopService]; - [_url release]; flutter::DartServiceIsolate::RemoveServerStatusCallback(std::move(_callbackHandle)); [super dealloc];