Uploaded image for project: 'Apache Cordova'
  1. Apache Cordova
  2. CB-3785

Channel.prototype.subscribe to support EventListener interface

    Details

    • Type: Improvement
    • Status: Resolved
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 2.8.0
    • Fix Version/s: None
    • Component/s: cordova-js
    • Environment:

      All platforms

      Description

      As number of Cordova-specific events use monkey-patch for add/remove/fire listeners it would be nice if Channel functions support EventListener interface:

      I assume only a small patch to Channel module is required. Here are the modified functions to resolve the issue:

      /**
       * Subscribes the given function to the channel. Any time that
       * Channel.fire is called so too will the function.
       * Optionally specify an execution context for the function
       * and a guid that can be used to stop subscribing to the channel.
       * Returns the guid.
       */
      Channel.prototype.subscribe = function(f, c) {
      
          var func;
          if (f && "object" === typeof f) {
              // EventListener interface
              func = f["handleEvent"];
              c = f;
          } else {
              // Function interface
              func = f;
          }
      
          // need a function to call
          forceFunction(func);
          if (this.state == 2) {
              func.apply(c || this, this.fireArgs);
              return;
          }
      
          var guid = f.observer_guid;
          if (typeof c == "object") { func = utils.close(c, func); }
      
          if (!guid) {
              // first time any channel has seen this subscriber
              guid = '' + nextGuid++;
          }
          func.observer_guid = guid;
          f.observer_guid = guid;
      
          // Don't add the same handler more than once.
          if (!this.handlers[guid]) {
              this.handlers[guid] = func;
              this.numHandlers++;
              if (this.numHandlers == 1) {
                  this.onHasSubscribersChange && this.onHasSubscribersChange();
              }
          }
      };
      
      /**
       * Unsubscribes the function with the given guid from the channel.
       */
      Channel.prototype.unsubscribe = function(f) {
          var func;
          if (f && "object" === typeof f) {
              // EventListener interface
              func = f["handleEvent"];
              c = f;
          } else {
              // Function interface
              func = f;
          }
      
          // need a function to unsubscribe
          forceFunction(func);
      
          var guid = f.observer_guid,
              handler = this.handlers[guid];
          if (handler) {
              delete this.handlers[guid];
              this.numHandlers--;
              if (this.numHandlers === 0) {
                  this.onHasSubscribersChange && this.onHasSubscribersChange();
              }
          }
      };
      

        Issue Links

          Activity

          Hide
          githubbot ASF GitHub Bot added a comment -

          Github user rayshan commented on the issue:

          https://github.com/apache/cordova-js/pull/130

          Yay! No worries.

          Show
          githubbot ASF GitHub Bot added a comment - Github user rayshan commented on the issue: https://github.com/apache/cordova-js/pull/130 Yay! No worries.
          Hide
          githubbot ASF GitHub Bot added a comment -

          Github user stevengill commented on the issue:

          https://github.com/apache/cordova-js/pull/130

          Thanks @rayshan! Sorry it took so long to merge.

          Show
          githubbot ASF GitHub Bot added a comment - Github user stevengill commented on the issue: https://github.com/apache/cordova-js/pull/130 Thanks @rayshan! Sorry it took so long to merge.
          Hide
          githubbot ASF GitHub Bot added a comment -

          Github user asfgit closed the pull request at:

          https://github.com/apache/cordova-js/pull/130

          Show
          githubbot ASF GitHub Bot added a comment - Github user asfgit closed the pull request at: https://github.com/apache/cordova-js/pull/130
          Hide
          jira-bot ASF subversion and git services added a comment -

          Commit 81d8b9924b78804017fbce2ee7bd3f92560d341a in cordova-js's branch refs/heads/master from Ray Shan
          [ https://git-wip-us.apache.org/repos/asf?p=cordova-js.git;h=81d8b99 ]

          Fix CB-3785

          Enable support of EventListener interface for
          Channel.prototype.subscribe / unsubscribe

          This closes #130

          Show
          jira-bot ASF subversion and git services added a comment - Commit 81d8b9924b78804017fbce2ee7bd3f92560d341a in cordova-js's branch refs/heads/master from Ray Shan [ https://git-wip-us.apache.org/repos/asf?p=cordova-js.git;h=81d8b99 ] Fix CB-3785 Enable support of EventListener interface for Channel.prototype.subscribe / unsubscribe This closes #130
          Hide
          githubbot ASF GitHub Bot added a comment -

          Github user cdebost commented on the issue:

          https://github.com/apache/cordova-js/pull/130

          +1. Without this, frameworks that use EventListener objects as arguments to addEventListener are mostly unusable with Cordova.

          Show
          githubbot ASF GitHub Bot added a comment - Github user cdebost commented on the issue: https://github.com/apache/cordova-js/pull/130 +1. Without this, frameworks that use EventListener objects as arguments to addEventListener are mostly unusable with Cordova.
          Hide
          githubbot ASF GitHub Bot added a comment -

          Github user rayshan commented on the issue:

          https://github.com/apache/cordova-js/pull/130

          Rebased

          Show
          githubbot ASF GitHub Bot added a comment - Github user rayshan commented on the issue: https://github.com/apache/cordova-js/pull/130 Rebased
          Hide
          githubbot ASF GitHub Bot added a comment -

          Github user stevengill commented on the pull request:

          https://github.com/apache/cordova-js/pull/130#issuecomment-169514704

          Interesting. I'm reviewing

          Show
          githubbot ASF GitHub Bot added a comment - Github user stevengill commented on the pull request: https://github.com/apache/cordova-js/pull/130#issuecomment-169514704 Interesting. I'm reviewing
          Hide
          githubbot ASF GitHub Bot added a comment -

          GitHub user rayshan opened a pull request:

          https://github.com/apache/cordova-js/pull/130

          Fix CB-3785 - enable EventListener interface support

          This patch enables support for `EventListener` interface for `Channel.prototype.subscribe` / `unsubscribe`, based on the patch by @motorro in https://issues.apache.org/jira/browse/CB-3785.

          This bug prevents other frameworks that make heavy use of the EventListener interface to work with Cordova, such as [Montage](https://github.com/montagejs/montage) and its `EventManager`.

          You can merge this pull request into a Git repository by running:

          $ git pull https://github.com/rayshan/cordova-js master

          Alternatively you can review and apply these changes as the patch at:

          https://github.com/apache/cordova-js/pull/130.patch

          To close this pull request, make a commit to your master/trunk branch
          with (at least) the following in the commit message:

          This closes #130


          commit 0cca16c84e6b95e29abbe68803d54b3f12ee9316
          Author: Ray Shan <ray@shan.io>
          Date: 2015-12-19T00:32:08Z

          Fix CB-3785

          Enable support of EventListener interface for
          Channel.prototype.subscribe / unsubscribe


          Show
          githubbot ASF GitHub Bot added a comment - GitHub user rayshan opened a pull request: https://github.com/apache/cordova-js/pull/130 Fix CB-3785 - enable EventListener interface support This patch enables support for `EventListener` interface for `Channel.prototype.subscribe` / `unsubscribe`, based on the patch by @motorro in https://issues.apache.org/jira/browse/CB-3785 . This bug prevents other frameworks that make heavy use of the EventListener interface to work with Cordova, such as [Montage] ( https://github.com/montagejs/montage ) and its `EventManager`. You can merge this pull request into a Git repository by running: $ git pull https://github.com/rayshan/cordova-js master Alternatively you can review and apply these changes as the patch at: https://github.com/apache/cordova-js/pull/130.patch To close this pull request, make a commit to your master/trunk branch with (at least) the following in the commit message: This closes #130 commit 0cca16c84e6b95e29abbe68803d54b3f12ee9316 Author: Ray Shan <ray@shan.io> Date: 2015-12-19T00:32:08Z Fix CB-3785 Enable support of EventListener interface for Channel.prototype.subscribe / unsubscribe
          Hide
          thibaultzanini@gmail.com Thibault Zanini added a comment -

          Any updates about this issue?

          Show
          thibaultzanini@gmail.com Thibault Zanini added a comment - Any updates about this issue?

            People

            • Assignee:
              rayshan Ray Shan
              Reporter:
              motorro Nikolai Kotchetkov
            • Votes:
              1 Vote for this issue
              Watchers:
              5 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved:

                Time Tracking

                Estimated:
                Original Estimate - 1h
                1h
                Remaining:
                Remaining Estimate - 1h
                1h
                Logged:
                Time Spent - Not Specified
                Not Specified

                  Development