Chromium Code Reviews| Index: plugins/org.chromium.sdk.wipbackend.dev/src/org/chromium/sdk/internal/wip/WipValueBuilder.java |
| diff --git a/plugins/org.chromium.sdk.wipbackend.dev/src/org/chromium/sdk/internal/wip/WipValueBuilder.java b/plugins/org.chromium.sdk.wipbackend.dev/src/org/chromium/sdk/internal/wip/WipValueBuilder.java |
| index 3870193fef8bbad9263164f41c1ae84df5dbfd08..fe4f169c883cc468bce5cba5d9635a30e2e308d1 100644 |
| --- a/plugins/org.chromium.sdk.wipbackend.dev/src/org/chromium/sdk/internal/wip/WipValueBuilder.java |
| +++ b/plugins/org.chromium.sdk.wipbackend.dev/src/org/chromium/sdk/internal/wip/WipValueBuilder.java |
| @@ -33,13 +33,16 @@ import org.chromium.sdk.SyncCallback; |
| import org.chromium.sdk.TextStreamPosition; |
| import org.chromium.sdk.internal.wip.WipValueLoader.Getter; |
| import org.chromium.sdk.internal.wip.WipValueLoader.ObjectProperties; |
| +import org.chromium.sdk.internal.wip.protocol.input.WipCommandResponse.Success; |
| import org.chromium.sdk.internal.wip.protocol.input.debugger.FunctionDetailsValue; |
| import org.chromium.sdk.internal.wip.protocol.input.debugger.LocationValue; |
| import org.chromium.sdk.internal.wip.protocol.input.debugger.ScopeValue; |
| import org.chromium.sdk.internal.wip.protocol.input.runtime.PropertyDescriptorValue; |
| import org.chromium.sdk.internal.wip.protocol.input.runtime.RemoteObjectValue; |
| +import org.chromium.sdk.internal.wip.protocol.output.debugger.SetVariableValueParams; |
| import org.chromium.sdk.internal.wip.protocol.output.runtime.CallArgumentParam; |
| import org.chromium.sdk.util.AsyncFutureRef; |
| +import org.chromium.sdk.util.GenericCallback; |
| import org.chromium.sdk.util.JavaScriptExpressionBuilder; |
| import org.chromium.sdk.util.MethodIsBlockingException; |
| @@ -95,11 +98,15 @@ class WipValueBuilder { |
| final String hostObjectRefId, String name) { |
| JsValue jsValue = wrap(propertyDescriptor.value()); |
| - final JsValue getter = wrapPropertyDescriptorFunction(propertyDescriptor.get(), "getter"); |
| + final JsValue getter = wrap(propertyDescriptor.get()); |
| - final JsValue setter = wrapPropertyDescriptorFunction(propertyDescriptor.set(), "setter"); |
| + final JsValue setter = wrap(propertyDescriptor.set()); |
| return new ObjectPropertyBase(jsValue, name) { |
| + |
| + @Override public boolean isMutable() { |
| + return false; |
| + } |
| @Override public boolean isWritable() { |
| return propertyDescriptor.writable(); |
| } |
| @@ -126,6 +133,12 @@ class WipValueBuilder { |
| } |
| @Override |
| + public RelayOk setValue(JsValue newValue, SetValueCallback callback, |
| + SyncCallback syncCallback) throws UnsupportedOperationException { |
| + throw new UnsupportedOperationException(); |
| + } |
| + |
| + @Override |
| public RelayOk evaluateGet(EvaluateCallback callback, SyncCallback syncCallback) { |
| WipContextBuilder.GlobalEvaluateContext evaluateContext = |
| new WipContextBuilder.GlobalEvaluateContext(valueLoader); |
| @@ -149,13 +162,38 @@ class WipValueBuilder { |
| }; |
| } |
| - private JsValue wrapPropertyDescriptorFunction(RemoteObjectValue value, String symbolicName) { |
| - return wrap(value); |
| - } |
| - |
| - public JsVariable createVariable(RemoteObjectValue valueData, String name) { |
| + public JsVariable createVariable(RemoteObjectValue valueData, String name, |
| + final WipContextBuilder.ScopeParams scopeParams) { |
| JsValue jsValue = wrap(valueData); |
| - return createVariable(jsValue, name); |
| + |
| + VariableValueChanger valueChanger; |
| + if (scopeParams == null) { |
| + valueChanger = null; |
| + } else { |
| + valueChanger = new VariableValueChanger() { |
| + @Override |
| + RelayOk setValue(String variableName, JsValue newValue, |
| + final GenericCallback<JsValue> callback, SyncCallback syncCallback) |
| + throws UnsupportedOperationException { |
| + final JsValueBase jsValueBase = JsValueBase.cast(newValue); |
| + SetVariableValueParams params = new SetVariableValueParams(scopeParams.getScopeNumber(), |
| + variableName, jsValueBase.createCallArgumentParam(), scopeParams.getCallFrameId(), |
| + scopeParams.getFunctionId()); |
| + WipCommandCallback rawCallback = new WipCommandCallback.Default() { |
| + @Override protected void onSuccess(Success success) { |
| + callback.success(jsValueBase); |
| + } |
| + @Override protected void onError(String message) { |
| + callback.failure(new Exception(message)); |
| + } |
| + }; |
| + return valueLoader.getTabImpl().getCommandProcessor().send(params, |
| + rawCallback, syncCallback); |
| + } |
| + }; |
| + } |
| + |
| + return new VariableImpl(jsValue, name, valueChanger); |
| } |
| public JsValue wrap(RemoteObjectValue valueData) { |
| @@ -165,10 +203,6 @@ class WipValueBuilder { |
| return getValueType(valueData).build(valueData, valueLoader); |
| } |
| - public static JsVariable createVariable(JsValue jsValue, String name) { |
| - return new VariableImpl(jsValue, name); |
| - } |
| - |
| private static ValueType getValueType(RemoteObjectValue valueData) { |
| RemoteObjectValue.Type protocolType = valueData.type(); |
| ValueType result = getSafe(PROTOCOL_TYPE_TO_VALUE_TYPE, protocolType); |
| @@ -573,8 +607,12 @@ class WipValueBuilder { |
| return Collections.emptyList(); |
| } |
| List<JsScope> result = new ArrayList<JsScope>(data.size()); |
| - for (ScopeValue scopeValue : data) { |
| - result.add(WipContextBuilder.createScope(scopeValue, getRemoteValueMapping())); |
| + WipContextBuilder.ScopeHolderParams holderParams = |
| + new WipContextBuilder.ScopeHolderParams(null, getRefId()); |
| + for (int i = 0; i < data.size(); i++) { |
| + ScopeValue scopeValue = data.get(i); |
| + result.add(WipContextBuilder.createScope(scopeValue, getRemoteValueMapping(), |
| + holderParams, i)); |
| } |
| return result; |
| } |
| @@ -603,11 +641,9 @@ class WipValueBuilder { |
| }; |
| private static abstract class VariableBase implements JsVariable { |
| - private final JsValue jsValue; |
| private final String name; |
| - VariableBase(JsValue jsValue, String name) { |
| - this.jsValue = jsValue; |
| + VariableBase(String name) { |
| this.name = name; |
| } |
| @@ -617,43 +653,75 @@ class WipValueBuilder { |
| } |
| @Override |
| - public JsValue getValue() { |
| - return jsValue; |
| - } |
| - |
| - @Override |
| public String getName() { |
| return name; |
| } |
| - |
| - @Override |
| - public boolean isMutable() { |
| - return false; |
| - } |
| - |
| - @Override |
| - public RelayOk setValue(JsValue newValue, SetValueCallback callback, |
| - SyncCallback syncCallback) throws UnsupportedOperationException { |
| - throw new UnsupportedOperationException(); |
| - } |
| } |
| private static class VariableImpl extends VariableBase { |
| - VariableImpl(JsValue jsValue, String name) { |
| - super(jsValue, name); |
| + private final VariableValueChanger valueChanger; |
| + private volatile JsValue jsValue; |
| + |
| + VariableImpl(JsValue jsValue, String name, VariableValueChanger valueChanger) { |
|
apavlov
2013/02/18 11:34:08
While we are here, it is a good idea to swap the J
Peter Rybin
2013/02/18 23:32:52
Done.
|
| + super(name); |
| + this.jsValue = jsValue; |
| + this.valueChanger = valueChanger; |
| } |
| @Override public JsObjectProperty asObjectProperty() { |
| return null; |
| } |
| + @Override public boolean isMutable() { |
|
apavlov
2013/02/18 11:34:08
Blank line
Peter Rybin
2013/02/18 23:32:52
We usually keep trivial and really simple methods
|
| + return valueChanger != null; |
| + } |
| + @Override public JsValue getValue() { |
|
apavlov
2013/02/18 11:34:08
Ditto
Peter Rybin
2013/02/18 23:32:52
Same
|
| + return jsValue; |
| + } |
| + |
| + @Override |
| + public RelayOk setValue(JsValue newValue, final SetValueCallback callback, |
| + SyncCallback syncCallback) throws UnsupportedOperationException { |
| + if (valueChanger == null) { |
| + throw new UnsupportedOperationException(); |
| + } |
| + GenericCallback<JsValue> rawCallback = new GenericCallback<JsValue>() { |
| + @Override |
| + public void success(JsValue value) { |
| + VariableImpl.this.jsValue = value; |
| + if (callback != null) { |
| + callback.success(); |
| + } |
| + } |
| + |
| + @Override |
| + public void failure(Exception exception) { |
| + if (callback != null) { |
| + callback.failure(exception); |
| + } |
| + } |
| + }; |
| + return valueChanger.setValue(getName(), newValue, rawCallback, syncCallback); |
| + } |
| + } |
| + |
| + static abstract class VariableValueChanger { |
| + abstract RelayOk setValue(String variableName, JsValue newValue, |
| + GenericCallback<JsValue> callback, SyncCallback syncCallback) |
| + throws UnsupportedOperationException; |
| } |
| private static abstract class ObjectPropertyBase |
| extends VariableBase implements JsObjectProperty { |
| + private final JsValue jsValue; |
| + |
| ObjectPropertyBase(JsValue jsValue, String name) { |
| - super(jsValue, name); |
| + super(name); |
| + this.jsValue = jsValue; |
| } |
| + @Override public JsValue getValue() { |
| + return jsValue; |
| + } |
| @Override public JsObjectProperty asObjectProperty() { |
|
apavlov
2013/02/18 11:34:08
Ditto
Peter Rybin
2013/02/18 23:32:52
The same
|
| return this; |
| } |