summaryrefslogtreecommitdiffstats
path: root/native_client_sdk
diff options
context:
space:
mode:
authorbinji@chromium.org <binji@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-20 16:55:49 +0000
committerbinji@chromium.org <binji@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-20 16:55:49 +0000
commit572560049bf254d94fb903360ad0ef4e943dd829 (patch)
tree952a5cefa721b814dc8912ed03dd385a88ae7336 /native_client_sdk
parentc347534167ec152ddb62337081e0d447101dcbc0 (diff)
downloadchromium_src-572560049bf254d94fb903360ad0ef4e943dd829.zip
chromium_src-572560049bf254d94fb903360ad0ef4e943dd829.tar.gz
chromium_src-572560049bf254d94fb903360ad0ef4e943dd829.tar.bz2
[NaCl SDK] Add var_dictionary example.
BUG=none R=sbc@chromium.org, noelallen@chromium.org Review URL: https://codereview.chromium.org/29363003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@229701 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'native_client_sdk')
-rw-r--r--native_client_sdk/src/build_tools/sdk_files.list1
-rw-r--r--native_client_sdk/src/examples/api/var_dictionary/example.dsc19
-rw-r--r--native_client_sdk/src/examples/api/var_dictionary/example.js89
-rw-r--r--native_client_sdk/src/examples/api/var_dictionary/index.html102
-rw-r--r--native_client_sdk/src/examples/api/var_dictionary/var_dictionary.cc158
5 files changed, 369 insertions, 0 deletions
diff --git a/native_client_sdk/src/build_tools/sdk_files.list b/native_client_sdk/src/build_tools/sdk_files.list
index f481589..5c8c765 100644
--- a/native_client_sdk/src/build_tools/sdk_files.list
+++ b/native_client_sdk/src/build_tools/sdk_files.list
@@ -14,6 +14,7 @@ examples/api/mouse_lock/*
examples/api/socket/*
examples/api/url_loader/*
examples/api/var_array_buffer/*
+examples/api/var_dictionary/*
examples/api/websocket/*
examples/button_close.png
examples/button_close_hover.png
diff --git a/native_client_sdk/src/examples/api/var_dictionary/example.dsc b/native_client_sdk/src/examples/api/var_dictionary/example.dsc
new file mode 100644
index 0000000..1842eba
--- /dev/null
+++ b/native_client_sdk/src/examples/api/var_dictionary/example.dsc
@@ -0,0 +1,19 @@
+{
+ 'TOOLS': ['newlib', 'glibc', 'pnacl', 'win', 'linux'],
+ 'TARGETS': [
+ {
+ 'NAME' : 'var_dictionary',
+ 'TYPE' : 'main',
+ 'SOURCES' : ['var_dictionary.cc'],
+ 'LIBS' : ['ppapi_cpp', 'ppapi', 'pthread']
+ }
+ ],
+ 'DATA': [
+ 'example.js',
+ ],
+ 'DEST': 'examples/api',
+ 'NAME': 'var_dictionary',
+ 'TITLE': 'Var Dictionary',
+ 'GROUP': 'API'
+}
+
diff --git a/native_client_sdk/src/examples/api/var_dictionary/example.js b/native_client_sdk/src/examples/api/var_dictionary/example.js
new file mode 100644
index 0000000..d0c58b7
--- /dev/null
+++ b/native_client_sdk/src/examples/api/var_dictionary/example.js
@@ -0,0 +1,89 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+function attachListeners() {
+ var radioEls = document.querySelectorAll('input[type="radio"]');
+ for (var i = 0; i < radioEls.length; ++i) {
+ radioEls[i].addEventListener('click', onRadioClicked);
+ }
+
+ // Wire up the 'click' event for each function's button.
+ var functionEls = document.querySelectorAll('.function');
+ for (var i = 0; i < functionEls.length; ++i) {
+ var functionEl = functionEls[i];
+ var id = functionEl.getAttribute('id');
+ var buttonEl = functionEl.querySelector('button');
+
+ // The function name matches the element id.
+ var func = window[id + 'ButtonClicked'];
+ buttonEl.addEventListener('click', func);
+ }
+}
+
+function onRadioClicked(e) {
+ var divId = this.id.slice(5); // skip "radio"
+ var functionEls = document.querySelectorAll('.function');
+ for (var i = 0; i < functionEls.length; ++i) {
+ var visible = functionEls[i].id === divId;
+ if (functionEls[i].id === divId)
+ functionEls[i].removeAttribute('hidden');
+ else
+ functionEls[i].setAttribute('hidden');
+ }
+}
+
+function getButtonClicked(e) {
+ var key = document.getElementById('getKey').value;
+ common.naclModule.postMessage({cmd: 'Get', key: key});
+}
+
+function setButtonClicked(e) {
+ var key = document.getElementById('setKey').value;
+ var valueString = document.getElementById('setValue').value;
+ var value;
+ try {
+ value = JSON.parse(valueString);
+ } catch (e) {
+ common.logMessage('Error parsing value: ' + e);
+ return;
+ }
+
+ common.naclModule.postMessage({cmd: 'Set', key: key, value: value});
+}
+
+function deleteButtonClicked(e) {
+ var key = document.getElementById('deleteKey').value;
+ common.naclModule.postMessage({cmd: 'Delete', key: key});
+}
+
+function getkeysButtonClicked(e) {
+ common.naclModule.postMessage({cmd: 'GetKeys'});
+}
+
+function haskeyButtonClicked(e) {
+ var key = document.getElementById('haskeyKey').value;
+ common.naclModule.postMessage({cmd: 'HasKey', key: key});
+}
+
+// Called by the common.js module.
+function handleMessage(message_event) {
+ var msg = message_event.data;
+
+ var cmd = msg.cmd;
+ var result = msg.result;
+ var newDict = msg.dict;
+
+ // cmd will be empty when the module first loads and sends the contents of
+ // its dictionary.
+ //
+ // Note that cmd is a String object, not a primitive, so the comparison cmd
+ // !== '' will always fail.
+ if (cmd != '') {
+ common.logMessage(
+ 'Function ' + cmd + ' returned ' + JSON.stringify(result));
+ }
+
+ var dictEl = document.getElementById('dict');
+ dictEl.textContent = JSON.stringify(newDict, null, ' ');
+}
diff --git a/native_client_sdk/src/examples/api/var_dictionary/index.html b/native_client_sdk/src/examples/api/var_dictionary/index.html
new file mode 100644
index 0000000..b585ed0
--- /dev/null
+++ b/native_client_sdk/src/examples/api/var_dictionary/index.html
@@ -0,0 +1,102 @@
+<!DOCTYPE html>
+<html>
+ <!--
+ Copyright (c) 2013 The Chromium Authors. All rights reserved.
+ Use of this source code is governed by a BSD-style license that can be
+ found in the LICENSE file.
+ -->
+<head>
+ <meta http-equiv="Pragma" content="no-cache">
+ <meta http-equiv="Expires" content="-1">
+ <title>{{title}}</title>
+ <script type="text/javascript" src="common.js"></script>
+ <script type ="text/javascript" src="example.js"></script>
+ <style>
+ .columns {
+ display: -webkit-flex;
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ -webkit-flex-direction: row;
+ }
+ .column {
+ -webkit-flex: 1;
+ border-left: 1px solid #ccc;
+ padding: 0 8px;
+ }
+ </style>
+</head>
+<body {{attrs}} data-width="0" data-height="0">
+ <h1>{{title}}</h1>
+ <h2>Status: <code id="statusField">NO-STATUS</code></h2>
+ <p>
+ This example shows how to use the pp::VarDictionary var type.
+ </p>
+ <p>
+ Click the radio buttons below to choose a function, input some parameters,
+then click the button to call that function in the NaCl module. After every
+function call, the NaCl module's dictionary will be displayed on the right.
+ </p>
+ <div class="columns">
+ <div class="column">
+ <div>
+ <span>
+ <input type="radio" id="radioget" name="group" checked="checked">Get
+ <input type="radio" id="radioset" name="group">Set
+ <input type="radio" id="radiodelete" name="group">Delete
+ <input type="radio" id="radiohaskey" name="group">HasKey
+ <input type="radio" id="radiogetkeys" name="group">GetKeys
+ </span>
+ </div>
+ <div class="function" id="get">
+ <span>
+ Key:<input type="text" id="getKey" value="array">
+ <button>Get</button>
+ </span>
+ </div>
+ <div class="function" id="set" hidden>
+ <span>
+ Key:<input type="text" id="setKey" value="baz">
+ Value:<input type="text" id="setValue" value="[1, 2, 3]">
+ <button>Set</button>
+ <p>
+ <em>hint: type value as <a href="http://json.org">JSON</a>.
+ e.g.:</em>
+ <ul>
+ <li>4245</li>
+ <li>4245.65</li>
+ <li>"foobar"</li>
+ <li>[1, 2, 3, "foo"]</li>
+ <li>{"foo": "bar", "baz": 3}</li>
+ </ul>
+ </p>
+ </span>
+ </div>
+ <div class="function" id="delete" hidden>
+ <span>
+ Key:<input type="text" id="deleteKey" value="foo">
+ <button>Delete</button>
+ </span>
+ </div>
+ <div class="function" id="haskey" hidden>
+ <span>
+ Key:<input type="text" id="haskeyKey" value="key1">
+ <button>HasKey</button>
+ </span>
+ </div>
+ <div class="function" id="getkeys" hidden>
+ <span>
+ <button>GetKeys</button>
+ </span>
+ </div>
+ <p><b>Log:</b></p>
+ <pre id="log" style="font-weight: bold"></pre>
+ <div id="listener"></div>
+ </div>
+ <div class="column" id="dictColumn">
+ <span>Dictionary:</span>
+ <pre id="dict"></pre>
+ </div>
+ </div>
+</body>
+</html>
diff --git a/native_client_sdk/src/examples/api/var_dictionary/var_dictionary.cc b/native_client_sdk/src/examples/api/var_dictionary/var_dictionary.cc
new file mode 100644
index 0000000..9291036
--- /dev/null
+++ b/native_client_sdk/src/examples/api/var_dictionary/var_dictionary.cc
@@ -0,0 +1,158 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <math.h>
+#include <stdio.h>
+#include <string>
+
+#include "ppapi/cpp/instance.h"
+#include "ppapi/cpp/module.h"
+#include "ppapi/cpp/var.h"
+#include "ppapi/cpp/var_dictionary.h"
+
+#ifdef WIN32
+#undef PostMessage
+// Allow 'this' in initializer list
+#pragma warning(disable : 4355)
+#endif
+
+namespace {
+
+static const char kGetCommand[] = "Get";
+static const char kSetCommand[] = "Set";
+static const char kDeleteCommand[] = "Delete";
+static const char kHasKeyCommand[] = "HasKey";
+static const char kGetKeysCommand[] = "GetKeys";
+
+static const char kCommandKey[] = "cmd";
+
+pp::Var MakeResult(const char* cmd, const pp::Var& value,
+ const pp::Var& newDictionary) {
+ pp::VarDictionary dict;
+ dict.Set("cmd", cmd);
+ dict.Set("result", value);
+ dict.Set("dict", newDictionary);
+ return dict;
+}
+
+} // namespace
+
+class VarDictionaryInstance : public pp::Instance {
+ public:
+ explicit VarDictionaryInstance(PP_Instance instance)
+ : pp::Instance(instance) {}
+
+ virtual bool Init(uint32_t argc, const char* argn[], const char* argv[]) {
+ // Create the initial dictionary with some basic values.
+ dictionary_.Set("key1", "value1");
+ dictionary_.Set("foo", true);
+
+ pp::VarArray array;
+ array.Set(0, 1);
+ array.Set(1, 2);
+ array.Set(2, 3.1415);
+ array.Set(3, "four");
+ dictionary_.Set("array", array);
+ PostResult("", pp::Var());
+ return true;
+ }
+
+ private:
+ virtual void HandleMessage(const pp::Var& var_message) {
+ if (!var_message.is_dictionary()) {
+ fprintf(stderr, "Unexpected message.\n");
+ return;
+ }
+
+ pp::VarDictionary dict_message(var_message);
+ pp::Var var_command = dict_message.Get("cmd");
+ if (!var_command.is_string()) {
+ fprintf(stderr, "Expect dict item \"command\" to be a string.\n");
+ return;
+ }
+
+ std::string command = var_command.AsString();
+ if (command == kGetCommand) {
+ HandleGet(dict_message);
+ } else if (command == kSetCommand) {
+ HandleSet(dict_message);
+ } else if (command == kDeleteCommand) {
+ HandleDelete(dict_message);
+ } else if (command == kGetKeysCommand) {
+ HandleGetKeys(dict_message);
+ } else if (command == kHasKeyCommand) {
+ HandleHasKey(dict_message);
+ }
+ }
+
+ void HandleGet(const pp::VarDictionary& dict_message) {
+ pp::Var var_key = dict_message.Get("key");
+ if (!var_key.is_string()) {
+ fprintf(stderr, "HandleGet: Expect dict item \"key\" to be a string.\n");
+ return;
+ }
+
+ std::string key = var_key.AsString();
+ PostResult(kGetCommand, dictionary_.Get(key));
+ }
+
+ void HandleSet(const pp::VarDictionary& dict_message) {
+ pp::Var var_key = dict_message.Get("key");
+ if (!var_key.is_string()) {
+ fprintf(stderr, "HandleGet: Expect dict item \"key\" to be a string.\n");
+ return;
+ }
+
+ pp::Var var_value = dict_message.Get("value");
+ std::string key = var_key.AsString();
+ PostResult(kSetCommand, dictionary_.Set(key, var_value));
+ }
+
+ void HandleDelete(const pp::VarDictionary& dict_message) {
+ pp::Var var_key = dict_message.Get("key");
+ if (!var_key.is_string()) {
+ fprintf(stderr, "HandleGet: Expect dict item \"key\" to be a string.\n");
+ return;
+ }
+
+ std::string key = var_key.AsString();
+ dictionary_.Delete(key);
+ PostResult(kDeleteCommand, pp::Var());
+ }
+
+ void HandleGetKeys(const pp::VarDictionary& dict_message) {
+ PostResult(kGetKeysCommand, dictionary_.GetKeys());
+ }
+
+ void HandleHasKey(const pp::VarDictionary& dict_message) {
+ pp::Var var_key = dict_message.Get("key");
+ if (!var_key.is_string()) {
+ fprintf(stderr, "HandleGet: Expect dict item \"key\" to be a string.\n");
+ return;
+ }
+
+ std::string key = var_key.AsString();
+ PostResult(kHasKeyCommand, dictionary_.HasKey(key));
+ }
+
+ void PostResult(const char* cmd, const pp::Var& result) {
+ PostMessage(MakeResult(cmd, result, dictionary_));
+ }
+
+ pp::VarDictionary dictionary_;
+};
+
+class VarDictionaryModule : public pp::Module {
+ public:
+ VarDictionaryModule() : pp::Module() {}
+ virtual ~VarDictionaryModule() {}
+
+ virtual pp::Instance* CreateInstance(PP_Instance instance) {
+ return new VarDictionaryInstance(instance);
+ }
+};
+
+namespace pp {
+Module* CreateModule() { return new VarDictionaryModule(); }
+} // namespace pp