#include "config.h"
#include "Intent.h"
#if ENABLE(WEB_INTENTS)
#include "ExceptionCode.h"
#include "MessagePort.h"
#include "ScriptState.h"
#include "SerializedScriptValue.h"
namespace WebCore {
PassRefPtr<Intent> Intent::create(const String& action, const String& type, PassRefPtr<SerializedScriptValue> data, const MessagePortArray& ports, ExceptionCode& ec)
{
if (action.isEmpty()) {
ec = SYNTAX_ERR;
return 0;
}
if (type.isEmpty()) {
ec = SYNTAX_ERR;
return 0;
}
OwnPtr<MessagePortChannelArray> channels = MessagePort::disentanglePorts(&ports, ec);
WTF::HashMap<String, String> extras;
KURL serviceUrl;
return adoptRef(new Intent(action, type, data, channels.release(), extras, serviceUrl));
}
PassRefPtr<Intent> Intent::create(ScriptState* scriptState, const Dictionary& options, ExceptionCode& ec)
{
String action;
if (!options.get("action", action) || action.isEmpty()) {
ec = SYNTAX_ERR;
return 0;
}
String type;
if (!options.get("type", type) || type.isEmpty()) {
ec = SYNTAX_ERR;
return 0;
}
String service;
KURL serviceUrl;
if (options.get("service", service) && !service.isEmpty()) {
serviceUrl = KURL(KURL(), service);
if (!serviceUrl.isValid()) {
ec = SYNTAX_ERR;
return 0;
}
}
MessagePortArray ports;
OwnPtr<MessagePortChannelArray> channels;
if (options.get("transfer", ports))
channels = MessagePort::disentanglePorts(&ports, ec);
ScriptValue dataValue;
RefPtr<SerializedScriptValue> serializedData;
if (options.get("data", dataValue)) {
bool didThrow = false;
serializedData = dataValue.serialize(scriptState, &ports, 0, didThrow);
if (didThrow) {
ec = DATA_CLONE_ERR;
return 0;
}
}
WTF::HashMap<String, String> extras;
Dictionary extrasDictionary;
if (options.get("extras", extrasDictionary))
extrasDictionary.getOwnPropertiesAsStringHashMap(extras);
return adoptRef(new Intent(action, type, serializedData.release(), channels.release(), extras, serviceUrl));
}
Intent::Intent(const String& action, const String& type,
PassRefPtr<SerializedScriptValue> data, PassOwnPtr<MessagePortChannelArray> ports,
const WTF::HashMap<String, String>& extras, const KURL& service)
: m_action(action)
, m_type(type)
, m_ports(ports)
, m_service(service)
, m_extras(extras)
{
if (data)
m_data = data;
else
m_data = SerializedScriptValue::nullValue();
}
}
#endif // ENABLE(WEB_INTENTS)