Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(17)

Side by Side Diff: native_client_sdk/doc_generated/devguide/coding/message-system.html

Issue 438403003: [NaCl SDK Docs] Only generate one top-level <section> element. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 {{+bindTo:partials.standard_nacl_article}} 1 {{+bindTo:partials.standard_nacl_article}}
2 2
3 <section id="messaging-system"> 3 <section id="messaging-system">
4 <span id="message-system"></span><h1 id="messaging-system"><span id="message-sys tem"></span>Messaging System</h1> 4 <span id="message-system"></span><h1 id="messaging-system"><span id="message-sys tem"></span>Messaging System</h1>
5 <div class="contents local" id="contents" style="display: none"> 5 <div class="contents local" id="contents" style="display: none">
6 <ul class="small-gap"> 6 <ul class="small-gap">
7 <li><a class="reference internal" href="#reference-information" id="id2">Referen ce information</a></li> 7 <li><a class="reference internal" href="#reference-information" id="id2">Referen ce information</a></li>
8 <li><p class="first"><a class="reference internal" href="#introduction-to-the-me ssaging-system" id="id3">Introduction to the messaging system</a></p> 8 <li><p class="first"><a class="reference internal" href="#introduction-to-the-me ssaging-system" id="id3">Introduction to the messaging system</a></p>
9 <ul class="small-gap"> 9 <ul class="small-gap">
10 <li><a class="reference internal" href="#design-of-the-messaging-system" id="id4 ">Design of the messaging system</a></li> 10 <li><a class="reference internal" href="#design-of-the-messaging-system" id="id4 ">Design of the messaging system</a></li>
(...skipping 25 matching lines...) Expand all
36 Native Client application. It introduces the concept of asynchronous 36 Native Client application. It introduces the concept of asynchronous
37 programming and the basic steps required to set up a Native Client module 37 programming and the basic steps required to set up a Native Client module
38 that sends messages to and receive messages from JavaScript. This chapter 38 that sends messages to and receive messages from JavaScript. This chapter
39 assumes you are familiar with the material presented in the 39 assumes you are familiar with the material presented in the
40 <a class="reference internal" href="/native-client/devguide/coding/application-s tructure.html"><em>Application Structure</em></a> chapter.</p> 40 <a class="reference internal" href="/native-client/devguide/coding/application-s tructure.html"><em>Application Structure</em></a> chapter.</p>
41 <aside class="note"> 41 <aside class="note">
42 The &#8220;Hello, World&#8221; example for getting started with NaCl is used her e to 42 The &#8220;Hello, World&#8221; example for getting started with NaCl is used her e to
43 illustrate basic programming techniques. You can find this code in 43 illustrate basic programming techniques. You can find this code in
44 the <code>/getting_started/part2</code> directory in the Native Client SDK downl oad. 44 the <code>/getting_started/part2</code> directory in the Native Client SDK downl oad.
45 </aside> 45 </aside>
46 <section id="reference-information">
47 <h2 id="reference-information">Reference information</h2> 46 <h2 id="reference-information">Reference information</h2>
48 <p>For reference information related to the Pepper messaging API, see the 47 <p>For reference information related to the Pepper messaging API, see the
49 following documentation:</p> 48 following documentation:</p>
50 <ul class="small-gap"> 49 <ul class="small-gap">
51 <li><a class="reference external" href="/native-client/pepper_stable/cpp/classpp _1_1_instance">pp::Instance class</a> 50 <li><a class="reference external" href="/native-client/pepper_stable/cpp/classpp _1_1_instance">pp::Instance class</a>
52 HandleMessage(), PostMessage())</li> 51 HandleMessage(), PostMessage())</li>
53 <li><a class="reference external" href="/native-client/pepper_stable/cpp/classpp _1_1_module">pp::Module class</a></li> 52 <li><a class="reference external" href="/native-client/pepper_stable/cpp/classpp _1_1_module">pp::Module class</a></li>
54 <li><a class="reference external" href="/native-client/pepper_stable/cpp/classpp _1_1_var">pp::Var class</a></li> 53 <li><a class="reference external" href="/native-client/pepper_stable/cpp/classpp _1_1_var">pp::Var class</a></li>
55 </ul> 54 </ul>
56 </section><section id="introduction-to-the-messaging-system">
57 <h2 id="introduction-to-the-messaging-system">Introduction to the messaging syst em</h2> 55 <h2 id="introduction-to-the-messaging-system">Introduction to the messaging syst em</h2>
58 <p>Native Client modules and JavaScript communicate by sending messages to each 56 <p>Native Client modules and JavaScript communicate by sending messages to each
59 other. The most basic form of a message is a string. Messages support many 57 other. The most basic form of a message is a string. Messages support many
60 JavaScript types, including ints, arrays, array buffers, and dictionaries (see 58 JavaScript types, including ints, arrays, array buffers, and dictionaries (see
61 <a class="reference external" href="/native-client/pepper_stable/cpp/classpp_1_1 _var">pp::Var</a>, 59 <a class="reference external" href="/native-client/pepper_stable/cpp/classpp_1_1 _var">pp::Var</a>,
62 <a class="reference external" href="/native-client/pepper_stable/cpp/classpp_1_1 _var_array_buffer">pp:VarArrayBuffer</a>, and the 60 <a class="reference external" href="/native-client/pepper_stable/cpp/classpp_1_1 _var_array_buffer">pp:VarArrayBuffer</a>, and the
63 general <a class="reference external" href="/native-client/pepper_stable/c/struc t_p_p_b___messaging__1__0">messaging system documentation</a>). It&#8217;s up t o 61 general <a class="reference external" href="/native-client/pepper_stable/c/struc t_p_p_b___messaging__1__0">messaging system documentation</a>). It&#8217;s up t o
64 you to decide on the type of message and define how to process the messages on 62 you to decide on the type of message and define how to process the messages on
65 both the JavaScript and Native Client side. For the &#8220;Hello, World&#8221; e xample, we 63 both the JavaScript and Native Client side. For the &#8220;Hello, World&#8221; e xample, we
66 will work with string-typed messages only.</p> 64 will work with string-typed messages only.</p>
67 <p>When JavaScript posts a message to the Native Client module, the 65 <p>When JavaScript posts a message to the Native Client module, the
68 Pepper <code>HandleMessage()</code> function is invoked on the module 66 Pepper <code>HandleMessage()</code> function is invoked on the module
69 side. Similarly, the Native Client module can post a message to 67 side. Similarly, the Native Client module can post a message to
70 JavaScript, and this message triggers a JavaScript event listener for 68 JavaScript, and this message triggers a JavaScript event listener for
71 <code>message</code> events in the DOM. (See the W3C specification on 69 <code>message</code> events in the DOM. (See the W3C specification on
72 <a class="reference external" href="http://www.w3.org/TR/DOM-Level-2-Events/even ts.html">Document Object Model Events</a> for more 70 <a class="reference external" href="http://www.w3.org/TR/DOM-Level-2-Events/even ts.html">Document Object Model Events</a> for more
73 information.) In the &#8220;Hello, World&#8221; example, the JavaScript function s for 71 information.) In the &#8220;Hello, World&#8221; example, the JavaScript function s for
74 posting and handling messages are named <code>postMessage()</code> and 72 posting and handling messages are named <code>postMessage()</code> and
75 <code>handleMessage()</code> (but any names could be used). On the Native Client 73 <code>handleMessage()</code> (but any names could be used). On the Native Client
76 C++ side, the Pepper Library functions for posting and handling 74 C++ side, the Pepper Library functions for posting and handling
77 messages are:</p> 75 messages are:</p>
78 <ul class="small-gap"> 76 <ul class="small-gap">
79 <li><code>void pp::Instance::PostMessage(const Var &amp;message)</code></li> 77 <li><code>void pp::Instance::PostMessage(const Var &amp;message)</code></li>
80 <li><code>virtual void pp::Instance::HandleMessage(const Var &amp;message)</code ></li> 78 <li><code>virtual void pp::Instance::HandleMessage(const Var &amp;message)</code ></li>
81 </ul> 79 </ul>
82 <p>If you want to receive messages from JavaScript, you need to implement the 80 <p>If you want to receive messages from JavaScript, you need to implement the
83 <code>pp::Instance::HandleMessage()</code> function in your Native Client module .</p> 81 <code>pp::Instance::HandleMessage()</code> function in your Native Client module .</p>
84 <section id="design-of-the-messaging-system">
85 <h3 id="design-of-the-messaging-system">Design of the messaging system</h3> 82 <h3 id="design-of-the-messaging-system">Design of the messaging system</h3>
86 <p>The Native Client messaging system is analogous to the system used by 83 <p>The Native Client messaging system is analogous to the system used by
87 the browser to allow web workers to communicate (see the <a class="reference ext ernal" href="http://www.w3.org/TR/workers">W3 web 84 the browser to allow web workers to communicate (see the <a class="reference ext ernal" href="http://www.w3.org/TR/workers">W3 web
88 worker specification</a>). The Native 85 worker specification</a>). The Native
89 Client messaging system is designed to keep the web page responsive while the 86 Client messaging system is designed to keep the web page responsive while the
90 Native Client module is performing potentially heavy processing in the 87 Native Client module is performing potentially heavy processing in the
91 background. When JavaScript sends a message to the Native Client 88 background. When JavaScript sends a message to the Native Client
92 module, the <code>postMessage()</code> call returns as soon as it sends its mess age 89 module, the <code>postMessage()</code> call returns as soon as it sends its mess age
93 to the Native Client module. The JavaScript does not wait for a reply 90 to the Native Client module. The JavaScript does not wait for a reply
94 from Native Client, thus avoiding bogging down the main JavaScript 91 from Native Client, thus avoiding bogging down the main JavaScript
95 thread. On the JavaScript side, you set up an event listener to 92 thread. On the JavaScript side, you set up an event listener to
96 respond to the message sent by the Native Client module when it has 93 respond to the message sent by the Native Client module when it has
97 finished the requested processing and returns a message.</p> 94 finished the requested processing and returns a message.</p>
98 <p>This asynchronous processing model keeps the main thread free while 95 <p>This asynchronous processing model keeps the main thread free while
99 avoiding the following problems:</p> 96 avoiding the following problems:</p>
100 <ul class="small-gap"> 97 <ul class="small-gap">
101 <li>The JavaScript engine hangs while waiting for a synchronous call to return.< /li> 98 <li>The JavaScript engine hangs while waiting for a synchronous call to return.< /li>
102 <li>The browser pops up a dialog when a JavaScript entry point takes longer 99 <li>The browser pops up a dialog when a JavaScript entry point takes longer
103 than a few moments.</li> 100 than a few moments.</li>
104 <li>The application hangs while waiting for an unresponsive Native Client module .</li> 101 <li>The application hangs while waiting for an unresponsive Native Client module .</li>
105 </ul> 102 </ul>
106 </section></section><section id="communication-tasks-in-the-hello-world-example" >
107 <h2 id="communication-tasks-in-the-hello-world-example">Communication tasks in t he &#8220;Hello, World&#8221; example</h2> 103 <h2 id="communication-tasks-in-the-hello-world-example">Communication tasks in t he &#8220;Hello, World&#8221; example</h2>
108 <p>The following sections describe how the &#8220;Hello, World&#8221; example po sts 104 <p>The following sections describe how the &#8220;Hello, World&#8221; example po sts
109 and handles messages on both the JavaScript side and the Native Client 105 and handles messages on both the JavaScript side and the Native Client
110 side of the application.</p> 106 side of the application.</p>
111 <section id="javascript-code">
112 <h3 id="javascript-code">JavaScript code</h3> 107 <h3 id="javascript-code">JavaScript code</h3>
113 <p>The JavaScript code and HTML in the &#8220;Hello, World&#8221; example can be 108 <p>The JavaScript code and HTML in the &#8220;Hello, World&#8221; example can be
114 found in the <code>example.js</code>, <code>common.js</code>, and <code>index.ht ml</code> files. 109 found in the <code>example.js</code>, <code>common.js</code>, and <code>index.ht ml</code> files.
115 The important steps are:</p> 110 The important steps are:</p>
116 <ol class="arabic simple"> 111 <ol class="arabic simple">
117 <li>Sets up an event listener to listen for <code>message</code> events from the 112 <li>Sets up an event listener to listen for <code>message</code> events from the
118 Native Client module.</li> 113 Native Client module.</li>
119 <li>Implements an event handler that the event listener invokes to handle 114 <li>Implements an event handler that the event listener invokes to handle
120 incoming <code>message</code> events.</li> 115 incoming <code>message</code> events.</li>
121 <li>Calls <code>postMessage()</code> to communicate with the NaCl module, 116 <li>Calls <code>postMessage()</code> to communicate with the NaCl module,
122 after the page loads.</li> 117 after the page loads.</li>
123 </ol> 118 </ol>
124 <section id="step-1-from-common-js">
125 <h4 id="step-1-from-common-js">Step 1: From common.js</h4> 119 <h4 id="step-1-from-common-js">Step 1: From common.js</h4>
126 <pre class="prettyprint"> 120 <pre class="prettyprint">
127 function attachDefaultListeners() { 121 function attachDefaultListeners() {
128 // The NaCl module embed is created within the listenerDiv 122 // The NaCl module embed is created within the listenerDiv
129 var listenerDiv = document.getElementById('listener'); 123 var listenerDiv = document.getElementById('listener');
130 // ... 124 // ...
131 125
132 // register the handleMessage function as the message event handler. 126 // register the handleMessage function as the message event handler.
133 listenerDiv.addEventListener('message', handleMessage, true); 127 listenerDiv.addEventListener('message', handleMessage, true);
134 // ... 128 // ...
135 } 129 }
136 </pre> 130 </pre>
137 </section><section id="step-2-from-example-js">
138 <h4 id="step-2-from-example-js">Step 2: From example.js</h4> 131 <h4 id="step-2-from-example-js">Step 2: From example.js</h4>
139 <pre class="prettyprint"> 132 <pre class="prettyprint">
140 // This function is called by common.js when a message is received from the 133 // This function is called by common.js when a message is received from the
141 // NaCl module. 134 // NaCl module.
142 function handleMessage(message) { 135 function handleMessage(message) {
143 // In the example, we simply log the data that's received in the message. 136 // In the example, we simply log the data that's received in the message.
144 var logEl = document.getElementById('log'); 137 var logEl = document.getElementById('log');
145 logEl.textContent += message.data; 138 logEl.textContent += message.data;
146 } 139 }
147 140
148 // In the index.html we have set up the appropriate divs: 141 // In the index.html we have set up the appropriate divs:
149 &lt;body {attrs}&gt; 142 &lt;body {attrs}&gt;
150 &lt;!-- ... --&gt; 143 &lt;!-- ... --&gt;
151 &lt;div id=&quot;listener&quot;&gt;&lt;/div&gt; 144 &lt;div id=&quot;listener&quot;&gt;&lt;/div&gt;
152 &lt;div id=&quot;log&quot;&gt;&lt;/div&gt; 145 &lt;div id=&quot;log&quot;&gt;&lt;/div&gt;
153 &lt;/body&gt; 146 &lt;/body&gt;
154 </pre> 147 </pre>
155 </section><section id="step-3-from-example-js">
156 <h4 id="step-3-from-example-js">Step 3: From example.js</h4> 148 <h4 id="step-3-from-example-js">Step 3: From example.js</h4>
157 <pre class="prettyprint"> 149 <pre class="prettyprint">
158 // From example.js, Step 3: 150 // From example.js, Step 3:
159 function moduleDidLoad() { 151 function moduleDidLoad() {
160 // After the NaCl module has loaded, common.naclModule is a reference to the 152 // After the NaCl module has loaded, common.naclModule is a reference to the
161 // NaCl module's &lt;embed&gt; element. 153 // NaCl module's &lt;embed&gt; element.
162 // 154 //
163 // postMessage sends a message to it. 155 // postMessage sends a message to it.
164 common.naclModule.postMessage('hello'); 156 common.naclModule.postMessage('hello');
165 } 157 }
166 </pre> 158 </pre>
167 </section></section><section id="native-client-module">
168 <h3 id="native-client-module">Native Client module</h3> 159 <h3 id="native-client-module">Native Client module</h3>
169 <p>The C++ code in the Native Client module of the &#8220;Hello, World&#8221; ex ample:</p> 160 <p>The C++ code in the Native Client module of the &#8220;Hello, World&#8221; ex ample:</p>
170 <ol class="arabic simple"> 161 <ol class="arabic simple">
171 <li>Implements <code>pp::Instance::HandleMessage()</code> to handle messages sen t 162 <li>Implements <code>pp::Instance::HandleMessage()</code> to handle messages sen t
172 by the JavaScript.</li> 163 by the JavaScript.</li>
173 <li>Processes incoming messages. This example simply checks that JavaScript 164 <li>Processes incoming messages. This example simply checks that JavaScript
174 has sent a &#8220;hello&#8221; message and not some other message.</li> 165 has sent a &#8220;hello&#8221; message and not some other message.</li>
175 <li>Calls <code>PostMessage()</code> to send an acknowledgement back to the Java Script 166 <li>Calls <code>PostMessage()</code> to send an acknowledgement back to the Java Script
176 code. The acknowledgement is a string in the form of a <code>Var</code> that th e 167 code. The acknowledgement is a string in the form of a <code>Var</code> that th e
177 JavaScript code can process. In general, a <code>pp::Var</code> can be several 168 JavaScript code can process. In general, a <code>pp::Var</code> can be several
(...skipping 16 matching lines...) Expand all
194 std::string message = var_message.AsString(); 185 std::string message = var_message.AsString();
195 if (message == kHelloString) { 186 if (message == kHelloString) {
196 // === Step 3: Send the reply. === 187 // === Step 3: Send the reply. ===
197 // If it matches, send our response back to JavaScript. 188 // If it matches, send our response back to JavaScript.
198 pp::Var var_reply(kReplyString); 189 pp::Var var_reply(kReplyString);
199 PostMessage(var_reply); 190 PostMessage(var_reply);
200 } 191 }
201 } 192 }
202 }; 193 };
203 </pre> 194 </pre>
204 </section></section><section id="messaging-in-javascript-code-more-details">
205 <h2 id="messaging-in-javascript-code-more-details">Messaging in JavaScript code: More details.</h2> 195 <h2 id="messaging-in-javascript-code-more-details">Messaging in JavaScript code: More details.</h2>
206 <p>This section describes in more detail the messaging system code in the 196 <p>This section describes in more detail the messaging system code in the
207 JavaScript portion of the &#8220;Hello, World&#8221; example.</p> 197 JavaScript portion of the &#8220;Hello, World&#8221; example.</p>
208 <section id="setting-up-an-event-listener-and-handler">
209 <h3 id="setting-up-an-event-listener-and-handler">Setting up an event listener a nd handler</h3> 198 <h3 id="setting-up-an-event-listener-and-handler">Setting up an event listener a nd handler</h3>
210 <p>The following JavaScript code sets up an event listener for messages 199 <p>The following JavaScript code sets up an event listener for messages
211 posted by the Native Client module. It then defines a message handler 200 posted by the Native Client module. It then defines a message handler
212 that simply logs the content of messages received from the module.</p> 201 that simply logs the content of messages received from the module.</p>
213 <section id="setting-up-the-message-handler-on-load">
214 <h4 id="setting-up-the-message-handler-on-load">Setting up the &#8216;message&#8 217; handler on load</h4> 202 <h4 id="setting-up-the-message-handler-on-load">Setting up the &#8216;message&#8 217; handler on load</h4>
215 <pre class="prettyprint"> 203 <pre class="prettyprint">
216 // From common.js 204 // From common.js
217 205
218 // Listen for the DOM content to be loaded. This event is fired when 206 // Listen for the DOM content to be loaded. This event is fired when
219 // parsing of the page's document has finished. 207 // parsing of the page's document has finished.
220 document.addEventListener('DOMContentLoaded', function() { 208 document.addEventListener('DOMContentLoaded', function() {
221 var body = document.body; 209 var body = document.body;
222 // ... 210 // ...
223 var loadFunction = common.domContentLoaded; 211 var loadFunction = common.domContentLoaded;
(...skipping 13 matching lines...) Expand all
237 } 225 }
238 } 226 }
239 227
240 function attachDefaultListeners() { 228 function attachDefaultListeners() {
241 var listenerDiv = document.getElementById('listener'); 229 var listenerDiv = document.getElementById('listener');
242 // ... 230 // ...
243 listenerDiv.addEventListener('message', handleMessage, true); 231 listenerDiv.addEventListener('message', handleMessage, true);
244 // ... 232 // ...
245 } 233 }
246 </pre> 234 </pre>
247 </section><section id="implementing-the-handler">
248 <h4 id="implementing-the-handler">Implementing the handler</h4> 235 <h4 id="implementing-the-handler">Implementing the handler</h4>
249 <pre class="prettyprint"> 236 <pre class="prettyprint">
250 // From example.js 237 // From example.js
251 function handleMessage(message) { 238 function handleMessage(message) {
252 var logEl = document.getElementById('log'); 239 var logEl = document.getElementById('log');
253 logEl.textContent += message.data; 240 logEl.textContent += message.data;
254 } 241 }
255 </pre> 242 </pre>
256 <p>Note that the <code>handleMessage()</code> function is handed a message_event 243 <p>Note that the <code>handleMessage()</code> function is handed a message_event
257 containing <code>data</code> that you can display or manipulate in JavaScript. T he 244 containing <code>data</code> that you can display or manipulate in JavaScript. T he
258 &#8220;Hello, World&#8221; application simply logs this data to the <code>log</c ode> div.</p> 245 &#8220;Hello, World&#8221; application simply logs this data to the <code>log</c ode> div.</p>
259 </section></section></section><section id="messaging-in-the-native-client-module -more-details">
260 <h2 id="messaging-in-the-native-client-module-more-details">Messaging in the Nat ive Client module: More details.</h2> 246 <h2 id="messaging-in-the-native-client-module-more-details">Messaging in the Nat ive Client module: More details.</h2>
261 <p>This section describes in more detail the messaging system code in 247 <p>This section describes in more detail the messaging system code in
262 the Native Client module portion of the &#8220;Hello, World&#8221; example.</p> 248 the Native Client module portion of the &#8220;Hello, World&#8221; example.</p>
263 <section id="implementing-handlemessage">
264 <h3 id="implementing-handlemessage">Implementing HandleMessage()</h3> 249 <h3 id="implementing-handlemessage">Implementing HandleMessage()</h3>
265 <p>If you want the Native Client module to receive and handle messages 250 <p>If you want the Native Client module to receive and handle messages
266 from JavaScript, you need to implement a <code>HandleMessage()</code> function 251 from JavaScript, you need to implement a <code>HandleMessage()</code> function
267 for your module&#8217;s <code>pp::Instance</code> class. The 252 for your module&#8217;s <code>pp::Instance</code> class. The
268 <code>HelloWorldInstance::HandleMessage()</code> function examines the message 253 <code>HelloWorldInstance::HandleMessage()</code> function examines the message
269 posted from JavaScript. First it examines that the type of the 254 posted from JavaScript. First it examines that the type of the
270 <code>pp::Var</code> is indeed a string (not a double, etc.). It then 255 <code>pp::Var</code> is indeed a string (not a double, etc.). It then
271 interprets the data as a string with <code>var_message.AsString()</code>, and 256 interprets the data as a string with <code>var_message.AsString()</code>, and
272 checks that the string matches <code>kHelloString</code>. After examining the 257 checks that the string matches <code>kHelloString</code>. After examining the
273 message received from JavaScript, the code calls <code>PostMessage()</code> to 258 message received from JavaScript, the code calls <code>PostMessage()</code> to
(...skipping 20 matching lines...) Expand all
294 // Get the string message and compare it to &quot;hello&quot;. 279 // Get the string message and compare it to &quot;hello&quot;.
295 std::string message = var_message.AsString(); 280 std::string message = var_message.AsString();
296 if (message == kHelloString) { 281 if (message == kHelloString) {
297 // If it matches, send our response back to JavaScript. 282 // If it matches, send our response back to JavaScript.
298 pp::Var var_reply(kReplyString); 283 pp::Var var_reply(kReplyString);
299 PostMessage(var_reply); 284 PostMessage(var_reply);
300 } 285 }
301 } 286 }
302 }; 287 };
303 </pre> 288 </pre>
304 </section><section id="implementing-application-specific-functions">
305 <h3 id="implementing-application-specific-functions">Implementing application-sp ecific functions</h3> 289 <h3 id="implementing-application-specific-functions">Implementing application-sp ecific functions</h3>
306 <p>While the &#8220;Hello, World&#8221; example is very simple, your Native Clie nt 290 <p>While the &#8220;Hello, World&#8221; example is very simple, your Native Clie nt
307 module will likely include application-specific functions to perform 291 module will likely include application-specific functions to perform
308 custom tasks in response to messages. For example the application 292 custom tasks in response to messages. For example the application
309 could be a compression and decompression service (two functions 293 could be a compression and decompression service (two functions
310 exported). The application could set up an application-specific 294 exported). The application could set up an application-specific
311 convention that messages coming from JavaScript are colon-separated 295 convention that messages coming from JavaScript are colon-separated
312 pairs of the form <code>&lt;command&gt;:&lt;data&gt;</code>. The Native Client module 296 pairs of the form <code>&lt;command&gt;:&lt;data&gt;</code>. The Native Client module
313 message handler can then split the incoming string along the <code>:</code> 297 message handler can then split the incoming string along the <code>:</code>
314 character to determine which command to execute. If the command is 298 character to determine which command to execute. If the command is
315 &#8220;compress&#8221;, then data to process is an uncompressed string. If the 299 &#8220;compress&#8221;, then data to process is an uncompressed string. If the
316 command is &#8220;uncompress&#8221;, then data to process is an already-compress ed 300 command is &#8220;uncompress&#8221;, then data to process is an already-compress ed
317 string. After processing the data asynchronously, the application then 301 string. After processing the data asynchronously, the application then
318 returns the result to JavaScript.</p> 302 returns the result to JavaScript.</p>
319 </section><section id="sending-messages-back-to-the-javascript-code">
320 <h3 id="sending-messages-back-to-the-javascript-code">Sending messages back to t he JavaScript code</h3> 303 <h3 id="sending-messages-back-to-the-javascript-code">Sending messages back to t he JavaScript code</h3>
321 <p>The Native Client module sends messages back to the JavaScript code 304 <p>The Native Client module sends messages back to the JavaScript code
322 using <code>PostMessage()</code>. The Native Client module always returns 305 using <code>PostMessage()</code>. The Native Client module always returns
323 its values in the form of a <code>pp::Var</code> that can be processed by the 306 its values in the form of a <code>pp::Var</code> that can be processed by the
324 browser&#8217;s JavaScript. In this example, the message is posted at the 307 browser&#8217;s JavaScript. In this example, the message is posted at the
325 end of the Native Client module&#8217;s <code>HandleMessage()</code> function:</ p> 308 end of the Native Client module&#8217;s <code>HandleMessage()</code> function:</ p>
326 <pre class="prettyprint"> 309 <pre class="prettyprint">
327 PostMessage(var_reply); 310 PostMessage(var_reply);
328 </pre> 311 </pre>
329 </section><section id="sending-and-receiving-other-pp-var-types">
330 <h3 id="sending-and-receiving-other-pp-var-types">Sending and receiving other <c ode>pp::Var</code> types</h3> 312 <h3 id="sending-and-receiving-other-pp-var-types">Sending and receiving other <c ode>pp::Var</code> types</h3>
331 <p>Besides strings, <code>pp::Var</code> can represent other types of JavaScript 313 <p>Besides strings, <code>pp::Var</code> can represent other types of JavaScript
332 objects. For example, messages can be JavaScript objects. These 314 objects. For example, messages can be JavaScript objects. These
333 richer types can make it easier to implement an application&#8217;s 315 richer types can make it easier to implement an application&#8217;s
334 messaging protocol.</p> 316 messaging protocol.</p>
335 <p>To send a dictionary from the NaCl module to JavaScript simply create 317 <p>To send a dictionary from the NaCl module to JavaScript simply create
336 a <code>pp::VarDictionary</code> and then call <code>PostMessage</code> with the 318 a <code>pp::VarDictionary</code> and then call <code>PostMessage</code> with the
337 dictionary.</p> 319 dictionary.</p>
338 <pre class="prettyprint"> 320 <pre class="prettyprint">
339 pp::VarDictionary dictionary; 321 pp::VarDictionary dictionary;
(...skipping 23 matching lines...) Expand all
363 if (var.is_dictionary()) { 345 if (var.is_dictionary()) {
364 pp::VarDictionary dictionary(var); 346 pp::VarDictionary dictionary(var);
365 // Use the dictionary 347 // Use the dictionary
366 pp::VarArray keys = dictionary.GetKeys(); 348 pp::VarArray keys = dictionary.GetKeys();
367 // ... 349 // ...
368 } else { 350 } else {
369 // ... 351 // ...
370 } 352 }
371 } 353 }
372 </pre> 354 </pre>
373 </section></section></section> 355 </section>
374 356
375 {{/partials.standard_nacl_article}} 357 {{/partials.standard_nacl_article}}
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698