From e07f05f103b81afc3c204840e7cbc0c4d51da41a Mon Sep 17 00:00:00 2001 From: Med Ismail Bennani Date: Wed, 5 Feb 2025 09:42:41 -0800 Subject: [PATCH] [lldb/Host] Add ability to open URLs on macOS This patch adds the ability to open URLs from lldb on macOS. This can be a website URL or a deep link to a particular application. rdar://143327616 Signed-off-by: Med Ismail Bennani --- lldb/include/lldb/Host/Host.h | 2 ++ lldb/source/Host/macosx/objcxx/Host.mm | 32 ++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/lldb/include/lldb/Host/Host.h b/lldb/include/lldb/Host/Host.h index d8113a5fceead..4e19d15b06743 100644 --- a/lldb/include/lldb/Host/Host.h +++ b/lldb/include/lldb/Host/Host.h @@ -259,6 +259,8 @@ class Host { const FileSpec &file_spec, uint32_t line_no); + static llvm::Error OpenURL(llvm::StringRef url); + /// Check if we're running in an interactive graphical session. /// /// \return diff --git a/lldb/source/Host/macosx/objcxx/Host.mm b/lldb/source/Host/macosx/objcxx/Host.mm index a99ffbc3a3fac..5b3d04a6b587b 100644 --- a/lldb/source/Host/macosx/objcxx/Host.mm +++ b/lldb/source/Host/macosx/objcxx/Host.mm @@ -452,6 +452,38 @@ repeat with the_window in (get windows)\n\ #endif // TARGET_OS_OSX } +llvm::Error Host::OpenURL(llvm::StringRef url) { +#if !TARGET_OS_OSX + return llvm::errorCodeToError( + std::error_code(ENOTSUP, std::system_category())); +#else // !TARGET_OS_OSX + if (url.empty()) + return llvm::createStringError("Cannot open empty URL."); + + LLDB_LOG(GetLog(LLDBLog::Host), "Opening URL: {0}", url); + + CFCString url_cfstr(url.data(), kCFStringEncodingUTF8); + CFCReleaser cfurl = ::CFURLCreateWithString( + /*allocator=*/NULL, + /*URLString*/ url_cfstr.get(), + /*baseURL=*/NULL); + + if (!cfurl.get()) + return llvm::createStringError( + llvm::formatv("could not create CFURL from URL \"{0}\"", url)); + + OSStatus error = ::LSOpenCFURLRef( + /*inURL=*/cfurl.get(), + /*outLaunchedURL=*/NULL); + + if (error != noErr) + return llvm::createStringError( + llvm::formatv("LSOpenCFURLRef failed: error {0:x}", error)); + + return llvm::Error::success(); +#endif // TARGET_OS_OSX +} + bool Host::IsInteractiveGraphicSession() { #if !TARGET_OS_OSX return false;