summaryrefslogtreecommitdiffstats
path: root/dom/browser-element/BrowserElementParent.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/browser-element/BrowserElementParent.h')
-rw-r--r--dom/browser-element/BrowserElementParent.h135
1 files changed, 135 insertions, 0 deletions
diff --git a/dom/browser-element/BrowserElementParent.h b/dom/browser-element/BrowserElementParent.h
new file mode 100644
index 000000000..428884f97
--- /dev/null
+++ b/dom/browser-element/BrowserElementParent.h
@@ -0,0 +1,135 @@
+/* -*- 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_BrowserElementHelpers_h
+#define mozilla_BrowserElementHelpers_h
+
+#include "nsAString.h"
+#include "mozilla/gfx/Point.h"
+#include "mozilla/gfx/Rect.h"
+#include "Units.h"
+#include "mozilla/dom/Element.h"
+
+class nsIDOMWindow;
+class nsIURI;
+
+namespace mozilla {
+
+namespace dom {
+class TabParent;
+} // namespace dom
+
+namespace layers {
+struct TextureFactoryIdentifier;
+} // namespace layers
+
+namespace layout {
+class PRenderFrameParent;
+} // namespace layout
+
+/**
+ * BrowserElementParent implements a portion of the parent-process side of
+ * <iframe mozbrowser>.
+ *
+ * Most of the parent-process side of <iframe mozbrowser> is implemented in
+ * BrowserElementParent.js. This file implements the few parts of this
+ * functionality which must be written in C++.
+ *
+ * We don't communicate with the JS code that lives in BrowserElementParent.js;
+ * the JS and C++ parts are completely separate.
+ */
+class BrowserElementParent
+{
+public:
+
+ /**
+ * Possible results from a window.open call.
+ * ADDED - The frame was added to a document (i.e. handled by the embedder).
+ * IGNORED - The frame was not added to a document and the embedder didn't
+ * call preventDefault() to prevent the platform from handling the call.
+ * CANCELLED - The frame was not added to a document, but the embedder still
+ * called preventDefault() to prevent the platform from handling the call.
+ */
+
+ enum OpenWindowResult {
+ OPEN_WINDOW_ADDED,
+ OPEN_WINDOW_IGNORED,
+ OPEN_WINDOW_CANCELLED
+ };
+
+ /**
+ * Handle a window.open call from an out-of-process <iframe mozbrowser>.
+ *
+ * window.open inside <iframe mozbrowser> doesn't actually open a new
+ * top-level window. Instead, the "embedder" (the document which contains
+ * the <iframe mozbrowser> whose content called window.open) gets the
+ * opportunity to place a new <iframe mozbrowser> in the DOM somewhere. This
+ * new "popup" iframe acts as the opened window.
+ *
+ * This method proceeds in three steps.
+ *
+ * 1) We fire a mozbrowseropenwindow CustomEvent on the opener
+ * iframe element. This event's detail is an instance of
+ * OpenWindowEventDetail.
+ *
+ * 2) The embedder (the document which contains the opener iframe) can accept
+ * the window.open request by inserting event.detail.frameElement (an iframe
+ * element) into the DOM somewhere.
+ *
+ * 3) If the embedder accepted the window.open request, we return true and
+ * set aPopupTabParent's frame element to event.detail.frameElement.
+ * Otherwise, we return false.
+ *
+ * @param aURL the URL the new window should load. The empty string is
+ * allowed.
+ * @param aOpenerTabParent the TabParent whose TabChild called window.open.
+ * @param aPopupTabParent the TabParent inside which the opened window will
+ * live.
+ * @return an OpenWindowresult that describes whether the embedder added the
+ * frame to a document and whether it called preventDefault to prevent
+ * the platform from handling the open request.
+ */
+ static OpenWindowResult
+ OpenWindowOOP(dom::TabParent* aOpenerTabParent,
+ dom::TabParent* aPopupTabParent,
+ layout::PRenderFrameParent* aRenderFrame,
+ const nsAString& aURL,
+ const nsAString& aName,
+ const nsAString& aFeatures,
+ layers::TextureFactoryIdentifier* aTextureFactoryIdentifier,
+ uint64_t* aLayersId);
+
+ /**
+ * Handle a window.open call from an in-process <iframe mozbrowser>.
+ *
+ * (These parameter types are silly, but they match what our caller has in
+ * hand. Feel free to add an override, if they are inconvenient to you.)
+ *
+ * @param aURI the URI the new window should load. May be null.
+ * @return an OpenWindowResult that describes whether the browser added the
+ * frame to a document or whether they called preventDefault to prevent
+ * the platform from handling the open request
+ */
+ static OpenWindowResult
+ OpenWindowInProcess(nsPIDOMWindowOuter* aOpenerWindow,
+ nsIURI* aURI,
+ const nsAString& aName,
+ const nsACString& aFeatures,
+ bool aForceNoOpener,
+ mozIDOMWindowProxy** aReturnWindow);
+
+private:
+ static OpenWindowResult
+ DispatchOpenWindowEvent(dom::Element* aOpenerFrameElement,
+ dom::Element* aPopupFrameElement,
+ const nsAString& aURL,
+ const nsAString& aName,
+ const nsAString& aFeatures);
+};
+
+} // namespace mozilla
+
+#endif