From 80f26e96ea407ee5afe19216389357e8a69f85eb Mon Sep 17 00:00:00 2001 From: epriestley Date: Mon, 23 Jun 2014 15:18:36 -0700 Subject: [PATCH] Install an uncaught exception handler in Aphlict Summary: Ref T5373. This seems to work pretty much correctly. Also stop popping bubbles and just use the log, since users find the bubbles confusing/not useful and they're not great for developers either. Future diffs will expose more user-facing stuff. Test Plan: Added `throw` to AphlictClient.as, got a log in the parent window. Reviewers: joshuaspence Reviewed By: joshuaspence Subscribers: epriestley Maniphest Tasks: T5373 Differential Revision: https://secure.phabricator.com/D9698 --- support/aphlict/client/src/Aphlict.as | 2 +- support/aphlict/client/src/AphlictClient.as | 10 ++++++++- .../aphlict/behavior-aphlict-listen.js | 20 +++++------------- webroot/rsrc/swf/aphlict.swf | Bin 6158 -> 6258 bytes 4 files changed, 15 insertions(+), 17 deletions(-) diff --git a/support/aphlict/client/src/Aphlict.as b/support/aphlict/client/src/Aphlict.as index 5045a26821..55c48aab13 100644 --- a/support/aphlict/client/src/Aphlict.as +++ b/support/aphlict/client/src/Aphlict.as @@ -34,7 +34,7 @@ package { ExternalInterface.call('JX.Aphlict.didReceiveEvent', type, object); } - final protected function error(error:Error):void { + final protected function error(error:Object):void { this.externalInvoke('error', error.toString()); } diff --git a/support/aphlict/client/src/AphlictClient.as b/support/aphlict/client/src/AphlictClient.as index dbde016a1a..dfbb390231 100644 --- a/support/aphlict/client/src/AphlictClient.as +++ b/support/aphlict/client/src/AphlictClient.as @@ -4,7 +4,7 @@ package { import flash.external.ExternalInterface; import flash.utils.Dictionary; import flash.utils.Timer; - + import flash.events.UncaughtErrorEvent; final public class AphlictClient extends Aphlict { @@ -37,6 +37,10 @@ package { public function AphlictClient() { super(); + loaderInfo.uncaughtErrorEvents.addEventListener( + UncaughtErrorEvent.UNCAUGHT_ERROR, + this.uncaughtErrorHandler); + ExternalInterface.addCallback('connect', this.externalConnect); ExternalInterface.call( 'JX.Stratcom.invoke', @@ -45,6 +49,10 @@ package { {}); } + private function uncaughtErrorHandler(event:UncaughtErrorEvent):void { + this.error(event.error.toString()); + } + public function externalConnect( server:String, port:Number, diff --git a/webroot/rsrc/js/application/aphlict/behavior-aphlict-listen.js b/webroot/rsrc/js/application/aphlict/behavior-aphlict-listen.js index cbb6c6292a..04cd66d378 100644 --- a/webroot/rsrc/js/application/aphlict/behavior-aphlict-listen.js +++ b/webroot/rsrc/js/application/aphlict/behavior-aphlict-listen.js @@ -8,6 +8,7 @@ * javelin-dom * javelin-json * javelin-router + * javelin-util * phabricator-notification */ @@ -54,28 +55,17 @@ JX.behavior('aphlict-listen', function(config) { // a request to Phabricator to get notification details. function onaphlictmessage(type, message) { switch (type) { - case 'error': - new JX.Notification() - .setContent('(Aphlict) ' + message) - .alterClassName('jx-notification-error', true) - .setDuration(0) - .show(); - break; - case 'receive': JX.Stratcom.invoke('aphlict-receive-message', null, message); break; default: - if (__DEV__ && config.debug) { + case 'error': + if (config.debug) { var details = message ? JX.JSON.stringify(message) : ''; - - new JX.Notification() - .setContent('(Aphlict) [' + type + '] ' + details) - .alterClassName('jx-notification-debug', true) - .setDuration(3000) - .show(); + JX.log('(Aphlict) [' + type + '] ' + details); } + break; } } diff --git a/webroot/rsrc/swf/aphlict.swf b/webroot/rsrc/swf/aphlict.swf index 9dc9c59565ebf8552c9646c78972dab4cda83ed0..b314f019e0c1f5df39e1dc3676118ac0adcf41ca 100644 GIT binary patch literal 6258 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