| // Copyright 2023 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #import "ios/chrome/common/extension_open_url.h" |
| |
| bool ExtensionOpenURL(NSURL* url, |
| UIResponder* responder, |
| BlockWithBoolean pre_open_block) { |
| while ((responder = responder.nextResponder)) { |
| SEL open_url_selector = @selector(openURL:options:completionHandler:); |
| if ([responder respondsToSelector:open_url_selector]) { |
| if (pre_open_block) { |
| pre_open_block(YES); |
| } |
| NSMethodSignature* method_signature = |
| [responder methodSignatureForSelector:open_url_selector]; |
| NSInvocation* open_invocation = |
| [NSInvocation invocationWithMethodSignature:method_signature]; |
| open_invocation.target = responder; |
| open_invocation.selector = open_url_selector; |
| [open_invocation setArgument:&url atIndex:2]; |
| [open_invocation retainArguments]; |
| [open_invocation invoke]; |
| return YES; |
| } |
| } |
| if (pre_open_block) { |
| pre_open_block(NO); |
| } |
| return NO; |
| } |