Index: Source/modules/crypto/CryptoKey.cpp |
diff --git a/Source/modules/crypto/CryptoKey.cpp b/Source/modules/crypto/CryptoKey.cpp |
index 4c2babef72784848851178bb1502133caf4cfe29..01510cc809d667ccbe89817210063771780339a9 100644 |
--- a/Source/modules/crypto/CryptoKey.cpp |
+++ b/Source/modules/crypto/CryptoKey.cpp |
@@ -32,6 +32,7 @@ |
#include "modules/crypto/CryptoKey.h" |
#include "bindings/core/v8/ExceptionState.h" |
+#include "bindings/core/v8/V8Uint8Array.h" |
#include "core/dom/ExceptionCode.h" |
#include "platform/CryptoResult.h" |
#include "public/platform/WebCryptoAlgorithmParams.h" |
@@ -96,6 +97,45 @@ WebCryptoKeyUsageMask keyUsageStringToMask(const String& usageString) |
return 0; |
} |
+class DictionaryBuilder : public blink::WebCryptoKeyAlgorithmDictionary { |
+public: |
+ explicit DictionaryBuilder(ScriptState* scriptState) |
+ : m_scriptState(scriptState) |
+ , m_dictionary(Dictionary::createEmpty(scriptState->isolate())) |
+ { |
+ } |
+ |
+ virtual void setString(const char* propertyName, const char* value) |
+ { |
+ m_dictionary.set(propertyName, value); |
+ } |
+ |
+ virtual void setUint(const char* propertyName, unsigned value) |
+ { |
+ m_dictionary.set(propertyName, value); |
+ } |
+ |
+ virtual void setAlgorithm(const char* propertyName, const blink::WebCryptoAlgorithm& algorithm) |
+ { |
+ ASSERT(algorithm.paramsType() == blink::WebCryptoAlgorithmParamsTypeNone); |
+ |
+ Dictionary algorithmValue = Dictionary::createEmpty(m_scriptState->isolate()); |
+ algorithmValue.set("name", blink::WebCryptoAlgorithm::lookupAlgorithmInfo(algorithm.id())->name); |
+ m_dictionary.set(propertyName, algorithmValue); |
+ } |
+ |
+ virtual void setUint8Array(const char* propertyName, const blink::WebVector<unsigned char>& vector) |
+ { |
+ m_dictionary.set(propertyName, toV8(DOMUint8Array::create(vector.data(), vector.size()), m_scriptState->context()->Global(), m_scriptState->isolate())); |
+ } |
+ |
+ const Dictionary& dictionary() const { return m_dictionary; } |
+ |
+private: |
+ RefPtr<ScriptState> m_scriptState; |
+ Dictionary m_dictionary; |
+}; |
+ |
} // namespace |
CryptoKey::~CryptoKey() |
@@ -117,6 +157,13 @@ bool CryptoKey::extractable() const |
return m_key.extractable(); |
} |
+ScriptValue CryptoKey::algorithm(ScriptState* scriptState) |
+{ |
+ DictionaryBuilder builder(scriptState); |
+ m_key.algorithm().writeToDictionary(&builder); |
+ return ScriptValue(scriptState, builder.dictionary().v8Value()); |
+} |
+ |
// FIXME: This creates a new javascript array each time. What should happen |
// instead is return the same (immutable) array. (Javascript callers can |
// distinguish this by doing an == test on the arrays and seeing they are |