(obj, propertyName)
| 106 | } |
| 107 | |
| 108 | createPropertyObserver(obj, propertyName) { |
| 109 | let descriptor; |
| 110 | let handler; |
| 111 | let xlinkResult; |
| 112 | |
| 113 | if (!(obj instanceof Object)) { |
| 114 | return new PrimitiveObserver(obj, propertyName); |
| 115 | } |
| 116 | |
| 117 | if (obj instanceof DOM.Element) { |
| 118 | if (propertyName === 'class') { |
| 119 | return new ClassObserver(obj); |
| 120 | } |
| 121 | if (propertyName === 'style' || propertyName === 'css') { |
| 122 | return new StyleObserver(obj, propertyName); |
| 123 | } |
| 124 | handler = this.eventManager.getElementHandler(obj, propertyName); |
| 125 | if (propertyName === 'value' && obj.tagName.toLowerCase() === 'select') { |
| 126 | return new SelectValueObserver(obj, handler, this); |
| 127 | } |
| 128 | if (propertyName === 'checked' && obj.tagName.toLowerCase() === 'input') { |
| 129 | return new CheckedObserver(obj, handler, this); |
| 130 | } |
| 131 | if (handler) { |
| 132 | return new ValueAttributeObserver(obj, propertyName, handler); |
| 133 | } |
| 134 | xlinkResult = /^xlink:(.+)$/.exec(propertyName); |
| 135 | if (xlinkResult) { |
| 136 | return new XLinkAttributeObserver(obj, propertyName, xlinkResult[1]); |
| 137 | } |
| 138 | if (propertyName === 'role' && (obj instanceof DOM.Element || obj instanceof DOM.SVGElement) |
| 139 | || /^\w+:|^data-|^aria-/.test(propertyName) |
| 140 | || obj instanceof DOM.SVGElement && this.svgAnalyzer.isStandardSvgAttribute(obj.nodeName, propertyName)) { |
| 141 | return new DataAttributeObserver(obj, propertyName); |
| 142 | } |
| 143 | } |
| 144 | |
| 145 | descriptor = Object.getPropertyDescriptor(obj, propertyName); |
| 146 | |
| 147 | if (hasDeclaredDependencies(descriptor)) { |
| 148 | return createComputedObserver(obj, propertyName, descriptor, this); |
| 149 | } |
| 150 | |
| 151 | if (descriptor) { |
| 152 | const existingGetterOrSetter = descriptor.get || descriptor.set; |
| 153 | if (existingGetterOrSetter) { |
| 154 | if (existingGetterOrSetter.getObserver) { |
| 155 | return existingGetterOrSetter.getObserver(obj); |
| 156 | } |
| 157 | |
| 158 | // attempt to use an adapter before resorting to dirty checking. |
| 159 | let adapterObserver = this.getAdapterObserver(obj, propertyName, descriptor); |
| 160 | if (adapterObserver) { |
| 161 | return adapterObserver; |
| 162 | } |
| 163 | return new DirtyCheckProperty(this.dirtyChecker, obj, propertyName); |
| 164 | } |
| 165 | } |
no test coverage detected