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

Side by Side Diff: chrome/common/extensions/docs/templates/articles/messaging.html

Issue 768373004: Improve native messaging documentation (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Move native messaging docs to new page Created 6 years 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
OLDNEW
1 <h1>Message Passing</h1> 1 <h1>Message Passing</h1>
2 2
3 3
4 <p> 4 <p>
5 Since content scripts run in the context of a web page and not the extension, 5 Since content scripts run in the context of a web page and not the extension,
6 they often need some way of communicating with the rest of the extension. For 6 they often need some way of communicating with the rest of the extension. For
7 example, an RSS reader extension might use content scripts to detect the 7 example, an RSS reader extension might use content scripts to detect the
8 presence of an RSS feed on a page, then notify the background page in order to 8 presence of an RSS feed on a page, then notify the background page in order to
9 display a page action icon for that page. 9 display a page action icon for that page.
10 10
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after
272 chrome.runtime.onMessageExternal.addListener( 272 chrome.runtime.onMessageExternal.addListener(
273 function(request, sender, sendResponse) { 273 function(request, sender, sendResponse) {
274 if (sender.url == blacklistedWebsite) 274 if (sender.url == blacklistedWebsite)
275 return; // don't allow this web page access 275 return; // don't allow this web page access
276 if (request.openUrlInEditor) 276 if (request.openUrlInEditor)
277 openUrl(request.openUrlInEditor); 277 openUrl(request.openUrlInEditor);
278 }); 278 });
279 </pre> 279 </pre>
280 280
281 281
282 <!-- Anchors to make sure that pages that link to a previous version of the
283 documentation do not break. -->
284 <a id="native-messaging-host"></a>
285 <a id="native-messaging-client"></a>
282 <h2 id="native-messaging">Native messaging</h2> 286 <h2 id="native-messaging">Native messaging</h2>
283 <p> 287 <p>
284 Extensions can exchange messages with native applications. Native 288 Extensions and apps <a href="nativeMessaging#native-messaging-client">can
285 applications that support this feature must register a <em>native messaging 289 exchange messages</a> with native applications that are registered as a
286 host</em> that knows how to communicate with the extension. Chrome starts the 290 <a href="nativeMessaging#native-messaging-host">native messaging host</a>.
287 host in a separate process and communicates with it using standard input and 291 To learn more about this feature, see <a href="nativeMessaging">Native messaging </a>.
288 standard output streams.
289 292
290 <h3 id="native-messaging-host">Native messaging host</h3>
291 <p>
292 In order to register a native messaging host the application must install a
293 manifest file that defines the native messaging host configuration. Below is an
294 example of the manifest file:
295 <pre data-filename="manifest.json">
296 {
297 "name": "com.my_company.my_application",
298 "description": "My Application",
299 "path": "C:\\Program Files\\My Application\\chrome_native_messaging_host.exe",
300 "type": "stdio",
301 "allowed_origins": [
302 "chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"
303 ]
304 }
305 </pre>
306
307 <p>Native messaging host manifest file contains the following fields:
308 <table class="simple">
309 <tr>
310 <th>Name</th>
311 <th>Description</th>
312 </tr>
313 <tr>
314 <td><code>name</code></td>
315 <td>Name of the native messaging host. Clients pass this string to
316 $(ref:runtime.connectNative) or $(ref:runtime.sendNativeMessage).</td>
317 </tr>
318 <tr>
319 <td><code>description</code></td>
320 <td>Short application description.</td>
321 </tr>
322 <tr>
323 <td><code>path</code></td>
324 <td>Path to the native messaging host binary. On Linux and OSX the path must
325 be absolute. On Windows it can be relative to the directory in which the
326 manifest file is located.</td>
327 </tr>
328 <tr>
329 <td><code>type</code></td>
330 <td>Type of the interface used to communicate with the native messaging
331 host. Currently there is only one possible value for this parameter:
332 <code>stdio</code>. It indicates that Chrome should use <code>stdin</code>
333 and <code>stdout</code> to communicate with the host.</td>
334 </tr>
335 <tr>
336 <td><code>allowed_origins</code></td>
337 <td>List of extensions that should have access to the native messaging host. </td>
338 </tr>
339 </table>
340
341 <p>Location of the manifest file depends on the platform:
342
343 <dl>
344 <dt>Windows:</dt>
345 <dd>The manifest file can be located anywhere in the file system.
346 The application installer must create registry key
347 <code>HKEY_LOCAL_MACHINE\SOFTWARE\Google\Chrome\NativeMessagingHosts\<em>co m.my_company.my_application</em></code>
348 or
349 <code>HKEY_CURRENT_USER\SOFTWARE\Google\Chrome\NativeMessagingHosts\<em>com .my_company.my_application</em></code>,
350 and set default value of that key to the full path to the manifest file.
351 </dd>
352
353 <dt>OSX:</dt>
354 <dd>The manifest file must be placed at
355 <code>/Library/Google/Chrome/NativeMessagingHosts/<em>com.my_company.my_appl ication</em>.json</code>,
356 or, for applications installed on user level,
357 <code>~/Library/Application Support/Google/Chrome/NativeMessagingHosts/<em>c om.my_company.my_application</em>.json</code>.
358 </dd>
359
360 <dt>Linux:</dt>
361 <dd>The manifest file must be placed at
362 <code>/etc/opt/chrome/native-messaging-hosts/<em>com.my_company.my_applicati on</em>.json</code>,
363 or, for applications installed on user level,
364 <code>~/.config/google-chrome/NativeMessagingHosts/<em>com.my_company.my_app lication</em>.json</code>.
365 </dd>
366 </dl>
367
368 <p>
369 Chrome starts each native messaging host in a separate process and communicates
370 with it using standard input (<code>stdin</code>) and standard output
371 (<code>stdout</code>). The same format is used to send messages in both
372 directions: each message is serialized using JSON, UTF-8 encoded
373 and is preceded with 32-bit message length in native byte order.
374
375 <p>
376 When a messaging port is created using $(ref:runtime.connectNative) Chrome
377 starts native messaging host process and keeps it running until the port is
378 destroyed. On the other hand, when a message is sent using
379 $(ref:runtime.sendNativeMessage), without creating a messaging port, Chrome star ts
380 a new native messaging host process for each message. In that case the first
381 message generated by the host process is handled as a response to the original
382 request, i.e. Chrome will pass it to the response callback specified when
383 $(ref:runtime.sendNativeMessage) is called. All other messages generated by the
384 native messaging host in that case are ignored.
385
386 <h3 id="native-messaging-client">Connecting to a native application</h3>
387 <p>
388 Sending and receiving messages to and from a native application is very similar
389 to cross-extension messaging. The main difference is that
390 $(ref:runtime.connectNative) is used instead of $(ref:runtime.connect),
391 and $(ref:runtime.sendNativeMessage) is used instead of $(ref:runtime.sendMessag e).
392
393 <p>
394 The Following example creates a $(ref:runtime.Port) object that's connected to n ative
395 messaging host <code>com.my_company.my_application</code>, starts listening for
396 messages from that port and sends one outgoing message:
397 <pre>
398 var port = chrome.runtime.connectNative('com.my_company.my_application');
399 port.onMessage.addListener(function(msg) {
400 console.log("Received" + msg);
401 });
402 port.onDisconnect.addListener(function() {
403 console.log("Disconnected");
404 });
405 port.postMessage({ text: "Hello, my_application" });
406 </pre>
407
408 <p>
409 $(ref:runtime.sendNativeMessage) can be used to send a message to native
410 application without creating a port, e.g.:
411 <pre>
412 chrome.runtime.sendNativeMessage('com.my_company.my_application',
413 { text: "Hello" },
414 function(response) {
415 console.log("Received " + response);
416 });
417 </pre>
418 293
419 <h2 id="security-considerations">Security considerations</h2> 294 <h2 id="security-considerations">Security considerations</h2>
420 295
421 <p> 296 <p>
422 When receiving a message from a content script or another extension, your 297 When receiving a message from a content script or another extension, your
423 background page should be careful not to fall victim to <a 298 background page should be careful not to fall victim to <a
424 href="http://en.wikipedia.org/wiki/Cross-site_scripting">cross-site 299 href="http://en.wikipedia.org/wiki/Cross-site_scripting">cross-site
425 scripting</a>. Specifically, avoid using dangerous APIs such as the 300 scripting</a>. Specifically, avoid using dangerous APIs such as the
426 below: 301 below:
427 </p> 302 </p>
(...skipping 24 matching lines...) Expand all
452 document.getElementById("resp").innerText = response.farewell; 327 document.getElementById("resp").innerText = response.farewell;
453 }); 328 });
454 </pre> 329 </pre>
455 330
456 <h2 id="examples">Examples</h2> 331 <h2 id="examples">Examples</h2>
457 332
458 <p> 333 <p>
459 You can find simple examples of communication via messages in the 334 You can find simple examples of communication via messages in the
460 <a href="http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extension s/docs/examples/api/messaging/">examples/api/messaging</a> 335 <a href="http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extension s/docs/examples/api/messaging/">examples/api/messaging</a>
461 directory. 336 directory.
462 <a href="http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extension s/docs/examples/api/nativeMessaging/">examples/api/nativeMessaging</a> 337 The <a href="nativeMessaging#examples">native messaging sample</a> demonstrates
463 contains an example application that uses native messaging. 338 how a Chrome app can communicate with a native app.
464 For more examples and for help in viewing the source code, see 339 For more examples and for help in viewing the source code, see
465 <a href="samples">Samples</a>. 340 <a href="samples">Samples</a>.
466 </p> 341 </p>
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698