/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=2 et sw=2 tw=80: */ /* 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); } }