DocAccessibleWrap.cpp (3366B)
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #include "DocAccessibleWrap.h" 8 9 #include "Compatibility.h" 10 #include "mozilla/PresShell.h" 11 #include "mozilla/dom/BrowsingContext.h" 12 #include "mozilla/dom/Document.h" 13 #include "DocAccessibleChild.h" 14 #include "nsWinUtils.h" 15 #include "RootAccessible.h" 16 #include "Statistics.h" 17 18 using namespace mozilla; 19 using namespace mozilla::a11y; 20 21 //////////////////////////////////////////////////////////////////////////////// 22 // DocAccessibleWrap 23 //////////////////////////////////////////////////////////////////////////////// 24 25 DocAccessibleWrap::DocAccessibleWrap(dom::Document* aDocument, 26 PresShell* aPresShell) 27 : DocAccessible(aDocument, aPresShell), mHWND(nullptr) {} 28 29 DocAccessibleWrap::~DocAccessibleWrap() {} 30 31 //////////////////////////////////////////////////////////////////////////////// 32 // LocalAccessible 33 34 void DocAccessibleWrap::Shutdown() { 35 // Do window emulation specific shutdown if emulation was started. 36 if (nsWinUtils::IsWindowEmulationStarted()) { 37 // Destroy window created for root document. 38 if (mDocFlags & eTopLevelContentDocInProcess) { 39 MOZ_ASSERT(XRE_IsParentProcess()); 40 HWND hWnd = static_cast<HWND>(mHWND); 41 ::RemovePropW(hWnd, kPropNameDocAcc); 42 ::DestroyWindow(hWnd); 43 } 44 45 mHWND = nullptr; 46 } 47 48 DocAccessible::Shutdown(); 49 } 50 51 //////////////////////////////////////////////////////////////////////////////// 52 // DocAccessible public 53 54 void* DocAccessibleWrap::GetNativeWindow() const { 55 if (mHWND) { 56 return mHWND; 57 } 58 return DocAccessible::GetNativeWindow(); 59 } 60 61 //////////////////////////////////////////////////////////////////////////////// 62 // DocAccessible protected 63 64 void DocAccessibleWrap::DoInitialUpdate() { 65 DocAccessible::DoInitialUpdate(); 66 67 if (nsWinUtils::IsWindowEmulationStarted()) { 68 // Create window for tab document. 69 if (mDocFlags & eTopLevelContentDocInProcess) { 70 MOZ_ASSERT(XRE_IsParentProcess()); 71 a11y::RootAccessible* rootDocument = RootAccessible(); 72 bool isActive = true; 73 LayoutDeviceIntRect rect(CW_USEDEFAULT, CW_USEDEFAULT, 0, 0); 74 if (Compatibility::IsDolphin()) { 75 rect = Bounds(); 76 LayoutDeviceIntRect rootRect = rootDocument->Bounds(); 77 rect.MoveToX(rootRect.X() - rect.X()); 78 rect.MoveByY(-rootRect.Y()); 79 80 auto* bc = mDocumentNode->GetBrowsingContext(); 81 isActive = bc && bc->IsActive(); 82 } 83 84 RefPtr<DocAccessibleWrap> self(this); 85 nsWinUtils::NativeWindowCreateProc onCreate([self](HWND aHwnd) -> void { 86 ::SetPropW(aHwnd, kPropNameDocAcc, 87 reinterpret_cast<HANDLE>(self.get())); 88 }); 89 90 HWND parentWnd = reinterpret_cast<HWND>(rootDocument->GetNativeWindow()); 91 mHWND = nsWinUtils::CreateNativeWindow( 92 kClassNameTabContent, parentWnd, rect.X(), rect.Y(), rect.Width(), 93 rect.Height(), isActive, &onCreate); 94 } else { 95 DocAccessible* parentDocument = ParentDocument(); 96 if (parentDocument) mHWND = parentDocument->GetNativeWindow(); 97 } 98 } 99 }