Skip to content
Snippets Groups Projects
Commit d2862405 authored by Dale Harvey's avatar Dale Harvey
Browse files

Bug 753595 - Add a getScreenshot call to mozbrowser. r=jlebar

parent a3172ed2
No related branches found
No related tags found
No related merge requests found
......@@ -75,6 +75,9 @@ BrowserElementChild.prototype = {
this._iconChangedHandler.bind(this),
/* useCapture = */ true,
/* wantsUntrusted = */ false);
addMessageListener("browser-element-api:get-screenshot",
this._recvGetScreenshot.bind(this));
},
_titleChangedHandler: function(e) {
......@@ -110,6 +113,22 @@ BrowserElementChild.prototype = {
}
},
_recvGetScreenshot: function(data) {
debug("Received getScreenshot message: (" + data.json.id + ")");
var canvas = content.document
.createElementNS("http://www.w3.org/1999/xhtml", "canvas");
var ctx = canvas.getContext("2d");
canvas.mozOpaque = true;
canvas.height = content.innerHeight;
canvas.width = content.innerWidth;
ctx.drawWindow(content, 0, 0, content.innerWidth,
content.innerHeight, "rgb(255,255,255)");
sendAsyncMsg('got-screenshot', {
id: data.json.id,
screenshot: canvas.toDataURL("image/png")
});
},
// The docShell keeps a weak reference to the progress listener, so we need
// to keep a strong ref to it ourselves.
_progressListener: {
......
......@@ -7,6 +7,8 @@
let Cu = Components.utils;
let Ci = Components.interfaces;
let Cc = Components.classes;
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
const NS_PREFBRANCH_PREFCHANGE_TOPIC_ID = "nsPref:changed";
......@@ -52,6 +54,9 @@ BrowserElementParent.prototype = {
this._initialized = true;
this._screenshotListeners = {};
this._screenshotReqCounter = 0;
var os = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
os.addObserver(this, 'remote-browser-frame-shown', /* ownsWeak = */ true);
os.addObserver(this, 'in-process-browser-frame-shown', /* ownsWeak = */ true);
......@@ -101,6 +106,11 @@ BrowserElementParent.prototype = {
addMessageListener("titlechange", this._fireEventFromMsg);
addMessageListener("iconchange", this._fireEventFromMsg);
addMessageListener("get-mozapp-manifest-url", this._sendMozAppManifestURL);
mm.addMessageListener('browser-element-api:got-screenshot',
this._recvGotScreenshot.bind(this));
XPCNativeWrapper.unwrap(frameElement).getScreenshot =
this._getScreenshot.bind(this, mm, frameElement);
mm.loadFrameScript("chrome://global/content/BrowserElementChild.js",
/* allowDelayedLoad = */ true);
......@@ -139,6 +149,21 @@ BrowserElementParent.prototype = {
return frameElement.getAttribute('mozapp');
},
_recvGotScreenshot: function(data) {
var req = this._screenshotListeners[data.json.id];
delete this._screenshotListeners[data.json.id];
Services.DOMRequest.fireSuccess(req, data.json.screenshot);
},
_getScreenshot: function(mm, frameElement) {
let id = 'req_' + this._screenshotReqCounter++;
let req = Services.DOMRequest
.createRequest(frameElement.ownerDocument.defaultView);
this._screenshotListeners[id] = req;
mm.sendAsyncMessage('browser-element-api:get-screenshot', {id: id});
return req;
},
observe: function(subject, topic, data) {
switch(topic) {
case 'app-startup':
......
......@@ -55,6 +55,7 @@ _TEST_FILES = \
test_browserFrame6.html \
test_browserFrame7.html \
test_browserFrame8.html \
test_browserFrame9.html \
$(NULL)
libs:: $(_TEST_FILES)
......
<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=753595
-->
<head>
<title>Test for Bug 753595</title>
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="application/javascript" src="browserFrameHelpers.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=753595">Mozilla Bug 753595</a>
<!--
Test the getScreenshot property for mozbrowser
-->
<script type="application/javascript;version=1.7">
"use strict";
SimpleTest.waitForExplicitFinish();
function runTest() {
browserFrameHelpers.setEnabledPref(true);
browserFrameHelpers.addToWhitelist();
var iframe1 = document.createElement('iframe');
iframe1.mozbrowser = true;
document.body.appendChild(iframe1);
var screenshots = [];
var numLoaded = 0;
function screenshotLoaded(e) {
screenshots.push(e.target.result);
if (screenshots.length === 1) {
iframe1.src = 'data:text/html,<html>' +
'<body style="background:blue">hello</body></html>';
}
else if (screenshots.length === 2) {
ok(screenshots[0] !== 'data:,', 'First Screenshot is not blank');
ok(screenshots[0] !== screenshots[1], 'Screenshots differ');
SimpleTest.finish();
}
}
function iframeLoadedHandler() {
numLoaded++;
// Ignore the first loaded event, that is fired on creation of
// the iframe
if (numLoaded === 2) {
iframe1.getScreenshot().onsuccess = screenshotLoaded;
} else if (numLoaded === 3) {
iframe1.getScreenshot().onsuccess = screenshotLoaded;
}
}
iframe1.addEventListener('mozbrowserloadend', iframeLoadedHandler);
iframe1.src = 'data:text/html,<html>' +
'<body style="background:green">hello</body></html>';
}
addEventListener('load', function() { SimpleTest.executeSoon(runTest); });
</script>
</body>
</html>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment