mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-25 22:01:30 +00:00
3cfb5253aa
Fixes WinToast failing to find the shortcut to check its AUMI because: 1) the app name given to WinToast did not match the shortcut name, and 2) it wasn't looking in the system-wide Start Menu. Further, adds an option to fail if shortcut isn't found, rather than create it, because: a) the shortcut would be to the WDBA, which is not useful, and anyway b) we're showing the notification immediately after initializing WinToast, which is too soon for Windows to reliably pick up on it, so it usually doesn't have the desired effect of allowing the custom abstract model. Differential Revision: https://phabricator.services.mozilla.com/D98838
111 lines
5.3 KiB
Diff
111 lines
5.3 KiB
Diff
diff --git a/src/wintoastlib.cpp b/src/wintoastlib.cpp
|
|
index 0895ff7..52de554 100644
|
|
--- a/src/wintoastlib.cpp
|
|
+++ b/src/wintoastlib.cpp
|
|
@@ -391,6 +391,10 @@ void WinToast::setAppUserModelId(_In_ const std::wstring& aumi) {
|
|
DEBUG_MSG(L"Default App User Model Id: " << _aumi.c_str());
|
|
}
|
|
|
|
+void WinToast::setShortcutPolicy(_In_ ShortcutPolicy shortcutPolicy) {
|
|
+ _shortcutPolicy = shortcutPolicy;
|
|
+}
|
|
+
|
|
bool WinToast::isCompatible() {
|
|
DllImporter::initialize();
|
|
return !((DllImporter::SetCurrentProcessExplicitAppUserModelID == nullptr)
|
|
@@ -492,10 +496,12 @@ bool WinToast::initialize(_Out_ WinToastError* error) {
|
|
return false;
|
|
}
|
|
|
|
- if (createShortcut() < 0) {
|
|
- setError(error, WinToastError::ShellLinkNotCreated);
|
|
- DEBUG_MSG(L"Error while attaching the AUMI to the current proccess =(");
|
|
- return false;
|
|
+ if (_shortcutPolicy != SHORTCUT_POLICY_IGNORE) {
|
|
+ if (createShortcut() < 0) {
|
|
+ setError(error, WinToastError::ShellLinkNotCreated);
|
|
+ DEBUG_MSG(L"Error while attaching the AUMI to the current proccess =(");
|
|
+ return false;
|
|
+ }
|
|
}
|
|
|
|
if (FAILED(DllImporter::SetCurrentProcessExplicitAppUserModelID(_aumi.c_str()))) {
|
|
@@ -555,18 +561,23 @@ HRESULT WinToast::validateShellLinkHelper(_Out_ bool& wasChanged) {
|
|
hr = DllImporter::PropVariantToString(appIdPropVar, AUMI, MAX_PATH);
|
|
wasChanged = false;
|
|
if (FAILED(hr) || _aumi != AUMI) {
|
|
- // AUMI Changed for the same app, let's update the current value! =)
|
|
- wasChanged = true;
|
|
- PropVariantClear(&appIdPropVar);
|
|
- hr = InitPropVariantFromString(_aumi.c_str(), &appIdPropVar);
|
|
- if (SUCCEEDED(hr)) {
|
|
- hr = propertyStore->SetValue(PKEY_AppUserModel_ID, appIdPropVar);
|
|
+ if (_shortcutPolicy == SHORTCUT_POLICY_REQUIRE_CREATE) {
|
|
+ // AUMI Changed for the same app, let's update the current value! =)
|
|
+ wasChanged = true;
|
|
+ PropVariantClear(&appIdPropVar);
|
|
+ hr = InitPropVariantFromString(_aumi.c_str(), &appIdPropVar);
|
|
if (SUCCEEDED(hr)) {
|
|
- hr = propertyStore->Commit();
|
|
- if (SUCCEEDED(hr) && SUCCEEDED(persistFile->IsDirty())) {
|
|
- hr = persistFile->Save(path, TRUE);
|
|
+ hr = propertyStore->SetValue(PKEY_AppUserModel_ID, appIdPropVar);
|
|
+ if (SUCCEEDED(hr)) {
|
|
+ hr = propertyStore->Commit();
|
|
+ if (SUCCEEDED(hr) && SUCCEEDED(persistFile->IsDirty())) {
|
|
+ hr = persistFile->Save(path, TRUE);
|
|
+ }
|
|
}
|
|
}
|
|
+ } else {
|
|
+ // Not allowed to touch the shortcut to fix the AUMI
|
|
+ hr = E_FAIL;
|
|
}
|
|
}
|
|
PropVariantClear(&appIdPropVar);
|
|
@@ -581,6 +592,10 @@ HRESULT WinToast::validateShellLinkHelper(_Out_ bool& wasChanged) {
|
|
|
|
|
|
HRESULT WinToast::createShellLinkHelper() {
|
|
+ if (_shortcutPolicy != SHORTCUT_POLICY_REQUIRE_CREATE) {
|
|
+ return E_FAIL;
|
|
+ }
|
|
+
|
|
WCHAR exePath[MAX_PATH]{L'\0'};
|
|
WCHAR slPath[MAX_PATH]{L'\0'};
|
|
Util::defaultShellLinkPath(_appName, slPath);
|
|
diff --git a/src/wintoastlib.h b/src/wintoastlib.h
|
|
index 68b1cb1..dc8d745 100644
|
|
--- a/src/wintoastlib.h
|
|
+++ b/src/wintoastlib.h
|
|
@@ -173,6 +173,16 @@ namespace WinToastLib {
|
|
SHORTCUT_CREATE_FAILED = -4
|
|
};
|
|
|
|
+ enum ShortcutPolicy {
|
|
+ /* Don't check, create, or modify a shortcut. */
|
|
+ SHORTCUT_POLICY_IGNORE = 0,
|
|
+ /* Require a shortcut with matching AUMI, don't create or modify an existing one. */
|
|
+ SHORTCUT_POLICY_REQUIRE_NO_CREATE = 1,
|
|
+ /* Require a shortcut with matching AUMI, create if missing, modify if not matching.
|
|
+ * This is the default. */
|
|
+ SHORTCUT_POLICY_REQUIRE_CREATE = 2,
|
|
+ };
|
|
+
|
|
WinToast(void);
|
|
virtual ~WinToast();
|
|
static WinToast* instance();
|
|
@@ -194,10 +204,12 @@ namespace WinToastLib {
|
|
const std::wstring& appUserModelId() const;
|
|
void setAppUserModelId(_In_ const std::wstring& aumi);
|
|
void setAppName(_In_ const std::wstring& appName);
|
|
+ void setShortcutPolicy(_In_ ShortcutPolicy policy);
|
|
|
|
protected:
|
|
bool _isInitialized{false};
|
|
bool _hasCoInitialized{false};
|
|
+ ShortcutPolicy _shortcutPolicy{SHORTCUT_POLICY_REQUIRE_CREATE};
|
|
std::wstring _appName{};
|
|
std::wstring _aumi{};
|
|
std::map<INT64, ComPtr<IToastNotification>> _buffer{};
|