Skip to content

Commit 41d5d2b

Browse files
authored
[lldb/Host] Add ability to open URLs on macOS (llvm#125893)
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 <[email protected]>
1 parent 57614a3 commit 41d5d2b

File tree

2 files changed

+34
-0
lines changed

2 files changed

+34
-0
lines changed

lldb/include/lldb/Host/Host.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,8 @@ class Host {
259259
const FileSpec &file_spec,
260260
uint32_t line_no);
261261

262+
static llvm::Error OpenURL(llvm::StringRef url);
263+
262264
/// Check if we're running in an interactive graphical session.
263265
///
264266
/// \return

lldb/source/Host/macosx/objcxx/Host.mm

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,38 @@ repeat with the_window in (get windows)\n\
452452
#endif // TARGET_OS_OSX
453453
}
454454

455+
llvm::Error Host::OpenURL(llvm::StringRef url) {
456+
#if !TARGET_OS_OSX
457+
return llvm::errorCodeToError(
458+
std::error_code(ENOTSUP, std::system_category()));
459+
#else // !TARGET_OS_OSX
460+
if (url.empty())
461+
return llvm::createStringError("Cannot open empty URL.");
462+
463+
LLDB_LOG(GetLog(LLDBLog::Host), "Opening URL: {0}", url);
464+
465+
CFCString url_cfstr(url.data(), kCFStringEncodingUTF8);
466+
CFCReleaser<CFURLRef> cfurl = ::CFURLCreateWithString(
467+
/*allocator=*/NULL,
468+
/*URLString*/ url_cfstr.get(),
469+
/*baseURL=*/NULL);
470+
471+
if (!cfurl.get())
472+
return llvm::createStringError(
473+
llvm::formatv("could not create CFURL from URL \"{0}\"", url));
474+
475+
OSStatus error = ::LSOpenCFURLRef(
476+
/*inURL=*/cfurl.get(),
477+
/*outLaunchedURL=*/NULL);
478+
479+
if (error != noErr)
480+
return llvm::createStringError(
481+
llvm::formatv("LSOpenCFURLRef failed: error {0:x}", error));
482+
483+
return llvm::Error::success();
484+
#endif // TARGET_OS_OSX
485+
}
486+
455487
bool Host::IsInteractiveGraphicSession() {
456488
#if !TARGET_OS_OSX
457489
return false;

0 commit comments

Comments
 (0)