{ "id": "79410", "key": "TIMOB-5043", "fields": { "issuetype": { "id": "1", "description": "A problem which impairs or prevents the functions of the product.", "name": "Bug", "subtask": false }, "project": { "id": "10153", "key": "TIMOB", "name": "Titanium SDK/CLI", "projectCategory": { "id": "10100", "description": "Titanium and related SDKs used in application development", "name": "Client" } }, "fixVersions": [], "resolution": { "id": "7", "description": "", "name": "Invalid" }, "resolutiondate": "2011-08-18T07:06:03.000+0000", "created": "2011-08-18T06:38:53.000+0000", "priority": { "name": "Low", "id": "4" }, "labels": [], "versions": [ { "id": "11367", "description": "", "name": "Release 1.7.1", "archived": true, "released": true, "releaseDate": "2011-06-21" }, { "id": "11570", "description": "", "name": "Release 1.7.2", "archived": true, "released": true, "releaseDate": "2011-07-21" } ], "issuelinks": [ { "id": "12472", "type": { "id": "10003", "name": "Relates", "inward": "relates to", "outward": "relates to" }, "outwardIssue": { "id": "79409", "key": "TIMOB-5042", "fields": { "summary": "removeEventListener() method does not remove event listener", "status": { "description": "The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.", "name": "Closed", "id": "6", "statusCategory": { "id": 3, "key": "done", "colorName": "green", "name": "Done" } }, "priority": { "name": "Low", "id": "4" }, "issuetype": { "id": "1", "description": "A problem which impairs or prevents the functions of the product.", "name": "Bug", "subtask": false } } } } ], "assignee": { "name": "dthorp", "key": "dthorp", "displayName": "Don Thorp", "active": true, "timeZone": "America/Los_Angeles" }, "updated": "2017-03-13T17:52:41.000+0000", "status": { "description": "The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.", "name": "Closed", "id": "6", "statusCategory": { "id": 3, "key": "done", "colorName": "green", "name": "Done" } }, "components": [ { "id": "10202", "name": "Android", "description": "Android Platform" } ], "description": "Although it is not stated in the [removeEventListener|http://developer.appcelerator.com/apidoc/mobile/latest/Titanium.UI.Window.removeEventListener-method.html] documentation, the method's second argument (a callback) is mandatory. Unless there is a good reason, please make it optional.\r\n\r\nThere is also an inconsistency between Android and iOS (Android simply requires an object, whereas iOS requires an anonymous function), as demonstrated using following code:\r\n\r\n{code:lang=javascript}\r\nvar win = Ti.UI.createWindow({\r\n\tbackgroundColor: '#000',\r\n\texitOnClose:true\r\n});\r\n\r\nvar button = Ti.UI.createButton({\r\n\ttitle: 'Click to log events!',\r\n\theight:80,\r\n\twidth: 300\r\n});\r\n\r\nwin.add(button);\r\nwin.open();\r\n\r\nbutton.addEventListener('click', function(){\r\n\tTi.API.info('Button click event fired');\r\n\twin.fireEvent('testWinEvent');\r\n\tTi.App.fireEvent('testTiAppEvent');\r\n});\r\n\r\nwin.addEventListener('testWinEvent', function(){\r\n\tTi.API.info('testWinEvent event fired');\r\n});\r\nTi.App.addEventListener('testTiAppEvent', function(){\r\n\tTi.API.info('testTiAppEvent event fired');\r\n});\r\nwin.removeEventListener('testWinEvent'); // this will generate an exception\r\n// win.removeEventListener('testWinEvent', {}); // this will work on android but generate an exception on iOS\r\n// win.removeEventListener('testWinEvent', function(){}); // this will work on both platforms without generating an exception\r\nTi.App.removeEventListener('testTiAppEvent',function(){});\r\n{code}\r\n\r\nIf the second argument is omitted on Android, the following exception is generated:\r\n\r\n{code}\r\nD/KrollContext( 637): (kroll$1: app://app.js) [117,656] Running evaluated script: file:///android_asset/Resources/app.js\r\nE/KrollMethod( 637): (kroll$1: app://app.js) [168,824] Exception calling kroll method removeEventListener, invocation: null ]\r\nE/KrollMethod( 637): java.lang.IllegalArgumentException: Expected 2 arguments for removeEventListener, got 1\r\nE/KrollMethod( 637): \tat org.appcelerator.kroll.util.KrollBindingUtils.assertRequiredArgs(KrollBindingUtils.java:30)\r\nE/KrollMethod( 637): \tat org.appcelerator.kroll.KrollProxyBindingGen$4.invoke(KrollProxyBindingGen.java:242)\r\nE/KrollMethod( 637): \tat org.appcelerator.kroll.KrollMethod.call(KrollMethod.java:51)\r\nE/KrollMethod( 637): \tat org.mozilla.javascript.Interpreter.interpretLoop(Interpreter.java:1701)\r\nE/KrollMethod( 637): \tat org.mozilla.javascript.Interpreter.interpret(Interpreter.java:854)\r\nE/KrollMethod( 637): \tat org.mozilla.javascript.InterpretedFunction.call(InterpretedFunction.java:164)\r\nE/KrollMethod( 637): \tat org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:426)\r\nE/KrollMethod( 637): \tat org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3177)\r\nE/KrollMethod( 637): \tat org.mozilla.javascript.InterpretedFunction.exec(InterpretedFunction.java:175)\r\nE/KrollMethod( 637): \tat org.mozilla.javascript.Context.evaluateReader(Context.java:1142)\r\nE/KrollMethod( 637): \tat org.appcelerator.titanium.kroll.KrollContext$DefaultEvaluator.evaluateFile(KrollContext.java:105)\r\nE/KrollMethod( 637): \tat org.appcelerator.titanium.kroll.KrollContext.evaluateScript(KrollContext.java:306)\r\nE/KrollMethod( 637): \tat org.appcelerator.titanium.kroll.KrollContext.handleEvalFile(KrollContext.java:318)\r\nE/KrollMethod( 637): \tat org.appcelerator.titanium.kroll.KrollContext.handleMessage(KrollContext.java:217)\r\nE/KrollMethod( 637): \tat org.appcelerator.titanium.TiMessageQueue.handleMessage(TiMessageQueue.java:223)\r\nE/KrollMethod( 637): \tat android.os.Handler.dispatchMessage(Handler.java:95)\r\nE/KrollMethod( 637): \tat android.os.Looper.loop(Looper.java:123)\r\nE/KrollMethod( 637): \tat org.appcelerator.titanium.kroll.KrollHandlerThread.run(KrollHandlerThread.java:86)\r\nE/KrollContext( 637): (kroll$1: app://app.js) [17,841] Error evaluating source: Wrapped java.lang.IllegalArgumentException: Expected 2 arguments for removeEventListener, got 1 (file:///android_asset/Resources/app.js#1249)\r\nE/KrollContext( 637): org.mozilla.javascript.WrappedException: Wrapped java.lang.IllegalArgumentException: Expected 2 arguments for removeEventListener, got 1 (file:///android_asset/Resources/app.js#1249)\r\nE/KrollContext( 637): \tat org.mozilla.javascript.Context.throwAsScriptRuntimeEx(Context.java:1786)\r\nE/KrollContext( 637): \tat org.appcelerator.kroll.KrollMethod.call(KrollMethod.java:85)\r\nE/KrollContext( 637): \tat org.mozilla.javascript.Interpreter.interpretLoop(Interpreter.java:1701)\r\nE/KrollContext( 637): \tat script(file:///android_asset/Resources/app.js:1249)\r\nE/KrollContext( 637): \tat org.mozilla.javascript.Interpreter.interpret(Interpreter.java:854)\r\nE/KrollContext( 637): \tat org.mozilla.javascript.InterpretedFunction.call(InterpretedFunction.java:164)\r\nE/KrollContext( 637): \tat org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:426)\r\nE/KrollContext( 637): \tat org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3177)\r\nE/KrollContext( 637): \tat org.mozilla.javascript.InterpretedFunction.exec(InterpretedFunction.java:175)\r\nE/KrollContext( 637): \tat org.mozilla.javascript.Context.evaluateReader(Context.java:1142)\r\nE/KrollContext( 637): \tat org.appcelerator.titanium.kroll.KrollContext$DefaultEvaluator.evaluateFile(KrollContext.java:105)\r\nE/KrollContext( 637): \tat org.appcelerator.titanium.kroll.KrollContext.evaluateScript(KrollContext.java:306)\r\nE/KrollContext( 637): \tat org.appcelerator.titanium.kroll.KrollContext.handleEvalFile(KrollContext.java:318)\r\nE/KrollContext( 637): \tat org.appcelerator.titanium.kroll.KrollContext.handleMessage(KrollContext.java:217)\r\nE/KrollContext( 637): \tat org.appcelerator.titanium.TiMessageQueue.handleMessage(TiMessageQueue.java:223)\r\nE/KrollContext( 637): \tat android.os.Handler.dispatchMessage(Handler.java:95)\r\nE/KrollContext( 637): \tat android.os.Looper.loop(Looper.java:123)\r\nE/KrollContext( 637): \tat org.appcelerator.titanium.kroll.KrollHandlerThread.run(KrollHandlerThread.java:86)\r\nE/KrollContext( 637): Caused by: java.lang.IllegalArgumentException: Expected 2 arguments for removeEventListener, got 1\r\nE/KrollContext( 637): \tat org.appcelerator.kroll.util.KrollBindingUtils.assertRequiredArgs(KrollBindingUtils.java:30)\r\nE/KrollContext( 637): \tat org.appcelerator.kroll.KrollProxyBindingGen$4.invoke(KrollProxyBindingGen.java:242)\r\nE/KrollContext( 637): \tat org.appcelerator.kroll.KrollMethod.call(KrollMethod.java:51)\r\nE/KrollContext( 637): \t... 15 more\r\nE/TiJSError( 637): (kroll$1: app://app.js) [20,861] ----- Titanium Javascript Runtime Error -----\r\nE/TiJSError( 637): (kroll$1: app://app.js) [0,861] - In file:///android_asset/Resources/app.js:1249,0\r\nE/TiJSError( 637): (kroll$1: app://app.js) [1,862] - Message: Wrapped java.lang.IllegalArgumentException: Expected 2 arguments for removeEventListener, got 1 (file:///android_asset/Resources/app.js#1249)\r\nE/TiJSError( 637): (kroll$1: app://app.js) [1,863] - Source: null\r\nD/dalvikvm( 637): GC freed 3236 objects / 293944 bytes in 48ms\r\nI/TiRootActivity( 637): (main) [0,0] checkpoint, on root activity resume. context = org.appcelerator.titanium.TiContext@44c3b8e0\r\nW/TiAnalyticsSvc( 637): (Thread-12) [27,27] Analytics Service Started\r\nW/InputManagerService( 53): Starting input on non-focused client com.android.internal.view.IInputMethodClient$Stub$Proxy@44d65ea0 (uid=10030 pid=637)\r\nW/InputManagerService( 53): Client not active, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@44d64260\r\nI/TiAnalyticsSvc( 637): (Thread-12) [357,384] Sending 1 analytics events.\r\nI/ActivityManager( 53): Displayed activity com.testing.testing7/.Testing7Activity: 2947 ms (total 2947 ms)\r\nD/dalvikvm( 637): GC freed 7578 objects / 456336 bytes in 57ms\r\nW/TiAnalyticsSvc( 637): (Thread-12) [2161,2545] Stopping Analytics Service\r\nD/dalvikvm( 236): GC freed 43 objects / 2096 bytes in 59ms\r\nD/dalvikvm( 96): GC freed 2327 objects / 135008 bytes in 72ms\r\n{code}\r\n", "attachment": [], "flagged": false, "summary": "Make second argument of removeEventListener() optional rather than mandatory (Android and iOS)", "creator": { "name": "pdowsett", "key": "pdowsett", "displayName": "Paul Dowsett", "active": true, "timeZone": "Europe/London" }, "subtasks": [], "reporter": { "name": "pdowsett", "key": "pdowsett", "displayName": "Paul Dowsett", "active": true, "timeZone": "Europe/London" }, "environment": "* emulator\r\n* Titanium SDK\r\n** 1.7.1 (2011/06/17 00:13 293a6d...)\r\n** 1.7.2 (2011/07/21 09:36 97c3689)\r\n** 1.7.3 (2011/08/05 10:18 )\r\n** 1.8.0 (2011/05/13 11:54 88c1b4...)\r\n* Android 2.1-update1\r\n* Titanium Studio, build: 1.0.4.201108101535, jenkins-titanium-rcp-master-40 (origin/master), 10 August 2011, 15:39:05\r\n* Ubuntu", "comment": { "comments": [ { "id": "163310", "author": { "name": "pdowsett", "key": "pdowsett", "displayName": "Paul Dowsett", "active": true, "timeZone": "Europe/London" }, "body": "Closing due to reason explained in TIMOB-5042.", "updateAuthor": { "name": "pdowsett", "key": "pdowsett", "displayName": "Paul Dowsett", "active": true, "timeZone": "Europe/London" }, "created": "2011-08-18T07:06:03.000+0000", "updated": "2011-08-18T07:06:03.000+0000" }, { "id": "411427", "author": { "name": "lmorris", "key": "lmorris", "displayName": "Lee Morris", "active": false, "timeZone": "America/Los_Angeles" }, "body": "Closing ticket as invalid.", "updateAuthor": { "name": "lmorris", "key": "lmorris", "displayName": "Lee Morris", "active": false, "timeZone": "America/Los_Angeles" }, "created": "2017-03-13T17:52:41.000+0000", "updated": "2017-03-13T17:52:41.000+0000" } ], "maxResults": 2, "total": 2, "startAt": 0 } } }