Bug 962736 - Update Shumway to version 0.8.6. r=till

This commit is contained in:
Yury Delendik 2014-01-24 09:26:32 -06:00
parent 732637c1d4
commit fd5479d445
6 changed files with 1150 additions and 818 deletions

View File

@ -37,18 +37,24 @@ const MAX_CLIPBOARD_DATA_SIZE = 8000;
Cu.import('resource://gre/modules/XPCOMUtils.jsm');
Cu.import('resource://gre/modules/Services.jsm');
Cu.import('resource://gre/modules/NetUtil.jsm');
Cu.import('resource://gre/modules/Promise.jsm');
XPCOMUtils.defineLazyModuleGetter(this, 'PrivateBrowsingUtils',
'resource://gre/modules/PrivateBrowsingUtils.jsm');
XPCOMUtils.defineLazyModuleGetter(this, 'AddonManager',
'resource://gre/modules/AddonManager.jsm');
XPCOMUtils.defineLazyModuleGetter(this, 'ShumwayTelemetry',
'resource://shumway/ShumwayTelemetry.jsm');
let appInfo = Cc['@mozilla.org/xre/app-info;1'].getService(Ci.nsIXULAppInfo);
let Svc = {};
XPCOMUtils.defineLazyServiceGetter(Svc, 'mime',
'@mozilla.org/mime;1', 'nsIMIMEService');
let StringInputStream = Cc["@mozilla.org/io/string-input-stream;1"];
let MimeInputStream = Cc["@mozilla.org/network/mime-input-stream;1"];
function getBoolPref(pref, def) {
try {
return Services.prefs.getBoolPref(pref);
@ -188,6 +194,32 @@ function isShumwayEnabledFor(actions) {
return true;
}
function getVersionInfo() {
var deferred = Promise.defer();
var versionInfo = {
geckoMstone : 'unknown',
geckoBuildID: 'unknown',
shumwayVersion: 'unknown'
};
try {
versionInfo.geckoMstone = Services.prefs.getCharPref('gecko.mstone');
versionInfo.geckoBuildID = Services.prefs.getCharPref('gecko.buildID');
} catch (e) {
log('Error encountered while getting platform version info:', e);
}
try {
var addonId = "shumway@research.mozilla.org";
AddonManager.getAddonByID(addonId, function(addon) {
versionInfo.shumwayVersion = addon ? addon.version : 'n/a';
deferred.resolve(versionInfo);
});
} catch (e) {
log('Error encountered while getting Shumway version info:', e);
deferred.resolve(versionInfo);
}
return deferred.promise;
}
function fallbackToNativePlugin(window, userAction, activateCTP) {
var obj = window.frameElement;
var doc = obj.ownerDocument;
@ -366,7 +398,7 @@ ChromeActions.prototype = {
});
},
fallback: function(automatic) {
automatic = !!automatic; // cast to boolean
automatic = !!automatic;
fallbackToNativePlugin(this.window, !automatic, automatic);
},
setClipboard: function (data) {
@ -432,6 +464,28 @@ ChromeActions.prototype = {
break;
}
},
reportIssue: function(exceptions) {
var base = "http://shumway-issue-reporter.paas.allizom.org/input?";
var windowUrl = this.window.parent.wrappedJSObject.location + '';
var params = 'url=' + encodeURIComponent(windowUrl);
params += '&swf=' + encodeURIComponent(this.url);
getVersionInfo().then(function (versions) {
params += '&ffbuild=' + encodeURIComponent(versions.geckoMstone + ' (' +
versions.geckoBuildID + ')');
params += '&shubuild=' + encodeURIComponent(versions.shumwayVersion);
}).then(function () {
var postDataStream = StringInputStream.
createInstance(Ci.nsIStringInputStream);
postDataStream.data = 'exceptions=' + encodeURIComponent(exceptions);
var postData = MimeInputStream.createInstance(Ci.nsIMIMEInputStream);
postData.addHeader("Content-Type", "application/x-www-form-urlencoded");
postData.addContentLength = true;
postData.setData(postDataStream);
this.window.openDialog('chrome://browser/content', '_blank',
'all,dialog=no', base + params, null, null,
postData);
}.bind(this));
},
externalCom: function (data) {
if (!this.allowScriptAccess)
return;
@ -459,6 +513,9 @@ ChromeActions.prototype = {
case 'unregister':
return embedTag.__flash__unregisterCallback(data.functionName);
}
},
getWindowUrl: function() {
return this.window.parent.wrappedJSObject.location + '';
}
};

View File

@ -3875,6 +3875,13 @@ function createParsingContext(commitData) {
command: 'complete',
stats: stats
});
},
onexception: function (e) {
commitData({
type: 'exception',
message: e.message,
stack: e.stack
});
}
};
}
@ -5813,7 +5820,7 @@ var readHeader = function readHeader($bytes, $stream, $, swfVersion, tagCode) {
global['tagHandler'] = tagHandler;
global['readHeader'] = readHeader;
}(this));
function readTags(context, stream, swfVersion, final, onprogress) {
function readTags(context, stream, swfVersion, final, onprogress, onexception) {
var tags = context.tags;
var bytes = stream.bytes;
var lastSuccessfulPosition;
@ -5882,6 +5889,7 @@ function readTags(context, stream, swfVersion, final, onprogress) {
}
} catch (e) {
if (e !== StreamNoDataError) {
onexception && onexception(e);
throw e;
}
stream.pos = lastSuccessfulPosition;
@ -6041,7 +6049,7 @@ BodyParser.prototype = {
finalBlock = progressInfo.bytesLoaded >= progressInfo.bytesTotal;
}
var readStartTime = performance.now();
readTags(swf, stream, swfVersion, finalBlock, options.onprogress);
readTags(swf, stream, swfVersion, finalBlock, options.onprogress, options.onexception);
swf.parseTime += performance.now() - readStartTime;
var read = stream.pos;
buffer.removeHead(read);

File diff suppressed because it is too large Load Diff

View File

@ -1 +1,2 @@
0.7.933
0.8.6
4728574

View File

@ -108,12 +108,17 @@ function runViewer() {
parseSwf(movieUrl, movieParams, objectParams);
if (isOverlay) {
document.getElementById('overlay').className = 'enabled';
var fallbackDiv = document.getElementById('fallback');
fallbackDiv.className = 'enabled';
fallbackDiv.addEventListener('click', function(e) {
fallback();
e.preventDefault();
});
var reportDiv = document.getElementById('report');
reportDiv.addEventListener('click', function(e) {
reportIssue();
e.preventDefault();
});
var fallbackMenu = document.getElementById('fallbackMenu');
fallbackMenu.removeAttribute('hidden');
fallbackMenu.addEventListener('click', fallback);
@ -122,13 +127,14 @@ function runViewer() {
showURLMenu.addEventListener('click', showURL);
var inspectorMenu = document.getElementById('inspectorMenu');
inspectorMenu.addEventListener('click', showInInspector);
var reportMenu = document.getElementById('reportMenu');
reportMenu.addEventListener('click', reportIssue);
document.getElementById('copyProfileMenu').addEventListener('click', copyProfile);
}
function showURL() {
var flashParams = JSON.parse(FirefoxCom.requestSync('getPluginParams', null));
window.prompt("Copy to clipboard", flashParams.url);
window.prompt("Copy to clipboard", movieUrl);
}
function showInInspector() {
@ -140,6 +146,26 @@ function showInInspector() {
window.open(base + encodeURIComponent(movieUrl) + params);
}
function reportIssue() {
var duplicatesMap = Object.create(null);
var prunedExceptions = [];
avm2.exceptions.forEach(function(e) {
var ident = e.source + e.message + e.stack;
var entry = duplicatesMap[ident];
if (!entry) {
entry = duplicatesMap[ident] = {
source: e.source,
message: e.message,
stack: e.stack,
count: 0
};
prunedExceptions.push(entry);
}
entry.count++;
});
FirefoxCom.requestSync('reportIssue', JSON.stringify(prunedExceptions));
}
function copyProfile() {
function toArray(v) {
var array = [];
@ -236,6 +262,12 @@ function parseSwf(url, movieParams, objectParams) {
FirefoxCom.requestSync('getCompilerSettings', null));
enableVerifier.value = compilerSettings.verifier;
// init misc preferences
turboMode.value = FirefoxCom.requestSync('getBoolPref', {pref: 'shumway.turboMode', def: false});
hud.value = FirefoxCom.requestSync('getBoolPref', {pref: 'shumway.hud', def: false});
forceHidpi.value = FirefoxCom.requestSync('getBoolPref', {pref: 'shumway.force_hidpi', def: false});
dummyAnimation.value = FirefoxCom.requestSync('getBoolPref', {pref: 'shumway.dummyMode', def: false});
console.log("Compiler settings: " + JSON.stringify(compilerSettings));
console.log("Parsing " + url + "...");
function loaded() {

View File

@ -38,38 +38,50 @@ limitations under the License.
line-height: 0;
}
#fallback {
#overlay {
display: none;
}
#fallback.enabled {
#overlay.enabled {
display: block;
position:fixed;
bottom: 0;
right: 0;
}
#report, #fallback {
float: right;
width: 70px; height: 16px;
padding: 8px 4px 4px;
color: white;
right: 0px; bottom: 0px; width: 70px; height: 16px;
padding: 4px;
padding-top: 8px;
background-color: rgba(0, 0, 0, 0.62);
font: bold 10px sans-serif;
text-align: center;
text-decoration: none;
}
#report {
display: none;
width: 100px;
}
#overlay:hover #report {
display: block;
}
#fallback .icon {
display: none;
color: white;
}
#fallback.enabled:hover .icon {
#fallback:hover .icon {
display: inline-block;
}
#fallback:hover {
background-color: rgb(0, 0, 0);
#report:hover, #fallback:hover {
background-color: black;
}
@media screen and (max-width: 100px), screen and (max-height: 40px) {
body.started #fallback {
body.started #overlay {
display: none;
}
}
@ -79,11 +91,15 @@ limitations under the License.
<body contextmenu="shumwayMenu">
<div id="viewer"></div>
<section>
<a id="fallback" href="#">Shumway <span class="icon">&times;</span></a>
<div id="overlay">
<a id="fallback" href="#">Shumway <span class="icon">&times;</span></a>
<a id="report" href="#">Report Problems</a>
</div>
<menu type="context" id="shumwayMenu">
<menuitem label="Show URL" id="showURLMenu"></menuitem>
<menuitem label="Copy Profile" id="copyProfileMenu"></menuitem>
<menuitem label="Open in Inspector" id="inspectorMenu"></menuitem>
<menuitem label="Report Problems" id="reportMenu"></menuitem>
<menuitem label="Fallback to Flash" id="fallbackMenu" hidden></menuitem>
</menu>
</section>