Bug 1278989 - Make parent outer window available on TabParent. r?mrbkap draft
authorMike Conley <mconley@mozilla.com>
Wed, 27 Apr 2016 15:40:36 -0400
changeset 376767 9ad6e95928c65c661dc2c2a4293401e260ed959e
parent 376275 ec20b463c04f57a4bfca1edb987fcb9e9707c364
child 523237 d142ed0e150af6d51156bf4ad79a1c5cebcf0a72
push id20669
push usermconley@mozilla.com
push dateWed, 08 Jun 2016 18:28:54 +0000
reviewersmrbkap
bugs1278989
milestone50.0a1
Bug 1278989 - Make parent outer window available on TabParent. r?mrbkap MozReview-Commit-ID: 9nS1zQkGmu3
dom/ipc/TabParent.cpp
dom/ipc/TabParent.h
--- a/dom/ipc/TabParent.cpp
+++ b/dom/ipc/TabParent.cpp
@@ -335,16 +335,37 @@ TabParent::RemoveTabParentFromTable(uint
 }
 
 void
 TabParent::CacheFrameLoader(nsFrameLoader* aFrameLoader)
 {
   mFrameLoader = aFrameLoader;
 }
 
+/**
+ * Will return nullptr if there is no outer window available for the
+ * document hosting the owner element of this TabParent. Also will return
+ * nullptr if that outer window is in the process of closing.
+ */
+already_AddRefed<nsPIDOMWindowOuter>
+TabParent::GetParentWindowOuter()
+{
+  nsCOMPtr<nsIContent> frame = do_QueryInterface(GetOwnerElement());
+  if (!frame) {
+    return nullptr;
+  }
+
+  nsCOMPtr<nsPIDOMWindowOuter> parent = frame->OwnerDoc()->GetWindow();
+  if (!parent || parent->Closed()) {
+    return nullptr;
+  }
+
+  return parent.forget();
+}
+
 void
 TabParent::SetOwnerElement(Element* aElement)
 {
   // If we held previous content then unregister for its events.
   RemoveWindowListeners();
 
   // If we change top-level documents then we need to change our
   // registration with them.
--- a/dom/ipc/TabParent.h
+++ b/dom/ipc/TabParent.h
@@ -138,16 +138,17 @@ public:
   NS_DECL_NSIDOMEVENTLISTENER
 
   TabParent(nsIContentParent* aManager,
             const TabId& aTabId,
             const TabContext& aContext,
             uint32_t aChromeFlags);
 
   Element* GetOwnerElement() const { return mFrameElement; }
+  already_AddRefed<nsPIDOMWindowOuter> GetParentWindowOuter();
 
   void SetOwnerElement(Element* aElement);
 
   void CacheFrameLoader(nsFrameLoader* aFrameLoader);
 
   /**
    * Get the mozapptype attribute from this TabParent's owner DOM element.
    */