mirror of https://github.com/roytam1/UXP
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
3.0 KiB
99 lines
3.0 KiB
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
|
/* This Source Code Form is subject to the terms of the Mozilla Public |
|
* License, v. 2.0. If a copy of the MPL was not distributed with this |
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
|
|
#include "Compatibility.h" |
|
|
|
#include "nsWinUtils.h" |
|
|
|
#include "mozilla/Preferences.h" |
|
|
|
using namespace mozilla; |
|
using namespace mozilla::a11y; |
|
|
|
/** |
|
* Return true if module version is lesser than the given version. |
|
*/ |
|
bool |
|
IsModuleVersionLessThan(HMODULE aModuleHandle, DWORD aMajor, DWORD aMinor) |
|
{ |
|
wchar_t fileName[MAX_PATH]; |
|
::GetModuleFileNameW(aModuleHandle, fileName, MAX_PATH); |
|
|
|
DWORD dummy = 0; |
|
DWORD length = ::GetFileVersionInfoSizeW(fileName, &dummy); |
|
|
|
LPBYTE versionInfo = new BYTE[length]; |
|
::GetFileVersionInfoW(fileName, 0, length, versionInfo); |
|
|
|
UINT uLen; |
|
VS_FIXEDFILEINFO* fixedFileInfo = nullptr; |
|
::VerQueryValueW(versionInfo, L"\\", (LPVOID*)&fixedFileInfo, &uLen); |
|
DWORD dwFileVersionMS = fixedFileInfo->dwFileVersionMS; |
|
DWORD dwFileVersionLS = fixedFileInfo->dwFileVersionLS; |
|
delete [] versionInfo; |
|
|
|
DWORD dwLeftMost = HIWORD(dwFileVersionMS); |
|
DWORD dwSecondRight = HIWORD(dwFileVersionLS); |
|
return (dwLeftMost < aMajor || |
|
(dwLeftMost == aMajor && dwSecondRight < aMinor)); |
|
} |
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////// |
|
// Compatibility |
|
//////////////////////////////////////////////////////////////////////////////// |
|
|
|
uint32_t Compatibility::sConsumers = Compatibility::UNKNOWN; |
|
|
|
void |
|
Compatibility::Init() |
|
{ |
|
HMODULE jawsHandle = ::GetModuleHandleW(L"jhook"); |
|
if (jawsHandle) |
|
sConsumers |= (IsModuleVersionLessThan(jawsHandle, 8, 2173)) ? |
|
OLDJAWS : JAWS; |
|
|
|
if (::GetModuleHandleW(L"gwm32inc")) |
|
sConsumers |= WE; |
|
|
|
if (::GetModuleHandleW(L"dolwinhk")) |
|
sConsumers |= DOLPHIN; |
|
|
|
if (::GetModuleHandleW(L"STSA32")) |
|
sConsumers |= SEROTEK; |
|
|
|
if (::GetModuleHandleW(L"nvdaHelperRemote")) |
|
sConsumers |= NVDA; |
|
|
|
if (::GetModuleHandleW(L"OsmHooks")) |
|
sConsumers |= COBRA; |
|
|
|
if (::GetModuleHandleW(L"WebFinderRemote")) |
|
sConsumers |= ZOOMTEXT; |
|
|
|
if (::GetModuleHandleW(L"Kazahook")) |
|
sConsumers |= KAZAGURU; |
|
|
|
if (::GetModuleHandleW(L"TextExtractorImpl32") || |
|
::GetModuleHandleW(L"TextExtractorImpl64")) |
|
sConsumers |= YOUDAO; |
|
|
|
if (::GetModuleHandleW(L"uiautomation") || |
|
::GetModuleHandleW(L"uiautomationcore")) |
|
sConsumers |= UIAUTOMATION; |
|
|
|
// If we have a known consumer remove the unknown bit. |
|
if (sConsumers != Compatibility::UNKNOWN) |
|
sConsumers ^= Compatibility::UNKNOWN; |
|
|
|
// Turn off new tab switching for Jaws and WE. |
|
if (sConsumers & (JAWS | OLDJAWS | WE)) { |
|
// Check to see if the pref for disallowing CtrlTab is already set. If so, |
|
// bail out (respect the user settings). If not, set it. |
|
if (!Preferences::HasUserValue("browser.ctrlTab.disallowForScreenReaders")) |
|
Preferences::SetBool("browser.ctrlTab.disallowForScreenReaders", true); |
|
} |
|
} |
|
|
|
|