Index: native_client_sdk/src/doc/_developer.chrome.com_generated/devguide/tutorial/tutorial-part2.html |
diff --git a/native_client_sdk/src/doc/_developer.chrome.com_generated/devguide/tutorial/tutorial-part2.html b/native_client_sdk/src/doc/_developer.chrome.com_generated/devguide/tutorial/tutorial-part2.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..edcaf74b5b7f10e0d3134a637c0f3a6bbb8d7ac6 |
--- /dev/null |
+++ b/native_client_sdk/src/doc/_developer.chrome.com_generated/devguide/tutorial/tutorial-part2.html |
@@ -0,0 +1,439 @@ |
+{{+bindTo:partials.standard_nacl_article}} |
+ |
+<section id="c-tutorial-getting-started-part-2"> |
+<span id="tutorial2"></span><h1 id="c-tutorial-getting-started-part-2"><span id="tutorial2"></span>C++ Tutorial: Getting Started (Part 2)</h1> |
+<div class="contents local topic" id="contents"> |
+<ul class="small-gap"> |
+<li><a class="reference internal" href="#overview" id="id1">Overview</a></li> |
+<li><p class="first"><a class="reference internal" href="#using-the-native-client-sdk-build-system" id="id2">Using the Native Client SDK build system</a></p> |
+<ul class="small-gap"> |
+<li><a class="reference internal" href="#simplifying-the-makefile" id="id3">Simplifying the Makefile</a></li> |
+<li><a class="reference internal" href="#choosing-valid-toolchains-and-including-common-mk" id="id4">Choosing valid toolchains, and including common.mk</a></li> |
+<li><a class="reference internal" href="#configuring-your-project" id="id5">Configuring your project</a></li> |
+<li><a class="reference internal" href="#build-macros" id="id6">Build macros</a></li> |
+</ul> |
+</li> |
+<li><p class="first"><a class="reference internal" href="#making-index-html-work-for-chrome-apps" id="id7">Making index.html work for Chrome Apps</a></p> |
+<ul class="small-gap"> |
+<li><a class="reference internal" href="#csp-rules" id="id8">CSP rules</a></li> |
+<li><a class="reference internal" href="#making-index-html-csp-compliant" id="id9">Making index.html CSP-compliant</a></li> |
+<li><a class="reference internal" href="#making-index-html-support-different-toolchains-and-configurations" id="id10">Making index.html support different toolchains and configurations</a></li> |
+</ul> |
+</li> |
+<li><p class="first"><a class="reference internal" href="#sharing-common-code-with-common-js" id="id11">Sharing common code with common.js</a></p> |
+<ul class="small-gap"> |
+<li><a class="reference internal" href="#loading-the-page-and-creating-the-module" id="id12">Loading the page and creating the module</a></li> |
+</ul> |
+</li> |
+<li><a class="reference internal" href="#example-specific-behavior-with-example-js" id="id13">Example-specific behavior with example.js</a></li> |
+</ul> |
+</div> |
+<section id="overview"> |
+<h2 id="overview">Overview</h2> |
+<p>This tutorial shows how to convert the finished PNaCl web application from |
+<a class="reference internal" href="/native-client/devguide/tutorial/tutorial-part1.html"><em>Part 1</em></a> to use the Native Client SDK build system and |
+common JavaScript files. It also demonstrates some techniques to make your |
+web application <cite>Content Security Policy (CSP)-compliant |
+<http://developer.chrome.com/apps/contentSecurityPolicy.html></cite>, which is |
+necessary for <a class="reference external" href="https://developer.chrome.com/apps/about_apps.html">Chrome Apps</a>.</p> |
+<p>Using the Native Client SDK build system makes it easy to build with all of the |
+SDK toolchains, and switch between the Debug and Release configurations. It |
+also simplifies the makefiles for your project, as we’ll see in the next |
+section. Finally, it adds some useful commands for <a class="reference internal" href="/native-client/sdk/examples.html#id1"><em>running</em></a> and <a class="reference internal" href="/native-client/sdk/examples.html#debugging-the-sdk-examples"><em>debugging</em></a> |
+your application.</p> |
+<p>The finished code for this example can be found in the |
+<code>pepper_$(VERSION)/getting_started/part2</code> directory in the Native Client SDK |
+download.</p> |
+</section><section id="using-the-native-client-sdk-build-system"> |
+<h2 id="using-the-native-client-sdk-build-system">Using the Native Client SDK build system</h2> |
+<p>This section describes how to use the SDK build system. To do so, we’ll make |
+changes in the makefile. Because the makefile in part1 and part2 are so |
+different, it is easier to start from scratch. Here is the contents of the new |
+makefile. The following sections will describe it in more detail.</p> |
+<section id="simplifying-the-makefile"> |
+<h3 id="simplifying-the-makefile">Simplifying the Makefile</h3> |
+<p>The makefile from part1 only supports one toolchain (PNaCl) and one |
+configuration (Release). It also only supports one source file. It’s relatively |
+simple, but if we want to add support for multiple toolchains, configurations, |
+source files, or build steps, it would grow increasingly complex. The SDK build |
+system uses a set of variables and macros to make this possible, without |
+significantly increasing the complexity of the makefile.</p> |
+<p>Here is the new makefile, supporting three toolchains (PNaCl, Newlib NaCl, |
+Glibc NaCl) and two configurations (Debug, Release).</p> |
+<pre class="prettyprint"> |
+VALID_TOOLCHAINS := pnacl newlib glibc |
+ |
+NACL_SDK_ROOT ?= $(abspath $(CURDIR)/../..) |
+include $(NACL_SDK_ROOT)/tools/common.mk |
+ |
+TARGET = part2 |
+LIBS = ppapi_cpp ppapi |
+ |
+CFLAGS = -Wall |
+SOURCES = hello_tutorial.cc |
+ |
+# Build rules generated by macros from common.mk: |
+ |
+$(foreach src,$(SOURCES),$(eval $(call COMPILE_RULE,$(src),$(CFLAGS)))) |
+ |
+ifeq ($(CONFIG),Release) |
+$(eval $(call LINK_RULE,$(TARGET)_unstripped,$(SOURCES),$(LIBS),$(DEPS))) |
+$(eval $(call STRIP_RULE,$(TARGET),$(TARGET)_unstripped)) |
+else |
+$(eval $(call LINK_RULE,$(TARGET),$(SOURCES),$(LIBS),$(DEPS))) |
+endif |
+ |
+$(eval $(call NMF_RULE,$(TARGET),)) |
+</pre> |
+</section><section id="choosing-valid-toolchains-and-including-common-mk"> |
+<h3 id="choosing-valid-toolchains-and-including-common-mk">Choosing valid toolchains, and including common.mk</h3> |
+<p>The makefile begins by specifying the toolchains that are valid for this |
+project. The Native Client SDK build system supports multi-toolchain projects |
+for its examples and libraries, but generally you will choose one toolchain |
+when you begin your project and never change it. Please see the |
+<a class="reference internal" href="/native-client/overview.html#toolchains"><em>Toolchains section of the Native Client overview</em></a> for more |
+information.</p> |
+<p>For this example, we support the <code>pnacl</code>, <code>newlib</code> and <code>glibc</code> toolchains.</p> |
+<pre class="prettyprint"> |
+VALID_TOOLCHAINS := pnacl newlib glibc |
+</pre> |
+<p>Next, as a convenience, we specify where to find <code>NACL_SDK_ROOT</code>. Because |
+this example is located in <code>pepper_$(VERSION)/getting_started/part2</code>, the |
+root of the SDK is two directories up.</p> |
+<pre class="prettyprint"> |
+NACL_SDK_ROOT ?= $(abspath $(CURDIR)/../..) |
+</pre> |
+<aside class="note"> |
+<blockquote> |
+<div>In your own projects, you can use the absolute path to your installed SDK |
+here. You can also override this default by setting the <code>NACL_SDK_ROOT</code> |
+environment variable. See <a class="reference internal" href="/native-client/devguide/tutorial/tutorial-part1.html#tutorial-step-5"><em>Step 5 of Part 1 of this tutorial</em></a> for more details.</div></blockquote> |
+ |
+</aside> |
+<p>Next, we include the file <code>tools/common.mk</code>. This file provides the |
+functionality for the Native Client SDK build system, including new build rules |
+to compile and link a project, which we’ll use below.</p> |
+<pre class="prettyprint"> |
+include $(NACL_SDK_ROOT)/tools/common.mk |
+</pre> |
+</section><section id="configuring-your-project"> |
+<h3 id="configuring-your-project">Configuring your project</h3> |
+<p>After including <code>tools/common.mk</code>, we configure the project by specifying its |
+name, the sources and libraries it uses:</p> |
+<pre class="prettyprint"> |
+TARGET = part2 |
+LIBS = ppapi_cpp ppapi |
+ |
+CFLAGS = -Wall |
+SOURCES = hello_tutorial.cc |
+</pre> |
+<p>These variable names are not required and not used by the SDK build system; |
+they are only used in the rules described below. By convention, all SDK |
+makefiles use the following variables:</p> |
+<dl class="docutils"> |
+<dt>TARGET</dt> |
+<dd>The name of the project to build. This variable determines the name of the |
+library or executable that will be generated. In the above example, we call |
+the target <code>part2</code>, which will generate an executable called |
+<code>part2.pexe</code> for PNaCl. For NaCl toolchains, the executable’s file name |
+will be given a suffix for its architecture. For example, the ARM executable |
+is called <code>part2_arm.nexe</code>.</dd> |
+<dt>LIBS</dt> |
+<dd>A list of libraries that this executable needs to link against. The library |
+search path is already set up to only look in the directory for the current |
+toolchain and architecture. In this example, we link against <code>ppapi_cpp</code> |
+and <code>ppapi</code>. <code>ppapi_cpp</code> is needed to use the <a class="reference external" href="https://developers.google.com/native-client/peppercpp/">Pepper C++ interface</a>. <code>ppapi</code> is |
+needed for communicating with the browser.</dd> |
+<dt>CFLAGS</dt> |
+<dd>A list of extra flags to pass to the compiler. In this example, we pass |
+<code>-Wall</code>, which turns on all warnings.</dd> |
+<dt>LDFLAGS</dt> |
+<dd>A list of additional flags to pass to the linker. This example does not need |
+any special linker flags, so this variable is omitted.</dd> |
+<dt>SOURCES</dt> |
+<dd>A list of C or C++ sources to compile, separated by spaces. If you have a |
+long list of sources, it may be easier to read if you put each file on its |
+own line, and use <code>\</code> as a line-continuation character. Here’s an example:</dd> |
+</dl> |
+<pre class="prettyprint"> |
+SOURCES = foo.cc \ |
+ bar.cc \ |
+ baz.cc \ |
+ quux.cc |
+</pre> |
+</section><section id="build-macros"> |
+<h3 id="build-macros">Build macros</h3> |
+<p>For many projects, the following build macros do not need to be changed; they |
+will use the variables we’ve defined above.</p> |
+<pre class="prettyprint"> |
+$(foreach src,$(SOURCES),$(eval $(call COMPILE_RULE,$(src),$(CFLAGS)))) |
+ |
+ifeq ($(CONFIG),Release) |
+$(eval $(call LINK_RULE,$(TARGET)_unstripped,$(SOURCES),$(LIBS),$(DEPS))) |
+$(eval $(call STRIP_RULE,$(TARGET),$(TARGET)_unstripped)) |
+else |
+$(eval $(call LINK_RULE,$(TARGET),$(SOURCES),$(LIBS),$(DEPS))) |
+endif |
+ |
+$(eval $(call NMF_RULE,$(TARGET),)) |
+</pre> |
+<p>The first line defines rules to compile each source in <code>SOURCES</code>, using the |
+flags in <code>CFLAGS</code>:</p> |
+<pre class="prettyprint"> |
+$(foreach src,$(SOURCES),$(eval $(call COMPILE_RULE,$(src),$(CFLAGS)))) |
+</pre> |
+<p>The next six lines define rules to link the object files into one or more |
+executables. When <code>TOOLCHAIN</code> is <code>pnacl</code>, there is only one executable |
+generated: in the example above, <code>part2.pexe</code>. When using a NaCl toolchain, |
+there will be three executables generated, one for each architecture: in the |
+example above, <code>part2_arm.nexe</code>, <code>part2_x86_32.nexe</code> and |
+<code>part2_x86_64.nexe</code>.</p> |
+<p>When <code>CONFIG</code> is <code>Release</code>, each executable is also stripped to remove |
+debug information and reduce the file size:</p> |
+<pre class="prettyprint"> |
+ifeq ($(CONFIG),Release) |
+$(eval $(call LINK_RULE,$(TARGET)_unstripped,$(SOURCES),$(LIBS),$(DEPS))) |
+$(eval $(call STRIP_RULE,$(TARGET),$(TARGET)_unstripped)) |
+else |
+$(eval $(call LINK_RULE,$(TARGET),$(SOURCES),$(LIBS),$(DEPS))) |
+endif |
+</pre> |
+<p>Finally, the NMF rule generates a NaCl manifest file (<code>.nmf</code>) that references |
+each executable generated in the previous step:</p> |
+<pre class="prettyprint"> |
+$(eval $(call NMF_RULE,$(TARGET),)) |
+</pre> |
+</section></section><section id="making-index-html-work-for-chrome-apps"> |
+<h2 id="making-index-html-work-for-chrome-apps">Making index.html work for Chrome Apps</h2> |
+<p>This section describes the changes necessary to make the HTML and JavaScript |
+in part1 CSP-compliant. This is required if you want to build a <a class="reference external" href="https://developer.chrome.com/apps/about_apps.html">Chrome App</a>, but is not necessary |
+if you want to use PNaCl on the open web.</p> |
+<section id="csp-rules"> |
+<h3 id="csp-rules">CSP rules</h3> |
+<p><a class="reference external" href="http://developer.chrome.com/apps/contentSecurityPolicy.html#what">Chrome Apps CSP</a> |
+restricts you from doing the following:</p> |
+<ul class="small-gap"> |
+<li>You can’t use inline scripting in your Chrome App pages. The restriction |
+bans both <code><script></code> blocks and event handlers (<code><button onclick="..."></code>).</li> |
+<li>You can’t reference any external resources in any of your app files (except |
+for video and audio resources). You can’t embed external resources in an |
+iframe.</li> |
+<li>You can’t use string-to-JavaScript methods like <code>eval()</code> and <code>new |
+Function()</code>.</li> |
+</ul> |
+</section><section id="making-index-html-csp-compliant"> |
+<h3 id="making-index-html-csp-compliant">Making index.html CSP-compliant</h3> |
+<p>To make our application CSP-compliant, we have to remove inline scripting. As |
+described above, we can’t use inline <code><script></code> blocks or event handlers. This |
+is easy to do—we’ll just reference some new files from our script tag, and |
+remove all of our inlined scripts:</p> |
+<pre class="prettyprint"> |
+<head> |
+ ... |
+ <script type="text/javascript" src="common.js"></script> |
+ <script type="text/javascript" src="example.js"></script> |
+</head> |
+</pre> |
+<p><code>common.js</code> has shared code used by all SDK examples, and is described |
+later in this document. <code>example.js</code> is a script that has code specific to |
+this example.</p> |
+<p>We also need to remove the inline event handler on the body tag:</p> |
+<pre class="prettyprint"> |
+<body onload="pageDidLoad()"> |
+... |
+</pre> |
+<p>This logic is now handled by <code>common.js</code>.</p> |
+</section><section id="making-index-html-support-different-toolchains-and-configurations"> |
+<h3 id="making-index-html-support-different-toolchains-and-configurations">Making index.html support different toolchains and configurations</h3> |
+<p>Finally, there are a few changes to <code>index.html</code> that are not necessary for |
+CSP-compliance, but help make the SDK examples more generic.</p> |
+<p>First, we add some <a class="reference external" href="https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Using_data_attributes">data attributes</a> |
+to the body element to specify the name, supported toolchains, supported |
+configurations, and path to the <code>.nmf</code> file:</p> |
+<pre class="prettyprint"> |
+<body data-name="part2" |
+ data-tools="newlib glibc pnacl" |
+ data-configs="Debug Release" |
+ data-path="{tc}/{config}"> |
+... |
+</pre> |
+<p><code>common.js</code> will read these data attributes to allow you to load the same |
+example with different toolchains by changing the URL’s <a class="reference external" href="http://en.wikipedia.org/wiki/Query_string">query string</a>. For example, you can load the |
+glibc Debug version of this example by navigating to |
+<code>index.html?tc=glibc&config=Debug</code>.</p> |
+<p>Next, we remove the <code>embed</code> element that is described in HTML. This will be |
+automatically added for us by <code>common.js</code>, based on the current |
+toolchain/configuration combination:</p> |
+<pre class="prettyprint"> |
+<!-- |
+Just as in part1, the <embed> element will be wrapped inside the <div> |
+element with the id "listener". In part1, the embed was specified in HTML, |
+here the common.js module creates a new <embed> element and adds it to the |
+<div> for us. |
+--> |
+<div id="listener"></div> |
+</pre> |
+</section></section><section id="sharing-common-code-with-common-js"> |
+<h2 id="sharing-common-code-with-common-js">Sharing common code with common.js</h2> |
+<p><code>common.js</code> contains JavaScript code that each example uses to create a |
+NaCl module, handle messages from that module and other common tasks like |
+displaying the module load status and logging messages. Explaining all of |
+<code>common.js</code> is outside the scope of this document, but please look at the |
+documentation in that file for more information.</p> |
+<section id="loading-the-page-and-creating-the-module"> |
+<h3 id="loading-the-page-and-creating-the-module">Loading the page and creating the module</h3> |
+<p>Since we’ve added <code><script></code> tags for <code>common.js</code> and <code>example.js</code> to the |
+<code>head</code> element, they will be loaded and executed before the rest of the |
+document has been parsed. As a result, we have to wait for the page to finish |
+loading before we try to create the embed element and add it to the page.</p> |
+<p>We can do that by calling <code>addEventListener</code> and listening for the |
+<code>DOMContentLoaded</code> event:</p> |
+<pre class="prettyprint"> |
+// Listen for the DOM content to be loaded. This event is fired when parsing of |
+// the page's document has finished. |
+document.addEventListener('DOMContentLoaded', function() { |
+ ... |
+}); |
+</pre> |
+<p>Inside this function, we parse the URL query string, and compare that to the |
+data attributes:</p> |
+<pre class="prettyprint"> |
+// From https://developer.mozilla.org/en-US/docs/DOM/window.location |
+var searchVars = {}; |
+if (window.location.search.length > 1) { |
+ var pairs = window.location.search.substr(1).split('&'); |
+ for (var key_ix = 0; key_ix < pairs.length; key_ix++) { |
+ var keyValue = pairs[key_ix].split('='); |
+ searchVars[unescape(keyValue[0])] = |
+ keyValue.length > 1 ? unescape(keyValue[1]) : ''; |
+ } |
+} |
+ |
+... |
+ |
+var toolchains = body.dataset.tools.split(' '); |
+var configs = body.dataset.configs.split(' '); |
+ |
+... |
+ |
+var tc = toolchains.indexOf(searchVars.tc) !== -1 ? |
+ searchVars.tc : toolchains[0]; |
+ |
+// If the config value is included in the search vars, use that. |
+// Otherwise default to Release if it is valid, or the first value if |
+// Release is not valid. |
+if (configs.indexOf(searchVars.config) !== -1) |
+ var config = searchVars.config; |
+else if (configs.indexOf('Release') !== -1) |
+ var config = 'Release'; |
+else |
+ var config = configs[0]; |
+</pre> |
+<p>Then <code>domContentLoaded</code> is called, which performs some checks to see if the |
+browser supports Native Client, then creates the NaCl module.</p> |
+<pre class="prettyprint"> |
+function domContentLoaded(name, tool, path, width, height, attrs) { |
+ updateStatus('Page loaded.'); |
+ if (!browserSupportsNaCl(tool)) { |
+ updateStatus( |
+ 'Browser does not support NaCl (' + tool + '), or NaCl is disabled'); |
+ } else if (common.naclModule == null) { |
+ updateStatus('Creating embed: ' + tool); |
+ |
+ // We use a non-zero sized embed to give Chrome space to place the bad |
+ // plug-in graphic, if there is a problem. |
+ width = typeof width !== 'undefined' ? width : 200; |
+ height = typeof height !== 'undefined' ? height : 200; |
+ attachDefaultListeners(); |
+ createNaClModule(name, tool, path, width, height, attrs); |
+ } else { |
+ // It's possible that the Native Client module onload event fired |
+ // before the page's onload event. In this case, the status message |
+ // will reflect 'SUCCESS', but won't be displayed. This call will |
+ // display the current message. |
+ updateStatus('Waiting.'); |
+ } |
+} |
+</pre> |
+<p><code>attachDefaultListeners</code> is added before the creation of the module, to make |
+sure that no messages are lost. Note that <code>window.attachListeners</code> is also |
+called; this is the way that <code>common.js</code> allows each example to configure |
+itself differently. If an example defines the <code>attachListeners</code> function, it |
+will be called by <code>common.js</code>.</p> |
+<pre class="prettyprint"> |
+function attachDefaultListeners() { |
+ var listenerDiv = document.getElementById('listener'); |
+ listenerDiv.addEventListener('load', moduleDidLoad, true); |
+ listenerDiv.addEventListener('message', handleMessage, true); |
+ listenerDiv.addEventListener('crash', handleCrash, true); |
+ if (typeof window.attachListeners !== 'undefined') { |
+ window.attachListeners(); |
+ } |
+} |
+</pre> |
+<p>Finally, <code>createNaClModule</code> actually creates the <code>embed</code>, and appends it as |
+a child of the element with id <code>listener</code>:</p> |
+<pre class="prettyprint"> |
+function createNaClModule(name, tool, path, width, height, attrs) { |
+ var moduleEl = document.createElement('embed'); |
+ moduleEl.setAttribute('name', 'nacl_module'); |
+ moduleEl.setAttribute('id', 'nacl_module'); |
+ moduleEl.setAttribute('width', width); |
+ moduleEl.setAttribute('height', height); |
+ moduleEl.setAttribute('path', path); |
+ moduleEl.setAttribute('src', path + '/' + name + '.nmf'); |
+ |
+ ... |
+ |
+ var mimetype = mimeTypeForTool(tool); |
+ moduleEl.setAttribute('type', mimetype); |
+ |
+ var listenerDiv = document.getElementById('listener'); |
+ listenerDiv.appendChild(moduleEl); |
+ ... |
+} |
+</pre> |
+<p>When the module finishes loading, it will dispatch a <code>load</code> event, and the |
+event listener function that was registered above (<code>moduleDidLoad</code>) will be |
+called. Note that <code>common.js</code> allows each example to define a |
+<code>window.moduleDidLoad</code> function, that will be called here as well.</p> |
+<pre class="prettyprint"> |
+function moduleDidLoad() { |
+ common.naclModule = document.getElementById('nacl_module'); |
+ updateStatus('RUNNING'); |
+ |
+ if (typeof window.moduleDidLoad !== 'undefined') { |
+ window.moduleDidLoad(); |
+ } |
+} |
+</pre> |
+</section></section><section id="example-specific-behavior-with-example-js"> |
+<h2 id="example-specific-behavior-with-example-js">Example-specific behavior with example.js</h2> |
+<p>As described in the previous section, <code>common.js</code> will call certain functions |
+during the module loading process. This example only needs to respond to two: |
+<code>moduleDidLoad</code> and <code>handleMessage</code>.</p> |
+<pre class="prettyprint"> |
+// This function is called by common.js when the NaCl module is |
+// loaded. |
+function moduleDidLoad() { |
+ // Once we load, hide the plugin. In this example, we don't display anything |
+ // in the plugin, so it is fine to hide it. |
+ common.hideModule(); |
+ |
+ // After the NaCl module has loaded, common.naclModule is a reference to the |
+ // NaCl module's <embed> element. |
+ // |
+ // postMessage sends a message to it. |
+ common.naclModule.postMessage('hello'); |
+} |
+ |
+// This function is called by common.js when a message is received from the |
+// NaCl module. |
+function handleMessage(message) { |
+ var logEl = document.getElementById('log'); |
+ logEl.textContent += message.data; |
+} |
+</pre> |
+</section></section> |
+ |
+{{/partials.standard_nacl_article}} |