gecko-dev/dom/ipc/BrowserBridgeParent.h
Hiroyuki Ikezoe 796e6049b6 Bug 1550800 - Call BrowserParent::UpdateDimensions() in BrowserBridgeParent::RecvUpdateDimensions. r=nika,hsivonen
So that we can get the correct client offset value and store other metrics
there and reuse them when the top browser window moves.

The client offset, browser window title bar and window decorated frame width,
is necessary to get element positions in OOP iframes in screen coordinates
for drag-and-drop etc.

This change also fixes event.screen{X,Y}. A mochitest in this commit fails
without this change with enabling fission at least on Linux. Note that in the
mochitest we have to use nsIDOMWindowUtils.synthesizeNativeMouseClick instead
of nsIDOMWindowUtils.sendMouseEvent since sendMouseEvent doesn't work in fission
world (bug 1528935).

Differential Revision: https://phabricator.services.mozilla.com/D62190

--HG--
extra : moz-landing-system : lando
2020-02-13 22:30:56 +00:00

110 lines
3.6 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=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/. */
#ifndef mozilla_dom_BrowserBridgeParent_h
#define mozilla_dom_BrowserBridgeParent_h
#include "mozilla/dom/PBrowserBridgeParent.h"
#include "mozilla/Tuple.h"
#include "mozilla/dom/ipc/IdType.h"
namespace mozilla {
namespace a11y {
class DocAccessibleParent;
}
namespace dom {
class BrowserParent;
/**
* BrowserBridgeParent implements the parent actor part of the PBrowserBridge
* protocol. See PBrowserBridge for more information.
*/
class BrowserBridgeParent : public PBrowserBridgeParent {
public:
NS_INLINE_DECL_REFCOUNTING(BrowserBridgeParent, final);
BrowserBridgeParent();
nsresult InitWithProcess(ContentParent* aContentParent,
const nsString& aPresentationURL,
const WindowGlobalInit& aWindowInit,
uint32_t aChromeFlags, TabId aTabId);
BrowserParent* GetBrowserParent() { return mBrowserParent; }
CanonicalBrowsingContext* GetBrowsingContext();
// Get our manager actor.
BrowserParent* Manager();
#if defined(ACCESSIBILITY)
/**
* Get the accessible for this iframe's embedder OuterDocAccessible.
* This returns the actor for the containing document and the unique id of
* the embedder accessible within that document.
*/
Tuple<a11y::DocAccessibleParent*, uint64_t> GetEmbedderAccessible() {
return Tuple<a11y::DocAccessibleParent*, uint64_t>(mEmbedderAccessibleDoc,
mEmbedderAccessibleID);
}
#endif // defined(ACCESSIBILITY)
// Tear down this BrowserBridgeParent.
void Destroy();
protected:
friend class PBrowserBridgeParent;
mozilla::ipc::IPCResult RecvShow(const OwnerShowInfo&);
mozilla::ipc::IPCResult RecvScrollbarPreferenceChanged(ScrollbarPreference);
mozilla::ipc::IPCResult RecvLoadURL(const nsCString& aUrl);
mozilla::ipc::IPCResult RecvResumeLoad(uint64_t aPendingSwitchID);
mozilla::ipc::IPCResult RecvUpdateDimensions(const nsIntRect& aRect,
const ScreenIntSize& aSize);
mozilla::ipc::IPCResult RecvUpdateEffects(const EffectsInfo& aEffects);
mozilla::ipc::IPCResult RecvRenderLayers(const bool& aEnabled,
const LayersObserverEpoch& aEpoch);
mozilla::ipc::IPCResult RecvNavigateByKey(const bool& aForward,
const bool& aForDocumentNavigation);
mozilla::ipc::IPCResult RecvDispatchSynthesizedMouseEvent(
const WidgetMouseEvent& aEvent);
mozilla::ipc::IPCResult RecvWillChangeProcess();
mozilla::ipc::IPCResult RecvActivate();
mozilla::ipc::IPCResult RecvDeactivate(const bool& aWindowLowering);
mozilla::ipc::IPCResult RecvSetIsUnderHiddenEmbedderElement(
const bool& aIsUnderHiddenEmbedderElement);
#ifdef ACCESSIBILITY
mozilla::ipc::IPCResult RecvSetEmbedderAccessible(PDocAccessibleParent* aDoc,
uint64_t aID);
#endif
void ActorDestroy(ActorDestroyReason aWhy) override;
private:
~BrowserBridgeParent();
RefPtr<BrowserParent> mBrowserParent;
#ifdef ACCESSIBILITY
RefPtr<a11y::DocAccessibleParent> mEmbedderAccessibleDoc;
uint64_t mEmbedderAccessibleID = 0;
#endif // ACCESSIBILITY
};
} // namespace dom
} // namespace mozilla
#endif // !defined(mozilla_dom_BrowserBridgeParent_h)