JSHistoryCustom.cpp [plain text]
#include "config.h"
#include "JSHistory.h"
#include "ExceptionCode.h"
#include "Frame.h"
#include "JSDOMBinding.h"
#include "SerializedScriptValue.h"
#include <runtime/JSFunction.h>
using namespace JSC;
namespace WebCore {
JSValue JSHistory::state(ExecState& state) const
{
History& history = wrapped();
JSValue cachedValue = m_state.get();
if (!cachedValue.isEmpty() && !history.stateChanged())
return cachedValue;
RefPtr<SerializedScriptValue> serialized = history.state();
JSValue result = serialized ? serialized->deserialize(&state, globalObject(), 0) : jsNull();
m_state.set(state.vm(), this, result);
return result;
}
JSValue JSHistory::pushState(ExecState& state)
{
auto historyState = SerializedScriptValue::create(&state, state.argument(0), 0, 0);
if (state.hadException())
return jsUndefined();
String title = valueToStringWithUndefinedOrNullCheck(&state, state.argument(1));
if (state.hadException())
return jsUndefined();
String url;
if (state.argumentCount() > 2) {
url = valueToStringWithUndefinedOrNullCheck(&state, state.argument(2));
if (state.hadException())
return jsUndefined();
}
ExceptionCodeWithMessage ec;
wrapped().stateObjectAdded(WTFMove(historyState), title, url, History::StateObjectType::Push, ec);
setDOMException(&state, ec);
m_state.clear();
return jsUndefined();
}
JSValue JSHistory::replaceState(ExecState& state)
{
auto historyState = SerializedScriptValue::create(&state, state.argument(0), 0, 0);
if (state.hadException())
return jsUndefined();
String title = valueToStringWithUndefinedOrNullCheck(&state, state.argument(1));
if (state.hadException())
return jsUndefined();
String url;
if (state.argumentCount() > 2) {
url = valueToStringWithUndefinedOrNullCheck(&state, state.argument(2));
if (state.hadException())
return jsUndefined();
}
ExceptionCodeWithMessage ec;
wrapped().stateObjectAdded(WTFMove(historyState), title, url, History::StateObjectType::Replace, ec);
setDOMException(&state, ec);
m_state.clear();
return jsUndefined();
}
}