<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<oembed><type>rich</type><version>1.0</version><provider_name>phorkie</provider_name><provider_url>https://p.cweiske.de/</provider_url><title>webaction via promise</title><author_name>Christian Weiske</author_name><cache_age>86400</cache_age><width>900</width><height>900</height><html>&lt;!-- embedding all files of https://p.cweiske.de/143 --&gt;
&lt;link rel="stylesheet" href="https://p.cweiske.de/css/embed.css"/&gt;
&lt;div class="phork" id="143"&gt;
    &lt;div class="phork-file"&gt;
 &lt;div class="phork-content"&gt;
  &lt;style type="text/css"&gt;/**
 * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
 * (http://qbnz.com/highlighter/ and http://geshi.org/)
 */
.xml .de1, .xml .de2 {font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;}
.xml  {font-family:monospace;}
.xml .imp {font-weight: bold; color: red;}
.xml li, .xml .li1 {color: #DDD;}
.xml .ln {width:1px;text-align:right;margin:0;padding:0 2px;vertical-align:top;}
.xml .es0 {color: #000099; font-weight: bold;}
.xml .br0 {color: #66cc66;}
.xml .sy0 {color: #66cc66;}
.xml .st0 {color: #ff0000;}
.xml .sc-1 {color: #808080; font-style: italic;}
.xml .sc0 {color: #00bbdd;}
.xml .sc1 {color: #ddbb00;}
.xml .sc2 {color: #339933;}
.xml .sc3 {color: #009900;}
.xml .re0 {color: #000066;}
.xml .re1 {color: #000000; font-weight: bold;}
.xml .re2 {color: #000000; font-weight: bold;}
.xml span.xtra { display:block; }
&lt;/style&gt;&lt;div class="code"&gt;&lt;table class="xml"&gt;&lt;tbody&gt;&lt;tr class="li1"&gt;&lt;td class="ln"&gt;&lt;pre class="de1"&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class="de1"&gt;&lt;pre class="de1"&gt;&lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;script&lt;/span&gt; &lt;span class="re0"&gt;type&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt; &lt;span class="re0"&gt;src&lt;/span&gt;=&lt;span class="st0"&gt;&amp;quot;js/webaction-promise.js&amp;quot;&lt;/span&gt;&lt;span class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;span class="re1"&gt;&amp;lt;/script&lt;span class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="phork-meta"&gt;
  &lt;a href="https://p.cweiske.de/143/rev-raw/948ddf6945d4ec253387b644ce3151506106d985/load.htm" style="float: right"&gt;view raw source&lt;/a&gt;
  &lt;a href="https://p.cweiske.de/143#load.htm"&gt;load.htm&lt;/a&gt;
 &lt;/div&gt;
&lt;/div&gt;
    &lt;div class="phork-file"&gt;
 &lt;div class="phork-content"&gt;
  &lt;style type="text/css"&gt;/**
 * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
 * (http://qbnz.com/highlighter/ and http://geshi.org/)
 */
.javascript .de1, .javascript .de2 {font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;}
.javascript  {font-family:monospace;}
.javascript .imp {font-weight: bold; color: red;}
.javascript li, .javascript .li1 {color: #DDD;}
.javascript .ln {width:1px;text-align:right;margin:0;padding:0 2px;vertical-align:top;}
.javascript .kw1 {color: #000066; font-weight: bold;}
.javascript .kw2 {color: #003366; font-weight: bold;}
.javascript .kw3 {color: #000066;}
.javascript .co1 {color: #006600; font-style: italic;}
.javascript .co2 {color: #009966; font-style: italic;}
.javascript .coMULTI {color: #006600; font-style: italic;}
.javascript .es0 {color: #000099; font-weight: bold;}
.javascript .br0 {color: #009900;}
.javascript .sy0 {color: #339933;}
.javascript .st0 {color: #3366CC;}
.javascript .nu0 {color: #CC0000;}
.javascript .me1 {color: #660066;}
.javascript span.xtra { display:block; }
&lt;/style&gt;&lt;div class="code"&gt;&lt;table class="javascript"&gt;&lt;tbody&gt;&lt;tr class="li1"&gt;&lt;td class="ln"&gt;&lt;pre class="de1"&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
&lt;/pre&gt;&lt;/td&gt;&lt;td class="de1"&gt;&lt;pre class="de1"&gt;&lt;span class="co1"&gt;// Lazy-create and return an indie-config load promise&lt;/span&gt;
&lt;span class="co1"&gt;// The promise will be resolved with a config once the indie-config has been loaded&lt;/span&gt;
&lt;span class="kw2"&gt;var&lt;/span&gt; loadIndieConfig &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;function&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;#160;
&amp;#160; &amp;#160; &lt;span class="co1"&gt;// Create the Promise to return&lt;/span&gt;
&amp;#160; &amp;#160; &lt;span class="kw2"&gt;var&lt;/span&gt; loadPromise &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;new&lt;/span&gt; Promise&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw2"&gt;function&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;resolve&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;#160;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="co1"&gt;// Parse the incoming messages&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="kw2"&gt;var&lt;/span&gt; parseIndieConfig &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;function&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;message&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;#160;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="co1"&gt;// Check if the message comes from the indieConfigFrame we added (or from some other frame)&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;message.&lt;span class="me1"&gt;source&lt;/span&gt; &lt;span class="sy0"&gt;!==&lt;/span&gt; indieConfigFrame.&lt;span class="me1"&gt;contentWindow&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="kw1"&gt;return&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;#160;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="kw2"&gt;var&lt;/span&gt; indieConfig&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="co1"&gt;// Try to parse the config, it can be malformed&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="kw1"&gt;try&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; indieConfig &lt;span class="sy0"&gt;=&lt;/span&gt; JSON.&lt;span class="me1"&gt;parse&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;message.&lt;span class="me1"&gt;data&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt; &lt;span class="kw1"&gt;catch&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;e&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;#160;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="co1"&gt;// We're done – remove the frame and event listener&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; window.&lt;span class="me1"&gt;removeEventListener&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'message'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; parseIndieConfig&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; indieConfigFrame.&lt;span class="me1"&gt;parentNode&lt;/span&gt;.&lt;span class="me1"&gt;removeChild&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;indieConfigFrame&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; indieConfigFrame &lt;span class="sy0"&gt;=&lt;/span&gt; undefined&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="co1"&gt;// And resolve the promise with the loaded indie-config&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; resolve&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;indieConfig&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="co1"&gt;// Listen for messages from the added iframe and parse those messages&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; window.&lt;span class="me1"&gt;addEventListener&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'message'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; parseIndieConfig&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="co1"&gt;// Create a hidden iframe pointing to something using the web+action: protocol&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="kw2"&gt;var&lt;/span&gt; indieConfigFrame &lt;span class="sy0"&gt;=&lt;/span&gt; document.&lt;span class="me1"&gt;createElement&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'iframe'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; indieConfigFrame.&lt;span class="me1"&gt;src&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="st0"&gt;'web+action:load'&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; document.&lt;span class="me1"&gt;getElementsByTagName&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'body'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt;.&lt;span class="me1"&gt;appendChild&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;indieConfigFrame&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; indieConfigFrame.&lt;span class="me1"&gt;style&lt;/span&gt;.&lt;span class="me1"&gt;display&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="st0"&gt;'none'&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160;
&amp;#160; &amp;#160; &lt;span class="co1"&gt;// Ensure that subsequent invocations return the same promise&lt;/span&gt;
&amp;#160; &amp;#160; loadIndieConfig &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;function&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span class="kw1"&gt;return&lt;/span&gt; loadPromise&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160;
&amp;#160; &amp;#160; &lt;span class="kw1"&gt;return&lt;/span&gt; loadPromise&lt;span class="sy0"&gt;;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160;
loadIndieConfig&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;.&lt;span class="me1"&gt;then&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;
&amp;#160; &amp;#160; &lt;span class="kw2"&gt;function&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; console.&lt;span class="me1"&gt;log&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;quot;yuri&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;.&lt;span class="kw1"&gt;catch&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;
&amp;#160; &amp;#160; &lt;span class="kw2"&gt;function&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; console.&lt;span class="me1"&gt;log&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;quot;fail&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
&amp;#160; &amp;#160; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="phork-meta"&gt;
  &lt;a href="https://p.cweiske.de/143/rev-raw/948ddf6945d4ec253387b644ce3151506106d985/webaction-promise.js" style="float: right"&gt;view raw source&lt;/a&gt;
  &lt;a href="https://p.cweiske.de/143#webaction-promise.js"&gt;webaction-promise.js&lt;/a&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</html></oembed>
