Bug 1530550 - Synchronize mOpener and mIsActivatedByUserGesture with SYNCED_BC_FIELD, r=farre

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

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Nika Layzell 2019-02-27 22:46:41 +00:00
Родитель 2a718d2775
Коммит b9e168fca3
6 изменённых файлов: 14 добавлений и 150 удалений

Просмотреть файл

@ -169,11 +169,11 @@ BrowsingContext::BrowsingContext(BrowsingContext* aParent,
uint64_t aBrowsingContextId, Type aType) uint64_t aBrowsingContextId, Type aType)
: mName(aName), : mName(aName),
mClosed(false), mClosed(false),
mOpener(aOpener),
mIsActivatedByUserGesture(false),
mType(aType), mType(aType),
mBrowsingContextId(aBrowsingContextId), mBrowsingContextId(aBrowsingContextId),
mParent(aParent), mParent(aParent) {
mOpener(aOpener),
mIsActivatedByUserGesture(false) {
// Specify our group in our constructor. We will explicitly join the group // Specify our group in our constructor. We will explicitly join the group
// when we are registered, as doing so will take a reference. // when we are registered, as doing so will take a reference.
if (mParent) { if (mParent) {
@ -280,22 +280,6 @@ void BrowsingContext::GetChildren(
MOZ_ALWAYS_TRUE(aChildren.AppendElements(mChildren)); MOZ_ALWAYS_TRUE(aChildren.AppendElements(mChildren));
} }
void BrowsingContext::SetOpener(BrowsingContext* aOpener) {
if (mOpener == aOpener) {
return;
}
mOpener = aOpener;
if (!XRE_IsContentProcess()) {
return;
}
auto cc = ContentChild::GetSingleton();
MOZ_DIAGNOSTIC_ASSERT(cc);
cc->SendSetOpenerBrowsingContext(this, aOpener);
}
// FindWithName follows the rules for choosing a browsing context, // FindWithName follows the rules for choosing a browsing context,
// with the exception of sandboxing for iframes. The implementation // with the exception of sandboxing for iframes. The implementation
// for arbitrarily choosing between two browsing contexts with the // for arbitrarily choosing between two browsing contexts with the
@ -477,14 +461,7 @@ void BrowsingContext::NotifyUserGestureActivation() {
RefPtr<BrowsingContext> topLevelBC = TopLevelBrowsingContext(); RefPtr<BrowsingContext> topLevelBC = TopLevelBrowsingContext();
USER_ACTIVATION_LOG("Get top level browsing context 0x%08" PRIx64, USER_ACTIVATION_LOG("Get top level browsing context 0x%08" PRIx64,
topLevelBC->Id()); topLevelBC->Id());
topLevelBC->SetUserGestureActivation(); topLevelBC->SetIsActivatedByUserGesture(true);
if (!XRE_IsContentProcess()) {
return;
}
auto cc = ContentChild::GetSingleton();
MOZ_ASSERT(cc);
cc->SendSetUserGestureActivation(topLevelBC, true);
} }
void BrowsingContext::NotifyResetUserGestureActivation() { void BrowsingContext::NotifyResetUserGestureActivation() {
@ -494,33 +471,12 @@ void BrowsingContext::NotifyResetUserGestureActivation() {
RefPtr<BrowsingContext> topLevelBC = TopLevelBrowsingContext(); RefPtr<BrowsingContext> topLevelBC = TopLevelBrowsingContext();
USER_ACTIVATION_LOG("Get top level browsing context 0x%08" PRIx64, USER_ACTIVATION_LOG("Get top level browsing context 0x%08" PRIx64,
topLevelBC->Id()); topLevelBC->Id());
topLevelBC->ResetUserGestureActivation(); topLevelBC->SetIsActivatedByUserGesture(false);
if (!XRE_IsContentProcess()) {
return;
}
auto cc = ContentChild::GetSingleton();
MOZ_ASSERT(cc);
cc->SendSetUserGestureActivation(topLevelBC, false);
}
void BrowsingContext::SetUserGestureActivation() {
MOZ_ASSERT(!mParent, "Set user activation flag on non top-level context!");
USER_ACTIVATION_LOG(
"Set user gesture activation for browsing context 0x%08" PRIx64, Id());
mIsActivatedByUserGesture = true;
} }
bool BrowsingContext::GetUserGestureActivation() { bool BrowsingContext::GetUserGestureActivation() {
RefPtr<BrowsingContext> topLevelBC = TopLevelBrowsingContext(); RefPtr<BrowsingContext> topLevelBC = TopLevelBrowsingContext();
return topLevelBC->mIsActivatedByUserGesture; return topLevelBC->GetIsActivatedByUserGesture();
}
void BrowsingContext::ResetUserGestureActivation() {
MOZ_ASSERT(!mParent, "Clear user activation flag on non top-level context!");
USER_ACTIVATION_LOG(
"Reset user gesture activation for browsing context 0x%08" PRIx64, Id());
mIsActivatedByUserGesture = false;
} }
NS_IMPL_CYCLE_COLLECTION_CLASS(BrowsingContext) NS_IMPL_CYCLE_COLLECTION_CLASS(BrowsingContext)
@ -577,7 +533,7 @@ Nullable<WindowProxyHolder> BrowsingContext::GetTop(ErrorResult& aError) {
void BrowsingContext::GetOpener(JSContext* aCx, void BrowsingContext::GetOpener(JSContext* aCx,
JS::MutableHandle<JS::Value> aOpener, JS::MutableHandle<JS::Value> aOpener,
ErrorResult& aError) const { ErrorResult& aError) const {
auto* opener = GetOpener(); BrowsingContext* opener = GetOpener();
if (!opener) { if (!opener) {
aOpener.setNull(); aOpener.setNull();
return; return;

Просмотреть файл

@ -66,9 +66,11 @@ class WindowProxyHolder;
// acts as a sentinel for callers of MOZ_FOR_EACH_SYNCED_FIELD. // acts as a sentinel for callers of MOZ_FOR_EACH_SYNCED_FIELD.
// clang-format off // clang-format off
#define MOZ_FOR_EACH_SYNCED_BC_FIELD(declare, ...) \ #define MOZ_FOR_EACH_SYNCED_BC_FIELD(declare, ...) \
declare(Name, nsString, nsAString) \ declare(Name, nsString, nsAString) \
declare(Closed, bool, bool) \ declare(Closed, bool, bool) \
declare(Opener, RefPtr<BrowsingContext>, BrowsingContext*) \
declare(IsActivatedByUserGesture, bool, bool) \
__VA_ARGS__ __VA_ARGS__
// clang-format on // clang-format on
@ -76,9 +78,9 @@ class WindowProxyHolder;
#define MOZ_SYNCED_BC_FIELD_ARGUMENT(name, type, atype) \ #define MOZ_SYNCED_BC_FIELD_ARGUMENT(name, type, atype) \
transaction->MOZ_SYNCED_BC_FIELD_NAME(name), transaction->MOZ_SYNCED_BC_FIELD_NAME(name),
#define MOZ_SYNCED_BC_FIELD_GETTER(name, type, atype) \ #define MOZ_SYNCED_BC_FIELD_GETTER(name, type, atype) \
const type& Get##name() const { return MOZ_SYNCED_BC_FIELD_NAME(name); } type const& Get##name() const { return MOZ_SYNCED_BC_FIELD_NAME(name); }
#define MOZ_SYNCED_BC_FIELD_SETTER(name, type, atype) \ #define MOZ_SYNCED_BC_FIELD_SETTER(name, type, atype) \
void Set##name(const atype& aValue) { \ void Set##name(atype const& aValue) { \
Transaction t; \ Transaction t; \
t.MOZ_SYNCED_BC_FIELD_NAME(name).emplace(aValue); \ t.MOZ_SYNCED_BC_FIELD_NAME(name).emplace(aValue); \
t.Commit(this); \ t.Commit(this); \
@ -204,10 +206,6 @@ class BrowsingContext : public nsWrapperCache,
void GetChildren(nsTArray<RefPtr<BrowsingContext>>& aChildren); void GetChildren(nsTArray<RefPtr<BrowsingContext>>& aChildren);
BrowsingContext* GetOpener() const { return mOpener; }
void SetOpener(BrowsingContext* aOpener);
BrowsingContextGroup* Group() { return mGroup; } BrowsingContextGroup* Group() { return mGroup; }
// Using the rules for choosing a browsing context we try to find // Using the rules for choosing a browsing context we try to find
@ -241,11 +239,6 @@ class BrowsingContext : public nsWrapperCache,
// activation flag of the top level browsing context. // activation flag of the top level browsing context.
void NotifyResetUserGestureActivation(); void NotifyResetUserGestureActivation();
// These functions would only be called in the top level browsing context.
// They would set/reset the user gesture activation flag.
void SetUserGestureActivation();
void ResetUserGestureActivation();
// Return true if it corresponding document is activated by user gesture. // Return true if it corresponding document is activated by user gesture.
bool GetUserGestureActivation(); bool GetUserGestureActivation();
@ -338,17 +331,12 @@ class BrowsingContext : public nsWrapperCache,
RefPtr<BrowsingContextGroup> mGroup; RefPtr<BrowsingContextGroup> mGroup;
RefPtr<BrowsingContext> mParent; RefPtr<BrowsingContext> mParent;
Children mChildren; Children mChildren;
WeakPtr<BrowsingContext> mOpener;
nsCOMPtr<nsIDocShell> mDocShell; nsCOMPtr<nsIDocShell> mDocShell;
// This is not a strong reference, but using a JS::Heap for that should be // This is not a strong reference, but using a JS::Heap for that should be
// fine. The JSObject stored in here should be a proxy with a // fine. The JSObject stored in here should be a proxy with a
// nsOuterWindowProxy handler, which will update the pointer from its // nsOuterWindowProxy handler, which will update the pointer from its
// objectMoved hook and clear it from its finalize hook. // objectMoved hook and clear it from its finalize hook.
JS::Heap<JSObject*> mWindowProxy; JS::Heap<JSObject*> mWindowProxy;
// This flag is only valid in the top level browsing context, it indicates
// whether the corresponding document has been activated by user gesture.
bool mIsActivatedByUserGesture;
}; };
/** /**

Просмотреть файл

@ -87,27 +87,6 @@ JSObject* CanonicalBrowsingContext::WrapObject(
return CanonicalBrowsingContext_Binding::Wrap(aCx, this, aGivenProto); return CanonicalBrowsingContext_Binding::Wrap(aCx, this, aGivenProto);
} }
void CanonicalBrowsingContext::NotifySetUserGestureActivationFromIPC(
bool aIsUserGestureActivation) {
if (!mCurrentWindowGlobal) {
return;
}
if (aIsUserGestureActivation) {
SetUserGestureActivation();
} else {
ResetUserGestureActivation();
}
USER_ACTIVATION_LOG("Chrome browsing context 0x%08" PRIx64
" would notify other browsing contexts for updating "
"user gesture activation flag.",
Id());
// XXX(alwu) : we need to sync the flag to other browsing contexts which are
// not in the same child process where the flag was set. Will implement that
// in bug1519229.
}
void CanonicalBrowsingContext::Traverse( void CanonicalBrowsingContext::Traverse(
nsCycleCollectionTraversalCallback& cb) { nsCycleCollectionTraversalCallback& cb) {
CanonicalBrowsingContext* tmp = this; CanonicalBrowsingContext* tmp = this;

Просмотреть файл

@ -5727,46 +5727,6 @@ mozilla::ipc::IPCResult ContentParent::RecvDetachBrowsingContext(
return IPC_OK(); return IPC_OK();
} }
mozilla::ipc::IPCResult ContentParent::RecvSetOpenerBrowsingContext(
BrowsingContext* aContext, BrowsingContext* aOpener) {
if (!aContext) {
MOZ_LOG(BrowsingContext::GetLog(), LogLevel::Debug,
("ParentIPC: Trying to set opener already detached"));
return IPC_OK();
}
if (!aContext->Canonical()->IsOwnedByProcess(ChildID())) {
// Where trying to set opener on a child BrowsingContext in
// another child process. This is illegal since the owner of the
// BrowsingContext is the proccess with the in-process docshell,
// which is tracked by OwnerProcessId.
// TODO(farre): To crash or not to crash. Same reasoning as in
// above TODO. [Bug 1471598]
MOZ_LOG(BrowsingContext::GetLog(), LogLevel::Warning,
("ParentIPC: Trying to set opener on out of process context "
"0x%08" PRIx64,
aContext->Id()));
return IPC_OK();
}
aContext->SetOpener(aOpener);
return IPC_OK();
}
mozilla::ipc::IPCResult ContentParent::RecvSetUserGestureActivation(
BrowsingContext* aContext, bool aNewValue) {
if (!aContext) {
MOZ_LOG(BrowsingContext::GetLog(), LogLevel::Debug,
("ParentIPC: Trying to activate wrong context"));
return IPC_OK();
}
aContext->Canonical()->NotifySetUserGestureActivationFromIPC(aNewValue);
return IPC_OK();
}
void ContentParent::RegisterRemoteWorkerActor() { ++mRemoteWorkerActors; } void ContentParent::RegisterRemoteWorkerActor() { ++mRemoteWorkerActors; }
void ContentParent::UnregisterRemoveWorkerActor() { void ContentParent::UnregisterRemoveWorkerActor() {

Просмотреть файл

@ -618,9 +618,6 @@ class ContentParent final : public PContentParent,
mozilla::ipc::IPCResult RecvDetachBrowsingContext(BrowsingContext* aContext, mozilla::ipc::IPCResult RecvDetachBrowsingContext(BrowsingContext* aContext,
bool aMoveToBFCache); bool aMoveToBFCache);
mozilla::ipc::IPCResult RecvSetOpenerBrowsingContext(
BrowsingContext* aContext, BrowsingContext* aOpener);
mozilla::ipc::IPCResult RecvWindowClose(BrowsingContext* aContext, mozilla::ipc::IPCResult RecvWindowClose(BrowsingContext* aContext,
bool aTrustedCaller); bool aTrustedCaller);
mozilla::ipc::IPCResult RecvWindowFocus(BrowsingContext* aContext); mozilla::ipc::IPCResult RecvWindowFocus(BrowsingContext* aContext);
@ -629,9 +626,6 @@ class ContentParent final : public PContentParent,
BrowsingContext* aContext, const ClonedMessageData& aMessage, BrowsingContext* aContext, const ClonedMessageData& aMessage,
const PostMessageData& aData); const PostMessageData& aData);
mozilla::ipc::IPCResult RecvSetUserGestureActivation(
BrowsingContext* aContext, bool aNewValue);
FORWARD_SHMEM_ALLOCATOR_TO(PContentParent) FORWARD_SHMEM_ALLOCATOR_TO(PContentParent)
protected: protected:

Просмотреть файл

@ -1253,19 +1253,6 @@ parent:
async DetachBrowsingContext(BrowsingContext aContext, async DetachBrowsingContext(BrowsingContext aContext,
bool aMoveToBFCache); bool aMoveToBFCache);
/**
* Set the opener of browsing context 'aContext' to the browsing context
* with id 'aOpenerId'.
*/
async SetOpenerBrowsingContext(BrowsingContext aContext,
BrowsingContext aOpenerContext);
/**
* Notify parent to update user gesture activation flag.
*/
async SetUserGestureActivation(BrowsingContext aContext,
bool aNewValue);
both: both:
async CommitBrowsingContextTransaction(BrowsingContext aContext, async CommitBrowsingContextTransaction(BrowsingContext aContext,
BrowsingContextTransaction aTransaction); BrowsingContextTransaction aTransaction);