diff options
author | binji@chromium.org <binji@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-20 16:55:49 +0000 |
---|---|---|
committer | binji@chromium.org <binji@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-20 16:55:49 +0000 |
commit | 572560049bf254d94fb903360ad0ef4e943dd829 (patch) | |
tree | 952a5cefa721b814dc8912ed03dd385a88ae7336 /native_client_sdk/src | |
parent | c347534167ec152ddb62337081e0d447101dcbc0 (diff) | |
download | chromium_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/src')
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 |