Bug 1267720 - Make parent outer window available on TabParent. r?smaug draft
authorMike Conley <mconley@mozilla.com>
Wed, 27 Apr 2016 15:40:36 -0400
changeset 363506 6aeb0b88bd510a5b08f63a4f2cb02a9c8c8985fc
parent 363505 544e6d6a4c0cdbc3484450bf480856011a23a744
child 363507 a6cfa7bd6a9fba589bc927340a21a552285d8b15
push id17222
push usermconley@mozilla.com
push dateWed, 04 May 2016 21:02:55 +0000
reviewerssmaug
bugs1267720
milestone49.0a1
Bug 1267720 - Make parent outer window available on TabParent. r?smaug MozReview-Commit-ID: 9nS1zQkGmu3
dom/ipc/TabParent.cpp
dom/ipc/TabParent.h
--- a/dom/ipc/TabParent.cpp
+++ b/dom/ipc/TabParent.cpp
@@ -334,16 +334,37 @@ TabParent::RemoveTabParentFromTable(uint
 }
 
 void
 TabParent::CacheFrameLoader(nsFrameLoader* aFrameLoader)
 {
   mFrameLoader = aFrameLoader;
 }
 
+/**
+ * TODO: Documentation. Will return nullptr if there is no outer
+ * window available, or 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
@@ -103,16 +103,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.
    */