Repository: electron/electron
Pull request: fix: crash parsing CLSID in `shell.readShortcutLink()`

#### Description of Change

<!--
Thank you for your Pull Request. Please provide a description above and review
the requirements below.

Contributors guide: https://github.com/electron/electron/blob/main/CONTRIBUTING.md
-->

Close #45166.

Shortcuts may store the `PKEY_AppUserModel_ToastActivatorCLSID` property as a string CLSID/UUID as opposed to `VT_CLSID` (i.e., bytes), resulting in `NOTREACHED` being hit. This PR adds support for `VT_BSTR` and `VT_LPWSTR`, and handles cases with and without braces around the ID.

Upstream CL: https://chromium-review.googlesource.com/c/chromium/src/+/6172220

#### Checklist
<!-- Remove items that do not apply. For completed items, change [ ] to [x]. -->

- [x] PR description included and stakeholders cc'd
- [x] `npm test` passes
- [x] tests are [changed or added](https://github.com/electron/electron/blob/main/docs/development/testing.md)
- [x] relevant documentation, tutorials, templates and examples are changed or added
- [x] [PR release notes](https://github.com/electron/clerk/blob/main/README.md) describe the change in a way relevant to app developers, and are [capitalized, punctuated, and past tense](https://github.com/electron/clerk/blob/main/README.md#examples).

#### Release Notes

Notes: Fixed a crash when calling `shell.readShortcutLink` caused by `PKEY_AppUserModel_ToastActivatorCLSID` sometimes being represented by a string uuid.

Changed files:
filename: patches/chromium/.patches
patch: @@ -139,3 +139,4 @@ build_disable_thin_lto_mac.patch
 build_add_public_config_simdutf_config.patch
 revert_code_health_clean_up_stale_macwebcontentsocclusion.patch
 build_remove_vr_directx_helpers_dependency.patch
+ignore_parse_errors_for_pkey_appusermodel_toastactivatorclsid.patch

filename: patches/chromium/ignore_parse_errors_for_pkey_appusermodel_toastactivatorclsid.patch
patch: @@ -0,0 +1,40 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?David=20L=C3=B6nnhager?= <dv.lnh.d@gmail.com>
+Date: Fri, 17 Jan 2025 14:30:48 +0100
+Subject: Ignore parse errors for PKEY_AppUserModel_ToastActivatorCLSID
+
+Some shortcuts store this as a string UUID as opposed to VT_CLSID,
+hitting NOTREACHED() and sometimes breaking parsing in Electron.
+Ignore this error instead.
+
+Bug: N/A
+Change-Id: I9fc472212b2d3afac2c8e18a2159bc2d50bbdf98
+
+diff --git a/AUTHORS b/AUTHORS
+index 55dc38c1448c1960b802c136018c8be22ed61c18..5cd195df3650331fbfd62b2f964368b5f3217f3c 100644
+--- a/AUTHORS
++++ b/AUTHORS
+@@ -337,6 +337,7 @@ David Futcher <david.mike.futcher@gmail.com>
+ David Jin <davidjin@amazon.com>
+ David Lechner <david@pybricks.com>
+ David Leen <davileen@amazon.com>
++David Lönnhager <dv.lnh.d@gmail.com>
+ David Manouchehri <david@davidmanouchehri.com>
+ David McAllister <mcdavid@amazon.com>
+ David Michael Barr <david.barr@samsung.com>
+diff --git a/base/win/shortcut.cc b/base/win/shortcut.cc
+index e790adb2f1d6529ac0dd77145f5da2796264c7ae..8a7edcfaf9af963468b4b42fe55a771fb31f13a2 100644
+--- a/base/win/shortcut.cc
++++ b/base/win/shortcut.cc
+@@ -342,8 +342,9 @@ bool ResolveShortcutProperties(const FilePath& shortcut_path,
+               *(pv_toast_activator_clsid.get().puuid));
+           break;
+         default:
+-          NOTREACHED() << "Unexpected variant type: "
+-                       << pv_toast_activator_clsid.get().vt;
++          // Shortcuts may use strings to represent the CLSID. This case is
++          // ignored.
++          break;
+       }
+     }
+   }

filename: shell/common/api/electron_api_shell.cc
patch: @@ -163,7 +163,8 @@ v8::Local<v8::Value> ReadShortcutLink(gin_helper::ErrorThrower thrower,
   options.Set("icon", properties.icon);
   options.Set("iconIndex", properties.icon_index);
   options.Set("appUserModelId", properties.app_id);
-  options.Set("toastActivatorClsid", properties.toast_activator_clsid);
+  if (properties.options & ShortcutProperties::PROPERTIES_TOAST_ACTIVATOR_CLSID)
+    options.Set("toastActivatorClsid", properties.toast_activator_clsid);
   return gin::ConvertToV8(thrower.isolate(), options);
 }
 #endif