Test WebKitMutationObserver.observe on attributes On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". Testing basic aspects of attribute observation. ...can attribute changes be observed at all PASS mutations.length is 2 PASS mutations[0].type is "attributes" PASS mutations[0].attributeName is "foo" PASS mutations[0].attributeNamespace is null PASS mutations[1].type is "attributes" PASS mutations[1].attributeName is "bar" PASS mutations[1].attributeNamespace is null ...observer.disconnect() should prevent further delivery of mutations. PASS mutations is null ...re-observing after disconnect works with the same observer. PASS mutations.length is 2 PASS mutations[0].type is "attributes" PASS mutations[0].attributeName is "foo" PASS mutations[0].attributeNamespace is null PASS mutations[1].type is "attributes" PASS mutations[1].attributeName is "bar" PASS mutations[1].attributeNamespace is null Testing that observing without specifying "attributes" does not result in hearing about attribute changes. PASS mutations is null Testing that re-observing the same node with the same observer has the effect of resetting the options. PASS calls is 1 PASS mutations.length is 1 PASS mutations[0].type is "attributes" PASS mutations[0].attributeName is "foo" PASS mutations is null Testing that multiple observers can be registered to a given node and both receive mutations. PASS mutations.length is 1 PASS mutations[0].type is "attributes" PASS mutations[0].attributeName is "foo" PASS mutations2.length is 1 PASS mutations2[0].type is "attributes" PASS mutations2[0].attributeName is "foo" Testing that "attributeNamespace" value is delivered properly. PASS mutations.length is 1 PASS mutations[0].type is "attributes" PASS mutations[0].attributeName is "foo" PASS mutations[0].attributeNamespace is "http://www.foo.com/bar" Testing that modifications to node properties which delegate to attribute storage deliver mutations. PASS mutations.length is 2 PASS mutations[0].type is "attributes" PASS mutations[0].attributeName is "src" PASS mutations[1].type is "attributes" PASS mutations[1].attributeName is "href" Testing mutation records are enqueued for attributes before DOMSubtreeModified is dispatched. PASS mutations.length is 2 PASS mutations[0].type is "attributes" PASS mutations[0].attributeName is "foo" PASS mutations[1].type is "attributes" PASS mutations[1].attributeName is "baz" Testing basic oldValue delivery. PASS mutations.length is 3 PASS mutations[0].type is "attributes" PASS mutations[0].attributeName is "foo" PASS mutations[0].oldValue is null PASS mutations[1].type is "attributes" PASS mutations[1].attributeName is "foo" PASS mutations[1].oldValue is "bar" PASS mutations[2].type is "attributes" PASS mutations[2].attributeName is "bar" PASS mutations[2].oldValue is "boo" Testing that oldValue is delivered as requested (or not). PASS mutationsWithOldValue.length is 1 PASS mutationsWithOldValue[0].type is "attributes" PASS mutationsWithOldValue[0].attributeName is "foo" PASS mutationsWithOldValue[0].oldValue is "bar" PASS mutations.length is 1 PASS mutations[0].type is "attributes" PASS mutations[0].attributeName is "foo" PASS mutations[0].oldValue is null An observer with multiple observations will get attributeOldValue if any entries request it. PASS mutations.length is 1 PASS mutations[0].type is "attributes" PASS mutations[0].attributeName is "foo" PASS mutations[0].oldValue is "bar" Testing setting an attribute via reflected IDL attribute. PASS mutations.length is 3 PASS mutations[0].type is "attributes" PASS mutations[0].attributeName is "id" PASS mutations[0].oldValue is null PASS mutations[1].type is "attributes" PASS mutations[1].attributeName is "id" PASS mutations[1].oldValue is "foo" PASS mutations[2].type is "attributes" PASS mutations[2].attributeName is "id" PASS mutations[2].oldValue is "bar" Testing that attributeFilter works as expected and observes case with HTML elements. ...only foo and bar should be received. PASS mutations.length is 2 PASS mutations[0].type is "attributes" PASS mutations[0].attributeName is "foo" PASS mutations[0].attributeNamespace is null PASS mutations[1].type is "attributes" PASS mutations[1].attributeName is "bar" PASS mutations[1].attributeNamespace is null Testing the behavior of attributeFilter when the same observer observes at multiple nodes in a subtree with different filter options. ...only foo, bar & bat should be received. PASS mutations.length is 3 PASS mutations[0].type is "attributes" PASS mutations[0].attributeName is "foo" PASS mutations[0].attributeNamespace is null PASS mutations[1].type is "attributes" PASS mutations[1].attributeName is "bar" PASS mutations[1].attributeNamespace is null PASS mutations[2].type is "attributes" PASS mutations[2].attributeName is "bat" PASS mutations[2].attributeNamespace is null ...bar, bat & baz should all be received. PASS mutations.length is 3 PASS mutations[0].type is "attributes" PASS mutations[0].attributeName is "bar" PASS mutations[0].attributeNamespace is null PASS mutations[1].type is "attributes" PASS mutations[1].attributeName is "bat" PASS mutations[1].attributeNamespace is null PASS mutations[2].type is "attributes" PASS mutations[2].attributeName is "baz" PASS mutations[2].attributeNamespace is null Testing that setting an attributeFilter filters out namespaced attributes. ...pathLength should not be received. PASS mutations is null Testing that attributeFilter respects case with non-HTML elements. ...only ID, id, booM should be received. PASS mutations.length is 3 PASS mutations[0].type is "attributes" PASS mutations[0].attributeName is "ID" PASS mutations[0].attributeNamespace is null PASS mutations[1].type is "attributes" PASS mutations[1].attributeName is "id" PASS mutations[1].attributeNamespace is null PASS mutations[2].type is "attributes" PASS mutations[2].attributeName is "booM" PASS mutations[2].attributeNamespace is null Testing that modifying an elements style property dispatches Mutation Records. PASS mutations.length is 3 PASS mutations[0].type is "attributes" PASS mutations[0].attributeName is "style" PASS mutations[0].oldValue is null PASS mutations[1].type is "attributes" PASS mutations[1].attributeName is "style" PASS mutations[1].oldValue is null PASS mutations[2].type is "attributes" PASS mutations[2].attributeName is "style" PASS mutations[2].oldValue is null ...mutation record created. PASS mutations is null Testing that modifying an elements style property dispatches Mutation Records with correct oldValues. PASS mutations.length is 3 PASS mutations[0].type is "attributes" PASS mutations[0].attributeName is "style" PASS mutations[0].oldValue is "color: yellow; width: 100px; " PASS mutations[1].type is "attributes" PASS mutations[1].attributeName is "style" PASS mutations[1].oldValue is "color: red; width: 100px; " PASS mutations[2].type is "attributes" PASS mutations[2].attributeName is "style" PASS mutations[2].oldValue is "color: red; width: 200px; " ...mutation record created. PASS mutations is null Testing that a no-op style property mutation does not create Mutation Records. PASS mutations is null Test that mutating an attribute through an attr node delivers mutation records PASS mutations.length is 1 PASS mutations[0].target is div PASS mutations[0].type is "attributes" PASS mutations[0].attributeName is "data-test" PASS mutations[0].oldValue is "foo" Test that mutating an attribute by attaching a child to an attr node delivers mutation records PASS mutations.length is 1 PASS mutations[0].target is div PASS mutations[0].type is "attributes" PASS mutations[0].attributeName is "data-test" PASS mutations[0].oldValue is "foo" Test that mutating via setAttributeNode delivers mutation records PASS mutations.length is 3 PASS mutations[0].target is div PASS mutations[0].type is "attributes" PASS mutations[0].attributeName is "data-test" PASS mutations[0].oldValue is "foo" PASS mutations[1].target is div PASS mutations[1].type is "attributes" PASS mutations[1].attributeName is "data-other" PASS mutations[1].oldValue is null PASS mutations[2].target is div PASS mutations[2].type is "attributes" PASS mutations[2].attributeName is "id" PASS mutations[2].oldValue is "myId" Test that setAttribute on an attribute with an existing Attr delivers mutation records PASS mutations.length is 1 PASS mutations[0].target is div PASS mutations[0].type is "attributes" PASS mutations[0].attributeName is "data-test" PASS mutations[0].oldValue is "foo" Test that setNamedItem and removeNamedItem deliver mutation records PASS mutations.length is 2 PASS mutations[0].target is div PASS mutations[0].type is "attributes" PASS mutations[0].attributeName is "data-test" PASS mutations[0].oldValue is "foo" PASS mutations[1].target is div PASS mutations[1].type is "attributes" PASS mutations[1].attributeName is "data-test" PASS mutations[1].oldValue is "bar" PASS successfullyParsed is true TEST COMPLETE