void DocAccessibleParent::MaybeInitWindowEmulation() { if (!nsWinUtils::IsWindowEmulationStarted()) { return; } // XXX get the bounds from the tabParent instead of poking at accessibles // which might not exist yet. Accessible* outerDoc = OuterDocOfRemoteBrowser(); if (!outerDoc) { return; } RootAccessible* rootDocument = outerDoc->RootAccessible(); MOZ_ASSERT(rootDocument); bool isActive = true; nsIntRect rect(CW_USEDEFAULT, CW_USEDEFAULT, 0, 0); if (Compatibility::IsDolphin()) { rect = Bounds(); nsIntRect rootRect = rootDocument->Bounds(); rect.x = rootRect.x - rect.x; rect.y -= rootRect.y; auto tab = static_cast<dom::TabParent*>(Manager()); tab->GetDocShellIsActive(&isActive); } nsWinUtils::NativeWindowCreateProc onCreate([this](HWND aHwnd) -> void { IAccessibleHolder hWndAccHolder; ::SetPropW(aHwnd, kPropNameDocAccParent, reinterpret_cast<HANDLE>(this)); SetEmulatedWindowHandle(aHwnd); IAccessible* rawHWNDAcc = nullptr; if (SUCCEEDED(::AccessibleObjectFromWindow(aHwnd, OBJID_WINDOW, IID_IAccessible, (void**)&rawHWNDAcc))) { hWndAccHolder.Set(IAccessibleHolder::COMPtrType(rawHWNDAcc)); } Unused << SendEmulatedWindow(reinterpret_cast<uintptr_t>(mEmulatedWindowHandle), hWndAccHolder); }); HWND parentWnd = reinterpret_cast<HWND>(rootDocument->GetNativeWindow()); DebugOnly<HWND> hWnd = nsWinUtils::CreateNativeWindow(kClassNameTabContent, parentWnd, rect.x, rect.y, rect.width, rect.height, isActive, &onCreate); MOZ_ASSERT(hWnd); }