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:
		@@ -8,7 +8,7 @@ return array(
 | 
			
		||||
  'names' =>
 | 
			
		||||
  array(
 | 
			
		||||
    'core.pkg.css' => '22e4fc33',
 | 
			
		||||
    'core.pkg.js' => '941224f2',
 | 
			
		||||
    'core.pkg.js' => 'f5ba2408',
 | 
			
		||||
    'darkconsole.pkg.js' => 'df001cab',
 | 
			
		||||
    'differential.pkg.css' => '4a93db37',
 | 
			
		||||
    'differential.pkg.js' => 'd1443567',
 | 
			
		||||
@@ -346,9 +346,9 @@ return array(
 | 
			
		||||
    'rsrc/image/texture/table_header.png' => '5c433037',
 | 
			
		||||
    'rsrc/image/texture/table_header_hover.png' => '038ec3b9',
 | 
			
		||||
    '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-listen.js' => 'bdb2032d',
 | 
			
		||||
    'rsrc/js/application/aphlict/behavior-aphlict-listen.js' => 'a826c925',
 | 
			
		||||
    'rsrc/js/application/auth/behavior-persona-login.js' => '9414ff18',
 | 
			
		||||
    'rsrc/js/application/config/behavior-reorder-fields.js' => '14a827de',
 | 
			
		||||
    'rsrc/js/application/conpherence/behavior-menu.js' => 'f0a41b9f',
 | 
			
		||||
@@ -490,7 +490,7 @@ return array(
 | 
			
		||||
    'rsrc/js/phuix/PHUIXActionListView.js' => 'b5c256b8',
 | 
			
		||||
    'rsrc/js/phuix/PHUIXActionView.js' => '6e8cefa4',
 | 
			
		||||
    'rsrc/js/phuix/PHUIXDropdownMenu.js' => 'bd4c8dca',
 | 
			
		||||
    'rsrc/swf/aphlict.swf' => '14d5aa2e',
 | 
			
		||||
    'rsrc/swf/aphlict.swf' => 'ef64606d',
 | 
			
		||||
  ),
 | 
			
		||||
  'symbols' =>
 | 
			
		||||
  array(
 | 
			
		||||
@@ -539,10 +539,10 @@ return array(
 | 
			
		||||
    'herald-rule-editor' => '6c9e6fb8',
 | 
			
		||||
    'herald-test-css' => '778b008e',
 | 
			
		||||
    'inline-comment-summary-css' => '8cfd34e8',
 | 
			
		||||
    'javelin-aphlict' => '08be8878',
 | 
			
		||||
    'javelin-aphlict' => 'da12704d',
 | 
			
		||||
    'javelin-behavior' => '8a3ed18b',
 | 
			
		||||
    'javelin-behavior-aphlict-dropdown' => '862ea0fe',
 | 
			
		||||
    'javelin-behavior-aphlict-listen' => 'bdb2032d',
 | 
			
		||||
    'javelin-behavior-aphlict-listen' => 'a826c925',
 | 
			
		||||
    'javelin-behavior-aphront-basic-tokenizer' => 'b3a4b884',
 | 
			
		||||
    'javelin-behavior-aphront-crop' => 'fa0f4fc2',
 | 
			
		||||
    'javelin-behavior-aphront-drag-and-drop-textarea' => '92eb531d',
 | 
			
		||||
@@ -878,11 +878,6 @@ return array(
 | 
			
		||||
      3 => 'javelin-vector',
 | 
			
		||||
      4 => 'javelin-stratcom',
 | 
			
		||||
    ),
 | 
			
		||||
    '08be8878' =>
 | 
			
		||||
    array(
 | 
			
		||||
      0 => 'javelin-install',
 | 
			
		||||
      1 => 'javelin-util',
 | 
			
		||||
    ),
 | 
			
		||||
    '08e56a4e' =>
 | 
			
		||||
    array(
 | 
			
		||||
      0 => 'javelin-install',
 | 
			
		||||
@@ -1279,6 +1274,13 @@ return array(
 | 
			
		||||
      1 => 'javelin-stratcom',
 | 
			
		||||
      2 => 'javelin-dom',
 | 
			
		||||
    ),
 | 
			
		||||
    '62e18640' =>
 | 
			
		||||
    array(
 | 
			
		||||
      0 => 'javelin-install',
 | 
			
		||||
      1 => 'javelin-util',
 | 
			
		||||
      2 => 'javelin-dom',
 | 
			
		||||
      3 => 'javelin-typeahead-normalizer',
 | 
			
		||||
    ),
 | 
			
		||||
    '6453c869' =>
 | 
			
		||||
    array(
 | 
			
		||||
      0 => 'javelin-install',
 | 
			
		||||
@@ -1357,13 +1359,6 @@ return array(
 | 
			
		||||
      0 => 'javelin-behavior',
 | 
			
		||||
      1 => 'javelin-dom',
 | 
			
		||||
    ),
 | 
			
		||||
    '62e18640' =>
 | 
			
		||||
    array(
 | 
			
		||||
      0 => 'javelin-install',
 | 
			
		||||
      1 => 'javelin-util',
 | 
			
		||||
      2 => 'javelin-dom',
 | 
			
		||||
      3 => 'javelin-typeahead-normalizer',
 | 
			
		||||
    ),
 | 
			
		||||
    '76b9fc3e' =>
 | 
			
		||||
    array(
 | 
			
		||||
      0 => 'javelin-behavior',
 | 
			
		||||
@@ -1642,6 +1637,19 @@ return array(
 | 
			
		||||
      1 => 'javelin-stratcom',
 | 
			
		||||
      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' =>
 | 
			
		||||
    array(
 | 
			
		||||
      0 => 'javelin-behavior',
 | 
			
		||||
@@ -1794,18 +1802,6 @@ return array(
 | 
			
		||||
      2 => 'javelin-util',
 | 
			
		||||
      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' =>
 | 
			
		||||
    array(
 | 
			
		||||
      0 => 'javelin-behavior',
 | 
			
		||||
@@ -1925,6 +1921,11 @@ return array(
 | 
			
		||||
      1 => 'javelin-util',
 | 
			
		||||
      2 => 'javelin-stratcom',
 | 
			
		||||
    ),
 | 
			
		||||
    'da12704d' =>
 | 
			
		||||
    array(
 | 
			
		||||
      0 => 'javelin-install',
 | 
			
		||||
      1 => 'javelin-util',
 | 
			
		||||
    ),
 | 
			
		||||
    'dd7e8ef5' =>
 | 
			
		||||
    array(
 | 
			
		||||
      0 => 'javelin-behavior',
 | 
			
		||||
 
 | 
			
		||||
@@ -42,6 +42,10 @@ package {
 | 
			
		||||
      this.externalInvoke('log', message);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    final protected function setStatus(status:String):void {
 | 
			
		||||
      this.externalInvoke('status', {type: status});
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -42,11 +42,8 @@ package {
 | 
			
		||||
        this.uncaughtErrorHandler);
 | 
			
		||||
 | 
			
		||||
      ExternalInterface.addCallback('connect', this.externalConnect);
 | 
			
		||||
      ExternalInterface.call(
 | 
			
		||||
        'JX.Stratcom.invoke',
 | 
			
		||||
        'aphlict-component-ready',
 | 
			
		||||
        null,
 | 
			
		||||
        {});
 | 
			
		||||
 | 
			
		||||
      this.setStatus('ready');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private function uncaughtErrorHandler(event:UncaughtErrorEvent):void {
 | 
			
		||||
@@ -58,8 +55,6 @@ package {
 | 
			
		||||
      port:Number,
 | 
			
		||||
      subscriptions:Array):void {
 | 
			
		||||
 | 
			
		||||
      this.externalInvoke('connect');
 | 
			
		||||
 | 
			
		||||
      this.remoteServer  = server;
 | 
			
		||||
      this.remotePort    = port;
 | 
			
		||||
      this.subscriptions = subscriptions;
 | 
			
		||||
 
 | 
			
		||||
@@ -25,51 +25,87 @@
 | 
			
		||||
 */
 | 
			
		||||
JX.install('Aphlict', {
 | 
			
		||||
 | 
			
		||||
  construct : function(id, server, port, subscriptions) {
 | 
			
		||||
  construct: function(id, server, port, subscriptions) {
 | 
			
		||||
    if (__DEV__) {
 | 
			
		||||
      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._port = port;
 | 
			
		||||
    this._subscriptions = subscriptions;
 | 
			
		||||
 | 
			
		||||
    // 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;
 | 
			
		||||
    JX.Aphlict._instance = this;
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  members : {
 | 
			
		||||
    _server : null,
 | 
			
		||||
    _port : null,
 | 
			
		||||
    _subscriptions : null,
 | 
			
		||||
    start : function() {
 | 
			
		||||
  members: {
 | 
			
		||||
    _id: null,
 | 
			
		||||
    _server: null,
 | 
			
		||||
    _port: null,
 | 
			
		||||
    _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._server,
 | 
			
		||||
        this._port,
 | 
			
		||||
        this._subscriptions);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  properties : {
 | 
			
		||||
    handler : null
 | 
			
		||||
  properties: {
 | 
			
		||||
    handler: null
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  statics : {
 | 
			
		||||
    _instance : null,
 | 
			
		||||
    didReceiveEvent : function(type, message) {
 | 
			
		||||
      if (!JX.Aphlict._instance) {
 | 
			
		||||
  statics: {
 | 
			
		||||
    _instance: null,
 | 
			
		||||
 | 
			
		||||
    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;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      var handler = JX.Aphlict._instance.getHandler();
 | 
			
		||||
      if (type == 'status') {
 | 
			
		||||
        switch (message.type) {
 | 
			
		||||
          case 'ready':
 | 
			
		||||
            client._didStartFlash();
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      var handler = client.getHandler();
 | 
			
		||||
      if (handler) {
 | 
			
		||||
        handler(type, message);
 | 
			
		||||
      }
 | 
			
		||||
 
 | 
			
		||||
@@ -16,18 +16,6 @@ JX.behavior('aphlict-listen', function(config) {
 | 
			
		||||
 | 
			
		||||
  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) {
 | 
			
		||||
    var message = e.getData();
 | 
			
		||||
 | 
			
		||||
@@ -61,6 +49,8 @@ JX.behavior('aphlict-listen', function(config) {
 | 
			
		||||
 | 
			
		||||
      default:
 | 
			
		||||
      case 'error':
 | 
			
		||||
      case 'log':
 | 
			
		||||
      case 'status':
 | 
			
		||||
        if (config.debug) {
 | 
			
		||||
          var details = message ? JX.JSON.stringify(message) : '';
 | 
			
		||||
          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.
 | 
			
		||||
  // If we just go crazy and start making calls to it before it loads, its
 | 
			
		||||
  // interfaces won't be registered yet.
 | 
			
		||||
  JX.Stratcom.listen('aphlict-component-ready', null, onready);
 | 
			
		||||
  client
 | 
			
		||||
    .setHandler(onaphlictmessage)
 | 
			
		||||
    .start(JX.$(config.containerID), config.swfURI);
 | 
			
		||||
 | 
			
		||||
  // 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.
										
									
								
							
		Reference in New Issue
	
	Block a user