diff options
Diffstat (limited to 'dom/ipc')
-rw-r--r-- | dom/ipc/PBrowser.ipdl | 20 | ||||
-rw-r--r-- | dom/ipc/PDocumentRenderer.ipdl | 25 | ||||
-rw-r--r-- | dom/ipc/TabChild.cpp | 52 | ||||
-rw-r--r-- | dom/ipc/TabChild.h | 21 | ||||
-rw-r--r-- | dom/ipc/TabParent.cpp | 19 | ||||
-rw-r--r-- | dom/ipc/TabParent.h | 11 | ||||
-rw-r--r-- | dom/ipc/moz.build | 1 |
7 files changed, 149 insertions, 0 deletions
diff --git a/dom/ipc/PBrowser.ipdl b/dom/ipc/PBrowser.ipdl index 9dfccbc5c..249657c26 100644 --- a/dom/ipc/PBrowser.ipdl +++ b/dom/ipc/PBrowser.ipdl @@ -11,6 +11,7 @@ include protocol PContent; include protocol PContentBridge; include protocol PDatePicker; include protocol PDocAccessible; +include protocol PDocumentRenderer; include protocol PFilePicker; include protocol PIndexedDBPermissionRequest; include protocol PRenderFrame; @@ -118,6 +119,7 @@ nested(upto inside_cpow) sync protocol PBrowser manages PColorPicker; manages PDatePicker; manages PDocAccessible; + manages PDocumentRenderer; manages PFilePicker; manages PIndexedDBPermissionRequest; manages PRenderFrame; @@ -737,6 +739,24 @@ child: async LoadRemoteScript(nsString aURL, bool aRunInGlobalScope); /** + * Create a asynchronous request to render whatever document is + * loaded in the child when this message arrives. When the + * request finishes, PDocumentRenderer:__delete__ is sent back to + * this side to notify completion. + * + * |documentRect| is the area of the remote document to draw, + * transformed by |transform|. The rendered area will have the + * default background color |bgcolor|. |renderFlags| are the + * nsIPresShell::RenderDocument() flags to use on the remote side, + * and if true, |flushLayout| will do just that before rendering + * the document. The rendered image will be of size |renderSize|. + */ + async PDocumentRenderer(nsRect documentRect, Matrix transform, + nsString bgcolor, + uint32_t renderFlags, bool flushLayout, + IntSize renderSize); + + /** * Sent by the chrome process when it no longer wants this remote * <browser>. The child side cleans up in response, then * finalizing its death by sending back __delete__() to the diff --git a/dom/ipc/PDocumentRenderer.ipdl b/dom/ipc/PDocumentRenderer.ipdl new file mode 100644 index 000000000..bdaed45d7 --- /dev/null +++ b/dom/ipc/PDocumentRenderer.ipdl @@ -0,0 +1,25 @@ +/* -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 8 -*- */ +/* 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 protocol PBrowser; + +include "mozilla/GfxMessageUtils.h"; + +using nsIntSize from "nsSize.h"; + +namespace mozilla { +namespace ipc { + +protocol PDocumentRenderer +{ + manager PBrowser; + +parent: + // Returns the width and height, in pixels, of the returned ARGB32 data. + async __delete__(nsIntSize renderedSize, nsCString data); +}; + +} // namespace ipc +} // namespace mozilla diff --git a/dom/ipc/TabChild.cpp b/dom/ipc/TabChild.cpp index f46a917d5..eaf4a32ed 100644 --- a/dom/ipc/TabChild.cpp +++ b/dom/ipc/TabChild.cpp @@ -22,6 +22,7 @@ #include "mozilla/dom/indexedDB/PIndexedDBPermissionRequestChild.h" #include "mozilla/plugins/PluginWidgetChild.h" #include "mozilla/IMEStateManager.h" +#include "mozilla/ipc/DocumentRendererChild.h" #include "mozilla/ipc/URIUtils.h" #include "mozilla/layers/APZChild.h" #include "mozilla/layers/APZCCallbackHelper.h" @@ -2005,6 +2006,57 @@ TabChild::DeallocPDocAccessibleChild(a11y::PDocAccessibleChild* aChild) return true; } +PDocumentRendererChild* +TabChild::AllocPDocumentRendererChild(const nsRect& documentRect, + const mozilla::gfx::Matrix& transform, + const nsString& bgcolor, + const uint32_t& renderFlags, + const bool& flushLayout, + const nsIntSize& renderSize) +{ + return new DocumentRendererChild(); +} + +bool +TabChild::DeallocPDocumentRendererChild(PDocumentRendererChild* actor) +{ + delete actor; + return true; +} + +bool +TabChild::RecvPDocumentRendererConstructor(PDocumentRendererChild* actor, + const nsRect& documentRect, + const mozilla::gfx::Matrix& transform, + const nsString& bgcolor, + const uint32_t& renderFlags, + const bool& flushLayout, + const nsIntSize& renderSize) +{ + DocumentRendererChild *render = static_cast<DocumentRendererChild *>(actor); + + nsCOMPtr<nsIWebBrowser> browser = do_QueryInterface(WebNavigation()); + if (!browser) + return true; // silently ignore + nsCOMPtr<mozIDOMWindowProxy> window; + if (NS_FAILED(browser->GetContentDOMWindow(getter_AddRefs(window))) || + !window) + { + return true; // silently ignore + } + + nsCString data; + bool ret = render->RenderDocument(nsPIDOMWindowOuter::From(window), + documentRect, transform, + bgcolor, + renderFlags, flushLayout, + renderSize, data); + if (!ret) + return true; // silently ignore + + return PDocumentRendererChild::Send__delete__(actor, renderSize, data); +} + PColorPickerChild* TabChild::AllocPColorPickerChild(const nsString&, const nsString&) { diff --git a/dom/ipc/TabChild.h b/dom/ipc/TabChild.h index 2232ffeaf..b23c7c19e 100644 --- a/dom/ipc/TabChild.h +++ b/dom/ipc/TabChild.h @@ -445,6 +445,27 @@ public: virtual bool DeallocPDocAccessibleChild(PDocAccessibleChild*) override; + virtual PDocumentRendererChild* + AllocPDocumentRendererChild(const nsRect& aDocumentRect, + const gfx::Matrix& aTransform, + const nsString& aBggcolor, + const uint32_t& aRenderFlags, + const bool& aFlushLayout, + const nsIntSize& arenderSize) override; + + virtual bool + DeallocPDocumentRendererChild(PDocumentRendererChild* aCctor) override; + + virtual bool + RecvPDocumentRendererConstructor(PDocumentRendererChild* aActor, + const nsRect& aDocumentRect, + const gfx::Matrix& aTransform, + const nsString& aBgcolor, + const uint32_t& aRenderFlags, + const bool& aFlushLayout, + const nsIntSize& aRenderSize) override; + + virtual PColorPickerChild* AllocPColorPickerChild(const nsString& aTitle, const nsString& aInitialColor) override; diff --git a/dom/ipc/TabParent.cpp b/dom/ipc/TabParent.cpp index 8e98de3ce..0df4c1253 100644 --- a/dom/ipc/TabParent.cpp +++ b/dom/ipc/TabParent.cpp @@ -28,6 +28,7 @@ #include "mozilla/gfx/GPUProcessManager.h" #include "mozilla/Hal.h" #include "mozilla/IMEStateManager.h" +#include "mozilla/ipc/DocumentRendererParent.h" #include "mozilla/jsipc/CrossProcessObjectWrappers.h" #include "mozilla/layers/AsyncDragMetrics.h" #include "mozilla/layers/InputAPZContext.h" @@ -956,6 +957,24 @@ TabParent::GetTopLevelDocAccessible() const return nullptr; } +PDocumentRendererParent* +TabParent::AllocPDocumentRendererParent(const nsRect& documentRect, + const gfx::Matrix& transform, + const nsString& bgcolor, + const uint32_t& renderFlags, + const bool& flushLayout, + const nsIntSize& renderSize) +{ + return new DocumentRendererParent(); +} + +bool +TabParent::DeallocPDocumentRendererParent(PDocumentRendererParent* actor) +{ + delete actor; + return true; +} + PFilePickerParent* TabParent::AllocPFilePickerParent(const nsString& aTitle, const int16_t& aMode) { diff --git a/dom/ipc/TabParent.h b/dom/ipc/TabParent.h index 09bb999f3..43afb0538 100644 --- a/dom/ipc/TabParent.h +++ b/dom/ipc/TabParent.h @@ -473,6 +473,17 @@ public: const ScrollableLayerGuid& aGuid, uint64_t aInputBlockId); + virtual PDocumentRendererParent* + AllocPDocumentRendererParent(const nsRect& documentRect, + const gfx::Matrix& transform, + const nsString& bgcolor, + const uint32_t& renderFlags, + const bool& flushLayout, + const nsIntSize& renderSize) override; + + virtual bool + DeallocPDocumentRendererParent(PDocumentRendererParent* actor) override; + virtual PFilePickerParent* AllocPFilePickerParent(const nsString& aTitle, const int16_t& aMode) override; diff --git a/dom/ipc/moz.build b/dom/ipc/moz.build index ff3880bc2..153bd3aae 100644 --- a/dom/ipc/moz.build +++ b/dom/ipc/moz.build @@ -96,6 +96,7 @@ IPDL_SOURCES += [ 'PCrashReporter.ipdl', 'PCycleCollectWithLogs.ipdl', 'PDatePicker.ipdl', + 'PDocumentRenderer.ipdl', 'PFilePicker.ipdl', 'PMemoryReportRequest.ipdl', 'PPluginWidget.ipdl', |