tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 }