bugGnash - The GNU Flash player - Bugs: bug #37223, JavaScript call didn't reach the...

 
 

bug #37223: JavaScript call didn't reach the ExternalInterface callback

Submitted by:  Nutchanon Wetchasit <nachanon>
Submitted on:  Thu Aug 30 09:09:26 2012  
Votes:  25  
 
Category: pluginSeverity: 3 - Normal
Release: 0.8.10Status: Ready For Test
Privacy: PublicAssigned to: Sandro Santilli <strk>
Open/Closed: Open

Add a New Comment (Rich MarkupRich Markup):
   

You are not logged in

Please log in, so followups can be emailed to you.

 

(Jump to the original submission Jump to the original submission)

Mon Mar 7 12:31:50 2016, comment #26:

The issue of `thisObject=null` and `thisObject=undefined` in Gnash's `Function.call()` is now reported separately as bug #47354.

Nutchanon Wetchasit <nachanon>
Mon Mar 7 06:21:28 2016, comment #25:

Patch included for fixing `instance=null` and `instance=undefined` case.
See patch #8933.

This is text output from `js2flash-nothis-v2.html` on browser with patched Gnash:

You'd see that all tests are now showing PASSED result.

Note: The `Function.call()` issue mentioned in the patch entry will be
reported separately after additional testing are done.

Gnash: 0.8.11dev (patched against git 9229f6f 3-Mar-2016) NPAPI
Browser: Iceweasel 10.0.12 (debian)
System: Debian GNU/Linux 7.0 Wheezy i386

Nutchanon Wetchasit <nachanon>
Mon Mar 7 06:00:49 2016, comment #24:

I have made a revised version of `js2flash-nothis.zip` test, which include
additional checks on relationship between `this` object inside callback
without context and the `_global` object, by trying to set some property
to `this` inside the callback, and check for them in `_global` outside
the callback.

The test is attached as `js2flash-nothis-v2.zip`.

Gnash: 0.8.11dev (git 9229f6f 3-Mar-2016) NPAPI
Flash Player: 11.2 r202 (11.2.202.491) NPAPI binary
Browser: Iceweasel 10.0.12 (debian)
System: Debian GNU/Linux 7.0 Wheezy i386

(file #36563)

Nutchanon Wetchasit <nachanon>
Sat Mar 5 17:16:31 2016, comment #23:

From more testing and a hint from Gnash's `Function.call()` implementation,
I found that the correct `this` object inside ExternalInterface
callback registered with `undefined` or `null` instance is, in fact,
ActionScript's `_global` object.

I have made a semi-automated test SWF/HTML for verifying this aspect of
ExternalInterface, attached as `js2flash-nothis.zip`.

This is text output from `js2flash-nothis.html` on browser with Flash Player:

You'd see that all checks were passed.

This is text output from `js2flash-nothis.html` on browser with Gnash:

You'd see that checks were failed in the same way as current XFAILs in
extcomm test of Gnash testsuite.

Gnash: 0.8.11dev (git 9229f6f 3-Mar-2016) NPAPI
Flash Player: 11.2 r202 (11.2.202.491) NPAPI binary
Browser: Iceweasel 10.0.12 (debian)
System: Debian GNU/Linux 7.0 Wheezy i386

(file #36557)

Nutchanon Wetchasit <nachanon>
Sat Dec 26 14:48:19 2015, comment #22:

Ideally there would be a single test composed by one (or more) SWF files and one (or more) HTML files so that anyone could point a web browser to the test entry point and intuitively see what's failing what's succeeding and what's running (test summary); then a test runner would somehow simulate the html interaction in an automated way (webkit-based, for example).

Failing to do that, an easier solution could be for the test runner to generate an HTML file that would replicate what the test runner does and contain instructions for the tester as for what's expected and what's obtained.

Note that all the tests under testsuite/actionscript.all are similar in this regard (self-contained tests) but were simpler to implement because do not require bidirectional host communication.

Sandro Santilli <strk>
Project MemberIn charge of this item.
Sat Dec 26 12:53:14 2015, comment #21:

The rest of automated tests mentioned in comment comment 7 are now included.
See patch #8840.

For `instance=null` and `instance=undefined` issue, I'm going to revisit
these cases and look for a way to emulate `function.call()` in this aspect,
so it would give a correct output.

Anyway, should a semi-automated HTML-based test runner (like
`js2flash-testrunner.html` in file #35071) be included too?
(In case of testing against proprietary Flash Player)

Gnash: 0.8.11dev (patched against git 4c03566 19-Dec-2015)
Adobe Flash Player: 11.2 r202 (11.2.202.491) NPAPI binary
Browser: Iceweasel 10.0.12 (debian)
System: Debian GNU/Linux 7.0 Wheezy i386

Nutchanon Wetchasit <nachanon>
Tue Oct 13 09:46:45 2015, comment #20:

An integrated version of `js2flash-auto` test is now included,
see patch #8770.

Gnash: 0.8.11dev (patched against git f0f66ce 23-Sep-2015)
System: Debian GNU/Linux 7.0 Wheezy i386

Nutchanon Wetchasit <nachanon>
Tue Oct 6 16:26:34 2015, comment #19:

It could be integrated under testsuite/misc-mtasc.all, can you try that ? Maybe renaming the dir to js2flash

Sandro Santilli <strk>
Project MemberIn charge of this item.
Mon Oct 5 09:16:06 2015, comment #18:

For a version of `js2flash-auto.tar.gz` that include an optional
HTML container/manual test runner, see the attached `js2flash-auto-v2.tar.gz`.

Gnash: Gnash 0.8.11dev (patched against git f0f66ce 23-Sep-2015) NPAPI
Browser: Iceweasel 10.0.12 (debian)
System: Debian GNU/Linux 7.0 Wheezy i386

(file #35071)

Nutchanon Wetchasit <nachanon>
Mon Oct 5 07:06:02 2015, comment #17:

I have made an example automated (but non-integrated) version of
`js2flash-rootcb.html` test, using host container emulation approach with
bourne shell script and named pipes. See the attached `js2flash-auto.tar.gz`.

It currently gives a `PASSED` result despite being a line-based tester
which depends on bug #46115 (container message line delimiting issue)
being fixed; due to the fact that there's only one return value check
done at the last message from player, combined with tester's built-in
timeout provision.

But this wouldn't hold if there are multiple return value tests done
in the script.

Gnash: Gnash 0.8.11dev (git f0f66ce 23-Sep-2015)
System: Debian GNU/Linux 7.0 Wheezy i386

(file #35064)

Nutchanon Wetchasit <nachanon>
Sat Oct 3 17:21:32 2015, comment #16:

For an issue on how Gnash delimit messages sent to host controller,
which affects how automated container-emulation tests could be written,
see bug #46115.

Nutchanon Wetchasit <nachanon>
Mon Sep 28 03:13:18 2015, comment #15:

For the libgnashplugin's crash in Object/Array return type mentioned
on comment 4, I suspect that it was caused by bug #32411 (plugin's nested XML parsing issue).

Nutchanon Wetchasit <nachanon>
Wed Aug 19 10:51:22 2015, comment #14:

if js2flash.swf is enough for testing all it takes, it may be a good idea to implement the test runner using MovieTester, see how it is done with testsuite/movies.all/tic_tac2-TestRunner.cpp as an example, or any of the testsuite/misc-ming.all/*Runner.cpp files.

It might take some enhancement to make working with filedescriptors easier.

Sandro Santilli <strk>
Project MemberIn charge of this item.
Wed Aug 19 10:46:28 2015, comment #13:

@strk
I didn't see your previous post, sorry.

I'll try to work on automated test case from now on.
Thanks.

Nutchanon Wetchasit <nachanon>
Wed Aug 19 10:37:17 2015, comment #12:

After several experiments, I think GC provision provided in previous
patches might not enough to prevent Function/Object registered via
`ExternalInterface.addCallback()` from being garbage-collected in a long run.
(The code would only prevent it in first GC iteration, if at all)

See patch #8720 for possible fix.

After applying the fix, running Gnash like

will not result in crash, and js2flash.html now works on browser
without crashing too.

Gnash: 0.8.11dev (patched against git c5b657f 17-Aug-2015) NPAPI
Browser: Iceweasel 10.0.12 (debian)
System: Debian GNU/Linux 7.0 Wheezy i386

Nutchanon Wetchasit <nachanon>
Wed Aug 19 10:32:44 2015, comment #11:

Third patch in as 88f86a3 -- looking forward for automated tests

Sandro Santilli <strk>
Project MemberIn charge of this item.
Wed Aug 19 09:24:48 2015, comment #10:

Running original js2flash test case (not js2flash-rootcb) on current Gnash git
(using either fake host container configuration, or running `js2flash.html`
via browser) would now cause it to crash:

I suspect that GC-related part of previous patches is the culprit.

Gnash: 0.8.11dev (git c5b657f 17-Aug-2015) NPAPI
Browser: Iceweasel 10.0.12 (debian)
System: Debian GNU/Linux 7.0 Wheezy i386

Nutchanon Wetchasit <nachanon>
Sun Aug 16 08:57:23 2015, comment #9:

second patch also committed as 25395ad8ac5fa389d7cf18bbdf61daa7caa0c578

Keeping this open in "Ready for test" mode for adding tests and running some manual tests too..

Sandro Santilli <strk>
Project MemberIn charge of this item.
Sun Aug 16 07:45:48 2015, comment #8:

shell or perl script seems to be the way to go. We already have a perl script for testing XMLSocket. The list of tests seems good to me!

NOTE: your first patch was pushed as commit:554c4638cc3a11dda8f54ba638de7a0445d345ad

Sandro Santilli <strk>
Project MemberIn charge of this item.
Sun Aug 16 05:02:37 2015, comment #7:

As for testing, the thing is, what is a proper way to test ExternalInterface?
ActionScript-only test cases (like ones I saw in `testsuite/misc-mtasc.all`)
won't cut it, since this involves browser-Gnash interaction.

An alternative would be writing some (shell or Perl) script that fakes
Gnash's host container (run gnash with`--fd` option), and verify result
from both side. I haven't looked closely on this method yet.
Any suggestion?

By the way, these are list of simple tests I planned to write:

  • Registered callback invocation test: ExternalInterface callback (pass) V.S. _root callback (fail), aka. an automated version of js2flash-rootcb test.
  • Registration test with `method=null` and `method=undefined`: callback registration must fail to pass.
  • Registration test with `instance=null`: callback registration should succeed to pass.
  • Test on `this` inside callback when `instance!=null`: user-specified Object (pass) V.S. registering code's `this` (fail) V.S. Function's class (fail) V.S. _root (fail).
  • Test on `this` inside callback when `instance=null`: must be an empty value (`null` or `undefined`) and instance variable reference must give `undefined` to pass.
  • Test on `this` inside callback when `instance=null`: must give `undefined` to pass. (This one is expected to fail)
  • Long callback arguments test ("The","quick","brown","fox","jumps","over","the","lazy","dog"): must be passed correctly to pass.
Nutchanon Wetchasit <nachanon>
Sun Aug 16 03:20:00 2015, comment #6:

Patch included (2 of 2), see patch #8715 comment 5.

The patch fixes following issue:

  • Actual value of `instance` argument was ignored; Gnash used `_root` instead.

Note:
In special case where user specified `instance=null` or `instance=undefined`,
under Flash Player, it make `this` reference return `undefined` inside
the callback. Under Gnash, there is a limitation which caused `this`
reference to return `null` inside the callback in these cases instead.

Gnash: 0.8.11dev (patched against git 6b269f9 24-May-2015) NPAPI
Browser: Iceweasel 10.0.12 (debian)
System: Debian GNU/Linux 7.0 Wheezy i386

Nutchanon Wetchasit <nachanon>
Thu Aug 13 16:30:55 2015, comment #5:

Patch included (1 of 2), see patch #8715.

The patch fixes following issues:

  • `method` argument was ignored; Gnash called `_root.methodName` instead.
  • Registration failed silently if `instance` argument is `null` or `undefined`.
  • Gnash only passed maximum 3 arguments to the callback; specifiying more than 3 would have same result as passing 0 argument.

Note: js2flash-rootcb.html should give a correct result after applying this patch.

Gnash: 0.8.11dev (patched against git 6b269f9 24-May-2015) NPAPI
Browser: Iceweasel 10.0.12 (debian)
System: Debian GNU/Linux 7.0 Wheezy i386

Nutchanon Wetchasit <nachanon>
Mon Aug 10 10:11:05 2015, comment #4:

These are list of problems found in Gnash's ExternalInterface implementation
(JavaScript -> Flash direction) as far as I have tested.

Problems with callback registration, `ExternalInterface.addCallback(methodName,instance,method)`:

  • `method` argument is ignored; Gnash calls `_root.methodName` instead. (The original submission)
  • Registration failed silently if `instance` argument is `null` or `undefined`. (It shouldn't fail)
  • Actual value of `instance` argument is ignored; Gnash uses `_root` instead.

Problems with the underlying callback mechanism:

  • Gnash only pass maximum 3 arguments to the callback; specifiying more than 3 will have same result as passing 0 argument.
  • When the callback is called and returned no value or returned `undefined`, Gnash returns `null` to JavaScript instead.
  • Gnash passes Array and Object argument (including associative array) to the callback as `undefined`.
  • Gnash passes callback return value of type Array or Object back to JavaScript as a weird inaccessible "NPObject JS wrapper" object, and caused the plugin to crash.

Gnash: 0.8.11dev (git 6b269f9 24-May-2015) NPAPI
Adobe Flash Player: 11.2 r202 (11.2.202.491) NPAPI binary
Browser: Iceweasel 10.0.12 (debian)
System: Debian GNU/Linux 7.0 Wheezy i386

Nutchanon Wetchasit <nachanon>
Tue Aug 4 11:35:01 2015, comment #3:

This is an excellent bug report, I really hope to find the time to deal with it, but being extremely busy it would help if you could turn your test into a self-contained one (see other tests under testsuite/misc-mtasc.all) and ideally provide a patch to fix the code (doesn't sound too hard now that you found the culprit)

Sandro Santilli <strk>
Project MemberIn charge of this item.
Tue Aug 4 11:08:16 2015, comment #2:

This issue is still reproducible under current git version of Gnash.

The root cause of this issue seems to be that Gnash uses the first argument in
`ExternalInterface.addCallback(methodName,instance,method)` to make the browser
aware of the registered callback, *but not using it to look up for a real
ActionScript function to call*.

Instead, Gnash tries to call `_root.methodName`, which is incorrect.

I've created HTML file and test flash file (using MTASC) to demonstrate the
root cause, by using two anonymous function, one registered as
ExternalInterface call named `script_call`, another one assigned to a variable
`_root.script_call`.

When running `js2flash-rootcb.html` on browser with Adobe Flash Player:
After 3 sec, you'd see that ExternalInterface-registered callback is called correctly.

When running `js2flash-rootcb.html` on browser with Gnash current 0.8.11dev git:
After 3 sec, you'd see that callback in _root is called instead of ExternalInterface-registered one.

Test Flash/HTML file, source code, build scripts and full debug logs with
screenshots of both cases are attached (js2flash-rootcb.zip).

Gnash: 0.8.11dev (git 6b269f9 24-May-2015) NPAPI
Adobe Flash Player: 11.2 r202 (11.2.202.491) NPAPI binary
Browser: Iceweasel 10.0.12 (debian)
System: Debian GNU/Linux 7.0 Wheezy i386

(file #34574)

Nutchanon Wetchasit <nachanon>
Tue Mar 19 10:45:16 2013, comment #1:

This problem still persists on current 0.8.11-git build
with exactly same trace message.

Gnash: Gnash 0.8.11dev master-21707-b482bd6 with 80989fcd, dfba5258 and 4b3dae97 reverted.
Browser: iceweasel 3.0.6-3 from Debian main repository (no addons)
System: Debian GNU/Linux 5.0 Lenny on i386

Nutchanon Wetchasit <nachanon>
Thu Aug 30 09:09:26 2012, original submission:

This is a spin-off from bug #37008 (SoundCloud issue).

I've tried to call my test flash's method from JavaScript land,
using Flash 8-style ExternalInterface callback that's expected
to recieve the parameters "Hello" and "World" from JavaScript land,
and return "Too" back to the JavaScript land.

The ActionScript callback method was coded like this

The callback was invoked correctly under Adobe Flash Player (with proper security settings),
but doesn't under Gnash.

This is a trace output from Adobe Flash Player 11:

callee: load
callee: finished loading
status: load
status: finished loading
status: load
status: finished loading
callee: first run
callee: external initializing
callee: adding callback
callee: finished first run
callee: callback entered
callee: callback succeeded, expected (Hello,World) got (Hello,World)
callee: callback finished

You may see that the ActionScript callback function was invoked.

This is a trace output result from Gnash:

2929:1] 292 TRACE: callee: load
2929:1] 292 TRACE: callee: finished loading
2929:1] 292 TRACE: callee: first run
2929:1] 292 TRACE: callee: external initializing
2929:1] 293 TRACE: callee: adding callback
2929:1] 294 TRACE: callee: finished first run
2929:1] 384 TRACE: status: load
2929:1] 384 TRACE: status: finished loading
2929:1] 384 TRACE: status: load
2929:1] 384 TRACE: status: finished loading

You may see that the ActionScript callback was not invoked.
From JavaScript perspective, the call returns null.

Note that a group of lines like this appeared in the log every time that I tried to call this ExternalInterface callback
(The "121 bytes" part of the log was consistent; it's always 121)

2929:1] 2796 DEBUG: There are 121 bytes in the network buffer
2929:1] 2796 DEBUG: bool gnash::movie_root::processInvoke(gnash::ExternalInterface::invoke_t*) enter
2929:1] 2796 DEBUG: Processing script_call call from the Browser.
2929:1] 2796 DEBUG: bool gnash::movie_root::processInvoke(gnash::ExternalInterface::invoke_t*) returning

Full Gnash debug log (verbosity = 2), also attached here.
http://www.mediafire.com/?db433qgumndy3dy

This is my test flash file and source, accompanied with HTML page,
created from Adobe Flash CS3 with Flash 8 target, also attached here.
http://www.mediafire.com/?3c9737f29embsis

Gnash: gnash 0.8.10-1~lenny, browser-plugin-gnash 0.8.10-1~lenny (both from getgnash.org APT repository)
Browser: iceweasel 3.0.6-3 from Debian main repository (no addons)
System: Debian GNU/Linux 5.0 Lenny on i386

Nutchanon Wetchasit <nachanon>

 

(Note: upload size limit is set to 16384 kB, after insertion of the required escape characters.)

Attach File(s):
   
   
Comment:
   

Attached Files
file #36563:  js2flash-nothis-v2.zip added by nachanon (30kB - application/zip - Test Flash/HTML file on `undefined`/`null` instance case (with property-based checks), debug logs and screenshots)
file #36557:  js2flash-nothis.zip added by nachanon (25kB - application/zip - Test Flash/HTML file on `undefined`/`null` instance case, with debug logs and screenshots)
file #35071:  js2flash-auto-v2.tar.gz added by nachanon (16kB - application/x-gzip - Example automated version of `js2flash-rootcb.html`, with HTML container)
file #35064:  js2flash-auto.tar.gz added by nachanon (15kB - application/x-gzip - Example automated version of `js2flash-rootcb.html`)
file #34574:  js2flash-rootcb.zip added by nachanon (7kB - application/zip - Test Flash/HTML file on _root callback case, with debug logs and screenshots)
file #26447:  js2flash.zip added by nachanon (3kB - application/zip - Test flash file, source code and Gnash debug log)
file #26448:  iceweasel3.0-gnash0.8.10-js2flash.log.txt added by nachanon (4kB - text/plain - Test flash file, source code and Gnash debug log)

 

Depends on the following items: None found

Items that depend on this one: None found

 

Carbon-Copy List
  • -unavailable- added by strk (Posted a comment)
  • -unavailable- added by nachanon (Voted in favor of this item)
  • -unavailable- added by nachanon (Submitted the item)
  •  

    Do you think this task is very important?
    If so, you can click here to add your encouragement to it.
    This task has 25 encouragements so far.

    Only logged-in users can vote.

     

    Please enter the title of George Orwell's famous dystopian book (it's a date):

     

     

    Follow 11 latest changes.

    Date Changed By Updated Field Previous Value => Replaced By
    Mon Mar 7 06:00:49 2016nachanonAttached File-=>Added js2flash-nothis-v2.zip, #36563
    Sat Mar 5 17:16:31 2016nachanonAttached File-=>Added js2flash-nothis.zip, #36557
    Mon Oct 5 09:16:06 2015nachanonAttached File-=>Added js2flash-auto-v2.tar.gz, #35071
    Mon Oct 5 07:06:02 2015nachanonAttached File-=>Added js2flash-auto.tar.gz, #35064
    Sun Aug 16 08:57:23 2015strkStatusIn Progress=>Ready For Test
    Sun Aug 16 07:45:48 2015strkAssigned toNone=>strk
    Sun Aug 16 07:45:47 2015strkStatusNone=>In Progress
    Tue Aug 4 11:08:16 2015nachanonAttached File-=>Added js2flash-rootcb.zip, #34574
    Mon Mar 11 07:24:47 2013nachanonCarbon-Copy-=>Added nachanon
    Thu Aug 30 09:09:26 2012nachanonAttached File-=>Added js2flash.zip, #26447
      Attached File-=>Added iceweasel3.0-gnash0.8.10-js2flash.log.txt, #26448

    Back to the top


    Powered by Savane 3.1-cleanup