batman-rails-flo 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (162) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +29 -0
  3. data/Rakefile +2 -0
  4. data/lib/batman-rails-flo.rb +5 -0
  5. data/lib/batman_rails_flo/railtie.rb +9 -0
  6. data/lib/batman_rails_flo/tasks.rake +14 -0
  7. data/lib/batman_rails_flo/version.rb +3 -0
  8. data/vendor/assets/javascripts/batman_rails_flo/flo_server.js +67 -0
  9. data/vendor/assets/javascripts/batman_rails_flo/live_reload.js.coffee +129 -0
  10. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/CNAME +1 -0
  11. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/CONTRIBUTING.md +9 -0
  12. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/LICENSE +22 -0
  13. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/README +50 -0
  14. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/bin/cake +7 -0
  15. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/bin/coffee +7 -0
  16. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/browser.js +134 -0
  17. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/cake.js +112 -0
  18. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/coffee-script.js +335 -0
  19. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/command.js +569 -0
  20. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/grammar.js +631 -0
  21. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/helpers.js +252 -0
  22. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/index.js +11 -0
  23. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/lexer.js +926 -0
  24. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/nodes.js +3158 -0
  25. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/optparse.js +139 -0
  26. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/parser.js +724 -0
  27. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/register.js +66 -0
  28. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/repl.js +163 -0
  29. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/rewriter.js +475 -0
  30. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/scope.js +146 -0
  31. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/sourcemap.js +161 -0
  32. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/LICENSE +21 -0
  33. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/examples/pow.js +6 -0
  34. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/index.js +82 -0
  35. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/package.json +34 -0
  36. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/readme.markdown +63 -0
  37. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/chmod.js +38 -0
  38. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/clobber.js +37 -0
  39. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/mkdirp.js +28 -0
  40. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/perm.js +32 -0
  41. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/perm_sync.js +39 -0
  42. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/race.js +41 -0
  43. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/rel.js +32 -0
  44. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/return.js +25 -0
  45. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/return_sync.js +24 -0
  46. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/root.js +18 -0
  47. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/sync.js +32 -0
  48. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/umask.js +28 -0
  49. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/umask_sync.js +32 -0
  50. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/package.json +50 -0
  51. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/register.js +1 -0
  52. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/LICENSE +30 -0
  53. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/PATENTS +23 -0
  54. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/README.md +124 -0
  55. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/bin/flo +26 -0
  56. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/client/configure/configure.html +57 -0
  57. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/client/configure/configure.js +205 -0
  58. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/client/configure/style.css +334 -0
  59. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/client/connection.js +235 -0
  60. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/client/devtools.html +12 -0
  61. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/client/index.js +323 -0
  62. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/client/logger.js +42 -0
  63. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/client/logo.png +0 -0
  64. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/client/manifest.json +13 -0
  65. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/client/session.js +305 -0
  66. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/index.js +10 -0
  67. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/lib/flo.js +226 -0
  68. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/lib/server.js +94 -0
  69. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/README.md +66 -0
  70. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/index.js +437 -0
  71. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/LICENSE +23 -0
  72. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/README.md +218 -0
  73. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/minimatch.js +1055 -0
  74. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS +14 -0
  75. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/lru-cache/LICENSE +23 -0
  76. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/lru-cache/README.md +97 -0
  77. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js +252 -0
  78. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/lru-cache/package.json +33 -0
  79. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/lru-cache/test/basic.js +369 -0
  80. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/lru-cache/test/foreach.js +52 -0
  81. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js +50 -0
  82. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/sigmund/LICENSE +27 -0
  83. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/sigmund/README.md +53 -0
  84. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/sigmund/bench.js +283 -0
  85. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/sigmund/package.json +42 -0
  86. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/sigmund/sigmund.js +39 -0
  87. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/sigmund/test/basic.js +24 -0
  88. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/package.json +40 -0
  89. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/test/basic.js +399 -0
  90. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/test/brace-expand.js +33 -0
  91. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/test/caching.js +14 -0
  92. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/test/defaults.js +274 -0
  93. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/test/extglob-ending-with-state-char.js +8 -0
  94. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/walker/lib/walker.js +111 -0
  95. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/walker/license +13 -0
  96. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/walker/node_modules/makeerror/lib/makeerror.js +87 -0
  97. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/walker/node_modules/makeerror/node_modules/tmpl/lib/tmpl.js +17 -0
  98. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/walker/node_modules/makeerror/node_modules/tmpl/package.json +31 -0
  99. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/walker/node_modules/makeerror/node_modules/tmpl/readme.md +10 -0
  100. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/walker/node_modules/makeerror/package.json +34 -0
  101. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/walker/node_modules/makeerror/readme.md +77 -0
  102. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/walker/package.json +36 -0
  103. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/walker/readme.md +52 -0
  104. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/watch/LICENSE +55 -0
  105. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/watch/main.js +128 -0
  106. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/watch/package.json +34 -0
  107. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/watch/readme.mkd +72 -0
  108. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/watch/test/d/d/t +0 -0
  109. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/watch/test/d/t +0 -0
  110. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/watch/test/test_monitor.js +31 -0
  111. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/watch/test/test_monitorRootDirectory.js +28 -0
  112. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/watch/test/test_watchTree.js +20 -0
  113. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/package.json +45 -0
  114. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/test/test.js +243 -0
  115. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/CHANGELOG.md +81 -0
  116. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/LICENSE +177 -0
  117. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/Makefile +11 -0
  118. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/README.md +245 -0
  119. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/binding.gyp +14 -0
  120. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/build/Makefile +355 -0
  121. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/build/Release/linker.lock +0 -0
  122. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/build/Release/obj.target/validation/src/validation.o +0 -0
  123. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/build/Release/obj.target/xor/src/xor.o +0 -0
  124. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/build/Release/validation.node +0 -0
  125. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/build/Release/xor.node +0 -0
  126. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/build/binding.Makefile +6 -0
  127. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/build/config.gypi +115 -0
  128. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/build/gyp-mac-tool +512 -0
  129. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/build/validation.target.mk +154 -0
  130. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/build/xor.target.mk +154 -0
  131. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/index.js +1 -0
  132. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/install.js +31 -0
  133. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/Constants.js +23 -0
  134. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/Deprecation.js +38 -0
  135. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/Validation.fallback.js +12 -0
  136. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/Validation.js +18 -0
  137. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/WebSocketClient.js +359 -0
  138. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/WebSocketConnection.js +717 -0
  139. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/WebSocketFrame.js +282 -0
  140. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/WebSocketRequest.js +478 -0
  141. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/WebSocketRouter.js +154 -0
  142. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/WebSocketRouterRequest.js +59 -0
  143. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/WebSocketServer.js +216 -0
  144. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/utils.js +7 -0
  145. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/websocket.js +11 -0
  146. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/xor.fallback.js +13 -0
  147. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/xor.js +18 -0
  148. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/package.json +43 -0
  149. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/src/validation.cc +144 -0
  150. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/src/xor.cpp +86 -0
  151. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/vendor/FastBufferList.js +192 -0
  152. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/vendor/node-ctype/LICENSE +18 -0
  153. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/vendor/node-ctype/ctio-faster.js +1126 -0
  154. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/package.json +25 -0
  155. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/test/client/browser_websocket.js +63 -0
  156. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/test/client/connection_test.js +57 -0
  157. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/test/client/logger_mock.js +15 -0
  158. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/test/client/session_test.js +194 -0
  159. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/test/server/flo_test.js +211 -0
  160. data/vendor/assets/javascripts/batman_rails_flo/package.json +15 -0
  161. data/vendor/assets/javascripts/batman_rails_flo/reload_event_handler.js.coffee +56 -0
  162. metadata +232 -0
@@ -0,0 +1,12 @@
1
+ <!doctype html>
2
+ <html>
3
+ <head>
4
+ <!-- Script order implies dependencies -->
5
+ <script src="logger.js"></script>
6
+ <script src="connection.js"></script>
7
+ <script src="session.js"></script>
8
+ <script src="index.js"></script>
9
+ </head>
10
+ <body>
11
+ </body>
12
+ </html>
@@ -0,0 +1,323 @@
1
+ /**
2
+ * Copyright (c) 2014, Facebook, Inc.
3
+ * All rights reserved.
4
+ *
5
+ * This source code is licensed under the BSD-style license found in the
6
+ * LICENSE file in the root directory of this source tree. An additional grant
7
+ * of patent rights can be found in the PATENTS file in the same directory.
8
+ */
9
+
10
+ /*global Session:false */
11
+ /* jshint evil:true */
12
+
13
+ (function() {
14
+ 'use strict';
15
+
16
+ /**
17
+ * Flo client controller.
18
+ *
19
+ * @class FloClient
20
+ * @private
21
+ */
22
+
23
+ function FloClient() {
24
+ this.config = loadConfig();
25
+ this.session = null;
26
+ this.panelWindow = null;
27
+ this.panelEventBuffer = [];
28
+ this.status = this.status.bind(this);
29
+ this.startNewSession = this.startNewSession.bind(this);
30
+ this.createLogger = Logger(this.triggerEvent.bind(this, 'log'));
31
+ this.loggger = this.createLogger('flo');
32
+ this.createPanel();
33
+ this.start();
34
+ }
35
+
36
+ /**
37
+ * Save and optionally set new config.
38
+ *
39
+ * @param {object} config
40
+ * @private
41
+ */
42
+
43
+ FloClient.prototype.saveConfig = function() {
44
+ localStorage.setItem('flo-config', JSON.stringify(this.config));
45
+ };
46
+
47
+ /**
48
+ * Listen on the panel window for an event `type`, i.e. receive a message
49
+ * from the panel.
50
+ *
51
+ * @param {string} type
52
+ * @param {function} callback
53
+ * @private
54
+ */
55
+
56
+ FloClient.prototype.listenToPanel = function(type, callback) {
57
+ if (!this.panelWindow) {
58
+ throw new Error('Panel not found');
59
+ }
60
+ this.panelWindow.addEventListener('flo_' + type, callback.bind(this));
61
+ };
62
+
63
+ /**
64
+ * Trigger an event on the panel window, i.e. send a message to the panel.
65
+ * If the panel wasn't instantiated yet, the event is buffered.
66
+ *
67
+ * @param {string} type
68
+ * @param {object} data
69
+ * @private
70
+ */
71
+
72
+ FloClient.prototype.triggerEvent = function(type, data) {
73
+ var event = new Event('flo_' + type);
74
+ event.data = data;
75
+ // Save events for anytime we need to reinit the panel with prev state.
76
+ this.panelEventBuffer.push(event);
77
+ if (this.panelWindow) {
78
+ this.panelWindow.dispatchEvent(event);
79
+ }
80
+ return event;
81
+ };
82
+
83
+ /**
84
+ * Create a new panel.
85
+ *
86
+ * @param {function} callback
87
+ * @private
88
+ */
89
+
90
+ FloClient.prototype.createPanel = function(callback) {
91
+ var self = this;
92
+ chrome.devtools.panels.create(
93
+ 'flo',
94
+ '',
95
+ 'configure/configure.html',
96
+ function (panel) {
97
+ panel.onShown.addListener(function(panelWindow) {
98
+ if (!panelWindow.wasShown) {
99
+ self.panelWindow = panelWindow;
100
+ self.initPanel();
101
+ panelWindow.wasShown = true;
102
+ }
103
+ });
104
+ }
105
+ );
106
+ };
107
+
108
+ /**
109
+ * Called after the panel is first created to listen on it's events.
110
+ * Will also trigger all buffered events on the panel.
111
+ *
112
+ * @param {object} config
113
+ * @private
114
+ */
115
+
116
+ FloClient.prototype.initPanel = function() {
117
+ this.listenToPanel('config_changed', function(e) {
118
+ this.config = e.data;
119
+ this.saveConfig();
120
+ this.startNewSession();
121
+ });
122
+ this.listenToPanel('retry', this.startNewSession);
123
+ this.listenToPanel('enable_for_host', this.enableForHost);
124
+ this.panelEventBuffer.forEach(function(event) {
125
+ this.panelWindow.dispatchEvent(event);
126
+ }, this);
127
+ this.triggerEvent('load', this.config);
128
+ };
129
+
130
+ /**
131
+ * Starts the flo client.
132
+ *
133
+ * @private
134
+ */
135
+
136
+ FloClient.prototype.start = function() {
137
+ this.status('starting');
138
+ this.startNewSession();
139
+ };
140
+
141
+
142
+ /**
143
+ * Stops flo client.
144
+ *
145
+ * @private
146
+ */
147
+
148
+ FloClient.prototype.stop = function() {
149
+ this.session.destroy();
150
+ this.session = null;
151
+ };
152
+
153
+ /**
154
+ * Get the url location of the inspected window.
155
+ *
156
+ * @param {function} callback
157
+ * @private
158
+ */
159
+
160
+ FloClient.prototype.getLocation = function(callback) {
161
+ chrome.devtools.inspectedWindow['eval'](
162
+ 'location.hostname',
163
+ callback.bind(this)
164
+ );
165
+ };
166
+
167
+ /**
168
+ * Match config patterns against `host` and returns the matched site record.
169
+ *
170
+ * @param {string} host
171
+ * @return {object|null}
172
+ * @private
173
+ */
174
+
175
+ FloClient.prototype.getSite = function(host) {
176
+ var config = this.config;
177
+ for (var i = 0; i < config.sites.length; i++) {
178
+ var site = config.sites[i];
179
+ var pattern = parsePattern(site.pattern);
180
+ var matched = false;
181
+ if (pattern instanceof RegExp) {
182
+ matched = pattern.exec(host);
183
+ } else {
184
+ matched = pattern === host;
185
+ }
186
+ if (matched) return site;
187
+ }
188
+ return null;
189
+ };
190
+
191
+ /**
192
+ * Instantiates a new `session`.
193
+ *
194
+ * @private
195
+ */
196
+
197
+ FloClient.prototype.startNewSession = function() {
198
+ if (this.session) {
199
+ this.stop();
200
+ }
201
+
202
+ this.getLocation(
203
+ function (host) {
204
+ var site = this.getSite(host);
205
+ if (site) {
206
+ this.session = new Session(
207
+ site.server || host,
208
+ site.port || this.config.port,
209
+ this.status,
210
+ this.createLogger
211
+ );
212
+ this.session.start();
213
+ } else {
214
+ this.status('disabled');
215
+ }
216
+ }
217
+ );
218
+ };
219
+
220
+ /**
221
+ * Enables flo for the current inspected window host.
222
+ *
223
+ * @private
224
+ */
225
+
226
+ FloClient.prototype.enableForHost = function() {
227
+ this.getLocation(function(host) {
228
+ if (!this.getSite(host)) {
229
+ this.config.sites.push({
230
+ pattern: host,
231
+ server: host
232
+ });
233
+ this.saveConfig();
234
+ this.triggerEvent('load', this.config);
235
+ this.startNewSession();
236
+ }
237
+ });
238
+ };
239
+
240
+ /**
241
+ * Reports status changes to panel.
242
+ *
243
+ * @param {string} status
244
+ * @param {object} aux
245
+ * @private
246
+ */
247
+
248
+ FloClient.prototype.status = function(status, aux) {
249
+ var text, action;
250
+ switch (status) {
251
+ case 'starting':
252
+ text = 'Starting';
253
+ break;
254
+ case 'disabled':
255
+ text = 'Disabled for this site';
256
+ action = 'enable';
257
+ break;
258
+ case 'connecting':
259
+ text = 'Connecting';
260
+ break;
261
+ case 'connected':
262
+ text = 'Connected';
263
+ break;
264
+ case 'started':
265
+ text = 'Started';
266
+ break;
267
+ case 'retry':
268
+ text = 'Failed to connect, retrying in ' + (aux / 1000) + 's';
269
+ break;
270
+ case 'error':
271
+ text = 'Error connecting';
272
+ action = 'retry';
273
+ break;
274
+ default:
275
+ throw new Error('Unknown session status.');
276
+ }
277
+
278
+ this.triggerEvent('status_change', {
279
+ type: status,
280
+ text: text,
281
+ action: action
282
+ });
283
+ };
284
+
285
+ /**
286
+ * Loads config from localstorage.
287
+ *
288
+ * @private
289
+ */
290
+
291
+ function loadConfig() {
292
+ var config = localStorage.getItem('flo-config');
293
+ try {
294
+ config = JSON.parse(config);
295
+ } catch (e) {} finally {
296
+ return config || {
297
+ sites: [],
298
+ port: 8888
299
+ };
300
+ }
301
+ }
302
+
303
+ /**
304
+ * Optionally parses config from JSON to an object.
305
+ * Also, parses patterns into regexp.
306
+ *
307
+ * @private
308
+ * @return {object}
309
+ */
310
+
311
+ function parsePattern(pattern) {
312
+ if (!pattern) return null;
313
+ var m = pattern.match(/^\/(.+)\/([gim]{0,3})$/);
314
+ if (m && m[1]) {
315
+ return new RegExp(m[1], m[2]);
316
+ }
317
+ return pattern;
318
+ }
319
+
320
+ // Start the app.
321
+ new FloClient();
322
+
323
+ })();
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Copyright (c) 2014, Facebook, Inc.
3
+ * All rights reserved.
4
+ *
5
+ * This source code is licensed under the BSD-style license found in the
6
+ * LICENSE file in the root directory of this source tree. An additional grant
7
+ * of patent rights can be found in the PATENTS file in the same directory.
8
+ */
9
+
10
+ /* jshint evil:true */
11
+
12
+ this.Logger = (function() {
13
+ 'use strict';
14
+
15
+ function Logger(log) {
16
+ return function(namespace) {
17
+ return {
18
+ error: createLogLevel('error'),
19
+ log: createLogLevel('log')
20
+ };
21
+
22
+ function createLogLevel(level) {
23
+ return function () {
24
+ var args = [].slice.call(arguments);
25
+ args[0] = '[' + namespace + '] ' + args[0];
26
+ return log([level, args]);
27
+ };
28
+ }
29
+ };
30
+ }
31
+
32
+ Logger.logInContext = function(arg, method) {
33
+ if (!method) {
34
+ method = 'log';
35
+ }
36
+ chrome.devtools.inspectedWindow['eval'](
37
+ 'console.' + method + '("' + arg.toString() + '")'
38
+ );
39
+ };
40
+
41
+ return Logger;
42
+ })();
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "fb-flo",
3
+ "version": "0.11",
4
+ "description": "Modify running web apps without reloading",
5
+ "devtools_page": "devtools.html",
6
+ "manifest_version": 2,
7
+ "permissions": [
8
+ "*://*/"
9
+ ],
10
+ "icons": {
11
+ "128": "logo.png"
12
+ }
13
+ }
@@ -0,0 +1,305 @@
1
+ /**
2
+ * Copyright (c) 2014, Facebook, Inc.
3
+ * All rights reserved.
4
+ *
5
+ * This source code is licensed under the BSD-style license found in the
6
+ * LICENSE file in the root directory of this source tree. An additional grant
7
+ * of patent rights can be found in the PATENTS file in the same directory.
8
+ */
9
+
10
+ /*global Connection:false */
11
+
12
+ (function () {
13
+ 'use strict';
14
+
15
+ /**
16
+ * Export to Node for testing and to global for production.
17
+ */
18
+
19
+ if (typeof module === 'object' && typeof exports === 'object') {
20
+ module.exports = Session;
21
+ } else {
22
+ this.Session = Session;
23
+ }
24
+
25
+ /**
26
+ * Manages a user sessios.
27
+ *
28
+ * @param {string} host
29
+ * @param {number} port
30
+ * @param {function} status
31
+ * @param {function} logger
32
+ * @class Session
33
+ * @public
34
+ */
35
+
36
+ function Session(host, port, status, createLogger) {
37
+ this.host = host;
38
+ this.port = port;
39
+ this.status = status;
40
+ this.createLogger = createLogger;
41
+ this.logger = createLogger('session');
42
+ this.resources = null;
43
+ this.conn = null;
44
+ this.listeners = {};
45
+ this.messageHandler = this.messageHandler.bind(this);
46
+ this.started = this.started.bind(this);
47
+ }
48
+
49
+ /**
50
+ * Registers the resources, connects to server and listens to events.
51
+ *
52
+ * @public
53
+ */
54
+
55
+ Session.prototype.start = function() {
56
+ this.logger.log('Starting flo for host', this.host);
57
+ this.getResources(this.connect.bind(this, this.started));
58
+ };
59
+
60
+ /**
61
+ * Similar to restart but does only what's needed to get flo started.
62
+ *
63
+ * @public
64
+ */
65
+
66
+ Session.prototype.restart = function() {
67
+ this.logger.log('Restarting');
68
+ this.removeEventListeners();
69
+ if (this.conn.connected()) {
70
+ // No need to reconnect. We just refetch the resources.
71
+ this.getResources(this.started.bind(this));
72
+ } else {
73
+ this.start();
74
+ }
75
+ };
76
+
77
+ /**
78
+ * This method takes care of listening to events defined by the chrome api
79
+ * @see http://developer.chrome.com/extensions/events
80
+ * We also keep an internal map of events we're listening to so we can
81
+ * unsubscribe in the future.
82
+ *
83
+ * @param {object} object
84
+ * @param {string} event
85
+ * @param {function} listener
86
+ * @private
87
+ */
88
+
89
+ Session.prototype.listen = function(obj, event, listener) {
90
+ listener = listener.bind(this);
91
+ obj[event].addListener(listener);
92
+ this.listeners[event] = {
93
+ obj: obj,
94
+ listener: listener
95
+ };
96
+ };
97
+
98
+
99
+ /**
100
+ * Remove all event listeners.
101
+ *
102
+ * @private
103
+ */
104
+
105
+ Session.prototype.removeEventListeners = function() {
106
+ Object.keys(this.listeners).forEach(function(event) {
107
+ var desc = this.listeners[event];
108
+ desc.obj[event].removeListener(desc.listener);
109
+ }, this);
110
+ };
111
+
112
+ /**
113
+ * Registers the resources and listens to onResourceAdded events.
114
+ *
115
+ * @param {function} callback
116
+ * @private
117
+ */
118
+
119
+ Session.prototype.getResources = function(callback) {
120
+ var self = this;
121
+ chrome.devtools.inspectedWindow.getResources(function (resources) {
122
+ self.resources = resources;
123
+ // After we register the current resources, we listen to the
124
+ // onResourceAdded event to push on more resources lazily fetched
125
+ // to our array.
126
+ self.listen(
127
+ chrome.devtools.inspectedWindow,
128
+ 'onResourceAdded',
129
+ function (res) {
130
+ self.resources.push(res);
131
+ }
132
+ );
133
+ callback();
134
+ });
135
+ };
136
+
137
+ /**
138
+ * Connect to server.
139
+ *
140
+ * @param {function} callback
141
+ * @private
142
+ */
143
+
144
+ Session.prototype.connect = function(callback) {
145
+ callback = once(callback);
146
+ var self = this;
147
+ this.conn = new Connection(this.host, this.port, this.createLogger)
148
+ .onmessage(this.messageHandler)
149
+ .onerror(function () {
150
+ self.status('error');
151
+ })
152
+ .onopen(function () {
153
+ self.status('connected');
154
+ callback();
155
+ })
156
+ .onretry(function(delay) {
157
+ self.status('retry', delay);
158
+ })
159
+ .onconnecting(function() {
160
+ self.status('connecting');
161
+ })
162
+ .connect();
163
+ };
164
+
165
+ /**
166
+ * Does whatever needs to be done after the session is started. Currenlty
167
+ * just listening to page refresh events.
168
+ *
169
+ * @param {function} callback
170
+ */
171
+
172
+ Session.prototype.started = function() {
173
+ this.logger.log('Started');
174
+ this.status('started');
175
+ this.listen(
176
+ chrome.devtools.network,
177
+ 'onNavigated',
178
+ this.restart
179
+ );
180
+ };
181
+
182
+ /**
183
+ * Handler for messages from the server.
184
+ *
185
+ * @param {object} updatedResource
186
+ * @private
187
+ */
188
+
189
+ Session.prototype.messageHandler = function(updatedResource) {
190
+ this.logger.log('Requested resource update', updatedResource.resourceURL);
191
+
192
+ if (updatedResource.reload) {
193
+ chrome.devtools.inspectedWindow.reload();
194
+ return;
195
+ }
196
+
197
+ var match = updatedResource.match;
198
+ var matcher;
199
+
200
+ if (typeof match === 'string') {
201
+ if (match === 'indexOf') {
202
+ matcher = indexOfMatcher;
203
+ } else if (match === 'equal') {
204
+ matcher = equalMatcher;
205
+ } else {
206
+ this.logger.error('Unknown match string option', match);
207
+ return;
208
+ }
209
+ } else if (match && typeof match === 'object') {
210
+ if (match.type === 'regexp') {
211
+ var flags = '';
212
+ if (match.ignoreCase) {
213
+ flags += 'i';
214
+ }
215
+ if (match.multiline) {
216
+ flags += 'm';
217
+ }
218
+ if (match.global) {
219
+ flags += 'g';
220
+ }
221
+ var r = new RegExp(match.source, flags);
222
+ matcher = r.exec.bind(r);
223
+ } else {
224
+ this.logger.error('Unknown matcher object:', match);
225
+ return;
226
+ }
227
+ }
228
+
229
+ var resource = this.resources.filter(function (res) {
230
+ return matcher(res.url, updatedResource.resourceURL);
231
+ })[0];
232
+
233
+ if (!resource) {
234
+ this.logger.error(
235
+ 'Resource with the following URL is not on the page:',
236
+ updatedResource.resourceURL
237
+ );
238
+ return;
239
+ }
240
+
241
+ resource.setContent(updatedResource.contents, true, function (status) {
242
+ if (status.code === 'OK') {
243
+ this.logger.log('Resource update successful');
244
+ triggerReloadEvent(updatedResource);
245
+ } else {
246
+ this.logger.error(
247
+ 'flo failed to update, this shouldn\'t happen please report it: ' +
248
+ JSON.stringify(status)
249
+ );
250
+ }
251
+ }.bind(this));
252
+ };
253
+
254
+ /**
255
+ * Destroys session.
256
+ *
257
+ * @public
258
+ */
259
+
260
+ Session.prototype.destroy = function() {
261
+ this.removeEventListeners();
262
+ if (this.conn) this.conn.disconnect();
263
+ };
264
+
265
+ /**
266
+ * Utility to ensure's a function is called only once.
267
+ *
268
+ * @param {function} cb
269
+ * @private
270
+ */
271
+
272
+ function once(cb) {
273
+ var called = false;
274
+ return function() {
275
+ if (!called) {
276
+ called = true;
277
+ return cb.apply(this, arguments);
278
+ }
279
+ };
280
+ }
281
+
282
+ function triggerReloadEvent(resource) {
283
+ var data = {
284
+ url: resource.resourceURL,
285
+ contents: resource.contents
286
+ };
287
+
288
+ var script = '(function() {' +
289
+ 'var event = new Event(\'fb-flo-reload\');' +
290
+ 'event.data = ' + JSON.stringify(data) + ';' +
291
+ 'window.dispatchEvent(event);' +
292
+ '})()';
293
+
294
+ chrome.devtools.inspectedWindow.eval(script);
295
+ }
296
+
297
+ function indexOfMatcher(val, resourceURL) {
298
+ return val.indexOf(resourceURL) > -1;
299
+ }
300
+
301
+ function equalMatcher(val, resourceURL) {
302
+ return resourceURL === val;
303
+ }
304
+
305
+ }).call(this);