We have a lot of ISimpleDOM code which only works for LocalAccessible. Because all web content uses RemoteAccessible now, practically, the only usable ISimpleDOM functionality is that which works for RemoteAccessible. Therefore, remove all code that only works for LocalAccessible. Differential Revision: https://phabricator.services.mozilla.com/D241805
100 lines
3.3 KiB
C++
100 lines
3.3 KiB
C++
/* -*- 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 "DocAccessibleWrap.h"
|
|
|
|
#include "Compatibility.h"
|
|
#include "mozilla/PresShell.h"
|
|
#include "mozilla/dom/BrowsingContext.h"
|
|
#include "mozilla/dom/Document.h"
|
|
#include "DocAccessibleChild.h"
|
|
#include "nsWinUtils.h"
|
|
#include "RootAccessible.h"
|
|
#include "Statistics.h"
|
|
|
|
using namespace mozilla;
|
|
using namespace mozilla::a11y;
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// DocAccessibleWrap
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
DocAccessibleWrap::DocAccessibleWrap(dom::Document* aDocument,
|
|
PresShell* aPresShell)
|
|
: DocAccessible(aDocument, aPresShell), mHWND(nullptr) {}
|
|
|
|
DocAccessibleWrap::~DocAccessibleWrap() {}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// LocalAccessible
|
|
|
|
void DocAccessibleWrap::Shutdown() {
|
|
// Do window emulation specific shutdown if emulation was started.
|
|
if (nsWinUtils::IsWindowEmulationStarted()) {
|
|
// Destroy window created for root document.
|
|
if (mDocFlags & eTopLevelContentDocInProcess) {
|
|
MOZ_ASSERT(XRE_IsParentProcess());
|
|
HWND hWnd = static_cast<HWND>(mHWND);
|
|
::RemovePropW(hWnd, kPropNameDocAcc);
|
|
::DestroyWindow(hWnd);
|
|
}
|
|
|
|
mHWND = nullptr;
|
|
}
|
|
|
|
DocAccessible::Shutdown();
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// DocAccessible public
|
|
|
|
void* DocAccessibleWrap::GetNativeWindow() const {
|
|
if (mHWND) {
|
|
return mHWND;
|
|
}
|
|
return DocAccessible::GetNativeWindow();
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// DocAccessible protected
|
|
|
|
void DocAccessibleWrap::DoInitialUpdate() {
|
|
DocAccessible::DoInitialUpdate();
|
|
|
|
if (nsWinUtils::IsWindowEmulationStarted()) {
|
|
// Create window for tab document.
|
|
if (mDocFlags & eTopLevelContentDocInProcess) {
|
|
MOZ_ASSERT(XRE_IsParentProcess());
|
|
a11y::RootAccessible* rootDocument = RootAccessible();
|
|
bool isActive = true;
|
|
LayoutDeviceIntRect rect(CW_USEDEFAULT, CW_USEDEFAULT, 0, 0);
|
|
if (Compatibility::IsDolphin()) {
|
|
rect = Bounds();
|
|
LayoutDeviceIntRect rootRect = rootDocument->Bounds();
|
|
rect.MoveToX(rootRect.X() - rect.X());
|
|
rect.MoveByY(-rootRect.Y());
|
|
|
|
auto* bc = mDocumentNode->GetBrowsingContext();
|
|
isActive = bc && bc->IsActive();
|
|
}
|
|
|
|
RefPtr<DocAccessibleWrap> self(this);
|
|
nsWinUtils::NativeWindowCreateProc onCreate([self](HWND aHwnd) -> void {
|
|
::SetPropW(aHwnd, kPropNameDocAcc,
|
|
reinterpret_cast<HANDLE>(self.get()));
|
|
});
|
|
|
|
HWND parentWnd = reinterpret_cast<HWND>(rootDocument->GetNativeWindow());
|
|
mHWND = nsWinUtils::CreateNativeWindow(
|
|
kClassNameTabContent, parentWnd, rect.X(), rect.Y(), rect.Width(),
|
|
rect.Height(), isActive, &onCreate);
|
|
} else {
|
|
DocAccessible* parentDocument = ParentDocument();
|
|
if (parentDocument) mHWND = parentDocument->GetNativeWindow();
|
|
}
|
|
}
|
|
}
|