1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-22 06:42:42 +01:00

Make JX.Aphlict a real singleton with a more sensible initialization order

Summary:
Ref T5373. The control flow between `aphlict-listener` and `JX.Aphlict` is pretty weird right now, where the listener (which is the highest-level component) has intimate knowledge of how to put the SWF on the page.

Instead:

  - Make `JX.Aphlict` a real singleton.
  - Instantiate it sooner.
  - Have it handle the flash setup handshake.

Test Plan: Loaded page in debug mode, saw normal flow take place.

Reviewers: joshuaspence

Reviewed By: joshuaspence

Subscribers: epriestley

Maniphest Tasks: T5373

Differential Revision: https://secure.phabricator.com/D9699
This commit is contained in:
epriestley 2014-06-23 15:19:34 -07:00
parent 80f26e96ea
commit dd91732df3
6 changed files with 105 additions and 84 deletions

View file

@ -8,7 +8,7 @@ return array(
'names' => 'names' =>
array( array(
'core.pkg.css' => '22e4fc33', 'core.pkg.css' => '22e4fc33',
'core.pkg.js' => '941224f2', 'core.pkg.js' => 'f5ba2408',
'darkconsole.pkg.js' => 'df001cab', 'darkconsole.pkg.js' => 'df001cab',
'differential.pkg.css' => '4a93db37', 'differential.pkg.css' => '4a93db37',
'differential.pkg.js' => 'd1443567', 'differential.pkg.js' => 'd1443567',
@ -346,9 +346,9 @@ return array(
'rsrc/image/texture/table_header.png' => '5c433037', 'rsrc/image/texture/table_header.png' => '5c433037',
'rsrc/image/texture/table_header_hover.png' => '038ec3b9', 'rsrc/image/texture/table_header_hover.png' => '038ec3b9',
'rsrc/image/texture/table_header_tall.png' => 'd56b434f', 'rsrc/image/texture/table_header_tall.png' => 'd56b434f',
'rsrc/js/application/aphlict/Aphlict.js' => '08be8878', 'rsrc/js/application/aphlict/Aphlict.js' => 'da12704d',
'rsrc/js/application/aphlict/behavior-aphlict-dropdown.js' => '862ea0fe', 'rsrc/js/application/aphlict/behavior-aphlict-dropdown.js' => '862ea0fe',
'rsrc/js/application/aphlict/behavior-aphlict-listen.js' => 'bdb2032d', 'rsrc/js/application/aphlict/behavior-aphlict-listen.js' => 'a826c925',
'rsrc/js/application/auth/behavior-persona-login.js' => '9414ff18', 'rsrc/js/application/auth/behavior-persona-login.js' => '9414ff18',
'rsrc/js/application/config/behavior-reorder-fields.js' => '14a827de', 'rsrc/js/application/config/behavior-reorder-fields.js' => '14a827de',
'rsrc/js/application/conpherence/behavior-menu.js' => 'f0a41b9f', 'rsrc/js/application/conpherence/behavior-menu.js' => 'f0a41b9f',
@ -490,7 +490,7 @@ return array(
'rsrc/js/phuix/PHUIXActionListView.js' => 'b5c256b8', 'rsrc/js/phuix/PHUIXActionListView.js' => 'b5c256b8',
'rsrc/js/phuix/PHUIXActionView.js' => '6e8cefa4', 'rsrc/js/phuix/PHUIXActionView.js' => '6e8cefa4',
'rsrc/js/phuix/PHUIXDropdownMenu.js' => 'bd4c8dca', 'rsrc/js/phuix/PHUIXDropdownMenu.js' => 'bd4c8dca',
'rsrc/swf/aphlict.swf' => '14d5aa2e', 'rsrc/swf/aphlict.swf' => 'ef64606d',
), ),
'symbols' => 'symbols' =>
array( array(
@ -539,10 +539,10 @@ return array(
'herald-rule-editor' => '6c9e6fb8', 'herald-rule-editor' => '6c9e6fb8',
'herald-test-css' => '778b008e', 'herald-test-css' => '778b008e',
'inline-comment-summary-css' => '8cfd34e8', 'inline-comment-summary-css' => '8cfd34e8',
'javelin-aphlict' => '08be8878', 'javelin-aphlict' => 'da12704d',
'javelin-behavior' => '8a3ed18b', 'javelin-behavior' => '8a3ed18b',
'javelin-behavior-aphlict-dropdown' => '862ea0fe', 'javelin-behavior-aphlict-dropdown' => '862ea0fe',
'javelin-behavior-aphlict-listen' => 'bdb2032d', 'javelin-behavior-aphlict-listen' => 'a826c925',
'javelin-behavior-aphront-basic-tokenizer' => 'b3a4b884', 'javelin-behavior-aphront-basic-tokenizer' => 'b3a4b884',
'javelin-behavior-aphront-crop' => 'fa0f4fc2', 'javelin-behavior-aphront-crop' => 'fa0f4fc2',
'javelin-behavior-aphront-drag-and-drop-textarea' => '92eb531d', 'javelin-behavior-aphront-drag-and-drop-textarea' => '92eb531d',
@ -878,11 +878,6 @@ return array(
3 => 'javelin-vector', 3 => 'javelin-vector',
4 => 'javelin-stratcom', 4 => 'javelin-stratcom',
), ),
'08be8878' =>
array(
0 => 'javelin-install',
1 => 'javelin-util',
),
'08e56a4e' => '08e56a4e' =>
array( array(
0 => 'javelin-install', 0 => 'javelin-install',
@ -1279,6 +1274,13 @@ return array(
1 => 'javelin-stratcom', 1 => 'javelin-stratcom',
2 => 'javelin-dom', 2 => 'javelin-dom',
), ),
'62e18640' =>
array(
0 => 'javelin-install',
1 => 'javelin-util',
2 => 'javelin-dom',
3 => 'javelin-typeahead-normalizer',
),
'6453c869' => '6453c869' =>
array( array(
0 => 'javelin-install', 0 => 'javelin-install',
@ -1357,13 +1359,6 @@ return array(
0 => 'javelin-behavior', 0 => 'javelin-behavior',
1 => 'javelin-dom', 1 => 'javelin-dom',
), ),
'62e18640' =>
array(
0 => 'javelin-install',
1 => 'javelin-util',
2 => 'javelin-dom',
3 => 'javelin-typeahead-normalizer',
),
'76b9fc3e' => '76b9fc3e' =>
array( array(
0 => 'javelin-behavior', 0 => 'javelin-behavior',
@ -1642,6 +1637,19 @@ return array(
1 => 'javelin-stratcom', 1 => 'javelin-stratcom',
2 => 'javelin-dom', 2 => 'javelin-dom',
), ),
'a826c925' =>
array(
0 => 'javelin-behavior',
1 => 'javelin-aphlict',
2 => 'javelin-stratcom',
3 => 'javelin-request',
4 => 'javelin-uri',
5 => 'javelin-dom',
6 => 'javelin-json',
7 => 'javelin-router',
8 => 'javelin-util',
9 => 'phabricator-notification',
),
'a82a7769' => 'a82a7769' =>
array( array(
0 => 'javelin-behavior', 0 => 'javelin-behavior',
@ -1794,18 +1802,6 @@ return array(
2 => 'javelin-util', 2 => 'javelin-util',
3 => 'javelin-request', 3 => 'javelin-request',
), ),
'bdb2032d' =>
array(
0 => 'javelin-behavior',
1 => 'javelin-aphlict',
2 => 'javelin-stratcom',
3 => 'javelin-request',
4 => 'javelin-uri',
5 => 'javelin-dom',
6 => 'javelin-json',
7 => 'javelin-router',
8 => 'phabricator-notification',
),
'bdb3e4d0' => 'bdb3e4d0' =>
array( array(
0 => 'javelin-behavior', 0 => 'javelin-behavior',
@ -1925,6 +1921,11 @@ return array(
1 => 'javelin-util', 1 => 'javelin-util',
2 => 'javelin-stratcom', 2 => 'javelin-stratcom',
), ),
'da12704d' =>
array(
0 => 'javelin-install',
1 => 'javelin-util',
),
'dd7e8ef5' => 'dd7e8ef5' =>
array( array(
0 => 'javelin-behavior', 0 => 'javelin-behavior',

View file

@ -42,6 +42,10 @@ package {
this.externalInvoke('log', message); this.externalInvoke('log', message);
} }
final protected function setStatus(status:String):void {
this.externalInvoke('status', {type: status});
}
} }
} }

View file

@ -42,11 +42,8 @@ package {
this.uncaughtErrorHandler); this.uncaughtErrorHandler);
ExternalInterface.addCallback('connect', this.externalConnect); ExternalInterface.addCallback('connect', this.externalConnect);
ExternalInterface.call(
'JX.Stratcom.invoke', this.setStatus('ready');
'aphlict-component-ready',
null,
{});
} }
private function uncaughtErrorHandler(event:UncaughtErrorEvent):void { private function uncaughtErrorHandler(event:UncaughtErrorEvent):void {
@ -58,8 +55,6 @@ package {
port:Number, port:Number,
subscriptions:Array):void { subscriptions:Array):void {
this.externalInvoke('connect');
this.remoteServer = server; this.remoteServer = server;
this.remotePort = port; this.remotePort = port;
this.subscriptions = subscriptions; this.subscriptions = subscriptions;

View file

@ -25,51 +25,87 @@
*/ */
JX.install('Aphlict', { JX.install('Aphlict', {
construct : function(id, server, port, subscriptions) { construct: function(id, server, port, subscriptions) {
if (__DEV__) { if (__DEV__) {
if (JX.Aphlict._instance) { if (JX.Aphlict._instance) {
JX.$E('Aphlict object is sort of a singleton..!'); JX.$E('Aphlict object is a singleton!');
} }
} }
JX.Aphlict._instance = this; this._id = id;
this._server = server; this._server = server;
this._port = port; this._port = port;
this._subscriptions = subscriptions; this._subscriptions = subscriptions;
// Flash puts its "objects" into global scope in an inconsistent way, JX.Aphlict._instance = this;
// because it was written in like 1816 when globals were awesome and IE4
// didn't support other scopes since global scope is the best anyway.
var container = document[id] || window[id];
this._flashContainer = container;
}, },
members : { members: {
_server : null, _id: null,
_port : null, _server: null,
_subscriptions : null, _port: null,
start : function() { _subscriptions: null,
start: function(node, uri) {
// NOTE: This is grotesque, but seems to work everywhere.
node.innerHTML =
'<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000">' +
'<param name="movie" value="' + uri + '" />' +
'<param name="allowScriptAccess" value="always" />' +
'<param name="wmode" value="opaque" />' +
'<embed src="' + uri + '" wmode="opaque"' +
'width="0" height="0" id="' + this._id + '">' +
'</embed>' +
'</object>';
},
_didStartFlash: function() {
var id = this._id;
// Flash puts its "objects" into global scope in an inconsistent way,
// because it was written in like 1816 when globals were awesome and IE4
// didn't support other scopes since global scope is the best anyway.
var container = document[id] || window[id];
this._flashContainer = container;
this._flashContainer.connect( this._flashContainer.connect(
this._server, this._server,
this._port, this._port,
this._subscriptions); this._subscriptions);
} }
}, },
properties : { properties: {
handler : null handler: null
}, },
statics : { statics: {
_instance : null, _instance: null,
didReceiveEvent : function(type, message) {
if (!JX.Aphlict._instance) { getInstance: function() {
var self = JX.Aphlict;
if (!self._instance) {
return null;
}
return self._instance;
},
didReceiveEvent: function(type, message) {
var client = JX.Aphlict.getInstance();
if (!client) {
return; return;
} }
var handler = JX.Aphlict._instance.getHandler(); if (type == 'status') {
switch (message.type) {
case 'ready':
client._didStartFlash();
break;
}
}
var handler = client.getHandler();
if (handler) { if (handler) {
handler(type, message); handler(type, message);
} }

View file

@ -16,18 +16,6 @@ JX.behavior('aphlict-listen', function(config) {
var showing_reload = false; var showing_reload = false;
function onready() {
var client = new JX.Aphlict(
config.id,
config.server,
config.port,
config.subscriptions);
client
.setHandler(onaphlictmessage)
.start();
}
JX.Stratcom.listen('aphlict-receive-message', null, function(e) { JX.Stratcom.listen('aphlict-receive-message', null, function(e) {
var message = e.getData(); var message = e.getData();
@ -61,6 +49,8 @@ JX.behavior('aphlict-listen', function(config) {
default: default:
case 'error': case 'error':
case 'log':
case 'status':
if (config.debug) { if (config.debug) {
var details = message ? JX.JSON.stringify(message) : ''; var details = message ? JX.JSON.stringify(message) : '';
JX.log('(Aphlict) [' + type + '] ' + details); JX.log('(Aphlict) [' + type + '] ' + details);
@ -98,19 +88,14 @@ JX.behavior('aphlict-listen', function(config) {
} }
} }
var client = new JX.Aphlict(
config.id,
config.server,
config.port,
config.subscriptions);
// Wait for the element to load, and don't do anything if it never loads. client
// If we just go crazy and start making calls to it before it loads, its .setHandler(onaphlictmessage)
// interfaces won't be registered yet. .start(JX.$(config.containerID), config.swfURI);
JX.Stratcom.listen('aphlict-component-ready', null, onready);
// Add Flash object to page
JX.$(config.containerID).innerHTML =
'<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000">' +
'<param name="movie" value="' + config.swfURI + '" />' +
'<param name="allowScriptAccess" value="always" />' +
'<param name="wmode" value="opaque" />' +
'<embed src="' + config.swfURI + '" wmode="opaque"' +
'width="0" height="0" id="' + config.id + '">' +
'</embed></object>'; //Evan sanctioned
}); });

Binary file not shown.