Browse Source

feat: read/write Toast Activator CLSID in shortcuts (#25493)

* read/write Toast Activator CLSID

* docs

* tests

* tweaks
bitdisaster 4 years ago
parent
commit
2cfa41e6e0

+ 2 - 0
docs/api/structures/shortcut-details.md

@@ -13,3 +13,5 @@ target's icon.
 DLL or EXE. Default is 0.
 * `appUserModelId` String (optional) - The Application User Model ID. Default
 is empty.
+* `toastActivatorClsid` String (optional) - The Application Toast Activator CLSID. Needed
+for participating in Action Center.

+ 1 - 0
filenames.gni

@@ -490,6 +490,7 @@ filenames = {
     "shell/common/gin_converters/file_path_converter.h",
     "shell/common/gin_converters/gfx_converter.cc",
     "shell/common/gin_converters/gfx_converter.h",
+    "shell/common/gin_converters/guid_converter.h",
     "shell/common/gin_converters/gurl_converter.h",
     "shell/common/gin_converters/image_converter.cc",
     "shell/common/gin_converters/image_converter.h",

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

@@ -6,6 +6,7 @@
 
 #include "shell/common/gin_converters/callback_converter.h"
 #include "shell/common/gin_converters/file_path_converter.h"
+#include "shell/common/gin_converters/guid_converter.h"
 #include "shell/common/gin_converters/gurl_converter.h"
 #include "shell/common/gin_helper/dictionary.h"
 #include "shell/common/gin_helper/error_thrower.h"
@@ -127,6 +128,7 @@ bool WriteShortcutLink(const base::FilePath& shortcut_path,
   base::win::ShortcutProperties properties;
   base::FilePath path;
   base::string16 str;
+  UUID toastActivatorClsid;
   int index;
   if (options.Get("target", &path))
     properties.set_target(path);
@@ -140,6 +142,8 @@ bool WriteShortcutLink(const base::FilePath& shortcut_path,
     properties.set_icon(path, index);
   if (options.Get("appUserModelId", &str))
     properties.set_app_id(str);
+  if (options.Get("toastActivatorClsid", &toastActivatorClsid))
+    properties.set_toast_activator_clsid(toastActivatorClsid);
 
   base::win::ScopedCOMInitializer com_initializer;
   return base::win::CreateOrUpdateShortcutLink(shortcut_path, properties,
@@ -164,6 +168,7 @@ 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);
   return gin::ConvertToV8(thrower.isolate(), options);
 }
 #endif

+ 19 - 0
shell/common/gin_converters/guid_converter.h

@@ -7,6 +7,9 @@
 
 #if defined(OS_WIN)
 #include <rpc.h>
+
+#include "base/strings/sys_string_conversions.h"
+#include "base/win/win_util.h"
 #endif
 #include <string>
 
@@ -14,6 +17,7 @@
 
 #if defined(OS_WIN)
 typedef GUID UUID;
+const GUID GUID_NULL = {};
 #else
 typedef struct {
 } UUID;
@@ -34,6 +38,9 @@ struct Converter<UUID> {
     UUID uid;
 
     if (guid.length() > 0) {
+      if (guid[0] == '{' && guid[guid.length() - 1] == '}') {
+        guid = guid.substr(1, guid.length() - 2);
+      }
       unsigned char* uid_cstr = (unsigned char*)guid.c_str();
       RPC_STATUS result = UuidFromStringA(uid_cstr, &uid);
       if (result == RPC_S_INVALID_STRING_UUID) {
@@ -46,6 +53,18 @@ struct Converter<UUID> {
     return false;
 #else
     return false;
+#endif
+  }
+  static v8::Local<v8::Value> ToV8(v8::Isolate* isolate, UUID val) {
+#if defined(OS_WIN)
+    if (val == GUID_NULL) {
+      return StringToV8(isolate, "");
+    } else {
+      std::wstring uid = base::win::WStringFromGUID(val);
+      return StringToV8(isolate, base::SysWideToUTF8(uid));
+    }
+#else
+    return v8::Undefined(isolate);
 #endif
   }
 };

+ 4 - 2
spec/api-shell-spec.js

@@ -15,7 +15,8 @@ describe('shell module', () => {
     args: 'args',
     appUserModelId: 'appUserModelId',
     icon: 'icon',
-    iconIndex: 1
+    iconIndex: 1,
+    toastActivatorClsid: '{0E3CFA27-6FEA-410B-824F-A174B6E865E5}'
   };
 
   describe('shell.readShortcutLink(shortcutPath)', () => {
@@ -76,7 +77,8 @@ describe('shell module', () => {
         args: 'args2',
         appUserModelId: 'appUserModelId2',
         icon: 'icon2',
-        iconIndex: 2
+        iconIndex: 2,
+        toastActivatorClsid: '{C51A3996-CAD9-4934-848B-16285D4A1496}'
       };
       expect(shell.writeShortcutLink(tmpShortcut, 'replace', change)).to.be.true();
       expect(shell.readShortcutLink(tmpShortcut)).to.deep.equal(change);

BIN
spec/fixtures/assets/shortcut.lnk