playful 0.1.0.alpha.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gemtest +0 -0
- data/.gitignore +19 -0
- data/.rspec +1 -0
- data/.travis.yml +5 -0
- data/Gemfile +6 -0
- data/History.rdoc +3 -0
- data/LICENSE.rdoc +22 -0
- data/README.rdoc +194 -0
- data/Rakefile +20 -0
- data/features/control_point.feature +13 -0
- data/features/device.feature +22 -0
- data/features/device_discovery.feature +9 -0
- data/features/step_definitions/control_point_steps.rb +19 -0
- data/features/step_definitions/device_discovery_steps.rb +40 -0
- data/features/step_definitions/device_steps.rb +28 -0
- data/features/support/common.rb +9 -0
- data/features/support/env.rb +17 -0
- data/features/support/fake_upnp_device_collection.rb +108 -0
- data/features/support/world_extensions.rb +15 -0
- data/lib/core_ext/hash_patch.rb +5 -0
- data/lib/core_ext/socket_patch.rb +16 -0
- data/lib/core_ext/to_upnp_s.rb +65 -0
- data/lib/playful.rb +5 -0
- data/lib/playful/control_point.rb +175 -0
- data/lib/playful/control_point/base.rb +74 -0
- data/lib/playful/control_point/device.rb +511 -0
- data/lib/playful/control_point/error.rb +13 -0
- data/lib/playful/control_point/service.rb +404 -0
- data/lib/playful/device.rb +28 -0
- data/lib/playful/logger.rb +8 -0
- data/lib/playful/ssdp.rb +195 -0
- data/lib/playful/ssdp/broadcast_searcher.rb +114 -0
- data/lib/playful/ssdp/error.rb +6 -0
- data/lib/playful/ssdp/listener.rb +38 -0
- data/lib/playful/ssdp/multicast_connection.rb +112 -0
- data/lib/playful/ssdp/network_constants.rb +17 -0
- data/lib/playful/ssdp/notifier.rb +41 -0
- data/lib/playful/ssdp/searcher.rb +87 -0
- data/lib/playful/version.rb +3 -0
- data/lib/rack/upnp_control_point.rb +70 -0
- data/playful.gemspec +38 -0
- data/spec/spec_helper.rb +16 -0
- data/spec/support/search_responses.rb +134 -0
- data/spec/unit/core_ext/to_upnp_s_spec.rb +105 -0
- data/spec/unit/playful/control_point/device_spec.rb +7 -0
- data/spec/unit/playful/control_point_spec.rb +45 -0
- data/spec/unit/playful/ssdp/listener_spec.rb +29 -0
- data/spec/unit/playful/ssdp/multicast_connection_spec.rb +157 -0
- data/spec/unit/playful/ssdp/notifier_spec.rb +76 -0
- data/spec/unit/playful/ssdp/searcher_spec.rb +110 -0
- data/spec/unit/playful/ssdp_spec.rb +214 -0
- data/tasks/control_point.html +30 -0
- data/tasks/control_point.thor +43 -0
- data/tasks/search.thor +128 -0
- data/tasks/test_js/FABridge.js +1425 -0
- data/tasks/test_js/WebSocketMain.swf +807 -0
- data/tasks/test_js/swfobject.js +825 -0
- data/tasks/test_js/web_socket.js +1133 -0
- data/test/test_ssdp.rb +298 -0
- data/test/test_ssdp_notification.rb +74 -0
- data/test/test_ssdp_response.rb +31 -0
- data/test/test_ssdp_search.rb +23 -0
- metadata +339 -0
@@ -0,0 +1,1133 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
|
4
|
+
<!DOCTYPE html>
|
5
|
+
<html>
|
6
|
+
<head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# githubog: http://ogp.me/ns/fb/githubog#">
|
7
|
+
<meta charset='utf-8'>
|
8
|
+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
9
|
+
<title>em-websocket/examples/js/web_socket.js at master · igrigorik/em-websocket · GitHub</title>
|
10
|
+
<link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="GitHub" />
|
11
|
+
<link rel="fluid-icon" href="https://github.com/fluidicon.png" title="GitHub" />
|
12
|
+
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" />
|
13
|
+
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
<meta content="authenticity_token" name="csrf-param" />
|
18
|
+
<meta content="1Uh5NqCqep+5LEn/0U33Dz1L3Swxv+Czxj8mPvkVdtc=" name="csrf-token" />
|
19
|
+
|
20
|
+
<link href="https://a248.e.akamai.net/assets.github.com/stylesheets/bundles/github-bbf16587e4cb227e94d4838b0b62e06ad84f2419.css" media="screen" rel="stylesheet" type="text/css" />
|
21
|
+
<link href="https://a248.e.akamai.net/assets.github.com/stylesheets/bundles/github2-27fd7716e0bafa52297f37784a2d549774dc1969.css" media="screen" rel="stylesheet" type="text/css" />
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
<script src="https://a248.e.akamai.net/assets.github.com/javascripts/bundles/frameworks-a450c7f907bdc1ee6b362ab1ecca811c761fd259.js" type="text/javascript"></script>
|
27
|
+
|
28
|
+
<script defer="defer" src="https://a248.e.akamai.net/assets.github.com/javascripts/bundles/github-962475eecb5a745150445b68592ced09de5cd872.js" type="text/javascript"></script>
|
29
|
+
|
30
|
+
|
31
|
+
|
32
|
+
<link rel='permalink' href='/igrigorik/em-websocket/blob/b9d439cd3494db3225587ccf7cb060f4b37a9f13/examples/js/web_socket.js'>
|
33
|
+
<meta property="og:title" content="em-websocket"/>
|
34
|
+
<meta property="og:type" content="githubog:gitrepository"/>
|
35
|
+
<meta property="og:url" content="https://github.com/igrigorik/em-websocket"/>
|
36
|
+
<meta property="og:image" content="https://a248.e.akamai.net/assets.github.com/images/gravatars/gravatar-140.png?1329275898"/>
|
37
|
+
<meta property="og:site_name" content="GitHub"/>
|
38
|
+
<meta property="og:description" content="EventMachine based WebSocket server. Contribute to em-websocket development by creating an account on GitHub."/>
|
39
|
+
|
40
|
+
<meta name="description" content="EventMachine based WebSocket server. Contribute to em-websocket development by creating an account on GitHub." />
|
41
|
+
|
42
|
+
<link href="https://github.com/igrigorik/em-websocket/commits/master.atom" rel="alternate" title="Recent Commits to em-websocket:master" type="application/atom+xml" />
|
43
|
+
|
44
|
+
</head>
|
45
|
+
|
46
|
+
|
47
|
+
<body class="logged_out page-blob vis-public env-production " data-blob-contribs-enabled="yes">
|
48
|
+
<div id="wrapper">
|
49
|
+
|
50
|
+
|
51
|
+
|
52
|
+
|
53
|
+
|
54
|
+
<div id="header" class="true clearfix">
|
55
|
+
<div class="container clearfix">
|
56
|
+
<a class="site-logo" href="https://github.com/">
|
57
|
+
<!--[if IE]>
|
58
|
+
<img alt="GitHub" class="github-logo" src="https://a248.e.akamai.net/assets.github.com/images/modules/header/logov7.png?1323882736" />
|
59
|
+
<img alt="GitHub" class="github-logo-hover" src="https://a248.e.akamai.net/assets.github.com/images/modules/header/logov7-hover.png?1324325373" />
|
60
|
+
<![endif]-->
|
61
|
+
<img alt="GitHub" class="github-logo-4x" height="30" src="https://a248.e.akamai.net/assets.github.com/images/modules/header/logov7@4x.png?1337118067" />
|
62
|
+
<img alt="GitHub" class="github-logo-4x-hover" height="30" src="https://a248.e.akamai.net/assets.github.com/images/modules/header/logov7@4x-hover.png?1337118067" />
|
63
|
+
</a>
|
64
|
+
|
65
|
+
|
66
|
+
<!--
|
67
|
+
make sure to use fully qualified URLs here since this nav
|
68
|
+
is used on error pages on other domains
|
69
|
+
-->
|
70
|
+
<ul class="top-nav logged_out">
|
71
|
+
<li class="pricing"><a href="https://github.com/plans">Signup and Pricing</a></li>
|
72
|
+
<li class="explore"><a href="https://github.com/explore">Explore GitHub</a></li>
|
73
|
+
<li class="features"><a href="https://github.com/features">Features</a></li>
|
74
|
+
<li class="blog"><a href="https://github.com/blog">Blog</a></li>
|
75
|
+
<li class="login"><a href="https://github.com/login?return_to=%2Figrigorik%2Fem-websocket%2Fblob%2Fmaster%2Fexamples%2Fjs%2Fweb_socket.js">Login</a></li>
|
76
|
+
</ul>
|
77
|
+
|
78
|
+
|
79
|
+
|
80
|
+
|
81
|
+
</div>
|
82
|
+
</div>
|
83
|
+
|
84
|
+
|
85
|
+
|
86
|
+
<div class="site hfeed" itemscope itemtype="http://schema.org/WebPage">
|
87
|
+
<div class="container hentry">
|
88
|
+
<div class="pagehead repohead instapaper_ignore readability-menu">
|
89
|
+
<div class="title-actions-bar">
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
|
94
|
+
<ul class="pagehead-actions">
|
95
|
+
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
<li>
|
100
|
+
<span class="watch-button"><a href="/login?return_to=%2Figrigorik%2Fem-websocket" class="minibutton btn-watch js-toggler-target entice tooltipped leftwards" title="You must be logged in to use this feature" rel="nofollow">Watch</a><a class="social-count js-social-count" href="/igrigorik/em-websocket/watchers">755</a></span>
|
101
|
+
</li>
|
102
|
+
<li>
|
103
|
+
<a href="/login?return_to=%2Figrigorik%2Fem-websocket" class="minibutton btn-fork js-toggler-target fork-button entice tooltipped leftwards" title="You must be logged in to use this feature" rel="nofollow">Fork</a><a href="/igrigorik/em-websocket/network" class="social-count">73</a>
|
104
|
+
</li>
|
105
|
+
|
106
|
+
</ul>
|
107
|
+
|
108
|
+
<h1 itemscope itemtype="http://data-vocabulary.org/Breadcrumb" class="entry-title public">
|
109
|
+
<span class="repo-label"><span>public</span></span>
|
110
|
+
<span class="mega-icon mega-icon-public-repo"></span>
|
111
|
+
<span class="author vcard">
|
112
|
+
<a href="/igrigorik" class="url fn" itemprop="url" rel="author"> <span itemprop="title">igrigorik</span>
|
113
|
+
</a></span> /
|
114
|
+
<strong><a href="/igrigorik/em-websocket" class="js-current-repository">em-websocket</a></strong>
|
115
|
+
</h1>
|
116
|
+
</div>
|
117
|
+
|
118
|
+
|
119
|
+
|
120
|
+
<ul class="tabs">
|
121
|
+
<li><a href="/igrigorik/em-websocket" class="selected" highlight="repo_sourcerepo_downloadsrepo_commitsrepo_tagsrepo_branches">Code</a></li>
|
122
|
+
<li><a href="/igrigorik/em-websocket/network" highlight="repo_network">Network</a>
|
123
|
+
<li><a href="/igrigorik/em-websocket/pulls" highlight="repo_pulls">Pull Requests <span class='counter'>2</span></a></li>
|
124
|
+
|
125
|
+
<li><a href="/igrigorik/em-websocket/issues" highlight="repo_issues">Issues <span class='counter'>14</span></a></li>
|
126
|
+
|
127
|
+
<li><a href="/igrigorik/em-websocket/wiki" highlight="repo_wiki">Wiki</a></li>
|
128
|
+
|
129
|
+
<li><a href="/igrigorik/em-websocket/graphs" highlight="repo_graphsrepo_contributors">Graphs</a></li>
|
130
|
+
|
131
|
+
</ul>
|
132
|
+
|
133
|
+
<div class="frame frame-center tree-finder" style="display:none"
|
134
|
+
data-tree-list-url="/igrigorik/em-websocket/tree-list/b9d439cd3494db3225587ccf7cb060f4b37a9f13"
|
135
|
+
data-blob-url-prefix="/igrigorik/em-websocket/blob/b9d439cd3494db3225587ccf7cb060f4b37a9f13"
|
136
|
+
>
|
137
|
+
|
138
|
+
<div class="breadcrumb">
|
139
|
+
<span class="bold"><a href="/igrigorik/em-websocket">em-websocket</a></span> /
|
140
|
+
<input class="tree-finder-input js-navigation-enable" type="text" name="query" autocomplete="off" spellcheck="false">
|
141
|
+
</div>
|
142
|
+
|
143
|
+
<div class="octotip">
|
144
|
+
<p>
|
145
|
+
<a href="/igrigorik/em-websocket/dismiss-tree-finder-help" class="dismiss js-dismiss-tree-list-help" title="Hide this notice forever" rel="nofollow">Dismiss</a>
|
146
|
+
<span class="bold">Octotip:</span> You've activated the <em>file finder</em>
|
147
|
+
by pressing <span class="kbd">t</span> Start typing to filter the
|
148
|
+
file list. Use <span class="kbd badmono">↑</span> and
|
149
|
+
<span class="kbd badmono">↓</span> to navigate,
|
150
|
+
<span class="kbd">enter</span> to view files.
|
151
|
+
</p>
|
152
|
+
</div>
|
153
|
+
|
154
|
+
<table class="tree-browser" cellpadding="0" cellspacing="0">
|
155
|
+
<tr class="js-header"><th> </th><th>name</th></tr>
|
156
|
+
<tr class="js-no-results no-results" style="display: none">
|
157
|
+
<th colspan="2">No matching files</th>
|
158
|
+
</tr>
|
159
|
+
<tbody class="js-results-list js-navigation-container">
|
160
|
+
</tbody>
|
161
|
+
</table>
|
162
|
+
</div>
|
163
|
+
|
164
|
+
<div id="jump-to-line" style="display:none">
|
165
|
+
<h2>Jump to Line</h2>
|
166
|
+
<form accept-charset="UTF-8">
|
167
|
+
<input class="textfield" type="text">
|
168
|
+
<div class="full-button">
|
169
|
+
<button type="submit" class="classy">
|
170
|
+
Go
|
171
|
+
</button>
|
172
|
+
</div>
|
173
|
+
</form>
|
174
|
+
</div>
|
175
|
+
|
176
|
+
|
177
|
+
<div class="subnav-bar">
|
178
|
+
|
179
|
+
<ul class="actions subnav">
|
180
|
+
<li><a href="/igrigorik/em-websocket/tags" class="" highlight="repo_tags">Tags <span class="counter">10</span></a></li>
|
181
|
+
<li><a href="/igrigorik/em-websocket/downloads" class="blank downloads-blank" highlight="repo_downloads">Downloads <span class="counter">0</span></a></li>
|
182
|
+
|
183
|
+
</ul>
|
184
|
+
|
185
|
+
<ul class="scope">
|
186
|
+
<li class="switcher">
|
187
|
+
|
188
|
+
<div class="context-menu-container js-menu-container js-context-menu">
|
189
|
+
<a href="#"
|
190
|
+
class="minibutton bigger switcher js-menu-target js-commitish-button btn-branch repo-tree"
|
191
|
+
data-hotkey="w"
|
192
|
+
data-master-branch="master"
|
193
|
+
data-ref="master">
|
194
|
+
<span><i>branch:</i> master</span>
|
195
|
+
</a>
|
196
|
+
|
197
|
+
<div class="context-pane commitish-context js-menu-content">
|
198
|
+
<a href="javascript:;" class="close js-menu-close"><span class="mini-icon mini-icon-remove-close"></span></a>
|
199
|
+
<div class="context-title">Switch Branches/Tags</div>
|
200
|
+
<div class="context-body pane-selector commitish-selector js-navigation-container">
|
201
|
+
<div class="filterbar">
|
202
|
+
<input type="text" id="context-commitish-filter-field" class="js-navigation-enable" placeholder="Filter branches/tags" data-filterable />
|
203
|
+
|
204
|
+
<ul class="tabs">
|
205
|
+
<li><a href="#" data-filter="branches" class="selected">Branches</a></li>
|
206
|
+
<li><a href="#" data-filter="tags">Tags</a></li>
|
207
|
+
</ul>
|
208
|
+
</div>
|
209
|
+
|
210
|
+
<div class="js-filter-tab js-filter-branches" data-filterable-for="context-commitish-filter-field" data-filterable-type=substring>
|
211
|
+
<div class="no-results js-not-filterable">Nothing to show</div>
|
212
|
+
<div class="commitish-item branch-commitish selector-item js-navigation-item js-navigation-target">
|
213
|
+
<h4>
|
214
|
+
<a href="/igrigorik/em-websocket/blob/master/examples/js/web_socket.js" class="js-navigation-open" data-name="master" rel="nofollow">master</a>
|
215
|
+
</h4>
|
216
|
+
</div>
|
217
|
+
</div>
|
218
|
+
|
219
|
+
<div class="js-filter-tab js-filter-tags" style="display:none" data-filterable-for="context-commitish-filter-field" data-filterable-type=substring>
|
220
|
+
<div class="no-results js-not-filterable">Nothing to show</div>
|
221
|
+
<div class="commitish-item tag-commitish selector-item js-navigation-item js-navigation-target">
|
222
|
+
<h4>
|
223
|
+
<a href="/igrigorik/em-websocket/blob/v0.3.6/examples/js/web_socket.js" class="js-navigation-open" data-name="v0.3.6" rel="nofollow">v0.3.6</a>
|
224
|
+
</h4>
|
225
|
+
</div>
|
226
|
+
<div class="commitish-item tag-commitish selector-item js-navigation-item js-navigation-target">
|
227
|
+
<h4>
|
228
|
+
<a href="/igrigorik/em-websocket/blob/v0.3.5/examples/js/web_socket.js" class="js-navigation-open" data-name="v0.3.5" rel="nofollow">v0.3.5</a>
|
229
|
+
</h4>
|
230
|
+
</div>
|
231
|
+
<div class="commitish-item tag-commitish selector-item js-navigation-item js-navigation-target">
|
232
|
+
<h4>
|
233
|
+
<a href="/igrigorik/em-websocket/blob/v0.3.4/examples/js/web_socket.js" class="js-navigation-open" data-name="v0.3.4" rel="nofollow">v0.3.4</a>
|
234
|
+
</h4>
|
235
|
+
</div>
|
236
|
+
<div class="commitish-item tag-commitish selector-item js-navigation-item js-navigation-target">
|
237
|
+
<h4>
|
238
|
+
<a href="/igrigorik/em-websocket/blob/v0.3.3/examples/js/web_socket.js" class="js-navigation-open" data-name="v0.3.3" rel="nofollow">v0.3.3</a>
|
239
|
+
</h4>
|
240
|
+
</div>
|
241
|
+
<div class="commitish-item tag-commitish selector-item js-navigation-item js-navigation-target">
|
242
|
+
<h4>
|
243
|
+
<a href="/igrigorik/em-websocket/blob/v0.3.2/examples/js/web_socket.js" class="js-navigation-open" data-name="v0.3.2" rel="nofollow">v0.3.2</a>
|
244
|
+
</h4>
|
245
|
+
</div>
|
246
|
+
<div class="commitish-item tag-commitish selector-item js-navigation-item js-navigation-target">
|
247
|
+
<h4>
|
248
|
+
<a href="/igrigorik/em-websocket/blob/v0.3.1/examples/js/web_socket.js" class="js-navigation-open" data-name="v0.3.1" rel="nofollow">v0.3.1</a>
|
249
|
+
</h4>
|
250
|
+
</div>
|
251
|
+
<div class="commitish-item tag-commitish selector-item js-navigation-item js-navigation-target">
|
252
|
+
<h4>
|
253
|
+
<a href="/igrigorik/em-websocket/blob/v0.3.0/examples/js/web_socket.js" class="js-navigation-open" data-name="v0.3.0" rel="nofollow">v0.3.0</a>
|
254
|
+
</h4>
|
255
|
+
</div>
|
256
|
+
<div class="commitish-item tag-commitish selector-item js-navigation-item js-navigation-target">
|
257
|
+
<h4>
|
258
|
+
<a href="/igrigorik/em-websocket/blob/v0.2.1/examples/js/web_socket.js" class="js-navigation-open" data-name="v0.2.1" rel="nofollow">v0.2.1</a>
|
259
|
+
</h4>
|
260
|
+
</div>
|
261
|
+
<div class="commitish-item tag-commitish selector-item js-navigation-item js-navigation-target">
|
262
|
+
<h4>
|
263
|
+
<a href="/igrigorik/em-websocket/blob/v0.2.0/examples/js/web_socket.js" class="js-navigation-open" data-name="v0.2.0" rel="nofollow">v0.2.0</a>
|
264
|
+
</h4>
|
265
|
+
</div>
|
266
|
+
<div class="commitish-item tag-commitish selector-item js-navigation-item js-navigation-target">
|
267
|
+
<h4>
|
268
|
+
<a href="/igrigorik/em-websocket/blob/v0.1.4/examples/js/web_socket.js" class="js-navigation-open" data-name="v0.1.4" rel="nofollow">v0.1.4</a>
|
269
|
+
</h4>
|
270
|
+
</div>
|
271
|
+
</div>
|
272
|
+
</div>
|
273
|
+
</div><!-- /.commitish-context-context -->
|
274
|
+
</div>
|
275
|
+
|
276
|
+
</li>
|
277
|
+
</ul>
|
278
|
+
|
279
|
+
<ul class="subnav with-scope">
|
280
|
+
|
281
|
+
<li><a href="/igrigorik/em-websocket" class="selected" highlight="repo_source">Files</a></li>
|
282
|
+
<li><a href="/igrigorik/em-websocket/commits/master" highlight="repo_commits">Commits</a></li>
|
283
|
+
<li><a href="/igrigorik/em-websocket/branches" class="" highlight="repo_branches" rel="nofollow">Branches <span class="counter">1</span></a></li>
|
284
|
+
</ul>
|
285
|
+
|
286
|
+
</div>
|
287
|
+
|
288
|
+
|
289
|
+
|
290
|
+
|
291
|
+
|
292
|
+
|
293
|
+
|
294
|
+
|
295
|
+
</div><!-- /.repohead -->
|
296
|
+
|
297
|
+
|
298
|
+
|
299
|
+
|
300
|
+
|
301
|
+
|
302
|
+
|
303
|
+
<!-- block_view_fragment_key: views10/v8/blob:v21:94c5c31ec6eb97b7d5078e3729f93ac2 -->
|
304
|
+
<div id="slider">
|
305
|
+
|
306
|
+
<div class="breadcrumb" data-path="examples/js/web_socket.js/">
|
307
|
+
<b itemscope="" itemtype="http://data-vocabulary.org/Breadcrumb"><a href="/igrigorik/em-websocket/tree/b9d439cd3494db3225587ccf7cb060f4b37a9f13" class="js-rewrite-sha" itemprop="url"><span itemprop="title">em-websocket</span></a></b> / <span itemscope="" itemtype="http://data-vocabulary.org/Breadcrumb"><a href="/igrigorik/em-websocket/tree/b9d439cd3494db3225587ccf7cb060f4b37a9f13/examples" class="js-rewrite-sha" itemscope="url"><span itemprop="title">examples</span></a></span> / <span itemscope="" itemtype="http://data-vocabulary.org/Breadcrumb"><a href="/igrigorik/em-websocket/tree/b9d439cd3494db3225587ccf7cb060f4b37a9f13/examples/js" class="js-rewrite-sha" itemscope="url"><span itemprop="title">js</span></a></span> / <strong class="final-path">web_socket.js</strong> <span class="js-clippy mini-icon mini-icon-clippy " data-clipboard-text="examples/js/web_socket.js" data-copied-hint="copied!" data-copy-hint="copy to clipboard"></span>
|
308
|
+
</div>
|
309
|
+
|
310
|
+
|
311
|
+
<div class="commit file-history-tease" data-path="examples/js/web_socket.js/">
|
312
|
+
<img class="main-avatar" height="24" src="https://secure.gravatar.com/avatar/aeecf4f1c835bc7d53021bac0a8a7da9?s=140&d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png" width="24" />
|
313
|
+
<span class="author">Bernard Potocki</span>
|
314
|
+
<time class="js-relative-date" datetime="2010-04-17T10:55:19-07:00" title="2010-04-17 10:55:19">April 17, 2010</time>
|
315
|
+
<div class="commit-title">
|
316
|
+
<a href="/igrigorik/em-websocket/commit/12e69e7b2793a134ae81a81dc0f3d035bb6a3393" class="message">Example of use in browser not supporting WebSocket using web-socket-js.</a>
|
317
|
+
</div>
|
318
|
+
|
319
|
+
<div class="participation">
|
320
|
+
<p class="quickstat"><a href="#blob_contributors_box" rel="facebox"><strong>0</strong> contributors</a></p>
|
321
|
+
|
322
|
+
</div>
|
323
|
+
<div id="blob_contributors_box" style="display:none">
|
324
|
+
<h2>Users on GitHub who have contributed to this file</h2>
|
325
|
+
<ul class="facebox-user-list">
|
326
|
+
</ul>
|
327
|
+
</div>
|
328
|
+
</div>
|
329
|
+
|
330
|
+
<div class="frames">
|
331
|
+
<div class="frame frame-center" data-path="examples/js/web_socket.js/" data-permalink-url="/igrigorik/em-websocket/blob/b9d439cd3494db3225587ccf7cb060f4b37a9f13/examples/js/web_socket.js" data-title="em-websocket/examples/js/web_socket.js at master · igrigorik/em-websocket · GitHub" data-type="blob">
|
332
|
+
|
333
|
+
<div id="files" class="bubble">
|
334
|
+
<div class="file">
|
335
|
+
<div class="meta">
|
336
|
+
<div class="info">
|
337
|
+
<span class="icon"><b class="mini-icon mini-icon-text-file"></b></span>
|
338
|
+
<span class="mode" title="File Mode">100755</span>
|
339
|
+
<span>313 lines (278 sloc)</span>
|
340
|
+
<span>9.057 kb</span>
|
341
|
+
</div>
|
342
|
+
<ul class="button-group actions">
|
343
|
+
<li>
|
344
|
+
<a class="grouped-button file-edit-link minibutton bigger lighter js-rewrite-sha" href="/igrigorik/em-websocket/edit/b9d439cd3494db3225587ccf7cb060f4b37a9f13/examples/js/web_socket.js" data-method="post" rel="nofollow" data-hotkey="e">Edit this file</a>
|
345
|
+
</li>
|
346
|
+
|
347
|
+
<li>
|
348
|
+
<a href="/igrigorik/em-websocket/raw/master/examples/js/web_socket.js" class="minibutton btn-raw grouped-button bigger lighter" id="raw-url"><span class="icon"></span>Raw</a>
|
349
|
+
</li>
|
350
|
+
<li>
|
351
|
+
<a href="/igrigorik/em-websocket/blame/master/examples/js/web_socket.js" class="minibutton btn-blame grouped-button bigger lighter"><span class="icon"></span>Blame</a>
|
352
|
+
</li>
|
353
|
+
<li>
|
354
|
+
<a href="/igrigorik/em-websocket/commits/master/examples/js/web_socket.js" class="minibutton btn-history grouped-button bigger lighter" rel="nofollow"><span class="icon"></span>History</a>
|
355
|
+
</li>
|
356
|
+
</ul>
|
357
|
+
</div>
|
358
|
+
<div class="data type-javascript">
|
359
|
+
<table cellpadding="0" cellspacing="0" class="lines">
|
360
|
+
<tr>
|
361
|
+
<td>
|
362
|
+
<pre class="line_numbers"><span id="L1" rel="#L1">1</span>
|
363
|
+
<span id="L2" rel="#L2">2</span>
|
364
|
+
<span id="L3" rel="#L3">3</span>
|
365
|
+
<span id="L4" rel="#L4">4</span>
|
366
|
+
<span id="L5" rel="#L5">5</span>
|
367
|
+
<span id="L6" rel="#L6">6</span>
|
368
|
+
<span id="L7" rel="#L7">7</span>
|
369
|
+
<span id="L8" rel="#L8">8</span>
|
370
|
+
<span id="L9" rel="#L9">9</span>
|
371
|
+
<span id="L10" rel="#L10">10</span>
|
372
|
+
<span id="L11" rel="#L11">11</span>
|
373
|
+
<span id="L12" rel="#L12">12</span>
|
374
|
+
<span id="L13" rel="#L13">13</span>
|
375
|
+
<span id="L14" rel="#L14">14</span>
|
376
|
+
<span id="L15" rel="#L15">15</span>
|
377
|
+
<span id="L16" rel="#L16">16</span>
|
378
|
+
<span id="L17" rel="#L17">17</span>
|
379
|
+
<span id="L18" rel="#L18">18</span>
|
380
|
+
<span id="L19" rel="#L19">19</span>
|
381
|
+
<span id="L20" rel="#L20">20</span>
|
382
|
+
<span id="L21" rel="#L21">21</span>
|
383
|
+
<span id="L22" rel="#L22">22</span>
|
384
|
+
<span id="L23" rel="#L23">23</span>
|
385
|
+
<span id="L24" rel="#L24">24</span>
|
386
|
+
<span id="L25" rel="#L25">25</span>
|
387
|
+
<span id="L26" rel="#L26">26</span>
|
388
|
+
<span id="L27" rel="#L27">27</span>
|
389
|
+
<span id="L28" rel="#L28">28</span>
|
390
|
+
<span id="L29" rel="#L29">29</span>
|
391
|
+
<span id="L30" rel="#L30">30</span>
|
392
|
+
<span id="L31" rel="#L31">31</span>
|
393
|
+
<span id="L32" rel="#L32">32</span>
|
394
|
+
<span id="L33" rel="#L33">33</span>
|
395
|
+
<span id="L34" rel="#L34">34</span>
|
396
|
+
<span id="L35" rel="#L35">35</span>
|
397
|
+
<span id="L36" rel="#L36">36</span>
|
398
|
+
<span id="L37" rel="#L37">37</span>
|
399
|
+
<span id="L38" rel="#L38">38</span>
|
400
|
+
<span id="L39" rel="#L39">39</span>
|
401
|
+
<span id="L40" rel="#L40">40</span>
|
402
|
+
<span id="L41" rel="#L41">41</span>
|
403
|
+
<span id="L42" rel="#L42">42</span>
|
404
|
+
<span id="L43" rel="#L43">43</span>
|
405
|
+
<span id="L44" rel="#L44">44</span>
|
406
|
+
<span id="L45" rel="#L45">45</span>
|
407
|
+
<span id="L46" rel="#L46">46</span>
|
408
|
+
<span id="L47" rel="#L47">47</span>
|
409
|
+
<span id="L48" rel="#L48">48</span>
|
410
|
+
<span id="L49" rel="#L49">49</span>
|
411
|
+
<span id="L50" rel="#L50">50</span>
|
412
|
+
<span id="L51" rel="#L51">51</span>
|
413
|
+
<span id="L52" rel="#L52">52</span>
|
414
|
+
<span id="L53" rel="#L53">53</span>
|
415
|
+
<span id="L54" rel="#L54">54</span>
|
416
|
+
<span id="L55" rel="#L55">55</span>
|
417
|
+
<span id="L56" rel="#L56">56</span>
|
418
|
+
<span id="L57" rel="#L57">57</span>
|
419
|
+
<span id="L58" rel="#L58">58</span>
|
420
|
+
<span id="L59" rel="#L59">59</span>
|
421
|
+
<span id="L60" rel="#L60">60</span>
|
422
|
+
<span id="L61" rel="#L61">61</span>
|
423
|
+
<span id="L62" rel="#L62">62</span>
|
424
|
+
<span id="L63" rel="#L63">63</span>
|
425
|
+
<span id="L64" rel="#L64">64</span>
|
426
|
+
<span id="L65" rel="#L65">65</span>
|
427
|
+
<span id="L66" rel="#L66">66</span>
|
428
|
+
<span id="L67" rel="#L67">67</span>
|
429
|
+
<span id="L68" rel="#L68">68</span>
|
430
|
+
<span id="L69" rel="#L69">69</span>
|
431
|
+
<span id="L70" rel="#L70">70</span>
|
432
|
+
<span id="L71" rel="#L71">71</span>
|
433
|
+
<span id="L72" rel="#L72">72</span>
|
434
|
+
<span id="L73" rel="#L73">73</span>
|
435
|
+
<span id="L74" rel="#L74">74</span>
|
436
|
+
<span id="L75" rel="#L75">75</span>
|
437
|
+
<span id="L76" rel="#L76">76</span>
|
438
|
+
<span id="L77" rel="#L77">77</span>
|
439
|
+
<span id="L78" rel="#L78">78</span>
|
440
|
+
<span id="L79" rel="#L79">79</span>
|
441
|
+
<span id="L80" rel="#L80">80</span>
|
442
|
+
<span id="L81" rel="#L81">81</span>
|
443
|
+
<span id="L82" rel="#L82">82</span>
|
444
|
+
<span id="L83" rel="#L83">83</span>
|
445
|
+
<span id="L84" rel="#L84">84</span>
|
446
|
+
<span id="L85" rel="#L85">85</span>
|
447
|
+
<span id="L86" rel="#L86">86</span>
|
448
|
+
<span id="L87" rel="#L87">87</span>
|
449
|
+
<span id="L88" rel="#L88">88</span>
|
450
|
+
<span id="L89" rel="#L89">89</span>
|
451
|
+
<span id="L90" rel="#L90">90</span>
|
452
|
+
<span id="L91" rel="#L91">91</span>
|
453
|
+
<span id="L92" rel="#L92">92</span>
|
454
|
+
<span id="L93" rel="#L93">93</span>
|
455
|
+
<span id="L94" rel="#L94">94</span>
|
456
|
+
<span id="L95" rel="#L95">95</span>
|
457
|
+
<span id="L96" rel="#L96">96</span>
|
458
|
+
<span id="L97" rel="#L97">97</span>
|
459
|
+
<span id="L98" rel="#L98">98</span>
|
460
|
+
<span id="L99" rel="#L99">99</span>
|
461
|
+
<span id="L100" rel="#L100">100</span>
|
462
|
+
<span id="L101" rel="#L101">101</span>
|
463
|
+
<span id="L102" rel="#L102">102</span>
|
464
|
+
<span id="L103" rel="#L103">103</span>
|
465
|
+
<span id="L104" rel="#L104">104</span>
|
466
|
+
<span id="L105" rel="#L105">105</span>
|
467
|
+
<span id="L106" rel="#L106">106</span>
|
468
|
+
<span id="L107" rel="#L107">107</span>
|
469
|
+
<span id="L108" rel="#L108">108</span>
|
470
|
+
<span id="L109" rel="#L109">109</span>
|
471
|
+
<span id="L110" rel="#L110">110</span>
|
472
|
+
<span id="L111" rel="#L111">111</span>
|
473
|
+
<span id="L112" rel="#L112">112</span>
|
474
|
+
<span id="L113" rel="#L113">113</span>
|
475
|
+
<span id="L114" rel="#L114">114</span>
|
476
|
+
<span id="L115" rel="#L115">115</span>
|
477
|
+
<span id="L116" rel="#L116">116</span>
|
478
|
+
<span id="L117" rel="#L117">117</span>
|
479
|
+
<span id="L118" rel="#L118">118</span>
|
480
|
+
<span id="L119" rel="#L119">119</span>
|
481
|
+
<span id="L120" rel="#L120">120</span>
|
482
|
+
<span id="L121" rel="#L121">121</span>
|
483
|
+
<span id="L122" rel="#L122">122</span>
|
484
|
+
<span id="L123" rel="#L123">123</span>
|
485
|
+
<span id="L124" rel="#L124">124</span>
|
486
|
+
<span id="L125" rel="#L125">125</span>
|
487
|
+
<span id="L126" rel="#L126">126</span>
|
488
|
+
<span id="L127" rel="#L127">127</span>
|
489
|
+
<span id="L128" rel="#L128">128</span>
|
490
|
+
<span id="L129" rel="#L129">129</span>
|
491
|
+
<span id="L130" rel="#L130">130</span>
|
492
|
+
<span id="L131" rel="#L131">131</span>
|
493
|
+
<span id="L132" rel="#L132">132</span>
|
494
|
+
<span id="L133" rel="#L133">133</span>
|
495
|
+
<span id="L134" rel="#L134">134</span>
|
496
|
+
<span id="L135" rel="#L135">135</span>
|
497
|
+
<span id="L136" rel="#L136">136</span>
|
498
|
+
<span id="L137" rel="#L137">137</span>
|
499
|
+
<span id="L138" rel="#L138">138</span>
|
500
|
+
<span id="L139" rel="#L139">139</span>
|
501
|
+
<span id="L140" rel="#L140">140</span>
|
502
|
+
<span id="L141" rel="#L141">141</span>
|
503
|
+
<span id="L142" rel="#L142">142</span>
|
504
|
+
<span id="L143" rel="#L143">143</span>
|
505
|
+
<span id="L144" rel="#L144">144</span>
|
506
|
+
<span id="L145" rel="#L145">145</span>
|
507
|
+
<span id="L146" rel="#L146">146</span>
|
508
|
+
<span id="L147" rel="#L147">147</span>
|
509
|
+
<span id="L148" rel="#L148">148</span>
|
510
|
+
<span id="L149" rel="#L149">149</span>
|
511
|
+
<span id="L150" rel="#L150">150</span>
|
512
|
+
<span id="L151" rel="#L151">151</span>
|
513
|
+
<span id="L152" rel="#L152">152</span>
|
514
|
+
<span id="L153" rel="#L153">153</span>
|
515
|
+
<span id="L154" rel="#L154">154</span>
|
516
|
+
<span id="L155" rel="#L155">155</span>
|
517
|
+
<span id="L156" rel="#L156">156</span>
|
518
|
+
<span id="L157" rel="#L157">157</span>
|
519
|
+
<span id="L158" rel="#L158">158</span>
|
520
|
+
<span id="L159" rel="#L159">159</span>
|
521
|
+
<span id="L160" rel="#L160">160</span>
|
522
|
+
<span id="L161" rel="#L161">161</span>
|
523
|
+
<span id="L162" rel="#L162">162</span>
|
524
|
+
<span id="L163" rel="#L163">163</span>
|
525
|
+
<span id="L164" rel="#L164">164</span>
|
526
|
+
<span id="L165" rel="#L165">165</span>
|
527
|
+
<span id="L166" rel="#L166">166</span>
|
528
|
+
<span id="L167" rel="#L167">167</span>
|
529
|
+
<span id="L168" rel="#L168">168</span>
|
530
|
+
<span id="L169" rel="#L169">169</span>
|
531
|
+
<span id="L170" rel="#L170">170</span>
|
532
|
+
<span id="L171" rel="#L171">171</span>
|
533
|
+
<span id="L172" rel="#L172">172</span>
|
534
|
+
<span id="L173" rel="#L173">173</span>
|
535
|
+
<span id="L174" rel="#L174">174</span>
|
536
|
+
<span id="L175" rel="#L175">175</span>
|
537
|
+
<span id="L176" rel="#L176">176</span>
|
538
|
+
<span id="L177" rel="#L177">177</span>
|
539
|
+
<span id="L178" rel="#L178">178</span>
|
540
|
+
<span id="L179" rel="#L179">179</span>
|
541
|
+
<span id="L180" rel="#L180">180</span>
|
542
|
+
<span id="L181" rel="#L181">181</span>
|
543
|
+
<span id="L182" rel="#L182">182</span>
|
544
|
+
<span id="L183" rel="#L183">183</span>
|
545
|
+
<span id="L184" rel="#L184">184</span>
|
546
|
+
<span id="L185" rel="#L185">185</span>
|
547
|
+
<span id="L186" rel="#L186">186</span>
|
548
|
+
<span id="L187" rel="#L187">187</span>
|
549
|
+
<span id="L188" rel="#L188">188</span>
|
550
|
+
<span id="L189" rel="#L189">189</span>
|
551
|
+
<span id="L190" rel="#L190">190</span>
|
552
|
+
<span id="L191" rel="#L191">191</span>
|
553
|
+
<span id="L192" rel="#L192">192</span>
|
554
|
+
<span id="L193" rel="#L193">193</span>
|
555
|
+
<span id="L194" rel="#L194">194</span>
|
556
|
+
<span id="L195" rel="#L195">195</span>
|
557
|
+
<span id="L196" rel="#L196">196</span>
|
558
|
+
<span id="L197" rel="#L197">197</span>
|
559
|
+
<span id="L198" rel="#L198">198</span>
|
560
|
+
<span id="L199" rel="#L199">199</span>
|
561
|
+
<span id="L200" rel="#L200">200</span>
|
562
|
+
<span id="L201" rel="#L201">201</span>
|
563
|
+
<span id="L202" rel="#L202">202</span>
|
564
|
+
<span id="L203" rel="#L203">203</span>
|
565
|
+
<span id="L204" rel="#L204">204</span>
|
566
|
+
<span id="L205" rel="#L205">205</span>
|
567
|
+
<span id="L206" rel="#L206">206</span>
|
568
|
+
<span id="L207" rel="#L207">207</span>
|
569
|
+
<span id="L208" rel="#L208">208</span>
|
570
|
+
<span id="L209" rel="#L209">209</span>
|
571
|
+
<span id="L210" rel="#L210">210</span>
|
572
|
+
<span id="L211" rel="#L211">211</span>
|
573
|
+
<span id="L212" rel="#L212">212</span>
|
574
|
+
<span id="L213" rel="#L213">213</span>
|
575
|
+
<span id="L214" rel="#L214">214</span>
|
576
|
+
<span id="L215" rel="#L215">215</span>
|
577
|
+
<span id="L216" rel="#L216">216</span>
|
578
|
+
<span id="L217" rel="#L217">217</span>
|
579
|
+
<span id="L218" rel="#L218">218</span>
|
580
|
+
<span id="L219" rel="#L219">219</span>
|
581
|
+
<span id="L220" rel="#L220">220</span>
|
582
|
+
<span id="L221" rel="#L221">221</span>
|
583
|
+
<span id="L222" rel="#L222">222</span>
|
584
|
+
<span id="L223" rel="#L223">223</span>
|
585
|
+
<span id="L224" rel="#L224">224</span>
|
586
|
+
<span id="L225" rel="#L225">225</span>
|
587
|
+
<span id="L226" rel="#L226">226</span>
|
588
|
+
<span id="L227" rel="#L227">227</span>
|
589
|
+
<span id="L228" rel="#L228">228</span>
|
590
|
+
<span id="L229" rel="#L229">229</span>
|
591
|
+
<span id="L230" rel="#L230">230</span>
|
592
|
+
<span id="L231" rel="#L231">231</span>
|
593
|
+
<span id="L232" rel="#L232">232</span>
|
594
|
+
<span id="L233" rel="#L233">233</span>
|
595
|
+
<span id="L234" rel="#L234">234</span>
|
596
|
+
<span id="L235" rel="#L235">235</span>
|
597
|
+
<span id="L236" rel="#L236">236</span>
|
598
|
+
<span id="L237" rel="#L237">237</span>
|
599
|
+
<span id="L238" rel="#L238">238</span>
|
600
|
+
<span id="L239" rel="#L239">239</span>
|
601
|
+
<span id="L240" rel="#L240">240</span>
|
602
|
+
<span id="L241" rel="#L241">241</span>
|
603
|
+
<span id="L242" rel="#L242">242</span>
|
604
|
+
<span id="L243" rel="#L243">243</span>
|
605
|
+
<span id="L244" rel="#L244">244</span>
|
606
|
+
<span id="L245" rel="#L245">245</span>
|
607
|
+
<span id="L246" rel="#L246">246</span>
|
608
|
+
<span id="L247" rel="#L247">247</span>
|
609
|
+
<span id="L248" rel="#L248">248</span>
|
610
|
+
<span id="L249" rel="#L249">249</span>
|
611
|
+
<span id="L250" rel="#L250">250</span>
|
612
|
+
<span id="L251" rel="#L251">251</span>
|
613
|
+
<span id="L252" rel="#L252">252</span>
|
614
|
+
<span id="L253" rel="#L253">253</span>
|
615
|
+
<span id="L254" rel="#L254">254</span>
|
616
|
+
<span id="L255" rel="#L255">255</span>
|
617
|
+
<span id="L256" rel="#L256">256</span>
|
618
|
+
<span id="L257" rel="#L257">257</span>
|
619
|
+
<span id="L258" rel="#L258">258</span>
|
620
|
+
<span id="L259" rel="#L259">259</span>
|
621
|
+
<span id="L260" rel="#L260">260</span>
|
622
|
+
<span id="L261" rel="#L261">261</span>
|
623
|
+
<span id="L262" rel="#L262">262</span>
|
624
|
+
<span id="L263" rel="#L263">263</span>
|
625
|
+
<span id="L264" rel="#L264">264</span>
|
626
|
+
<span id="L265" rel="#L265">265</span>
|
627
|
+
<span id="L266" rel="#L266">266</span>
|
628
|
+
<span id="L267" rel="#L267">267</span>
|
629
|
+
<span id="L268" rel="#L268">268</span>
|
630
|
+
<span id="L269" rel="#L269">269</span>
|
631
|
+
<span id="L270" rel="#L270">270</span>
|
632
|
+
<span id="L271" rel="#L271">271</span>
|
633
|
+
<span id="L272" rel="#L272">272</span>
|
634
|
+
<span id="L273" rel="#L273">273</span>
|
635
|
+
<span id="L274" rel="#L274">274</span>
|
636
|
+
<span id="L275" rel="#L275">275</span>
|
637
|
+
<span id="L276" rel="#L276">276</span>
|
638
|
+
<span id="L277" rel="#L277">277</span>
|
639
|
+
<span id="L278" rel="#L278">278</span>
|
640
|
+
<span id="L279" rel="#L279">279</span>
|
641
|
+
<span id="L280" rel="#L280">280</span>
|
642
|
+
<span id="L281" rel="#L281">281</span>
|
643
|
+
<span id="L282" rel="#L282">282</span>
|
644
|
+
<span id="L283" rel="#L283">283</span>
|
645
|
+
<span id="L284" rel="#L284">284</span>
|
646
|
+
<span id="L285" rel="#L285">285</span>
|
647
|
+
<span id="L286" rel="#L286">286</span>
|
648
|
+
<span id="L287" rel="#L287">287</span>
|
649
|
+
<span id="L288" rel="#L288">288</span>
|
650
|
+
<span id="L289" rel="#L289">289</span>
|
651
|
+
<span id="L290" rel="#L290">290</span>
|
652
|
+
<span id="L291" rel="#L291">291</span>
|
653
|
+
<span id="L292" rel="#L292">292</span>
|
654
|
+
<span id="L293" rel="#L293">293</span>
|
655
|
+
<span id="L294" rel="#L294">294</span>
|
656
|
+
<span id="L295" rel="#L295">295</span>
|
657
|
+
<span id="L296" rel="#L296">296</span>
|
658
|
+
<span id="L297" rel="#L297">297</span>
|
659
|
+
<span id="L298" rel="#L298">298</span>
|
660
|
+
<span id="L299" rel="#L299">299</span>
|
661
|
+
<span id="L300" rel="#L300">300</span>
|
662
|
+
<span id="L301" rel="#L301">301</span>
|
663
|
+
<span id="L302" rel="#L302">302</span>
|
664
|
+
<span id="L303" rel="#L303">303</span>
|
665
|
+
<span id="L304" rel="#L304">304</span>
|
666
|
+
<span id="L305" rel="#L305">305</span>
|
667
|
+
<span id="L306" rel="#L306">306</span>
|
668
|
+
<span id="L307" rel="#L307">307</span>
|
669
|
+
<span id="L308" rel="#L308">308</span>
|
670
|
+
<span id="L309" rel="#L309">309</span>
|
671
|
+
<span id="L310" rel="#L310">310</span>
|
672
|
+
<span id="L311" rel="#L311">311</span>
|
673
|
+
<span id="L312" rel="#L312">312</span>
|
674
|
+
</pre>
|
675
|
+
</td>
|
676
|
+
<td width="100%">
|
677
|
+
<div class="highlight"><pre><div class='line' id='LC1'><span class="c1">// Copyright: Hiroshi Ichikawa <http://gimite.net/en/></span></div><div class='line' id='LC2'><span class="c1">// Lincense: New BSD Lincense</span></div><div class='line' id='LC3'><span class="c1">// Reference: http://dev.w3.org/html5/websockets/</span></div><div class='line' id='LC4'><span class="c1">// Reference: http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol</span></div><div class='line' id='LC5'><br/></div><div class='line' id='LC6'><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span></div><div class='line' id='LC7'> </div><div class='line' id='LC8'> <span class="k">if</span> <span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">WebSocket</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span></div><div class='line' id='LC9'><br/></div><div class='line' id='LC10'> <span class="kd">var</span> <span class="nx">console</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">console</span><span class="p">;</span></div><div class='line' id='LC11'> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">console</span><span class="p">)</span> <span class="nx">console</span> <span class="o">=</span> <span class="p">{</span><span class="nx">log</span><span class="o">:</span> <span class="kd">function</span><span class="p">(){</span> <span class="p">},</span> <span class="nx">error</span><span class="o">:</span> <span class="kd">function</span><span class="p">(){</span> <span class="p">}};</span></div><div class='line' id='LC12'><br/></div><div class='line' id='LC13'> <span class="kd">function</span> <span class="nx">hasFlash</span><span class="p">()</span> <span class="p">{</span></div><div class='line' id='LC14'> <span class="k">if</span> <span class="p">(</span><span class="s1">'navigator'</span> <span class="k">in</span> <span class="nb">window</span> <span class="o">&&</span> <span class="s1">'plugins'</span> <span class="k">in</span> <span class="nx">navigator</span> <span class="o">&&</span> <span class="nx">navigator</span><span class="p">.</span><span class="nx">plugins</span><span class="p">[</span><span class="s1">'Shockwave Flash'</span><span class="p">])</span> <span class="p">{</span></div><div class='line' id='LC15'> <span class="k">return</span> <span class="o">!!</span><span class="nx">navigator</span><span class="p">.</span><span class="nx">plugins</span><span class="p">[</span><span class="s1">'Shockwave Flash'</span><span class="p">].</span><span class="nx">description</span><span class="p">;</span></div><div class='line' id='LC16'> <span class="p">}</span></div><div class='line' id='LC17'> <span class="k">if</span> <span class="p">(</span><span class="s1">'ActiveXObject'</span> <span class="k">in</span> <span class="nb">window</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC18'> <span class="k">try</span> <span class="p">{</span></div><div class='line' id='LC19'> <span class="k">return</span> <span class="o">!!</span><span class="k">new</span> <span class="nx">ActiveXObject</span><span class="p">(</span><span class="s1">'ShockwaveFlash.ShockwaveFlash'</span><span class="p">).</span><span class="nx">GetVariable</span><span class="p">(</span><span class="s1">'$version'</span><span class="p">);</span></div><div class='line' id='LC20'> <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{}</span></div><div class='line' id='LC21'> <span class="p">}</span></div><div class='line' id='LC22'> <span class="k">return</span> <span class="kc">false</span><span class="p">;</span></div><div class='line' id='LC23'> <span class="p">}</span></div><div class='line' id='LC24'> </div><div class='line' id='LC25'> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">hasFlash</span><span class="p">())</span> <span class="p">{</span></div><div class='line' id='LC26'> <span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="s2">"Flash Player is not installed."</span><span class="p">);</span></div><div class='line' id='LC27'> <span class="k">return</span><span class="p">;</span></div><div class='line' id='LC28'> <span class="p">}</span></div><div class='line' id='LC29'><br/></div><div class='line' id='LC30'> <span class="nx">WebSocket</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">url</span><span class="p">,</span> <span class="nx">protocol</span><span class="p">,</span> <span class="nx">proxyHost</span><span class="p">,</span> <span class="nx">proxyPort</span><span class="p">,</span> <span class="nx">headers</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC31'> <span class="kd">var</span> <span class="nx">self</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span></div><div class='line' id='LC32'> <span class="nx">self</span><span class="p">.</span><span class="nx">readyState</span> <span class="o">=</span> <span class="nx">WebSocket</span><span class="p">.</span><span class="nx">CONNECTING</span><span class="p">;</span></div><div class='line' id='LC33'> <span class="nx">self</span><span class="p">.</span><span class="nx">bufferedAmount</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span></div><div class='line' id='LC34'> <span class="nx">WebSocket</span><span class="p">.</span><span class="nx">__addTask</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span></div><div class='line' id='LC35'> <span class="nx">self</span><span class="p">.</span><span class="nx">__flash</span> <span class="o">=</span></div><div class='line' id='LC36'> <span class="nx">WebSocket</span><span class="p">.</span><span class="nx">__flash</span><span class="p">.</span><span class="nx">create</span><span class="p">(</span><span class="nx">url</span><span class="p">,</span> <span class="nx">protocol</span><span class="p">,</span> <span class="nx">proxyHost</span> <span class="o">||</span> <span class="kc">null</span><span class="p">,</span> <span class="nx">proxyPort</span> <span class="o">||</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">headers</span> <span class="o">||</span> <span class="kc">null</span><span class="p">);</span></div><div class='line' id='LC37'><br/></div><div class='line' id='LC38'> <span class="nx">self</span><span class="p">.</span><span class="nx">__flash</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="s2">"open"</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">fe</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC39'> <span class="k">try</span> <span class="p">{</span></div><div class='line' id='LC40'> <span class="k">if</span> <span class="p">(</span><span class="nx">self</span><span class="p">.</span><span class="nx">onopen</span><span class="p">)</span> <span class="nx">self</span><span class="p">.</span><span class="nx">onopen</span><span class="p">();</span></div><div class='line' id='LC41'> <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC42'> <span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">toString</span><span class="p">());</span></div><div class='line' id='LC43'> <span class="p">}</span></div><div class='line' id='LC44'> <span class="p">});</span></div><div class='line' id='LC45'><br/></div><div class='line' id='LC46'> <span class="nx">self</span><span class="p">.</span><span class="nx">__flash</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="s2">"close"</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">fe</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC47'> <span class="k">try</span> <span class="p">{</span></div><div class='line' id='LC48'> <span class="k">if</span> <span class="p">(</span><span class="nx">self</span><span class="p">.</span><span class="nx">onclose</span><span class="p">)</span> <span class="nx">self</span><span class="p">.</span><span class="nx">onclose</span><span class="p">();</span></div><div class='line' id='LC49'> <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC50'> <span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">toString</span><span class="p">());</span></div><div class='line' id='LC51'> <span class="p">}</span></div><div class='line' id='LC52'> <span class="p">});</span></div><div class='line' id='LC53'><br/></div><div class='line' id='LC54'> <span class="nx">self</span><span class="p">.</span><span class="nx">__flash</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="s2">"message"</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">fe</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC55'> <span class="kd">var</span> <span class="nx">data</span> <span class="o">=</span> <span class="nb">decodeURIComponent</span><span class="p">(</span><span class="nx">fe</span><span class="p">.</span><span class="nx">getData</span><span class="p">());</span></div><div class='line' id='LC56'> <span class="k">try</span> <span class="p">{</span></div><div class='line' id='LC57'> <span class="k">if</span> <span class="p">(</span><span class="nx">self</span><span class="p">.</span><span class="nx">onmessage</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC58'> <span class="kd">var</span> <span class="nx">e</span><span class="p">;</span></div><div class='line' id='LC59'> <span class="k">if</span> <span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">MessageEvent</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC60'> <span class="nx">e</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createEvent</span><span class="p">(</span><span class="s2">"MessageEvent"</span><span class="p">);</span></div><div class='line' id='LC61'> <span class="nx">e</span><span class="p">.</span><span class="nx">initMessageEvent</span><span class="p">(</span><span class="s2">"message"</span><span class="p">,</span> <span class="kc">false</span><span class="p">,</span> <span class="kc">false</span><span class="p">,</span> <span class="nx">data</span><span class="p">,</span> <span class="kc">null</span><span class="p">,</span> <span class="kc">null</span><span class="p">,</span> <span class="nb">window</span><span class="p">);</span></div><div class='line' id='LC62'> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="c1">// IE</span></div><div class='line' id='LC63'> <span class="nx">e</span> <span class="o">=</span> <span class="p">{</span><span class="nx">data</span><span class="o">:</span> <span class="nx">data</span><span class="p">};</span></div><div class='line' id='LC64'> <span class="p">}</span></div><div class='line' id='LC65'> <span class="nx">self</span><span class="p">.</span><span class="nx">onmessage</span><span class="p">(</span><span class="nx">e</span><span class="p">);</span></div><div class='line' id='LC66'> <span class="p">}</span></div><div class='line' id='LC67'> <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC68'> <span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">toString</span><span class="p">());</span></div><div class='line' id='LC69'> <span class="p">}</span></div><div class='line' id='LC70'> <span class="p">});</span></div><div class='line' id='LC71'><br/></div><div class='line' id='LC72'> <span class="nx">self</span><span class="p">.</span><span class="nx">__flash</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="s2">"stateChange"</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">fe</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC73'> <span class="k">try</span> <span class="p">{</span></div><div class='line' id='LC74'> <span class="nx">self</span><span class="p">.</span><span class="nx">readyState</span> <span class="o">=</span> <span class="nx">fe</span><span class="p">.</span><span class="nx">getReadyState</span><span class="p">();</span></div><div class='line' id='LC75'> <span class="nx">self</span><span class="p">.</span><span class="nx">bufferedAmount</span> <span class="o">=</span> <span class="nx">fe</span><span class="p">.</span><span class="nx">getBufferedAmount</span><span class="p">();</span></div><div class='line' id='LC76'> <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC77'> <span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">toString</span><span class="p">());</span></div><div class='line' id='LC78'> <span class="p">}</span></div><div class='line' id='LC79'> <span class="p">});</span></div><div class='line' id='LC80'><br/></div><div class='line' id='LC81'> <span class="c1">//console.log("[WebSocket] Flash object is ready");</span></div><div class='line' id='LC82'> <span class="p">});</span></div><div class='line' id='LC83'> <span class="p">}</span></div><div class='line' id='LC84'><br/></div><div class='line' id='LC85'> <span class="nx">WebSocket</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">send</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">data</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC86'> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="k">this</span><span class="p">.</span><span class="nx">__flash</span> <span class="o">||</span> <span class="k">this</span><span class="p">.</span><span class="nx">readyState</span> <span class="o">==</span> <span class="nx">WebSocket</span><span class="p">.</span><span class="nx">CONNECTING</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC87'> <span class="k">throw</span> <span class="s2">"INVALID_STATE_ERR: Web Socket connection has not been established"</span><span class="p">;</span></div><div class='line' id='LC88'> <span class="p">}</span></div><div class='line' id='LC89'> <span class="kd">var</span> <span class="nx">result</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">__flash</span><span class="p">.</span><span class="nx">send</span><span class="p">(</span><span class="nx">data</span><span class="p">);</span></div><div class='line' id='LC90'> <span class="k">if</span> <span class="p">(</span><span class="nx">result</span> <span class="o"><</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// success</span></div><div class='line' id='LC91'> <span class="k">return</span> <span class="kc">true</span><span class="p">;</span></div><div class='line' id='LC92'> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span></div><div class='line' id='LC93'> <span class="k">this</span><span class="p">.</span><span class="nx">bufferedAmount</span> <span class="o">=</span> <span class="nx">result</span><span class="p">;</span></div><div class='line' id='LC94'> <span class="k">return</span> <span class="kc">false</span><span class="p">;</span></div><div class='line' id='LC95'> <span class="p">}</span></div><div class='line' id='LC96'> <span class="p">};</span></div><div class='line' id='LC97'><br/></div><div class='line' id='LC98'> <span class="nx">WebSocket</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">close</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span></div><div class='line' id='LC99'> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="k">this</span><span class="p">.</span><span class="nx">__flash</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span></div><div class='line' id='LC100'> <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">readyState</span> <span class="o">!=</span> <span class="nx">WebSocket</span><span class="p">.</span><span class="nx">OPEN</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span></div><div class='line' id='LC101'> <span class="k">this</span><span class="p">.</span><span class="nx">__flash</span><span class="p">.</span><span class="nx">close</span><span class="p">();</span></div><div class='line' id='LC102'> <span class="c1">// Sets/calls them manually here because Flash WebSocketConnection.close cannot fire events</span></div><div class='line' id='LC103'> <span class="c1">// which causes weird error:</span></div><div class='line' id='LC104'> <span class="c1">// > You are trying to call recursively into the Flash Player which is not allowed.</span></div><div class='line' id='LC105'> <span class="k">this</span><span class="p">.</span><span class="nx">readyState</span> <span class="o">=</span> <span class="nx">WebSocket</span><span class="p">.</span><span class="nx">CLOSED</span><span class="p">;</span></div><div class='line' id='LC106'> <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">onclose</span><span class="p">)</span> <span class="k">this</span><span class="p">.</span><span class="nx">onclose</span><span class="p">();</span></div><div class='line' id='LC107'> <span class="p">};</span></div><div class='line' id='LC108'><br/></div><div class='line' id='LC109'> <span class="cm">/**</span></div><div class='line' id='LC110'><span class="cm"> * Implementation of {@link <a href="http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-registration">DOM 2 EventTarget Interface</a>}</span></div><div class='line' id='LC111'><span class="cm"> *</span></div><div class='line' id='LC112'><span class="cm"> * @param {string} type</span></div><div class='line' id='LC113'><span class="cm"> * @param {function} listener</span></div><div class='line' id='LC114'><span class="cm"> * @param {boolean} useCapture !NB Not implemented yet</span></div><div class='line' id='LC115'><span class="cm"> * @return void</span></div><div class='line' id='LC116'><span class="cm"> */</span></div><div class='line' id='LC117'> <span class="nx">WebSocket</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">addEventListener</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">type</span><span class="p">,</span> <span class="nx">listener</span><span class="p">,</span> <span class="nx">useCapture</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC118'> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="s1">'__events'</span> <span class="k">in</span> <span class="k">this</span><span class="p">))</span> <span class="p">{</span></div><div class='line' id='LC119'> <span class="k">this</span><span class="p">.</span><span class="nx">__events</span> <span class="o">=</span> <span class="p">{};</span></div><div class='line' id='LC120'> <span class="p">}</span></div><div class='line' id='LC121'> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="nx">type</span> <span class="k">in</span> <span class="k">this</span><span class="p">.</span><span class="nx">__events</span><span class="p">))</span> <span class="p">{</span></div><div class='line' id='LC122'> <span class="k">this</span><span class="p">.</span><span class="nx">__events</span><span class="p">[</span><span class="nx">type</span><span class="p">]</span> <span class="o">=</span> <span class="p">[];</span></div><div class='line' id='LC123'> <span class="k">if</span> <span class="p">(</span><span class="s1">'function'</span> <span class="o">==</span> <span class="k">typeof</span> <span class="k">this</span><span class="p">[</span><span class="s1">'on'</span> <span class="o">+</span> <span class="nx">type</span><span class="p">])</span> <span class="p">{</span></div><div class='line' id='LC124'> <span class="k">this</span><span class="p">.</span><span class="nx">__events</span><span class="p">[</span><span class="nx">type</span><span class="p">].</span><span class="nx">defaultHandler</span> <span class="o">=</span> <span class="k">this</span><span class="p">[</span><span class="s1">'on'</span> <span class="o">+</span> <span class="nx">type</span><span class="p">];</span></div><div class='line' id='LC125'> <span class="k">this</span><span class="p">[</span><span class="s1">'on'</span> <span class="o">+</span> <span class="nx">type</span><span class="p">]</span> <span class="o">=</span> <span class="nx">WebSocket_FireEvent</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">type</span><span class="p">);</span></div><div class='line' id='LC126'> <span class="p">}</span></div><div class='line' id='LC127'> <span class="p">}</span></div><div class='line' id='LC128'> <span class="k">this</span><span class="p">.</span><span class="nx">__events</span><span class="p">[</span><span class="nx">type</span><span class="p">].</span><span class="nx">push</span><span class="p">(</span><span class="nx">listener</span><span class="p">);</span></div><div class='line' id='LC129'> <span class="p">};</span></div><div class='line' id='LC130'><br/></div><div class='line' id='LC131'> <span class="cm">/**</span></div><div class='line' id='LC132'><span class="cm"> * Implementation of {@link <a href="http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-registration">DOM 2 EventTarget Interface</a>}</span></div><div class='line' id='LC133'><span class="cm"> *</span></div><div class='line' id='LC134'><span class="cm"> * @param {string} type</span></div><div class='line' id='LC135'><span class="cm"> * @param {function} listener</span></div><div class='line' id='LC136'><span class="cm"> * @param {boolean} useCapture NB! Not implemented yet</span></div><div class='line' id='LC137'><span class="cm"> * @return void</span></div><div class='line' id='LC138'><span class="cm"> */</span></div><div class='line' id='LC139'> <span class="nx">WebSocket</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">removeEventListener</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">type</span><span class="p">,</span> <span class="nx">listener</span><span class="p">,</span> <span class="nx">useCapture</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC140'> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="s1">'__events'</span> <span class="k">in</span> <span class="k">this</span><span class="p">))</span> <span class="p">{</span></div><div class='line' id='LC141'> <span class="k">this</span><span class="p">.</span><span class="nx">__events</span> <span class="o">=</span> <span class="p">{};</span></div><div class='line' id='LC142'> <span class="p">}</span></div><div class='line' id='LC143'> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="nx">type</span> <span class="k">in</span> <span class="k">this</span><span class="p">.</span><span class="nx">__events</span><span class="p">))</span> <span class="k">return</span><span class="p">;</span></div><div class='line' id='LC144'> <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">__events</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span> <span class="o">></span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span> <span class="o">--</span><span class="nx">i</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC145'> <span class="k">if</span> <span class="p">(</span><span class="nx">listener</span> <span class="o">===</span> <span class="k">this</span><span class="p">.</span><span class="nx">__events</span><span class="p">[</span><span class="nx">type</span><span class="p">][</span><span class="nx">i</span><span class="p">])</span> <span class="p">{</span></div><div class='line' id='LC146'> <span class="k">this</span><span class="p">.</span><span class="nx">__events</span><span class="p">[</span><span class="nx">type</span><span class="p">].</span><span class="nx">splice</span><span class="p">(</span><span class="nx">i</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span></div><div class='line' id='LC147'> <span class="k">break</span><span class="p">;</span></div><div class='line' id='LC148'> <span class="p">}</span></div><div class='line' id='LC149'> <span class="p">}</span></div><div class='line' id='LC150'> <span class="p">};</span></div><div class='line' id='LC151'><br/></div><div class='line' id='LC152'> <span class="cm">/**</span></div><div class='line' id='LC153'><span class="cm"> * Implementation of {@link <a href="http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-registration">DOM 2 EventTarget Interface</a>}</span></div><div class='line' id='LC154'><span class="cm"> *</span></div><div class='line' id='LC155'><span class="cm"> * @param {WebSocketEvent} event</span></div><div class='line' id='LC156'><span class="cm"> * @return void</span></div><div class='line' id='LC157'><span class="cm"> */</span></div><div class='line' id='LC158'> <span class="nx">WebSocket</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">dispatchEvent</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC159'> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="s1">'__events'</span> <span class="k">in</span> <span class="k">this</span><span class="p">))</span> <span class="k">throw</span> <span class="s1">'UNSPECIFIED_EVENT_TYPE_ERR'</span><span class="p">;</span></div><div class='line' id='LC160'> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="nx">event</span><span class="p">.</span><span class="nx">type</span> <span class="k">in</span> <span class="k">this</span><span class="p">.</span><span class="nx">__events</span><span class="p">))</span> <span class="k">throw</span> <span class="s1">'UNSPECIFIED_EVENT_TYPE_ERR'</span><span class="p">;</span></div><div class='line' id='LC161'><br/></div><div class='line' id='LC162'> <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">l</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">__events</span><span class="p">[</span><span class="nx">event</span><span class="p">.</span><span class="nx">type</span><span class="p">].</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="nx">l</span><span class="p">;</span> <span class="o">++</span> <span class="nx">i</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC163'> <span class="k">this</span><span class="p">.</span><span class="nx">__events</span><span class="p">[</span><span class="nx">event</span><span class="p">.</span><span class="nx">type</span><span class="p">][</span><span class="nx">i</span><span class="p">](</span><span class="nx">event</span><span class="p">);</span></div><div class='line' id='LC164'> <span class="k">if</span> <span class="p">(</span><span class="nx">event</span><span class="p">.</span><span class="nx">cancelBubble</span><span class="p">)</span> <span class="k">break</span><span class="p">;</span></div><div class='line' id='LC165'> <span class="p">}</span></div><div class='line' id='LC166'><br/></div><div class='line' id='LC167'> <span class="k">if</span> <span class="p">(</span><span class="kc">false</span> <span class="o">!==</span> <span class="nx">event</span><span class="p">.</span><span class="nx">returnValue</span> <span class="o">&&</span></div><div class='line' id='LC168'> <span class="s1">'function'</span> <span class="o">==</span> <span class="k">typeof</span> <span class="k">this</span><span class="p">.</span><span class="nx">__events</span><span class="p">[</span><span class="nx">event</span><span class="p">.</span><span class="nx">type</span><span class="p">].</span><span class="nx">defaultHandler</span><span class="p">)</span></div><div class='line' id='LC169'> <span class="p">{</span></div><div class='line' id='LC170'> <span class="k">this</span><span class="p">.</span><span class="nx">__events</span><span class="p">[</span><span class="nx">event</span><span class="p">.</span><span class="nx">type</span><span class="p">].</span><span class="nx">defaultHandler</span><span class="p">(</span><span class="nx">event</span><span class="p">);</span></div><div class='line' id='LC171'> <span class="p">}</span></div><div class='line' id='LC172'> <span class="p">};</span></div><div class='line' id='LC173'><br/></div><div class='line' id='LC174'> <span class="cm">/**</span></div><div class='line' id='LC175'><span class="cm"> *</span></div><div class='line' id='LC176'><span class="cm"> * @param {object} object</span></div><div class='line' id='LC177'><span class="cm"> * @param {string} type</span></div><div class='line' id='LC178'><span class="cm"> */</span></div><div class='line' id='LC179'> <span class="kd">function</span> <span class="nx">WebSocket_FireEvent</span><span class="p">(</span><span class="nx">object</span><span class="p">,</span> <span class="nx">type</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC180'> <span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">data</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC181'> <span class="kd">var</span> <span class="nx">event</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">WebSocketEvent</span><span class="p">();</span></div><div class='line' id='LC182'> <span class="nx">event</span><span class="p">.</span><span class="nx">initEvent</span><span class="p">(</span><span class="nx">type</span><span class="p">,</span> <span class="kc">true</span><span class="p">,</span> <span class="kc">true</span><span class="p">);</span></div><div class='line' id='LC183'> <span class="nx">event</span><span class="p">.</span><span class="nx">target</span> <span class="o">=</span> <span class="nx">event</span><span class="p">.</span><span class="nx">currentTarget</span> <span class="o">=</span> <span class="nx">object</span><span class="p">;</span></div><div class='line' id='LC184'> <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">key</span> <span class="k">in</span> <span class="nx">data</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC185'> <span class="nx">event</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span> <span class="o">=</span> <span class="nx">data</span><span class="p">[</span><span class="nx">key</span><span class="p">];</span></div><div class='line' id='LC186'> <span class="p">}</span></div><div class='line' id='LC187'> <span class="nx">object</span><span class="p">.</span><span class="nx">dispatchEvent</span><span class="p">(</span><span class="nx">event</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span></div><div class='line' id='LC188'> <span class="p">};</span></div><div class='line' id='LC189'> <span class="p">}</span></div><div class='line' id='LC190'><br/></div><div class='line' id='LC191'> <span class="cm">/**</span></div><div class='line' id='LC192'><span class="cm"> * Basic implementation of {@link <a href="http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-interface">DOM 2 EventInterface</a>}</span></div><div class='line' id='LC193'><span class="cm"> *</span></div><div class='line' id='LC194'><span class="cm"> * @class</span></div><div class='line' id='LC195'><span class="cm"> * @constructor</span></div><div class='line' id='LC196'><span class="cm"> */</span></div><div class='line' id='LC197'> <span class="kd">function</span> <span class="nx">WebSocketEvent</span><span class="p">(){}</span></div><div class='line' id='LC198'><br/></div><div class='line' id='LC199'> <span class="cm">/**</span></div><div class='line' id='LC200'><span class="cm"> *</span></div><div class='line' id='LC201'><span class="cm"> * @type boolean</span></div><div class='line' id='LC202'><span class="cm"> */</span></div><div class='line' id='LC203'> <span class="nx">WebSocketEvent</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">cancelable</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span></div><div class='line' id='LC204'><br/></div><div class='line' id='LC205'> <span class="cm">/**</span></div><div class='line' id='LC206'><span class="cm"> *</span></div><div class='line' id='LC207'><span class="cm"> * @type boolean</span></div><div class='line' id='LC208'><span class="cm"> */</span></div><div class='line' id='LC209'> <span class="nx">WebSocketEvent</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">cancelBubble</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span></div><div class='line' id='LC210'><br/></div><div class='line' id='LC211'> <span class="cm">/**</span></div><div class='line' id='LC212'><span class="cm"> *</span></div><div class='line' id='LC213'><span class="cm"> * @return void</span></div><div class='line' id='LC214'><span class="cm"> */</span></div><div class='line' id='LC215'> <span class="nx">WebSocketEvent</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">preventDefault</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span></div><div class='line' id='LC216'> <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">cancelable</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC217'> <span class="k">this</span><span class="p">.</span><span class="nx">returnValue</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span></div><div class='line' id='LC218'> <span class="p">}</span></div><div class='line' id='LC219'> <span class="p">};</span></div><div class='line' id='LC220'><br/></div><div class='line' id='LC221'> <span class="cm">/**</span></div><div class='line' id='LC222'><span class="cm"> *</span></div><div class='line' id='LC223'><span class="cm"> * @return void</span></div><div class='line' id='LC224'><span class="cm"> */</span></div><div class='line' id='LC225'> <span class="nx">WebSocketEvent</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">stopPropagation</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span></div><div class='line' id='LC226'> <span class="k">this</span><span class="p">.</span><span class="nx">cancelBubble</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span></div><div class='line' id='LC227'> <span class="p">};</span></div><div class='line' id='LC228'><br/></div><div class='line' id='LC229'> <span class="cm">/**</span></div><div class='line' id='LC230'><span class="cm"> *</span></div><div class='line' id='LC231'><span class="cm"> * @param {string} eventTypeArg</span></div><div class='line' id='LC232'><span class="cm"> * @param {boolean} canBubbleArg</span></div><div class='line' id='LC233'><span class="cm"> * @param {boolean} cancelableArg</span></div><div class='line' id='LC234'><span class="cm"> * @return void</span></div><div class='line' id='LC235'><span class="cm"> */</span></div><div class='line' id='LC236'> <span class="nx">WebSocketEvent</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">initEvent</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">eventTypeArg</span><span class="p">,</span> <span class="nx">canBubbleArg</span><span class="p">,</span> <span class="nx">cancelableArg</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC237'> <span class="k">this</span><span class="p">.</span><span class="nx">type</span> <span class="o">=</span> <span class="nx">eventTypeArg</span><span class="p">;</span></div><div class='line' id='LC238'> <span class="k">this</span><span class="p">.</span><span class="nx">cancelable</span> <span class="o">=</span> <span class="nx">cancelableArg</span><span class="p">;</span></div><div class='line' id='LC239'> <span class="k">this</span><span class="p">.</span><span class="nx">timeStamp</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Date</span><span class="p">();</span></div><div class='line' id='LC240'> <span class="p">};</span></div><div class='line' id='LC241'><br/></div><div class='line' id='LC242'><br/></div><div class='line' id='LC243'> <span class="nx">WebSocket</span><span class="p">.</span><span class="nx">CONNECTING</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span></div><div class='line' id='LC244'> <span class="nx">WebSocket</span><span class="p">.</span><span class="nx">OPEN</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span></div><div class='line' id='LC245'> <span class="nx">WebSocket</span><span class="p">.</span><span class="nx">CLOSED</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span></div><div class='line' id='LC246'><br/></div><div class='line' id='LC247'> <span class="nx">WebSocket</span><span class="p">.</span><span class="nx">__tasks</span> <span class="o">=</span> <span class="p">[];</span></div><div class='line' id='LC248'><br/></div><div class='line' id='LC249'> <span class="nx">WebSocket</span><span class="p">.</span><span class="nx">__initialize</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span></div><div class='line' id='LC250'> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">WebSocket</span><span class="p">.</span><span class="nx">__swfLocation</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC251'> <span class="c1">//console.error("[WebSocket] set WebSocket.__swfLocation to location of WebSocketMain.swf");</span></div><div class='line' id='LC252'> <span class="c1">//return;</span></div><div class='line' id='LC253'> <span class="nx">WebSocket</span><span class="p">.</span><span class="nx">__swfLocation</span> <span class="o">=</span> <span class="s2">"js/WebSocketMain.swf"</span><span class="p">;</span></div><div class='line' id='LC254'> <span class="p">}</span></div><div class='line' id='LC255'> <span class="kd">var</span> <span class="nx">container</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s2">"div"</span><span class="p">);</span></div><div class='line' id='LC256'> <span class="nx">container</span><span class="p">.</span><span class="nx">id</span> <span class="o">=</span> <span class="s2">"webSocketContainer"</span><span class="p">;</span></div><div class='line' id='LC257'> <span class="c1">// Puts the Flash out of the window. Note that we cannot use display: none or visibility: hidden</span></div><div class='line' id='LC258'> <span class="c1">// here because it prevents Flash from loading at least in IE.</span></div><div class='line' id='LC259'> <span class="nx">container</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">position</span> <span class="o">=</span> <span class="s2">"absolute"</span><span class="p">;</span></div><div class='line' id='LC260'> <span class="nx">container</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">left</span> <span class="o">=</span> <span class="s2">"-100px"</span><span class="p">;</span></div><div class='line' id='LC261'> <span class="nx">container</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">top</span> <span class="o">=</span> <span class="s2">"-100px"</span><span class="p">;</span></div><div class='line' id='LC262'> <span class="kd">var</span> <span class="nx">holder</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s2">"div"</span><span class="p">);</span></div><div class='line' id='LC263'> <span class="nx">holder</span><span class="p">.</span><span class="nx">id</span> <span class="o">=</span> <span class="s2">"webSocketFlash"</span><span class="p">;</span></div><div class='line' id='LC264'> <span class="nx">container</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">holder</span><span class="p">);</span></div><div class='line' id='LC265'> <span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">container</span><span class="p">);</span></div><div class='line' id='LC266'> <span class="nx">swfobject</span><span class="p">.</span><span class="nx">embedSWF</span><span class="p">(</span></div><div class='line' id='LC267'> <span class="nx">WebSocket</span><span class="p">.</span><span class="nx">__swfLocation</span><span class="p">,</span> <span class="s2">"webSocketFlash"</span><span class="p">,</span> <span class="s2">"8"</span><span class="p">,</span> <span class="s2">"8"</span><span class="p">,</span> <span class="s2">"9.0.0"</span><span class="p">,</span></div><div class='line' id='LC268'> <span class="kc">null</span><span class="p">,</span> <span class="p">{</span><span class="nx">bridgeName</span><span class="o">:</span> <span class="s2">"webSocket"</span><span class="p">},</span> <span class="kc">null</span><span class="p">,</span> <span class="kc">null</span><span class="p">,</span></div><div class='line' id='LC269'> <span class="kd">function</span><span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC270'> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">e</span><span class="p">.</span><span class="nx">success</span><span class="p">)</span> <span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="s2">"[WebSocket] swfobject.embedSWF failed"</span><span class="p">);</span></div><div class='line' id='LC271'> <span class="p">}</span></div><div class='line' id='LC272'> <span class="p">);</span></div><div class='line' id='LC273'> <span class="nx">FABridge</span><span class="p">.</span><span class="nx">addInitializationCallback</span><span class="p">(</span><span class="s2">"webSocket"</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span></div><div class='line' id='LC274'> <span class="k">try</span> <span class="p">{</span></div><div class='line' id='LC275'> <span class="c1">//console.log("[WebSocket] FABridge initializad");</span></div><div class='line' id='LC276'> <span class="nx">WebSocket</span><span class="p">.</span><span class="nx">__flash</span> <span class="o">=</span> <span class="nx">FABridge</span><span class="p">.</span><span class="nx">webSocket</span><span class="p">.</span><span class="nx">root</span><span class="p">();</span></div><div class='line' id='LC277'> <span class="nx">WebSocket</span><span class="p">.</span><span class="nx">__flash</span><span class="p">.</span><span class="nx">setCallerUrl</span><span class="p">(</span><span class="nx">location</span><span class="p">.</span><span class="nx">href</span><span class="p">);</span></div><div class='line' id='LC278'> <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="nx">WebSocket</span><span class="p">.</span><span class="nx">__tasks</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="o">++</span><span class="nx">i</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC279'> <span class="nx">WebSocket</span><span class="p">.</span><span class="nx">__tasks</span><span class="p">[</span><span class="nx">i</span><span class="p">]();</span></div><div class='line' id='LC280'> <span class="p">}</span></div><div class='line' id='LC281'> <span class="nx">WebSocket</span><span class="p">.</span><span class="nx">__tasks</span> <span class="o">=</span> <span class="p">[];</span></div><div class='line' id='LC282'> <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC283'> <span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="s2">"[WebSocket] "</span> <span class="o">+</span> <span class="nx">e</span><span class="p">.</span><span class="nx">toString</span><span class="p">());</span></div><div class='line' id='LC284'> <span class="p">}</span></div><div class='line' id='LC285'> <span class="p">});</span></div><div class='line' id='LC286'> <span class="p">};</span></div><div class='line' id='LC287'><br/></div><div class='line' id='LC288'> <span class="nx">WebSocket</span><span class="p">.</span><span class="nx">__addTask</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">task</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC289'> <span class="k">if</span> <span class="p">(</span><span class="nx">WebSocket</span><span class="p">.</span><span class="nx">__flash</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC290'> <span class="nx">task</span><span class="p">();</span></div><div class='line' id='LC291'> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span></div><div class='line' id='LC292'> <span class="nx">WebSocket</span><span class="p">.</span><span class="nx">__tasks</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">task</span><span class="p">);</span></div><div class='line' id='LC293'> <span class="p">}</span></div><div class='line' id='LC294'> <span class="p">}</span></div><div class='line' id='LC295'><br/></div><div class='line' id='LC296'> <span class="c1">// called from Flash</span></div><div class='line' id='LC297'> <span class="kd">function</span> <span class="nx">webSocketLog</span><span class="p">(</span><span class="nx">message</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC298'> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nb">decodeURIComponent</span><span class="p">(</span><span class="nx">message</span><span class="p">));</span></div><div class='line' id='LC299'> <span class="p">}</span></div><div class='line' id='LC300'><br/></div><div class='line' id='LC301'> <span class="c1">// called from Flash</span></div><div class='line' id='LC302'> <span class="kd">function</span> <span class="nx">webSocketError</span><span class="p">(</span><span class="nx">message</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC303'> <span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="nb">decodeURIComponent</span><span class="p">(</span><span class="nx">message</span><span class="p">));</span></div><div class='line' id='LC304'> <span class="p">}</span></div><div class='line' id='LC305'><br/></div><div class='line' id='LC306'> <span class="k">if</span> <span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">)</span> <span class="p">{</span></div><div class='line' id='LC307'> <span class="nb">window</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="s2">"load"</span><span class="p">,</span> <span class="nx">WebSocket</span><span class="p">.</span><span class="nx">__initialize</span><span class="p">,</span> <span class="kc">false</span><span class="p">);</span></div><div class='line' id='LC308'> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span></div><div class='line' id='LC309'> <span class="nb">window</span><span class="p">.</span><span class="nx">attachEvent</span><span class="p">(</span><span class="s2">"onload"</span><span class="p">,</span> <span class="nx">WebSocket</span><span class="p">.</span><span class="nx">__initialize</span><span class="p">);</span></div><div class='line' id='LC310'> <span class="p">}</span></div><div class='line' id='LC311'> </div><div class='line' id='LC312'><span class="p">})();</span></div></pre></div>
|
678
|
+
</td>
|
679
|
+
</tr>
|
680
|
+
</table>
|
681
|
+
</div>
|
682
|
+
|
683
|
+
</div>
|
684
|
+
</div>
|
685
|
+
</div>
|
686
|
+
</div>
|
687
|
+
|
688
|
+
</div>
|
689
|
+
|
690
|
+
<div class="frame frame-loading large-loading-area" style="display:none;" data-tree-list-url="/igrigorik/em-websocket/tree-list/b9d439cd3494db3225587ccf7cb060f4b37a9f13" data-blob-url-prefix="/igrigorik/em-websocket/blob/b9d439cd3494db3225587ccf7cb060f4b37a9f13">
|
691
|
+
<img src="https://a248.e.akamai.net/assets.github.com/images/spinners/octocat-spinner-64.gif?1329872009" height="64" width="64">
|
692
|
+
</div>
|
693
|
+
|
694
|
+
</div>
|
695
|
+
<div class="context-overlay"></div>
|
696
|
+
</div>
|
697
|
+
|
698
|
+
<div id="footer-push"></div><!-- hack for sticky footer -->
|
699
|
+
</div><!-- end of wrapper - hack for sticky footer -->
|
700
|
+
|
701
|
+
<!-- footer -->
|
702
|
+
<div id="footer" >
|
703
|
+
|
704
|
+
<div class="upper_footer">
|
705
|
+
<div class="container clearfix">
|
706
|
+
|
707
|
+
<!--[if IE]><h4 id="blacktocat_ie">GitHub Links</h4><![endif]-->
|
708
|
+
<![if !IE]><h4 id="blacktocat">GitHub Links</h4><![endif]>
|
709
|
+
|
710
|
+
<ul class="footer_nav">
|
711
|
+
<h4>GitHub</h4>
|
712
|
+
<li><a href="https://github.com/about">About</a></li>
|
713
|
+
<li><a href="https://github.com/blog">Blog</a></li>
|
714
|
+
<li><a href="https://github.com/features">Features</a></li>
|
715
|
+
<li><a href="https://github.com/contact">Contact & Support</a></li>
|
716
|
+
<li><a href="https://github.com/training">Training</a></li>
|
717
|
+
<li><a href="http://enterprise.github.com/">GitHub Enterprise</a></li>
|
718
|
+
<li><a href="http://status.github.com/">Site Status</a></li>
|
719
|
+
</ul>
|
720
|
+
|
721
|
+
<ul class="footer_nav">
|
722
|
+
<h4>Tools</h4>
|
723
|
+
<li><a href="http://get.gaug.es/">Gauges: Analyze web traffic</a></li>
|
724
|
+
<li><a href="http://speakerdeck.com">Speaker Deck: Presentations</a></li>
|
725
|
+
<li><a href="https://gist.github.com">Gist: Code snippets</a></li>
|
726
|
+
<li><a href="http://mac.github.com/">GitHub for Mac</a></li>
|
727
|
+
<li><a href="http://windows.github.com/">GitHub for Windows</a></li>
|
728
|
+
<li><a href="http://mobile.github.com/">Issues for iPhone</a></li>
|
729
|
+
<li><a href="http://jobs.github.com/">Job Board</a></li>
|
730
|
+
</ul>
|
731
|
+
|
732
|
+
<ul class="footer_nav">
|
733
|
+
<h4>Extras</h4>
|
734
|
+
<li><a href="http://shop.github.com/">GitHub Shop</a></li>
|
735
|
+
<li><a href="http://octodex.github.com/">The Octodex</a></li>
|
736
|
+
</ul>
|
737
|
+
|
738
|
+
<ul class="footer_nav">
|
739
|
+
<h4>Documentation</h4>
|
740
|
+
<li><a href="http://help.github.com/">GitHub Help</a></li>
|
741
|
+
<li><a href="http://developer.github.com/">Developer API</a></li>
|
742
|
+
<li><a href="http://github.github.com/github-flavored-markdown/">GitHub Flavored Markdown</a></li>
|
743
|
+
<li><a href="http://pages.github.com/">GitHub Pages</a></li>
|
744
|
+
</ul>
|
745
|
+
|
746
|
+
</div><!-- /.site -->
|
747
|
+
</div><!-- /.upper_footer -->
|
748
|
+
|
749
|
+
<div class="lower_footer">
|
750
|
+
<div class="container clearfix">
|
751
|
+
<!--[if IE]><div id="legal_ie"><![endif]-->
|
752
|
+
<![if !IE]><div id="legal"><![endif]>
|
753
|
+
<ul>
|
754
|
+
<li><a href="https://github.com/site/terms">Terms of Service</a></li>
|
755
|
+
<li><a href="https://github.com/site/privacy">Privacy</a></li>
|
756
|
+
<li><a href="https://github.com/security">Security</a></li>
|
757
|
+
</ul>
|
758
|
+
|
759
|
+
<p>© 2012 <span title="0.10916s from fe8.rs.github.com">GitHub</span> Inc. All rights reserved.</p>
|
760
|
+
</div><!-- /#legal or /#legal_ie-->
|
761
|
+
|
762
|
+
<div class="sponsor">
|
763
|
+
<a href="http://www.rackspace.com" class="logo">
|
764
|
+
<img alt="Dedicated Server" height="36" src="https://a248.e.akamai.net/assets.github.com/images/modules/footer/rackspaces_logo.png?1329521041" width="38" />
|
765
|
+
</a>
|
766
|
+
Powered by the <a href="http://www.rackspace.com ">Dedicated
|
767
|
+
Servers</a> and<br/> <a href="http://www.rackspacecloud.com">Cloud
|
768
|
+
Computing</a> of Rackspace Hosting<span>®</span>
|
769
|
+
</div>
|
770
|
+
</div><!-- /.site -->
|
771
|
+
</div><!-- /.lower_footer -->
|
772
|
+
|
773
|
+
</div><!-- /#footer -->
|
774
|
+
|
775
|
+
|
776
|
+
|
777
|
+
<div id="keyboard_shortcuts_pane" class="instapaper_ignore readability-extra" style="display:none">
|
778
|
+
<h2>Keyboard Shortcuts <small><a href="#" class="js-see-all-keyboard-shortcuts">(see all)</a></small></h2>
|
779
|
+
|
780
|
+
<div class="columns threecols">
|
781
|
+
<div class="column first">
|
782
|
+
<h3>Site wide shortcuts</h3>
|
783
|
+
<dl class="keyboard-mappings">
|
784
|
+
<dt>s</dt>
|
785
|
+
<dd>Focus site search</dd>
|
786
|
+
</dl>
|
787
|
+
<dl class="keyboard-mappings">
|
788
|
+
<dt>?</dt>
|
789
|
+
<dd>Bring up this help dialog</dd>
|
790
|
+
</dl>
|
791
|
+
</div><!-- /.column.first -->
|
792
|
+
|
793
|
+
<div class="column middle" style='display:none'>
|
794
|
+
<h3>Commit list</h3>
|
795
|
+
<dl class="keyboard-mappings">
|
796
|
+
<dt>j</dt>
|
797
|
+
<dd>Move selection down</dd>
|
798
|
+
</dl>
|
799
|
+
<dl class="keyboard-mappings">
|
800
|
+
<dt>k</dt>
|
801
|
+
<dd>Move selection up</dd>
|
802
|
+
</dl>
|
803
|
+
<dl class="keyboard-mappings">
|
804
|
+
<dt>c <em>or</em> o <em>or</em> enter</dt>
|
805
|
+
<dd>Open commit</dd>
|
806
|
+
</dl>
|
807
|
+
<dl class="keyboard-mappings">
|
808
|
+
<dt>y</dt>
|
809
|
+
<dd>Expand URL to its canonical form</dd>
|
810
|
+
</dl>
|
811
|
+
</div><!-- /.column.first -->
|
812
|
+
|
813
|
+
<div class="column last" style='display:none'>
|
814
|
+
<h3>Pull request list</h3>
|
815
|
+
<dl class="keyboard-mappings">
|
816
|
+
<dt>j</dt>
|
817
|
+
<dd>Move selection down</dd>
|
818
|
+
</dl>
|
819
|
+
<dl class="keyboard-mappings">
|
820
|
+
<dt>k</dt>
|
821
|
+
<dd>Move selection up</dd>
|
822
|
+
</dl>
|
823
|
+
<dl class="keyboard-mappings">
|
824
|
+
<dt>o <em>or</em> enter</dt>
|
825
|
+
<dd>Open issue</dd>
|
826
|
+
</dl>
|
827
|
+
<dl class="keyboard-mappings">
|
828
|
+
<dt><span class="platform-mac">⌘</span><span class="platform-other">ctrl</span> <em>+</em> enter</dt>
|
829
|
+
<dd>Submit comment</dd>
|
830
|
+
</dl>
|
831
|
+
</div><!-- /.columns.last -->
|
832
|
+
|
833
|
+
</div><!-- /.columns.equacols -->
|
834
|
+
|
835
|
+
<div style='display:none'>
|
836
|
+
<div class="rule"></div>
|
837
|
+
|
838
|
+
<h3>Issues</h3>
|
839
|
+
|
840
|
+
<div class="columns threecols">
|
841
|
+
<div class="column first">
|
842
|
+
<dl class="keyboard-mappings">
|
843
|
+
<dt>j</dt>
|
844
|
+
<dd>Move selection down</dd>
|
845
|
+
</dl>
|
846
|
+
<dl class="keyboard-mappings">
|
847
|
+
<dt>k</dt>
|
848
|
+
<dd>Move selection up</dd>
|
849
|
+
</dl>
|
850
|
+
<dl class="keyboard-mappings">
|
851
|
+
<dt>x</dt>
|
852
|
+
<dd>Toggle selection</dd>
|
853
|
+
</dl>
|
854
|
+
<dl class="keyboard-mappings">
|
855
|
+
<dt>o <em>or</em> enter</dt>
|
856
|
+
<dd>Open issue</dd>
|
857
|
+
</dl>
|
858
|
+
<dl class="keyboard-mappings">
|
859
|
+
<dt><span class="platform-mac">⌘</span><span class="platform-other">ctrl</span> <em>+</em> enter</dt>
|
860
|
+
<dd>Submit comment</dd>
|
861
|
+
</dl>
|
862
|
+
</div><!-- /.column.first -->
|
863
|
+
<div class="column last">
|
864
|
+
<dl class="keyboard-mappings">
|
865
|
+
<dt>c</dt>
|
866
|
+
<dd>Create issue</dd>
|
867
|
+
</dl>
|
868
|
+
<dl class="keyboard-mappings">
|
869
|
+
<dt>l</dt>
|
870
|
+
<dd>Create label</dd>
|
871
|
+
</dl>
|
872
|
+
<dl class="keyboard-mappings">
|
873
|
+
<dt>i</dt>
|
874
|
+
<dd>Back to inbox</dd>
|
875
|
+
</dl>
|
876
|
+
<dl class="keyboard-mappings">
|
877
|
+
<dt>u</dt>
|
878
|
+
<dd>Back to issues</dd>
|
879
|
+
</dl>
|
880
|
+
<dl class="keyboard-mappings">
|
881
|
+
<dt>/</dt>
|
882
|
+
<dd>Focus issues search</dd>
|
883
|
+
</dl>
|
884
|
+
</div>
|
885
|
+
</div>
|
886
|
+
</div>
|
887
|
+
|
888
|
+
<div style='display:none'>
|
889
|
+
<div class="rule"></div>
|
890
|
+
|
891
|
+
<h3>Issues Dashboard</h3>
|
892
|
+
|
893
|
+
<div class="columns threecols">
|
894
|
+
<div class="column first">
|
895
|
+
<dl class="keyboard-mappings">
|
896
|
+
<dt>j</dt>
|
897
|
+
<dd>Move selection down</dd>
|
898
|
+
</dl>
|
899
|
+
<dl class="keyboard-mappings">
|
900
|
+
<dt>k</dt>
|
901
|
+
<dd>Move selection up</dd>
|
902
|
+
</dl>
|
903
|
+
<dl class="keyboard-mappings">
|
904
|
+
<dt>o <em>or</em> enter</dt>
|
905
|
+
<dd>Open issue</dd>
|
906
|
+
</dl>
|
907
|
+
</div><!-- /.column.first -->
|
908
|
+
</div>
|
909
|
+
</div>
|
910
|
+
|
911
|
+
<div style='display:none'>
|
912
|
+
<div class="rule"></div>
|
913
|
+
|
914
|
+
<h3>Network Graph</h3>
|
915
|
+
<div class="columns equacols">
|
916
|
+
<div class="column first">
|
917
|
+
<dl class="keyboard-mappings">
|
918
|
+
<dt><span class="badmono">←</span> <em>or</em> h</dt>
|
919
|
+
<dd>Scroll left</dd>
|
920
|
+
</dl>
|
921
|
+
<dl class="keyboard-mappings">
|
922
|
+
<dt><span class="badmono">→</span> <em>or</em> l</dt>
|
923
|
+
<dd>Scroll right</dd>
|
924
|
+
</dl>
|
925
|
+
<dl class="keyboard-mappings">
|
926
|
+
<dt><span class="badmono">↑</span> <em>or</em> k</dt>
|
927
|
+
<dd>Scroll up</dd>
|
928
|
+
</dl>
|
929
|
+
<dl class="keyboard-mappings">
|
930
|
+
<dt><span class="badmono">↓</span> <em>or</em> j</dt>
|
931
|
+
<dd>Scroll down</dd>
|
932
|
+
</dl>
|
933
|
+
<dl class="keyboard-mappings">
|
934
|
+
<dt>t</dt>
|
935
|
+
<dd>Toggle visibility of head labels</dd>
|
936
|
+
</dl>
|
937
|
+
</div><!-- /.column.first -->
|
938
|
+
<div class="column last">
|
939
|
+
<dl class="keyboard-mappings">
|
940
|
+
<dt>shift <span class="badmono">←</span> <em>or</em> shift h</dt>
|
941
|
+
<dd>Scroll all the way left</dd>
|
942
|
+
</dl>
|
943
|
+
<dl class="keyboard-mappings">
|
944
|
+
<dt>shift <span class="badmono">→</span> <em>or</em> shift l</dt>
|
945
|
+
<dd>Scroll all the way right</dd>
|
946
|
+
</dl>
|
947
|
+
<dl class="keyboard-mappings">
|
948
|
+
<dt>shift <span class="badmono">↑</span> <em>or</em> shift k</dt>
|
949
|
+
<dd>Scroll all the way up</dd>
|
950
|
+
</dl>
|
951
|
+
<dl class="keyboard-mappings">
|
952
|
+
<dt>shift <span class="badmono">↓</span> <em>or</em> shift j</dt>
|
953
|
+
<dd>Scroll all the way down</dd>
|
954
|
+
</dl>
|
955
|
+
</div><!-- /.column.last -->
|
956
|
+
</div>
|
957
|
+
</div>
|
958
|
+
|
959
|
+
<div >
|
960
|
+
<div class="rule"></div>
|
961
|
+
<div class="columns threecols">
|
962
|
+
<div class="column first" >
|
963
|
+
<h3>Source Code Browsing</h3>
|
964
|
+
<dl class="keyboard-mappings">
|
965
|
+
<dt>t</dt>
|
966
|
+
<dd>Activates the file finder</dd>
|
967
|
+
</dl>
|
968
|
+
<dl class="keyboard-mappings">
|
969
|
+
<dt>l</dt>
|
970
|
+
<dd>Jump to line</dd>
|
971
|
+
</dl>
|
972
|
+
<dl class="keyboard-mappings">
|
973
|
+
<dt>w</dt>
|
974
|
+
<dd>Switch branch/tag</dd>
|
975
|
+
</dl>
|
976
|
+
<dl class="keyboard-mappings">
|
977
|
+
<dt>y</dt>
|
978
|
+
<dd>Expand URL to its canonical form</dd>
|
979
|
+
</dl>
|
980
|
+
</div>
|
981
|
+
</div>
|
982
|
+
</div>
|
983
|
+
|
984
|
+
<div style='display:none'>
|
985
|
+
<div class="rule"></div>
|
986
|
+
<div class="columns threecols">
|
987
|
+
<div class="column first">
|
988
|
+
<h3>Browsing Commits</h3>
|
989
|
+
<dl class="keyboard-mappings">
|
990
|
+
<dt><span class="platform-mac">⌘</span><span class="platform-other">ctrl</span> <em>+</em> enter</dt>
|
991
|
+
<dd>Submit comment</dd>
|
992
|
+
</dl>
|
993
|
+
<dl class="keyboard-mappings">
|
994
|
+
<dt>escape</dt>
|
995
|
+
<dd>Close form</dd>
|
996
|
+
</dl>
|
997
|
+
<dl class="keyboard-mappings">
|
998
|
+
<dt>p</dt>
|
999
|
+
<dd>Parent commit</dd>
|
1000
|
+
</dl>
|
1001
|
+
<dl class="keyboard-mappings">
|
1002
|
+
<dt>o</dt>
|
1003
|
+
<dd>Other parent commit</dd>
|
1004
|
+
</dl>
|
1005
|
+
</div>
|
1006
|
+
</div>
|
1007
|
+
</div>
|
1008
|
+
</div>
|
1009
|
+
|
1010
|
+
<div id="markdown-help" class="instapaper_ignore readability-extra">
|
1011
|
+
<h2>Markdown Cheat Sheet</h2>
|
1012
|
+
|
1013
|
+
<div class="cheatsheet-content">
|
1014
|
+
|
1015
|
+
<div class="mod">
|
1016
|
+
<div class="col">
|
1017
|
+
<h3>Format Text</h3>
|
1018
|
+
<p>Headers</p>
|
1019
|
+
<pre>
|
1020
|
+
# This is an <h1> tag
|
1021
|
+
## This is an <h2> tag
|
1022
|
+
###### This is an <h6> tag</pre>
|
1023
|
+
<p>Text styles</p>
|
1024
|
+
<pre>
|
1025
|
+
*This text will be italic*
|
1026
|
+
_This will also be italic_
|
1027
|
+
**This text will be bold**
|
1028
|
+
__This will also be bold__
|
1029
|
+
|
1030
|
+
*You **can** combine them*
|
1031
|
+
</pre>
|
1032
|
+
</div>
|
1033
|
+
<div class="col">
|
1034
|
+
<h3>Lists</h3>
|
1035
|
+
<p>Unordered</p>
|
1036
|
+
<pre>
|
1037
|
+
* Item 1
|
1038
|
+
* Item 2
|
1039
|
+
* Item 2a
|
1040
|
+
* Item 2b</pre>
|
1041
|
+
<p>Ordered</p>
|
1042
|
+
<pre>
|
1043
|
+
1. Item 1
|
1044
|
+
2. Item 2
|
1045
|
+
3. Item 3
|
1046
|
+
* Item 3a
|
1047
|
+
* Item 3b</pre>
|
1048
|
+
</div>
|
1049
|
+
<div class="col">
|
1050
|
+
<h3>Miscellaneous</h3>
|
1051
|
+
<p>Images</p>
|
1052
|
+
<pre>
|
1053
|
+
![GitHub Logo](/images/logo.png)
|
1054
|
+
Format: ![Alt Text](url)
|
1055
|
+
</pre>
|
1056
|
+
<p>Links</p>
|
1057
|
+
<pre>
|
1058
|
+
http://github.com - automatic!
|
1059
|
+
[GitHub](http://github.com)</pre>
|
1060
|
+
<p>Blockquotes</p>
|
1061
|
+
<pre>
|
1062
|
+
As Kanye West said:
|
1063
|
+
|
1064
|
+
> We're living the future so
|
1065
|
+
> the present is our past.
|
1066
|
+
</pre>
|
1067
|
+
</div>
|
1068
|
+
</div>
|
1069
|
+
<div class="rule"></div>
|
1070
|
+
|
1071
|
+
<h3>Code Examples in Markdown</h3>
|
1072
|
+
<div class="col">
|
1073
|
+
<p>Syntax highlighting with <a href="http://github.github.com/github-flavored-markdown/" title="GitHub Flavored Markdown" target="_blank">GFM</a></p>
|
1074
|
+
<pre>
|
1075
|
+
```javascript
|
1076
|
+
function fancyAlert(arg) {
|
1077
|
+
if(arg) {
|
1078
|
+
$.facebox({div:'#foo'})
|
1079
|
+
}
|
1080
|
+
}
|
1081
|
+
```</pre>
|
1082
|
+
</div>
|
1083
|
+
<div class="col">
|
1084
|
+
<p>Or, indent your code 4 spaces</p>
|
1085
|
+
<pre>
|
1086
|
+
Here is a Python code example
|
1087
|
+
without syntax highlighting:
|
1088
|
+
|
1089
|
+
def foo:
|
1090
|
+
if not bar:
|
1091
|
+
return true</pre>
|
1092
|
+
</div>
|
1093
|
+
<div class="col">
|
1094
|
+
<p>Inline code for comments</p>
|
1095
|
+
<pre>
|
1096
|
+
I think you should use an
|
1097
|
+
`<addr>` element here instead.</pre>
|
1098
|
+
</div>
|
1099
|
+
</div>
|
1100
|
+
|
1101
|
+
</div>
|
1102
|
+
</div>
|
1103
|
+
|
1104
|
+
|
1105
|
+
<div id="ajax-error-message">
|
1106
|
+
<span class="mini-icon mini-icon-exclamation"></span>
|
1107
|
+
Something went wrong with that request. Please try again.
|
1108
|
+
<a href="#" class="ajax-error-dismiss">Dismiss</a>
|
1109
|
+
</div>
|
1110
|
+
|
1111
|
+
<div id="logo-popup">
|
1112
|
+
<h2>Looking for the GitHub logo?</h2>
|
1113
|
+
<ul>
|
1114
|
+
<li>
|
1115
|
+
<h4>GitHub Logo</h4>
|
1116
|
+
<a href="http://github-media-downloads.s3.amazonaws.com/GitHub_Logos.zip"><img alt="Github_logo" src="https://a248.e.akamai.net/assets.github.com/images/modules/about_page/github_logo.png?1310104853" /></a>
|
1117
|
+
<a href="http://github-media-downloads.s3.amazonaws.com/GitHub_Logos.zip" class="minibutton btn-download download">Download</a>
|
1118
|
+
</li>
|
1119
|
+
<li>
|
1120
|
+
<h4>The Octocat</h4>
|
1121
|
+
<a href="http://github-media-downloads.s3.amazonaws.com/Octocats.zip"><img alt="Octocat" src="https://a248.e.akamai.net/assets.github.com/images/modules/about_page/octocat.png?1310104853" /></a>
|
1122
|
+
<a href="http://github-media-downloads.s3.amazonaws.com/Octocats.zip" class="minibutton btn-download download">Download</a>
|
1123
|
+
</li>
|
1124
|
+
</ul>
|
1125
|
+
</div>
|
1126
|
+
|
1127
|
+
|
1128
|
+
|
1129
|
+
|
1130
|
+
<span id='server_response_time' data-time='0.11204' data-host='fe8'></span>
|
1131
|
+
</body>
|
1132
|
+
</html>
|
1133
|
+
|