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

Unified 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: Add extra installation instructions for Windows 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/common/extensions/docs/examples/api/nativeMessaging/host/uninstall_host.bat ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/common/extensions/docs/templates/articles/messaging.html
diff --git a/chrome/common/extensions/docs/templates/articles/messaging.html b/chrome/common/extensions/docs/templates/articles/messaging.html
index a6066e80e9542f44b05b0263083f989e83e775c5..c4f79fc9f34500f3cc69413c5762dee01eac9400 100644
--- a/chrome/common/extensions/docs/templates/articles/messaging.html
+++ b/chrome/common/extensions/docs/templates/articles/messaging.html
@@ -304,8 +304,9 @@ example of the manifest file:
}
</pre>
-<p>Native messaging host manifest file contains the following fields:
-<table class="simple">
+<p>The native messaging host manifest file must be valid JSON and contains the
+following fields:
+<table class="simple" id="native-messaging-host-manifest">
<tr>
<th>Name</th>
<th>Description</th>
@@ -313,7 +314,11 @@ example of the manifest file:
<tr>
<td><code>name</code></td>
<td>Name of the native messaging host. Clients pass this string to
- $(ref:runtime.connectNative) or $(ref:runtime.sendNativeMessage).</td>
+ $(ref:runtime.connectNative) or $(ref:runtime.sendNativeMessage).
+ This name can only contain lowercase alphanumeric characters, underscores
+ and dots. The name cannot start or end with a dot, and a dot cannot be
+ followed by another dot.
+ </td>
</tr>
<tr>
<td><code>description</code></td>
@@ -334,43 +339,79 @@ example of the manifest file:
</tr>
<tr>
<td><code>allowed_origins</code></td>
- <td>List of extensions that should have access to the native messaging host.</td>
+ <td>List of extensions that should have access to the native messaging host.
+ Wildcards such as <code>chrome-extension://*/*</code> are <em>not</em>
+ allowed.</td>
</tr>
</table>
+</p>
+
+<h4 id="native-messaging-host-location">Native messaging host location</h4>
+<p>The location of the manifest file depends on the platform.</p>
+
+<p id="native-messaging-host-location-windows">
+On <b>Windows</b>, the manifest file can be located anywhere in the file system.
+The application installer must create registry key
+<code>HKEY_LOCAL_MACHINE\SOFTWARE\Google\Chrome\NativeMessagingHosts\<em>com.my_company.my_application</em></code>
+or
+<code>HKEY_CURRENT_USER\SOFTWARE\Google\Chrome\NativeMessagingHosts\<em>com.my_company.my_application</em></code>,
+and set default value of that key to the full path to the manifest file.
+For example, using the following command:<br>
+<pre>
+REG ADD "HKCU\Software\Google\Chrome\NativeMessagingHosts\<em>com.my_company.my_application</em>" /ve /t REG_SZ /d "C:\path\to\nmh-manifest.json" /f
+</pre>
+or using the following <code>.reg</code> file:
+<pre>
+Windows Registry Editor Version 5.00
+[HKEY_CURRENT_USER\Software\Google\Chrome\NativeMessagingHosts\<em>com.my_company.my_application</em>]
+@="C:\\path\\to\\nmh-manifest.json"
+</pre>
+When Chrome looks for native messaging hosts, first the 32-bit registry is
+queried, then the 64-bit registry.
+</p>
-<p>Location of the manifest file depends on the platform:
+<p id="native-messaging-host-location-nix">
+On <b>OS X</b> and <b>Linux</b>, the location of the native messaging host's
+manifest file varies by the browser (Google Chrome or Chromium).
+The system-wide native messaging hosts are looked up at a fixed location,
+while the user-level native messaging hosts are looked up in a subdirectory within the
+<a href="https://www.chromium.org/user-experience/user-data-directory">user profile directory</a>
+called <code>NativeMessagingHosts</code>.
+</p>
Sergey Ulanov 2014/12/10 18:42:47 nit: don't need </p> here and below. http://stacko
robwu 2014/12/10 23:09:41 Done.
+
+<p>
+<dl>
+<dt>OS X (system-wide)</dt>
+<dd>Google Chrome: <code>/Library/Google/Chrome/NativeMessagingHosts/<em>com.my_company.my_application</em>.json</code></dd>
+<dd>Chromium: <code>/Library/Application Support/Chromium/NativeMessagingHosts/<em>com.my_company.my_application</em>.json</code></dd>
+<dt>OS X (user-specific, <em>default</em> path)</dt>
+<dd>Google Chrome: <code>~/Library/Application Support/Google/Chrome/Default/NativeMessagingHosts/<em>com.my_company.my_application</em>.json</code></dd>
+<dd>Chromium: <code>~/Library/Application Support/Chromium/Default/NativeMessagingHosts/<em>com.my_company.my_application</em>.json</code></dd>
+</dl>
+</p>
+<p>
<dl>
- <dt>Windows:</dt>
- <dd>The manifest file can be located anywhere in the file system.
- The application installer must create registry key
- <code>HKEY_LOCAL_MACHINE\SOFTWARE\Google\Chrome\NativeMessagingHosts\<em>com.my_company.my_application</em></code>
- or
- <code>HKEY_CURRENT_USER\SOFTWARE\Google\Chrome\NativeMessagingHosts\<em>com.my_company.my_application</em></code>,
- and set default value of that key to the full path to the manifest file.
- </dd>
-
- <dt>OSX:</dt>
- <dd>The manifest file must be placed at
- <code>/Library/Google/Chrome/NativeMessagingHosts/<em>com.my_company.my_application</em>.json</code>,
- or, for applications installed on user level,
- <code>~/Library/Application Support/Google/Chrome/NativeMessagingHosts/<em>com.my_company.my_application</em>.json</code>.
- </dd>
-
- <dt>Linux:</dt>
- <dd>The manifest file must be placed at
- <code>/etc/opt/chrome/native-messaging-hosts/<em>com.my_company.my_application</em>.json</code>,
- or, for applications installed on user level,
- <code>~/.config/google-chrome/NativeMessagingHosts/<em>com.my_company.my_application</em>.json</code>.
- </dd>
+<dt>Linux (system-wide)</dt>
+<dd>Google Chrome: <code>/etc/opt/chrome/native-messaging-hosts/<em>com.my_company.my_application</em>.json</code></dd>
+<dd>Chromium: <code>/etc/chromium/native-messaging-hosts/<em>com.my_company.my_application</em>.json</code></dd>
+<dt>Linux (user-specific, <em>default</em> path)</dt>
+<dd>Google Chrome: <code>~/.config/google-chrome/NativeMessagingHosts/<em>com.my_company.my_application</em>.json</code></dd>
+<dd>Chromium: <code>~/.config/chromium/NativeMessagingHosts/<em>com.my_company.my_application</em>.json</code></dd>
</dl>
+</p>
+<h4 id="native-messaging-host-protocol">Native messaging protocol</h4>
<p>
Chrome starts each native messaging host in a separate process and communicates
with it using standard input (<code>stdin</code>) and standard output
(<code>stdout</code>). The same format is used to send messages in both
directions: each message is serialized using JSON, UTF-8 encoded
and is preceded with 32-bit message length in native byte order.
+The maximum size of a single message from the native messaging host is 1 MB,
+mainly to protect Chrome from misbehaving native applications. The maximum
+size of the message sent to the native messaging host is 4 GB.
+</p>
<p>
When a messaging port is created using $(ref:runtime.connectNative) Chrome
@@ -381,7 +422,7 @@ a new native messaging host process for each message. In that case the first
message generated by the host process is handled as a response to the original
request, i.e. Chrome will pass it to the response callback specified when
$(ref:runtime.sendNativeMessage) is called. All other messages generated by the
-native messaging host in that case are ignored.
+native messaging host in that case are ignored.</p>
<h3 id="native-messaging-client">Connecting to a native application</h3>
<p>
@@ -416,6 +457,99 @@ chrome.runtime.sendNativeMessage('com.my_company.my_application',
});
</pre>
+<h3 id="native-messaging-debugging">Debugging native messaging</h3>
+<p>
+When the native messaging host fails to start, writes to <code>stderr</code> or
+when it violates the communication protocol, output is written to the error log
+of Chrome.
+On Linux and OS X, this log can easily be accessed by starting Chrome from the
+command line and watching its output in the terminal.
+On Windows, use <code>--enable-logging</code> as explained at
+<a href="https://www.chromium.org/for-testers/enable-logging">How to enable logging</a>.
+</p>
+
+Here are some errors and tips for solving the issues:
+<dl>
+ <dt>Failed to start native messaging host.</dt>
Sergey Ulanov 2014/12/10 18:42:47 nit: don't need to close <dt>, same for <dd>
robwu 2014/12/10 23:09:41 Done.
+ <dd>Check whether you have sufficient permissions to execute the file.</dd>
+
+ <dt>Invalid native messaging host name specified.</dt>
+ <dd>Check whether the name contains any invalid characters.
+ Only lowercase alphanumeric characters, underscores and dots are allowed.
+ A name cannot start or end with a dot, and a dot cannot be followed by
+ another dot.</dd>
+
+ <dt>Native host has exited.</dt>
+ <dd>The pipe to the native messaging host was broken before the message was
+ read by Chrome. This is most likely initiated from your native messaging host.
+ </dd>
+
+ <dt>Specified native messaging host not found.</dt>
+ <dd>
+ <ul>
+ <li>Is the name spelled correctly in the extension and in the manifest file?</li>
Sergey Ulanov 2014/12/10 18:42:47 nit: don't need to close <li> in html
robwu 2014/12/10 23:09:41 Done.
+ <li>
+ Is the manifest put in the right directory and with the correct name? See
+ <a href="#native-messaging-host-location">native messaging host location</a>
+ for the expected formats.
+ </li>
+ <li>
+ Is the manifest file in the correct format? In particular, is the JSON
+ syntax correct and do the values match the definition of a
+ <a href="native-messaging-host-manifest">native messaging host manifest</a>?
+ </li>
+ <li>Does the file specified in <code>path</code> exist? On Windows, paths
+ may be relative, but on OS X and Linux, the paths must be absolute.</li>
+ </ul>
+ </dd>
+
+ <dt>Native messaging host <em>host name</em> is not registered. (Windows-only)</dt>
+ <dd>The native messaging host was not found in the Windows registry. Double-check
+ using <code>regedit</code> whether the key was really created and matches the
+ required format as documented at
+ <a href="#native-messaging-host-location">native messaging host location</a>.
+ </dd>
+
+ <dt>Access to the specified native messaging host is forbidden.</dt>
+ <dd>Is the extension's origin listed in <code>allowed_origins</code>?</dd>
+
+ <dt>Error when communicating with the native messaging host.</dt>
+ <dd>This is a very common error and indicates an incorrect implementation of
+ the communication protocol in the native messaging host.
+ <ul>
+ <li>
+ Make sure that all output in <code>stdout</code> adheres to the native
+ messaging protocol. If you want to print some data for debugging purposes,
+ write to <code>stderr</code>.
+ </li>
+ <li>
+ Make sure that the 32-bit message length is in the platform's native
+ integer format (little-endian / big-endian).
+ </li>
+ <li>
+ The message length must not exceed 1024*1024.
+ </li>
+ <li>
+ The message size must be equal to the number of bytes in the message.
+ This may differ from the "length" of a string, because characters may be
+ represented by multiple bytes.
+ </li>
+ <li>
+ <b>Windows-only: Make sure that the program's I/O mode is set to
+ <code>O_BINARY</code></b>. By default, the I/O mode is <code>O_TEXT</code>,
Sergey Ulanov 2014/12/10 18:42:47 Please add link to MSDN for how the mode can be ch
robwu 2014/12/10 23:09:41 Done.
+ which replaces line breaks (<code>\n</code> = <code>0A</code>) with
+ Windows-style line endings (<code>\r\n</code> = <code>0D 0A</code>).<br>
+ This modification is problematic. For example, if your message length is
+ 10, then the 32-bit integer is <code>00 00 00 0A</code>.
+ When <code>0D</code> is inserted before <code>0A</code>, the message
+ header becomes <code>00 00 00 0D 0A</code>. Only the first four bytes
+ represent a 32-bit integer, so the length is <code>0D</code> = 13.
+ This length is different from the original message length and incorrect!
+ </li>
+ </ul>
+ </dd>
+</dl>
+
<h2 id="security-considerations">Security considerations</h2>
<p>
@@ -459,7 +593,7 @@ chrome.tabs.sendMessage(tab.id, {greeting: "hello"}, function(response) {
You can find simple examples of communication via messages in the
<a href="http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/api/messaging/">examples/api/messaging</a>
directory.
-<a href="http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/api/nativeMessaging/">examples/api/nativeMessaging</a>
+<a href="https://chromium.googlesource.com/chromium/src/+/master/chrome/common/extensions/docs/examples/api/nativeMessaging">examples/api/nativeMessaging</a>
contains an example application that uses native messaging.
Also see the
<a href="http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/howto/contentscript_xhr">contentscript_xhr</a> example,
« no previous file with comments | « chrome/common/extensions/docs/examples/api/nativeMessaging/host/uninstall_host.bat ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698