| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.sdk.internal.wip; | 5 package org.chromium.sdk.internal.wip; |
| 6 | 6 |
| 7 import static org.chromium.sdk.util.BasicUtil.getSafe; | 7 import static org.chromium.sdk.util.BasicUtil.getSafe; |
| 8 | 8 |
| 9 import java.util.ArrayList; | 9 import java.util.ArrayList; |
| 10 import java.util.Collection; | 10 import java.util.Collection; |
| 11 import java.util.Collections; | 11 import java.util.Collections; |
| 12 import java.util.HashMap; | 12 import java.util.HashMap; |
| 13 import java.util.List; | 13 import java.util.List; |
| 14 import java.util.Map; | 14 import java.util.Map; |
| 15 import java.util.SortedMap; | 15 import java.util.SortedMap; |
| 16 import java.util.TreeMap; | 16 import java.util.TreeMap; |
| 17 import java.util.concurrent.atomic.AtomicReference; | 17 import java.util.concurrent.atomic.AtomicReference; |
| 18 import java.util.logging.Logger; | 18 import java.util.logging.Logger; |
| 19 | 19 |
| 20 import org.chromium.sdk.FunctionScopeExtension; | 20 import org.chromium.sdk.FunctionScopeExtension; |
| 21 import org.chromium.sdk.JsArray; | 21 import org.chromium.sdk.JsArray; |
| 22 import org.chromium.sdk.JsDeclarativeVariable; |
| 22 import org.chromium.sdk.JsEvaluateContext.EvaluateCallback; | 23 import org.chromium.sdk.JsEvaluateContext.EvaluateCallback; |
| 23 import org.chromium.sdk.JsFunction; | 24 import org.chromium.sdk.JsFunction; |
| 24 import org.chromium.sdk.JsObject; | 25 import org.chromium.sdk.JsObject; |
| 25 import org.chromium.sdk.JsObjectProperty; | 26 import org.chromium.sdk.JsObjectProperty; |
| 26 import org.chromium.sdk.JsScope; | 27 import org.chromium.sdk.JsScope; |
| 27 import org.chromium.sdk.JsValue; | 28 import org.chromium.sdk.JsValue; |
| 28 import org.chromium.sdk.JsValue.Type; | 29 import org.chromium.sdk.JsValue.Type; |
| 29 import org.chromium.sdk.JsVariable; | 30 import org.chromium.sdk.JsVariable; |
| 30 import org.chromium.sdk.RelayOk; | 31 import org.chromium.sdk.RelayOk; |
| 31 import org.chromium.sdk.Script; | 32 import org.chromium.sdk.Script; |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 | 97 |
| 97 public JsObjectProperty createObjectProperty(final PropertyDescriptorValue pro
pertyDescriptor, | 98 public JsObjectProperty createObjectProperty(final PropertyDescriptorValue pro
pertyDescriptor, |
| 98 final String hostObjectRefId, String name) { | 99 final String hostObjectRefId, String name) { |
| 99 JsValue jsValue = wrap(propertyDescriptor.value()); | 100 JsValue jsValue = wrap(propertyDescriptor.value()); |
| 100 | 101 |
| 101 final JsValue getter = wrap(propertyDescriptor.get()); | 102 final JsValue getter = wrap(propertyDescriptor.get()); |
| 102 | 103 |
| 103 final JsValue setter = wrap(propertyDescriptor.set()); | 104 final JsValue setter = wrap(propertyDescriptor.set()); |
| 104 | 105 |
| 105 return new ObjectPropertyBase(jsValue, name) { | 106 return new ObjectPropertyBase(jsValue, name) { |
| 106 | |
| 107 @Override public boolean isMutable() { | |
| 108 return false; | |
| 109 } | |
| 110 @Override public boolean isWritable() { | 107 @Override public boolean isWritable() { |
| 111 return propertyDescriptor.writable(); | 108 return propertyDescriptor.writable(); |
| 112 } | 109 } |
| 113 @Override public JsValue getGetter() { | 110 @Override public JsValue getGetter() { |
| 114 return getter; | 111 return getter; |
| 115 } | 112 } |
| 116 @Override public JsValue getSetter() { | 113 @Override public JsValue getSetter() { |
| 117 return setter; | 114 return setter; |
| 118 } | 115 } |
| 119 @Override public boolean isConfigurable() { | 116 @Override public boolean isConfigurable() { |
| 120 return propertyDescriptor.configurable(); | 117 return propertyDescriptor.configurable(); |
| 121 } | 118 } |
| 122 @Override public boolean isEnumerable() { | 119 @Override public boolean isEnumerable() { |
| 123 return propertyDescriptor.enumerable(); | 120 return propertyDescriptor.enumerable(); |
| 124 } | 121 } |
| 125 | 122 |
| 126 @Override | 123 @Override |
| 127 public JsFunction getGetterAsFunction() { | 124 public JsFunction getGetterAsFunction() { |
| 128 JsObject getterObject = getter.asObject(); | 125 JsObject getterObject = getter.asObject(); |
| 129 if (getterObject == null) { | 126 if (getterObject == null) { |
| 130 return null; | 127 return null; |
| 131 } | 128 } |
| 132 return getterObject.asFunction(); | 129 return getterObject.asFunction(); |
| 133 } | 130 } |
| 134 | 131 |
| 135 @Override | 132 @Override |
| 136 public RelayOk setValue(JsValue newValue, SetValueCallback callback, | |
| 137 SyncCallback syncCallback) throws UnsupportedOperationException { | |
| 138 throw new UnsupportedOperationException(); | |
| 139 } | |
| 140 | |
| 141 @Override | |
| 142 public RelayOk evaluateGet(EvaluateCallback callback, SyncCallback syncCal
lback) { | 133 public RelayOk evaluateGet(EvaluateCallback callback, SyncCallback syncCal
lback) { |
| 143 WipContextBuilder.GlobalEvaluateContext evaluateContext = | 134 WipContextBuilder.GlobalEvaluateContext evaluateContext = |
| 144 new WipContextBuilder.GlobalEvaluateContext(valueLoader); | 135 new WipContextBuilder.GlobalEvaluateContext(valueLoader); |
| 145 | 136 |
| 146 JsFunction getterFunction = getGetterAsFunction(); | 137 JsFunction getterFunction = getGetterAsFunction(); |
| 147 if (getterFunction == null) { | 138 if (getterFunction == null) { |
| 148 throw new RuntimeException("Getter is not a function"); | 139 throw new RuntimeException("Getter is not a function"); |
| 149 } | 140 } |
| 150 | 141 |
| 151 Map<String, SerializableValue> context = new HashMap<String, Serializabl
eValue>(2); | 142 Map<String, SerializableValue> context = new HashMap<String, Serializabl
eValue>(2); |
| 152 context.put(GETTER_VAR_NAME, (SerializableValue) getterFunction); | 143 context.put(GETTER_VAR_NAME, (SerializableValue) getterFunction); |
| 153 context.put(OBJECT_VAR_NAME, SerializableValue.Util.wrapRefId(hostObject
RefId)); | 144 context.put(OBJECT_VAR_NAME, SerializableValue.Util.wrapRefId(hostObject
RefId)); |
| 154 | 145 |
| 155 return evaluateContext.evaluateAsyncImpl(EVALUATE_EXPRESSION, | 146 return evaluateContext.evaluateAsyncImpl(EVALUATE_EXPRESSION, |
| 156 context, valueLoader, callback, syncCallback); | 147 context, valueLoader, callback, syncCallback); |
| 157 } | 148 } |
| 158 private static final String GETTER_VAR_NAME = "gttr"; | 149 private static final String GETTER_VAR_NAME = "gttr"; |
| 159 private static final String OBJECT_VAR_NAME = "obj"; | 150 private static final String OBJECT_VAR_NAME = "obj"; |
| 160 private static final String EVALUATE_EXPRESSION = | 151 private static final String EVALUATE_EXPRESSION = |
| 161 GETTER_VAR_NAME + ".call(" + OBJECT_VAR_NAME + ")"; | 152 GETTER_VAR_NAME + ".call(" + OBJECT_VAR_NAME + ")"; |
| 162 }; | 153 }; |
| 163 } | 154 } |
| 164 | 155 |
| 165 public JsVariable createVariable(RemoteObjectValue valueData, String name, | 156 public JsVariable createVariable(RemoteObjectValue valueData, String name) { |
| 157 return new VariableImpl(name, wrap(valueData)); |
| 158 } |
| 159 |
| 160 public JsDeclarativeVariable createDeclarativeVariable(RemoteObjectValue value
Data, String name, |
| 166 final WipContextBuilder.ScopeParams scopeParams) { | 161 final WipContextBuilder.ScopeParams scopeParams) { |
| 167 JsValue jsValue = wrap(valueData); | 162 JsValue jsValue = wrap(valueData); |
| 168 | 163 VariableValueChanger valueChanger = new VariableValueChanger() { |
| 169 VariableValueChanger valueChanger; | 164 @Override |
| 170 if (scopeParams == null) { | 165 RelayOk setValue(String variableName, JsValue newValue, |
| 171 valueChanger = null; | 166 final GenericCallback<JsValue> callback, SyncCallback syncCallback
) |
| 172 } else { | 167 throws UnsupportedOperationException { |
| 173 valueChanger = new VariableValueChanger() { | 168 final JsValueBase jsValueBase = JsValueBase.cast(newValue); |
| 174 @Override | 169 SetVariableValueParams params = new SetVariableValueParams(scopePara
ms.getScopeNumber(), |
| 175 RelayOk setValue(String variableName, JsValue newValue, | 170 variableName, jsValueBase.createCallArgumentParam(), scopeParams
.getCallFrameId(), |
| 176 final GenericCallback<JsValue> callback, SyncCallback syncCallback) | 171 scopeParams.getFunctionId()); |
| 177 throws UnsupportedOperationException { | 172 WipCommandCallback rawCallback = new WipCommandCallback.Default() { |
| 178 final JsValueBase jsValueBase = JsValueBase.cast(newValue); | 173 @Override protected void onSuccess(Success success) { |
| 179 SetVariableValueParams params = new SetVariableValueParams(scopeParams
.getScopeNumber(), | 174 callback.success(jsValueBase); |
| 180 variableName, jsValueBase.createCallArgumentParam(), scopeParams.g
etCallFrameId(), | 175 } |
| 181 scopeParams.getFunctionId()); | 176 @Override protected void onError(String message) { |
| 182 WipCommandCallback rawCallback = new WipCommandCallback.Default() { | 177 callback.failure(new Exception(message)); |
| 183 @Override protected void onSuccess(Success success) { | 178 } |
| 184 callback.success(jsValueBase); | 179 }; |
| 185 } | 180 return valueLoader.getTabImpl().getCommandProcessor().send(params, |
| 186 @Override protected void onError(String message) { | 181 rawCallback, syncCallback); |
| 187 callback.failure(new Exception(message)); | 182 } |
| 188 } | 183 }; |
| 189 }; | 184 return new DeclarativeVariable(name, jsValue, valueChanger); |
| 190 return valueLoader.getTabImpl().getCommandProcessor().send(params, | |
| 191 rawCallback, syncCallback); | |
| 192 } | |
| 193 }; | |
| 194 } | |
| 195 | |
| 196 return new VariableImpl(name, jsValue, valueChanger); | |
| 197 } | 185 } |
| 198 | 186 |
| 199 public JsValue wrap(RemoteObjectValue valueData) { | 187 public JsValue wrap(RemoteObjectValue valueData) { |
| 200 if (valueData == null) { | 188 if (valueData == null) { |
| 201 return null; | 189 return null; |
| 202 } | 190 } |
| 203 return getValueType(valueData).build(valueData, valueLoader); | 191 return getValueType(valueData).build(valueData, valueLoader); |
| 204 } | 192 } |
| 205 | 193 |
| 206 private static ValueType getValueType(RemoteObjectValue valueData) { | 194 private static ValueType getValueType(RemoteObjectValue valueData) { |
| (...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 640 } | 628 } |
| 641 }; | 629 }; |
| 642 | 630 |
| 643 private static abstract class VariableBase implements JsVariable { | 631 private static abstract class VariableBase implements JsVariable { |
| 644 private final String name; | 632 private final String name; |
| 645 | 633 |
| 646 VariableBase(String name) { | 634 VariableBase(String name) { |
| 647 this.name = name; | 635 this.name = name; |
| 648 } | 636 } |
| 649 | 637 |
| 650 @Override | 638 @Override public String getName() { |
| 651 public boolean isReadable() { | |
| 652 return true; | |
| 653 } | |
| 654 | |
| 655 @Override | |
| 656 public String getName() { | |
| 657 return name; | 639 return name; |
| 658 } | 640 } |
| 659 } | 641 } |
| 660 | 642 |
| 661 private static class VariableImpl extends VariableBase { | 643 private static class VariableImpl extends VariableBase { |
| 644 private final JsValue jsValue; |
| 645 |
| 646 VariableImpl(String name, JsValue jsValue) { |
| 647 super(name); |
| 648 this.jsValue = jsValue; |
| 649 } |
| 650 |
| 651 @Override public JsObjectProperty asObjectProperty() { |
| 652 return null; |
| 653 } |
| 654 @Override public JsDeclarativeVariable asDeclarativeVariable() { |
| 655 return null; |
| 656 } |
| 657 @Override public JsValue getValue() { |
| 658 return jsValue; |
| 659 } |
| 660 } |
| 661 |
| 662 private static class DeclarativeVariable extends VariableBase implements JsDec
larativeVariable { |
| 662 private final VariableValueChanger valueChanger; | 663 private final VariableValueChanger valueChanger; |
| 663 private volatile JsValue jsValue; | 664 private volatile JsValue jsValue; |
| 664 | 665 |
| 665 VariableImpl(String name, JsValue jsValue, VariableValueChanger valueChanger
) { | 666 DeclarativeVariable(String name, JsValue jsValue, VariableValueChanger value
Changer) { |
| 666 super(name); | 667 super(name); |
| 667 this.jsValue = jsValue; | 668 this.jsValue = jsValue; |
| 668 this.valueChanger = valueChanger; | 669 this.valueChanger = valueChanger; |
| 669 } | 670 } |
| 670 | 671 |
| 671 @Override public JsObjectProperty asObjectProperty() { | 672 @Override public JsObjectProperty asObjectProperty() { |
| 672 return null; | 673 return null; |
| 673 } | 674 } |
| 675 @Override public JsDeclarativeVariable asDeclarativeVariable() { |
| 676 return this; |
| 677 } |
| 674 @Override public boolean isMutable() { | 678 @Override public boolean isMutable() { |
| 675 return valueChanger != null; | 679 return valueChanger != null; |
| 676 } | 680 } |
| 677 @Override public JsValue getValue() { | 681 @Override public JsValue getValue() { |
| 678 return jsValue; | 682 return jsValue; |
| 679 } | 683 } |
| 680 | 684 |
| 681 @Override | 685 @Override |
| 682 public RelayOk setValue(JsValue newValue, final SetValueCallback callback, | 686 public RelayOk setValue(JsValue newValue, final SetValueCallback callback, |
| 683 SyncCallback syncCallback) throws UnsupportedOperationException { | 687 SyncCallback syncCallback) throws UnsupportedOperationException { |
| 684 if (valueChanger == null) { | 688 if (valueChanger == null) { |
| 685 throw new UnsupportedOperationException(); | 689 throw new UnsupportedOperationException(); |
| 686 } | 690 } |
| 687 GenericCallback<JsValue> rawCallback = new GenericCallback<JsValue>() { | 691 GenericCallback<JsValue> rawCallback = new GenericCallback<JsValue>() { |
| 688 @Override | 692 @Override |
| 689 public void success(JsValue value) { | 693 public void success(JsValue value) { |
| 690 VariableImpl.this.jsValue = value; | 694 DeclarativeVariable.this.jsValue = value; |
| 691 if (callback != null) { | 695 if (callback != null) { |
| 692 callback.success(); | 696 callback.success(); |
| 693 } | 697 } |
| 694 } | 698 } |
| 695 | 699 |
| 696 @Override | 700 @Override |
| 697 public void failure(Exception exception) { | 701 public void failure(Exception exception) { |
| 698 if (callback != null) { | 702 if (callback != null) { |
| 699 callback.failure(exception); | 703 callback.failure(exception); |
| 700 } | 704 } |
| (...skipping 17 matching lines...) Expand all Loading... |
| 718 super(name); | 722 super(name); |
| 719 this.jsValue = jsValue; | 723 this.jsValue = jsValue; |
| 720 } | 724 } |
| 721 | 725 |
| 722 @Override public JsValue getValue() { | 726 @Override public JsValue getValue() { |
| 723 return jsValue; | 727 return jsValue; |
| 724 } | 728 } |
| 725 @Override public JsObjectProperty asObjectProperty() { | 729 @Override public JsObjectProperty asObjectProperty() { |
| 726 return this; | 730 return this; |
| 727 } | 731 } |
| 732 @Override public JsDeclarativeVariable asDeclarativeVariable() { |
| 733 return null; |
| 734 } |
| 728 } | 735 } |
| 729 | 736 |
| 730 private static class ObjectType extends ValueType { | 737 private static class ObjectType extends ValueType { |
| 731 @Override | 738 @Override |
| 732 JsValue build(RemoteObjectValue valueData, WipValueLoader valueLoader) { | 739 JsValue build(RemoteObjectValue valueData, WipValueLoader valueLoader) { |
| 733 ValueType secondLevelValueType = | 740 ValueType secondLevelValueType = |
| 734 getSafe(PROTOCOL_SUBTYPE_TO_VALUE_TYPE, valueData.subtype()); | 741 getSafe(PROTOCOL_SUBTYPE_TO_VALUE_TYPE, valueData.subtype()); |
| 735 | 742 |
| 736 if (secondLevelValueType == null) { | 743 if (secondLevelValueType == null) { |
| 737 LOGGER.severe("Unexpected value type: " + valueData.type() + " " + value
Data.subtype()); | 744 LOGGER.severe("Unexpected value type: " + valueData.type() + " " + value
Data.subtype()); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 775 new SingletonPrimitiveType(JsValue.Type.TYPE_UNDEFINED, "undefined")); | 782 new SingletonPrimitiveType(JsValue.Type.TYPE_UNDEFINED, "undefined")); |
| 776 | 783 |
| 777 PROTOCOL_TYPE_TO_VALUE_TYPE.put(RemoteObjectValue.Type.OBJECT, new ObjectTyp
e()); | 784 PROTOCOL_TYPE_TO_VALUE_TYPE.put(RemoteObjectValue.Type.OBJECT, new ObjectTyp
e()); |
| 778 PROTOCOL_TYPE_TO_VALUE_TYPE.put(RemoteObjectValue.Type.FUNCTION, new Functio
nType()); | 785 PROTOCOL_TYPE_TO_VALUE_TYPE.put(RemoteObjectValue.Type.FUNCTION, new Functio
nType()); |
| 779 | 786 |
| 780 assert PROTOCOL_TYPE_TO_VALUE_TYPE.size() == RemoteObjectValue.Type.values()
.length; | 787 assert PROTOCOL_TYPE_TO_VALUE_TYPE.size() == RemoteObjectValue.Type.values()
.length; |
| 781 } | 788 } |
| 782 | 789 |
| 783 private static final ValueType DEFAULT_VALUE_TYPE = new ObjectSubtype(JsValue.
Type.TYPE_OBJECT); | 790 private static final ValueType DEFAULT_VALUE_TYPE = new ObjectSubtype(JsValue.
Type.TYPE_OBJECT); |
| 784 } | 791 } |
| OLD | NEW |