I posted this in the closed bug forum : https://www.scirra.com/forum/friction-bug-contacts-can-be-updated_t124639 , but I remembered that you don't necessarily check there. So I am putting this here.
b2body.GetContactList(); isn't meant to return a list but rather a single b2ContactEdge object. you can get the next object in the list (managed by the body) by using .get_next(); However, there is a bug in ams.js that causes .get_next() to always return an object, even at the end of the list. So, you have to use a workaround; Box2d.getPointer( B2ContactEdge ) !==0;
The following code resets friction across all contacts, and worked fine with the tests I ran.
In SetFriction:
for (var contactEdge = this.body.GetContactList();
Box2D.getPointer(contactEdge) !==0;
contactEdge = contactEdge.get_next())
{
var contact = contactEdge.get_contact();
if (contact)
contact.ResetFriction();
}
Sorry for the double post if you read the other. I just wanted to make sure you got this! It took way to long to figure out and I didn't want anyone repeating the work if they didn't have to. ... and sorry for not following proper bug posting. I didn't think it was needed here, as it is a known bug.
relevant post: https://github.com/kripken/box2d.js/issues/17