| Index: third_party/WebKit/Source/bindings/core/v8/custom/V8PopStateEventCustom.cpp
|
| diff --git a/third_party/WebKit/Source/bindings/core/v8/custom/V8PopStateEventCustom.cpp b/third_party/WebKit/Source/bindings/core/v8/custom/V8PopStateEventCustom.cpp
|
| index 141a8426f20404c2afa61835d9fdbd345b6510c0..08002066e61cbf54843004f22d2dff4eb41278d0 100644
|
| --- a/third_party/WebKit/Source/bindings/core/v8/custom/V8PopStateEventCustom.cpp
|
| +++ b/third_party/WebKit/Source/bindings/core/v8/custom/V8PopStateEventCustom.cpp
|
| @@ -32,21 +32,26 @@
|
|
|
| #include "bindings/core/v8/SerializedScriptValue.h"
|
| #include "bindings/core/v8/SerializedScriptValueFactory.h"
|
| -#include "bindings/core/v8/V8HiddenValue.h"
|
| #include "bindings/core/v8/V8History.h"
|
| +#include "bindings/core/v8/V8PrivateProperty.h"
|
| #include "core/events/PopStateEvent.h"
|
| #include "core/frame/History.h"
|
|
|
| namespace blink {
|
|
|
| +namespace {
|
| +// |kSymbolKey| is a key for a cached attribute for History.state.
|
| +// TODO(peria): Do not use this cached attribute directly.
|
| +constexpr char kSymbolKey[] = "History#State";
|
| +}
|
| +
|
| // Save the state value to a hidden attribute in the V8PopStateEvent, and return
|
| // it, for convenience.
|
| static v8::Local<v8::Value> cacheState(ScriptState* scriptState,
|
| v8::Local<v8::Object> popStateEvent,
|
| v8::Local<v8::Value> state) {
|
| - V8HiddenValue::setHiddenValue(scriptState, popStateEvent,
|
| - V8HiddenValue::state(scriptState->isolate()),
|
| - state);
|
| + V8PrivateProperty::getPopStateEventState(scriptState->isolate())
|
| + .set(popStateEvent, state);
|
| return state;
|
| }
|
|
|
| @@ -54,8 +59,9 @@ void V8PopStateEvent::stateAttributeGetterCustom(
|
| const v8::FunctionCallbackInfo<v8::Value>& info) {
|
| v8::Isolate* isolate = info.GetIsolate();
|
| ScriptState* scriptState = ScriptState::current(isolate);
|
| - v8::Local<v8::Value> result = V8HiddenValue::getHiddenValue(
|
| - scriptState, info.Holder(), V8HiddenValue::state(isolate));
|
| + V8PrivateProperty::Symbol propertySymbol =
|
| + V8PrivateProperty::getPopStateEventState(isolate);
|
| + v8::Local<v8::Value> result = propertySymbol.getOrEmpty(info.Holder());
|
|
|
| if (!result.IsEmpty()) {
|
| v8SetReturnValue(info, result);
|
| @@ -87,23 +93,21 @@ void V8PopStateEvent::stateAttributeGetterCustom(
|
| // deserialization with history.state.
|
|
|
| bool isSameState = history->isSameAsCurrentState(event->serializedState());
|
| -
|
| if (isSameState) {
|
| + V8PrivateProperty::Symbol historyState =
|
| + V8PrivateProperty::getSymbol(isolate, kSymbolKey);
|
| v8::Local<v8::Value> v8HistoryValue = ToV8(history, info.Holder(), isolate);
|
| if (v8HistoryValue.IsEmpty())
|
| return;
|
| v8::Local<v8::Object> v8History = v8HistoryValue.As<v8::Object>();
|
| - if (!history->stateChanged()) {
|
| - result = V8HiddenValue::getHiddenValue(scriptState, v8History,
|
| - V8HiddenValue::state(isolate));
|
| - if (!result.IsEmpty()) {
|
| - v8SetReturnValue(info, cacheState(scriptState, info.Holder(), result));
|
| - return;
|
| - }
|
| + if (!history->stateChanged() && historyState.hasValue(v8History)) {
|
| + v8SetReturnValue(info,
|
| + cacheState(scriptState, info.Holder(),
|
| + historyState.getOrUndefined(v8History)));
|
| + return;
|
| }
|
| result = event->serializedState()->deserialize(isolate);
|
| - V8HiddenValue::setHiddenValue(scriptState, v8History,
|
| - V8HiddenValue::state(isolate), result);
|
| + historyState.set(v8History, result);
|
| } else {
|
| result = event->serializedState()->deserialize(isolate);
|
| }
|
|
|