Browse Source

feat: add logUsage to shell.openExternal() options (#37139)

Co-authored-by: Milan Burda <[email protected]>
Milan Burda 2 years ago
parent
commit
a38b711fb1

+ 2 - 0
docs/api/shell.md

@@ -40,6 +40,8 @@ Open the given file in the desktop's default manner.
 * `options` Object (optional)
   * `activate` boolean (optional) _macOS_ - `true` to bring the opened application to the foreground. The default is `true`.
   * `workingDirectory` string (optional) _Windows_ - The working directory.
+  * `logUsage` boolean (optional) _Windows_ - Indicates a user initiated launch that enables tracking of frequently used programs and other behaviors.
+                                              The default is `false`.
 
 Returns `Promise<void>`
 

+ 1 - 0
shell/common/api/electron_api_shell.cc

@@ -64,6 +64,7 @@ v8::Local<v8::Promise> OpenExternal(const GURL& url, gin::Arguments* args) {
     if (args->GetNext(&obj)) {
       obj.Get("activate", &options.activate);
       obj.Get("workingDirectory", &options.working_dir);
+      obj.Get("logUsage", &options.log_usage);
     }
   }
 

+ 1 - 0
shell/common/platform_util.h

@@ -28,6 +28,7 @@ void OpenPath(const base::FilePath& full_path, OpenCallback callback);
 struct OpenExternalOptions {
   bool activate = true;
   base::FilePath working_dir;
+  bool log_usage = false;
 };
 
 // Open the given external protocol URL in the desktop's default manner.

+ 13 - 4
shell/common/platform_util_win.cc

@@ -246,10 +246,19 @@ std::string OpenExternalOnWorkerThread(
       L"\"";
   std::wstring working_dir = options.working_dir.value();
 
-  if (reinterpret_cast<ULONG_PTR>(
-          ShellExecuteW(nullptr, L"open", escaped_url.c_str(), nullptr,
-                        working_dir.empty() ? nullptr : working_dir.c_str(),
-                        SW_SHOWNORMAL)) <= 32) {
+  SHELLEXECUTEINFO info = {};
+  info.cbSize = sizeof(SHELLEXECUTEINFO);
+  info.fMask = SEE_MASK_NOASYNC | SEE_MASK_FLAG_NO_UI;
+  info.lpVerb = L"open";
+  info.lpFile = escaped_url.c_str();
+  info.lpDirectory = working_dir.empty() ? nullptr : working_dir.c_str();
+  info.nShow = SW_SHOWNORMAL;
+
+  if (options.log_usage) {
+    info.fMask |= SEE_MASK_FLAG_LOG_USAGE;
+  }
+
+  if (!ShellExecuteEx(&info)) {
     return "Failed to open: " +
            logging::SystemErrorCodeToString(logging::GetLastSystemErrorCode());
   }