Add the ability to code generated prepopulated static nested structs
[chromium-blink-merge.git] / extensions / renderer / resources / guest_view / guest_view_attributes.js
blob7bc33b81e24875e24ca0ad7ac2623fd8384381ab
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 // This module implements the base attributes of the GuestView tags.
7 // -----------------------------------------------------------------------------
8 // Attribute object.
10 // Default implementation of a GuestView attribute.
11 function Attribute(name, view) {
12   this.dirty = false;
13   this.ignoreMutation = false;
14   this.name = name;
15   this.view = view;
17   this.defineProperty();
20 // Retrieves and returns the attribute's value.
21 Attribute.prototype.getValue = function() {
22   return this.view.element.getAttribute(this.name) || '';
25 // Retrieves and returns the attribute's value if it has been dirtied since
26 // the last time this method was called. Returns null otherwise.
27 Attribute.prototype.getValueIfDirty = function() {
28   if (!this.dirty)
29     return null;
30   this.dirty = false;
31   return this.getValue();
34 // Sets the attribute's value.
35 Attribute.prototype.setValue = function(value) {
36   this.view.element.setAttribute(this.name, value || '');
39 // Changes the attribute's value without triggering its mutation handler.
40 Attribute.prototype.setValueIgnoreMutation = function(value) {
41   this.ignoreMutation = true;
42   this.setValue(value);
43   this.ignoreMutation = false;
46 // Defines this attribute as a property on the view's element.
47 Attribute.prototype.defineProperty = function() {
48   $Object.defineProperty(this.view.element, this.name, {
49     get: function() {
50       return this.getValue();
51     }.bind(this),
52     set: function(value) {
53       this.setValue(value);
54     }.bind(this),
55     enumerable: true
56   });
59 // Called when the attribute's value changes.
60 Attribute.prototype.maybeHandleMutation = function(oldValue, newValue) {
61   if (this.ignoreMutation)
62     return;
64   this.dirty = true;
65   this.handleMutation(oldValue, newValue);
68 // Called when a change that isn't ignored occurs to the attribute's value.
69 Attribute.prototype.handleMutation = function(oldValue, newValue) {};
71 // Called when the view's element is attached to the DOM tree.
72 Attribute.prototype.attach = function() {};
74 // Called when the view's element is detached from the DOM tree.
75 Attribute.prototype.detach = function() {};
77 // -----------------------------------------------------------------------------
78 // BooleanAttribute object.
80 // An attribute that is treated as a Boolean.
81 function BooleanAttribute(name, view) {
82   Attribute.call(this, name, view);
85 BooleanAttribute.prototype.__proto__ = Attribute.prototype;
87 BooleanAttribute.prototype.getValue = function() {
88   return this.view.element.hasAttribute(this.name);
91 BooleanAttribute.prototype.setValue = function(value) {
92   if (!value) {
93     this.view.element.removeAttribute(this.name);
94   } else {
95     this.view.element.setAttribute(this.name, '');
96   }
99 // -----------------------------------------------------------------------------
100 // IntegerAttribute object.
102 // An attribute that is treated as an integer.
103 function IntegerAttribute(name, view) {
104   Attribute.call(this, name, view);
107 IntegerAttribute.prototype.__proto__ = Attribute.prototype;
109 IntegerAttribute.prototype.getValue = function() {
110   return parseInt(this.view.element.getAttribute(this.name)) || 0;
113 IntegerAttribute.prototype.setValue = function(value) {
114   this.view.element.setAttribute(this.name, parseInt(value) || 0);
117 // -----------------------------------------------------------------------------
118 // ReadOnlyAttribute object.
120 // An attribute that cannot be changed (externally). The only way to set it
121 // internally is via |setValueIgnoreMutation|.
122 function ReadOnlyAttribute(name, view) {
123   Attribute.call(this, name, view);
126 ReadOnlyAttribute.prototype.__proto__ = Attribute.prototype;
128 ReadOnlyAttribute.prototype.handleMutation = function(oldValue, newValue) {
129   this.setValueIgnoreMutation(oldValue);
132 // -----------------------------------------------------------------------------
134 var GuestViewAttributes = {
135   Attribute: Attribute,
136   BooleanAttribute: BooleanAttribute,
137   IntegerAttribute: IntegerAttribute,
138   ReadOnlyAttribute: ReadOnlyAttribute
141 // Exports.
142 exports.GuestViewAttributes = GuestViewAttributes;