gecko-dev/dom/ipc/BrowserBridgeHost.cpp
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

89 lines
2.5 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/. */
#include "mozilla/dom/BrowserBridgeHost.h"
#include "mozilla/Unused.h"
namespace mozilla {
namespace dom {
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(BrowserBridgeHost)
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
NS_IMPL_CYCLE_COLLECTION(BrowserBridgeHost)
NS_IMPL_CYCLE_COLLECTING_ADDREF(BrowserBridgeHost)
NS_IMPL_CYCLE_COLLECTING_RELEASE(BrowserBridgeHost)
BrowserBridgeHost::BrowserBridgeHost(BrowserBridgeChild* aChild)
: mBridge(aChild) {}
TabId BrowserBridgeHost::GetTabId() const { return mBridge->GetTabId(); }
mozilla::layers::LayersId BrowserBridgeHost::GetLayersId() const {
return mBridge->GetLayersId();
}
BrowsingContext* BrowserBridgeHost::GetBrowsingContext() const {
return mBridge->GetBrowsingContext();
}
nsILoadContext* BrowserBridgeHost::GetLoadContext() const {
return mBridge->GetLoadContext();
}
void BrowserBridgeHost::LoadURL(nsIURI* aURI) {
nsAutoCString spec;
aURI->GetSpec(spec);
Unused << mBridge->SendLoadURL(spec);
}
void BrowserBridgeHost::ResumeLoad(uint64_t aPendingSwitchId) {
Unused << mBridge->SendResumeLoad(aPendingSwitchId);
}
void BrowserBridgeHost::DestroyStart() { DestroyComplete(); }
void BrowserBridgeHost::DestroyComplete() {
if (!mBridge) {
return;
}
Unused << mBridge->Send__delete__(mBridge);
mBridge = nullptr;
}
bool BrowserBridgeHost::Show(const OwnerShowInfo& aShowInfo) {
Unused << mBridge->SendShow(aShowInfo);
return true;
}
void BrowserBridgeHost::UpdateDimensions(const nsIntRect& aRect,
const ScreenIntSize& aSize) {
Unused << mBridge->SendUpdateDimensions(aRect, aSize);
}
void BrowserBridgeHost::UpdateEffects(EffectsInfo aEffects) {
if (!mBridge || mEffectsInfo == aEffects) {
return;
}
mEffectsInfo = aEffects;
Unused << mBridge->SendUpdateEffects(mEffectsInfo);
}
already_AddRefed<nsIWidget> BrowserBridgeHost::GetWidget() const {
RefPtr<Element> owner = mBridge->GetFrameLoader()->GetOwnerContent();
nsCOMPtr<nsIWidget> widget = nsContentUtils::WidgetForContent(owner);
if (!widget) {
widget = nsContentUtils::WidgetForDocument(owner->OwnerDoc());
}
return widget.forget();
}
} // namespace dom
} // namespace mozilla