CSC/ECE 517 Spring 2017/M1702 Implement the Mutation Observer API: Difference between revisions

From Expertiza_Wiki
Jump to navigation Jump to search
No edit summary
Line 12: Line 12:
=='''Tracking issue'''==
=='''Tracking issue'''==
The Original Tracking Issue for the project can be found at the [https://github.com/servo/servo/issues/6633 Tracking Issue] page of the [https://github.com/servo/servo/wiki/Mutation-observer-project Mutation Observer Project].
The Original Tracking Issue for the project can be found at the [https://github.com/servo/servo/issues/6633 Tracking Issue] page of the [https://github.com/servo/servo/wiki/Mutation-observer-project Mutation Observer Project].
=='''Building the Project'''==
Follow the Guidelines mentioned in the [https://github.com/srivassumit/servo/wiki/Readme Read me] file of the project Wiki Page for building the Project in a Linux Environment.


=='''Project Description'''==
=='''Project Description'''==
*'''Initial steps for Stub method Implementation''':
*'''Initial steps for Stub method Implementation''':
**Create the [https://dom.spec.whatwg.org/#mutationobserver MutationObserver] and [https://dom.spec.whatwg.org/#mutationrecord MutationRecord] interfaces with stub method implementations following the guidelines given here: [http://doc.servo.org/script/dom/index.html#adding-a-new-dom-interface Adding a new DOM Interface]
**Created the [https://dom.spec.whatwg.org/#mutationobserver MutationObserver] and [https://dom.spec.whatwg.org/#mutationrecord MutationRecord] interfaces with stub method implementations following the guidelines given here: [http://doc.servo.org/script/dom/index.html#adding-a-new-dom-interface Adding a new DOM Interface]
     '''MutationObserver IDL'''
     '''MutationObserver IDL'''
     [Constructor(MutationCallback callback)]
     [Constructor(MutationCallback callback)]
Line 51: Line 53:
     };
     };


*Hide the new interfaces by default by adding a <code>[Pref="dom.mutation_observer.enabled"]</code> attribute to each one and add a corresponding preference to <code>resources/prefs.json</code>.
*We hid the new interfaces by default by adding a <code>[Pref="dom.mutation_observer.enabled"]</code> attribute to both <code>mutationobserver.rs</code> and <code>mutationrecord.rs</code> and added a corresponding preference to <code>resources/prefs.json</code> file.


*Add a vector of <code>MutationObserver</code> objects as a member of [https://github.com/servo/servo/blob/3c8daca772aacf59bffdff32b017f8029437a85e/components/script/script_thread.rs#L397 ScriptThread].
*Added a vector of <code>MutationObserver</code> objects as a member of the [https://github.com/servo/servo/blob/3c8daca772aacf59bffdff32b017f8029437a85e/components/script/script_thread.rs#L397 ScriptThread] as mentioed in the requirements.
*Implement the <code>MutationObserver</code> constructor, by following the steps given in the [https://dom.spec.whatwg.org/#dom-mutationobserver-mutationobserver DOM Specifications].
*Implemented the <code>MutationObserver</code> constructor, by following the steps given in the [https://dom.spec.whatwg.org/#dom-mutationobserver-mutationobserver DOM Specifications].




=='''Testing'''==
=='''Testing'''==
*add a <code>__dir__.ini </code> file to <code>tests/wpt/metadata/dom/nodes/</code> which enables the new preference by including <code>"prefs: ["dom.mutation_observer.enabled:true"]"</code>.
*Added a <code>__dir__.ini </code> file to <code>tests/wpt/metadata/dom/nodes/</code> for enabling the new preference by including <code>"prefs: ["dom.mutation_observer.enabled:true"]"</code>.
*Tests are present in web-platform-tests directory (i.e <code>.tests/wpt/web-platform-tests/dom/nodes</code>).
*Tests are present in web-platform-tests directory (i.e <code>.tests/wpt/web-platform-tests/dom/nodes</code>).
*Run web-platform tests from the root by using the following command  
*The web-platform tests can be run by giving the following command at the root directory of the project:
     ./mach test-wpt tests/wpt/web-platform-tests/dom/nodes.
     ./mach test-wpt tests/wpt/web-platform-tests/dom/nodes.
*Update corresponding tests expectations as per the given [https://github.com/servo/servo/blob/master/tests/wpt/README.md#updating-test-expectations guidelines] in <code>tests/wpt/metadata/dom/nodes/</code> directory.
*We have Updated the corresponding test expectations as per the given [https://github.com/servo/servo/blob/master/tests/wpt/README.md#updating-test-expectations guidelines] in the <code>tests/wpt/metadata/dom/nodes/</code> directory.




=='''Design Patterns'''==
=='''Design Patterns'''==
TODO
Our Project follows the [https://en.wikipedia.org/wiki/Observer_pattern Observer Pattern], where a list of the objects dependent on the current object is maintained and the dependents are notified of any state changes. The Mutation Observer helps in achieving this functionality.


=='''Conclusion'''==
=='''Conclusion'''==
After making our changes, we can create the Mutation Observer Object using the Constructor.
After making the above mentioned changes, we can create the Mutation Observer Object using the Constructor which we have implemented.





Revision as of 20:31, 23 March 2017

Mutation Observer API Project with SERVO & RUST

Servo is a prototype web browser engine written in the RUST language. The DOM standard defines a MutationObserver API that allows web content to receive callbacks when the page contents are mutated. The goal of this project is to implement the fundamental pieces required to support the Mutation Observer API.

Introduction

Servo

Servo is an open source prototype web browser layout engine being developed by Mozilla, and it is written in Rust language. The main idea is to create a highly parallel environment, in which different components can be handled by fine grained, isolated tasks. The different components can be rendering, HTML parsing, etc.

Rust

Rust is an open source systems programming language developed by Mozilla. Servo is written in Rust. The main purpose behind it's design is to be thread safe and concurrent. The emphasis is also on speed, safety and control of memory layout.

Tracking issue

The Original Tracking Issue for the project can be found at the Tracking Issue page of the Mutation Observer Project.

Building the Project

Follow the Guidelines mentioned in the Read me file of the project Wiki Page for building the Project in a Linux Environment.

Project Description

   MutationObserver IDL
   [Constructor(MutationCallback callback)]
   interface MutationObserver {
     void observe(Node target, optional MutationObserverInit options);
     void disconnect();
     sequence<MutationRecord> takeRecords();
   };
   
   callback MutationCallback  = void (sequence<MutationRecord> mutations, MutationObserver observer);
   
   dictionary MutationObserverInit {
     boolean childList = false;
     boolean attributes;
     boolean characterData;
     boolean subtree = false;
     boolean attributeOldValue;
     boolean characterDataOldValue;
     sequence<DOMString> attributeFilter;
   };
   MutationRecord IDL
   [Exposed=Window]
   interface MutationRecord {
     readonly attribute DOMString type;
     [SameObject] readonly attribute Node target;
     [SameObject] readonly attribute NodeList addedNodes;
     [SameObject] readonly attribute NodeList removedNodes;
     readonly attribute Node? previousSibling;
     readonly attribute Node? nextSibling;
     readonly attribute DOMString? attributeName;
     readonly attribute DOMString? attributeNamespace;
     readonly attribute DOMString? oldValue;
   };
  • We hid the new interfaces by default by adding a [Pref="dom.mutation_observer.enabled"] attribute to both mutationobserver.rs and mutationrecord.rs and added a corresponding preference to resources/prefs.json file.
  • Added a vector of MutationObserver objects as a member of the ScriptThread as mentioed in the requirements.
  • Implemented the MutationObserver constructor, by following the steps given in the DOM Specifications.


Testing

  • Added a __dir__.ini file to tests/wpt/metadata/dom/nodes/ for enabling the new preference by including "prefs: ["dom.mutation_observer.enabled:true"]".
  • Tests are present in web-platform-tests directory (i.e .tests/wpt/web-platform-tests/dom/nodes).
  • The web-platform tests can be run by giving the following command at the root directory of the project:
   ./mach test-wpt tests/wpt/web-platform-tests/dom/nodes.
  • We have Updated the corresponding test expectations as per the given guidelines in the tests/wpt/metadata/dom/nodes/ directory.


Design Patterns

Our Project follows the Observer Pattern, where a list of the objects dependent on the current object is maintained and the dependents are notified of any state changes. The Mutation Observer helps in achieving this functionality.

Conclusion

After making the above mentioned changes, we can create the Mutation Observer Object using the Constructor which we have implemented.


Subsequent Steps

After completing the above initial steps, we plan on performing the following tasks:

Commit Frequency

As per the guidelines of the Mozilla project, all the changes will be submitted in a single commit.

References

1. https://doc.rust-lang.org/stable/book/
2. https://en.wikipedia.org/wiki/Rust_(programming_language)
3. https://en.wikipedia.org/wiki/Servo_(layout_engine)
4. https://github.com/servo/servo
5. https://github.com/servo/servo/wiki/Mutation-observer-project
6. https://dom.spec.whatwg.org/