frank-cucumber 0.9.6 → 0.9.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. data/frank-skeleton/frank_static_resources.bundle/index.html +29 -34
  2. data/frank-skeleton/frank_static_resources.bundle/{index.haml → index.html.haml} +28 -29
  3. data/frank-skeleton/frank_static_resources.bundle/js/accessible_views_view.coffee +41 -0
  4. data/frank-skeleton/frank_static_resources.bundle/js/accessible_views_view.js +46 -0
  5. data/frank-skeleton/frank_static_resources.bundle/js/controller.coffee +129 -0
  6. data/frank-skeleton/frank_static_resources.bundle/js/controller.js +142 -0
  7. data/frank-skeleton/frank_static_resources.bundle/js/details_view.coffee +42 -0
  8. data/frank-skeleton/frank_static_resources.bundle/js/details_view.js +51 -0
  9. data/frank-skeleton/frank_static_resources.bundle/js/dropdown_control.coffee +64 -0
  10. data/frank-skeleton/frank_static_resources.bundle/js/dropdown_control.js +73 -0
  11. data/frank-skeleton/frank_static_resources.bundle/js/ersatz_model.coffee +46 -0
  12. data/frank-skeleton/frank_static_resources.bundle/js/ersatz_model.js +59 -0
  13. data/frank-skeleton/frank_static_resources.bundle/js/ersatz_view.coffee +167 -0
  14. data/frank-skeleton/frank_static_resources.bundle/js/ersatz_view.js +198 -0
  15. data/frank-skeleton/frank_static_resources.bundle/js/experiment_bar_model.coffee +10 -0
  16. data/frank-skeleton/frank_static_resources.bundle/js/experiment_bar_model.js +17 -0
  17. data/frank-skeleton/frank_static_resources.bundle/js/experiment_bar_view.coffee +43 -0
  18. data/frank-skeleton/frank_static_resources.bundle/js/experiment_bar_view.js +60 -0
  19. data/frank-skeleton/frank_static_resources.bundle/js/frank.coffee +96 -0
  20. data/frank-skeleton/frank_static_resources.bundle/js/frank.js +118 -0
  21. data/frank-skeleton/frank_static_resources.bundle/js/lib/backbone.js +1431 -0
  22. data/frank-skeleton/frank_static_resources.bundle/{coffee-script.js → js/lib/coffee-script.js} +0 -0
  23. data/frank-skeleton/frank_static_resources.bundle/{jquery-ui.min.js → js/lib/jquery-ui.min.js} +0 -0
  24. data/frank-skeleton/frank_static_resources.bundle/{jquery.min.js → js/lib/jquery.min.js} +0 -0
  25. data/frank-skeleton/frank_static_resources.bundle/{jquery.treeview.js → js/lib/jquery.treeview.js} +0 -0
  26. data/frank-skeleton/frank_static_resources.bundle/{json2.js → js/lib/json2.js} +0 -0
  27. data/frank-skeleton/frank_static_resources.bundle/js/lib/raphael.js +5815 -0
  28. data/frank-skeleton/frank_static_resources.bundle/js/lib/require.js +2053 -0
  29. data/frank-skeleton/frank_static_resources.bundle/{underscore.js → js/lib/underscore.js} +466 -177
  30. data/frank-skeleton/frank_static_resources.bundle/js/main.coffee +27 -0
  31. data/frank-skeleton/frank_static_resources.bundle/js/main.js +29 -0
  32. data/frank-skeleton/frank_static_resources.bundle/js/tabs_controller.coffee +13 -0
  33. data/frank-skeleton/frank_static_resources.bundle/js/tabs_controller.js +22 -0
  34. data/frank-skeleton/frank_static_resources.bundle/js/toast_controller.coffee +15 -0
  35. data/frank-skeleton/frank_static_resources.bundle/js/toast_controller.js +28 -0
  36. data/frank-skeleton/frank_static_resources.bundle/js/transform_stack.coffee +59 -0
  37. data/frank-skeleton/frank_static_resources.bundle/js/transform_stack.js +78 -0
  38. data/frank-skeleton/frank_static_resources.bundle/js/tree_view.coffee +53 -0
  39. data/frank-skeleton/frank_static_resources.bundle/js/tree_view.js +64 -0
  40. data/frank-skeleton/frank_static_resources.bundle/js/view_heir_model.coffee +37 -0
  41. data/frank-skeleton/frank_static_resources.bundle/js/view_heir_model.js +48 -0
  42. data/frank-skeleton/frank_static_resources.bundle/js/view_model.coffee +39 -0
  43. data/frank-skeleton/frank_static_resources.bundle/js/view_model.js +62 -0
  44. data/frank-skeleton/frank_static_resources.bundle/symbiote.css +116 -84
  45. data/lib/frank-cucumber/frankifier.rb +20 -2
  46. data/lib/frank-cucumber/version.rb +1 -1
  47. metadata +70 -38
  48. data/frank-skeleton/frank_static_resources.bundle/raphael-min.js +0 -7
  49. data/frank-skeleton/frank_static_resources.bundle/symbiote.js +0 -585
  50. data/frank-skeleton/frank_static_resources.bundle/symbiote_ui.coffee +0 -39
@@ -3,15 +3,15 @@
3
3
  <head>
4
4
  <meta charset='utf-8' />
5
5
  <title>Symbiote</title>
6
- <script src='jquery.min.js'></script>
7
- <script src='jquery-ui.min.js'></script>
8
- <script src='coffee-script.js'></script>
9
- <script src='raphael-min.js'></script>
10
- <script src='jquery.treeview.js'></script>
11
- <script src='json2.js'></script>
12
- <script src='underscore.js'></script>
13
- <script src='symbiote.js'></script>
14
- <script src='symbiote_ui.coffee' type='text/coffeescript'></script>
6
+ <script src='js/lib/jquery.min.js'></script>
7
+ <script src='js/lib/jquery-ui.min.js'></script>
8
+ <script src='js/lib/jquery.treeview.js'></script>
9
+ <script src='js/lib/coffee-script.js'></script>
10
+ <script src='js/lib/raphael.js'></script>
11
+ <script src='js/lib/underscore.js'></script>
12
+ <script src='js/lib/backbone.js'></script>
13
+ <script src='js/lib/json2.js'></script>
14
+ <script data-main='/js/main' src='js/lib/require.js'></script>
15
15
  <link href='reset.css' rel='stylesheet' />
16
16
  <link href='pictos/pictos.css' rel='stylesheet' />
17
17
  <link href='jquery.treeview.css' rel='stylesheet' />
@@ -20,7 +20,7 @@
20
20
  <body>
21
21
  <header id='header'>
22
22
  <h1>symbiote</h1>
23
- <i>From here you can inspect the current state of the app's UI, and test which UI elements a selector will select</i>
23
+ <div class='toast'></div>
24
24
  <div id='refresh'>
25
25
  <button id='dump_button'>
26
26
  <span></span>
@@ -29,40 +29,30 @@
29
29
  </header>
30
30
  <section class='symbiote_shell'>
31
31
  <article id='selector-test'>
32
+ <label class='selector-engine-label'>
33
+ use &rarr;
34
+ </label>
35
+ <div class='selector-engine dropdown'></div>
36
+ <label></label>
37
+ to select views that match &rarr;
32
38
  <input id='query' placeholder="Selector label marked:'Search'" />
33
- <div class='action-buttons'>
34
- <button id='highlight'>Highlight</button>
35
- <ul class='extra-actions'>
36
- <li>
37
- <button id='touch'>Touch In App</button>
38
- </li>
39
- <li>
40
- <button id='flash'>Flash In App</button>
41
- </li>
42
- </ul>
43
- <div class='drop-indicator'>v</div>
44
- </div>
45
- <div class='selector_engine'>
46
- <input id='selector_engine' value='shelley_compat' />
47
- <button id='selector_engine_dropdown'>&#x25BC;</button>
48
- <ul id='selector_engine_options'>
49
- <li>shelley_compat</li>
50
- <li>uiquery</li>
51
- </ul>
52
- </div>
39
+ <label>
40
+ and then &rarr;
41
+ </label>
42
+ <div class='action-buttons dropdown'></div>
53
43
  </article>
54
44
  </section>
55
45
  <section class='the-columns'>
56
46
  <div id='list-tabs'>
57
47
  <ul>
58
48
  <li>
59
- <a href='#dom_dump'>View Heirarchy</a>
49
+ <a href='#dom-dump'>View Heirarchy</a>
60
50
  </li>
61
51
  <li>
62
52
  <a href='#accessible-views-tab'>Accessible Elements</a>
63
53
  </li>
64
54
  </ul>
65
- <div id='dom_dump'>
55
+ <div id='dom-dump'>
66
56
  <ul></ul>
67
57
  </div>
68
58
  <div id='accessible-views-tab'>
@@ -76,7 +66,7 @@
76
66
  <div id='inspect-tabs'>
77
67
  <ul>
78
68
  <li>
79
- <a href='#dom_detail'>View Properties</a>
69
+ <a href='#dom-detail'>View Properties</a>
80
70
  </li>
81
71
  <li>
82
72
  <a href='#ui-locator'>View Locator</a>
@@ -89,10 +79,15 @@
89
79
  <span>Y</span>
90
80
  </button>
91
81
  </div>
82
+ <div id='asploder'>
83
+ <button>
84
+ Asplode
85
+ </button>
86
+ </div>
92
87
  <button id='ui-locator-rotator'>1</button>
93
88
  <div id='ui-locator-view'></div>
94
89
  </div>
95
- <div id='dom_detail'>
90
+ <div id='dom-detail'>
96
91
  <p>Click an element in the view heirarchy on the right to see details of that element here.</p>
97
92
  </div>
98
93
  </div>
@@ -4,15 +4,17 @@
4
4
  %meta(charset="utf-8")
5
5
  %title Symbiote
6
6
 
7
- %script(src="jquery.min.js")
8
- %script(src="jquery-ui.min.js")
9
- %script(src="coffee-script.js")
10
- %script(src="raphael-min.js")
11
- %script(src="jquery.treeview.js")
12
- %script(src="json2.js")
13
- %script(src="underscore.js")
14
- %script(src="symbiote.js")
15
- %script(src="symbiote_ui.coffee" type="text/coffeescript")
7
+ %script(src="js/lib/jquery.min.js")
8
+ %script(src="js/lib/jquery-ui.min.js")
9
+ %script(src="js/lib/jquery.treeview.js")
10
+ %script(src="js/lib/coffee-script.js")
11
+ %script(src="js/lib/raphael.js")
12
+ %script(src="js/lib/underscore.js")
13
+ %script(src="js/lib/backbone.js")
14
+ %script(src="js/lib/json2.js")
15
+
16
+ %script(data-main="/js/main" src="js/lib/require.js")
17
+
16
18
  %link(href="reset.css" rel="stylesheet")
17
19
  %link(href="pictos/pictos.css" rel="stylesheet")
18
20
  %link(href="jquery.treeview.css" rel="stylesheet")
@@ -21,39 +23,33 @@
21
23
  %body
22
24
  %header#header
23
25
  %h1 symbiote
24
- %i From here you can inspect the current state of the app's UI, and test which UI elements a selector will select
26
+ .toast
25
27
  #refresh
26
28
  %button#dump_button
27
29
  %span
28
30
 
29
31
  %section.symbiote_shell
30
32
  %article#selector-test
31
- %input#query(placeholder="Selector label marked:'Search'")
32
- .action-buttons
33
- %button#highlight Highlight
34
- %ul.extra-actions
35
- %li
36
- %button#touch Touch In App
37
- %li
38
- %button#flash Flash In App
39
- %div.drop-indicator v
40
- .selector_engine
41
- %input#selector_engine(value="shelley_compat")
42
- %button#selector_engine_dropdown &#x25BC;
43
- %ul#selector_engine_options
44
- %li shelley_compat
45
- %li uiquery
33
+ %label.selector-engine-label
34
+ use &rarr;
35
+ .selector-engine.dropdown
46
36
 
37
+ %label
38
+ to select views that match &rarr;
39
+ %input#query(placeholder="Selector label marked:'Search'")
47
40
 
41
+ %label
42
+ and then &rarr;
43
+ .action-buttons.dropdown
48
44
 
49
45
  %section.the-columns
50
46
  #list-tabs
51
47
  %ul
52
48
  %li
53
- %a(href="#dom_dump") View Heirarchy
49
+ %a(href="#dom-dump") View Heirarchy
54
50
  %li
55
51
  %a(href="#accessible-views-tab") Accessible Elements
56
- #dom_dump
52
+ #dom-dump
57
53
  %ul
58
54
  #accessible-views-tab
59
55
  %div.hints
@@ -64,7 +60,7 @@
64
60
  #inspect-tabs
65
61
  %ul
66
62
  %li
67
- %a(href="#dom_detail") View Properties
63
+ %a(href="#dom-detail") View Properties
68
64
  %li
69
65
  %a(href="#ui-locator") View Locator
70
66
  #ui-locator
@@ -72,8 +68,11 @@
72
68
  %button
73
69
  Live
74
70
  %span Y
71
+ #asploder
72
+ %button
73
+ Asplode
75
74
  %button#ui-locator-rotator 1
76
75
  #ui-locator-view
77
76
 
78
- #dom_detail
77
+ #dom-detail
79
78
  %p Click an element in the view heirarchy on the right to see details of that element here.
@@ -0,0 +1,41 @@
1
+ define ->
2
+ AccessibleViewItemView = Backbone.View.extend
3
+ tagName: 'div'
4
+
5
+ events:
6
+ "click": "clicked"
7
+ "mouseover":"mousedover"
8
+ "mouseout":"mousedout"
9
+
10
+ render: ->
11
+ @$el.empty().append( """
12
+ <a href="#" title="#{@model.getShelleySelector()}">
13
+ <span class="viewClass">#{@model.get('class')}</span>
14
+ with label
15
+ "<span class="viewLabel">#{@model.get('accessibilityLabel')}</span>"
16
+ </a>
17
+ """)
18
+ @
19
+
20
+ mousedover: -> @model.setActive()
21
+ mousedout: -> @model.unsetActive()
22
+
23
+ clicked: ->
24
+ @model.trigger( 'accessible-selected', @model )
25
+
26
+
27
+ AccessibleViewsView = Backbone.View.extend
28
+ el: $('#accessible-views')
29
+
30
+ initialize: ->
31
+ @collection = new Backbone.Collection
32
+ @collection.on 'reset', _.bind(@render,@)
33
+
34
+
35
+ render: ->
36
+ @$el.empty()
37
+ @collection.each (viewModel) =>
38
+ @$el.append( new AccessibleViewItemView(model:viewModel).render().el )
39
+ @
40
+
41
+ AccessibleViewsView
@@ -0,0 +1,46 @@
1
+ (function() {
2
+
3
+ define(function() {
4
+ var AccessibleViewItemView, AccessibleViewsView;
5
+ AccessibleViewItemView = Backbone.View.extend({
6
+ tagName: 'div',
7
+ events: {
8
+ "click": "clicked",
9
+ "mouseover": "mousedover",
10
+ "mouseout": "mousedout"
11
+ },
12
+ render: function() {
13
+ this.$el.empty().append("<a href=\"#\" title=\"" + (this.model.getShelleySelector()) + "\">\n <span class=\"viewClass\">" + (this.model.get('class')) + "</span>\n with label\n \"<span class=\"viewLabel\">" + (this.model.get('accessibilityLabel')) + "</span>\"\n</a>");
14
+ return this;
15
+ },
16
+ mousedover: function() {
17
+ return this.model.setActive();
18
+ },
19
+ mousedout: function() {
20
+ return this.model.unsetActive();
21
+ },
22
+ clicked: function() {
23
+ return this.model.trigger('accessible-selected', this.model);
24
+ }
25
+ });
26
+ AccessibleViewsView = Backbone.View.extend({
27
+ el: $('#accessible-views'),
28
+ initialize: function() {
29
+ this.collection = new Backbone.Collection;
30
+ return this.collection.on('reset', _.bind(this.render, this));
31
+ },
32
+ render: function() {
33
+ var _this = this;
34
+ this.$el.empty();
35
+ this.collection.each(function(viewModel) {
36
+ return _this.$el.append(new AccessibleViewItemView({
37
+ model: viewModel
38
+ }).render().el);
39
+ });
40
+ return this;
41
+ }
42
+ });
43
+ return AccessibleViewsView;
44
+ });
45
+
46
+ }).call(this);
@@ -0,0 +1,129 @@
1
+ RELOAD_INTERVAL = 500
2
+
3
+ guessAtDeviceFamilyBasedOnViewDump = (viewHeir)->
4
+ switch viewHeir.accessibilityFrame.size.height
5
+ when 1024 then 'ipad'
6
+ when 480 then 'iphone'
7
+ else
8
+ console.warn( "couldn't recognize device family based on screen height of " + data.accessibilityFrame.size.height + "px" )
9
+ 'unknown'
10
+
11
+ define ['frank'],(frank)->
12
+
13
+ createController = ({
14
+ tabsController,
15
+ toastController,
16
+ treeView,
17
+ ersatzView,
18
+ detailsView,
19
+ accessibleViewsView,
20
+ experimentBarModel,
21
+ $asplodeButton,
22
+ $reloadButton,
23
+ $liveButton})->
24
+
25
+ treeView.model.on 'active-view-changed', (viewModel)->
26
+
27
+ treeView.model.on 'selected-view-changed', (viewModel)->
28
+ detailsView.updateModel(viewModel)
29
+ tabsController.selectViewDetailsTab()
30
+
31
+ treeView.model.on 'accessible-view-selected', (viewModel)->
32
+ viewModel.setActive()
33
+ experimentBarModel.set( selector: viewModel.getShelleySelector() )
34
+
35
+
36
+ reportActionOutcome = (action,numViews)->
37
+ message = switch numViews
38
+ when 0 then "Sorry, no views matched that selector so none were #{action}"
39
+ when 1 then "1 view was #{action}"
40
+ else "#{numViews} views were #{action}"
41
+ toastController.showToastMessage(message)
42
+
43
+ validateViewSelector = (selector)->
44
+ if selector.length == 0
45
+ toastController.showToastMessage("You haven't provided a view selector. Please enter one below.")
46
+ false
47
+ else
48
+ true
49
+
50
+
51
+ experimentBarModel.on 'flash-clicked', (model)->
52
+ [selector, selectorEngine] = [model.get('selector'), model.get('selectorEngine')]
53
+ return unless validateViewSelector(selector)
54
+ frank.sendFlashCommand(
55
+ selector,
56
+ selectorEngine
57
+ ).done (data)->
58
+ reportActionOutcome( "flashed", data.length )
59
+
60
+ experimentBarModel.on 'touch-clicked', (model)->
61
+ [selector, selectorEngine] = [model.get('selector'), model.get('selectorEngine')]
62
+ return unless validateViewSelector(selector)
63
+
64
+ views = frank.sendTouchCommand(
65
+ selector,
66
+ selectorEngine
67
+ ).done (data)->
68
+ reportActionOutcome( "touched", data.length )
69
+
70
+ experimentBarModel.on 'highlight-clicked', (model)->
71
+ [selector, selectorEngine] = [model.get('selector'), model.get('selectorEngine')]
72
+ return unless validateViewSelector(selector)
73
+
74
+ views = frank.getAccessibilityFramesForViewsMatchingSelector(
75
+ selector,
76
+ selectorEngine
77
+ ).done (data)->
78
+ ersatzView.model.highlightSomeFramesForABit( data )
79
+ reportActionOutcome( "highlighted", data.length )
80
+
81
+ $asplodeButton.on 'click', ->
82
+ isAsploded = ersatzView.model.toggleAsploded()
83
+ $asplodeButton.toggleClass( 'down', isAsploded )
84
+
85
+ $reloadButton.on 'click', ->
86
+ reload().done ->
87
+ toastController.showToastMessage('views reloaded')
88
+
89
+ liveTimeout = undefined
90
+ reloadLoop = ->
91
+ reload()
92
+ liveTimeout = window.setTimeout( reloadLoop, RELOAD_INTERVAL )
93
+
94
+ $liveButton.on 'click', ->
95
+ window.clearTimeout(liveTimeout) if liveTimeout?
96
+
97
+ if $liveButton.hasClass('down')
98
+ toastController.showToastMessage('leaving live mode')
99
+ $liveButton.removeClass('down')
100
+ else
101
+ reloadLoop()
102
+ toastController.showToastMessage('entering live mode')
103
+ $liveButton.addClass('down')
104
+
105
+ reload = ->
106
+ deferable = $.Deferred()
107
+ $.when( frank.fetchViewHeirarchy(), frank.fetchOrientation() ).done ([rawHeir,],orientation)->
108
+ deviceFamily = guessAtDeviceFamilyBasedOnViewDump(rawHeir)
109
+
110
+ treeView.model.resetViewHeir(rawHeir)
111
+ ersatzView.model.resetViews(treeView.model.get('allViews'),deviceFamily,orientation)
112
+
113
+ accessibleViews = treeView.model.getAccessibleViews()
114
+ accessibleViewsView.collection.reset( accessibleViews )
115
+
116
+ ersatzView.render()
117
+ deferable.resolve()
118
+
119
+ deferable.promise()
120
+
121
+ boot = ->
122
+ tabsController.selectLocatorTab()
123
+ reload()
124
+
125
+ {
126
+ boot: boot
127
+ }
128
+
129
+ createController
@@ -0,0 +1,142 @@
1
+ (function() {
2
+ var RELOAD_INTERVAL, guessAtDeviceFamilyBasedOnViewDump;
3
+
4
+ RELOAD_INTERVAL = 500;
5
+
6
+ guessAtDeviceFamilyBasedOnViewDump = function(viewHeir) {
7
+ switch (viewHeir.accessibilityFrame.size.height) {
8
+ case 1024:
9
+ return 'ipad';
10
+ case 480:
11
+ return 'iphone';
12
+ default:
13
+ console.warn("couldn't recognize device family based on screen height of " + data.accessibilityFrame.size.height + "px");
14
+ return 'unknown';
15
+ }
16
+ };
17
+
18
+ define(['frank'], function(frank) {
19
+ var createController;
20
+ createController = function(_arg) {
21
+ var $asplodeButton, $liveButton, $reloadButton, accessibleViewsView, boot, detailsView, ersatzView, experimentBarModel, liveTimeout, reload, reloadLoop, reportActionOutcome, tabsController, toastController, treeView, validateViewSelector;
22
+ tabsController = _arg.tabsController, toastController = _arg.toastController, treeView = _arg.treeView, ersatzView = _arg.ersatzView, detailsView = _arg.detailsView, accessibleViewsView = _arg.accessibleViewsView, experimentBarModel = _arg.experimentBarModel, $asplodeButton = _arg.$asplodeButton, $reloadButton = _arg.$reloadButton, $liveButton = _arg.$liveButton;
23
+ treeView.model.on('active-view-changed', function(viewModel) {});
24
+ treeView.model.on('selected-view-changed', function(viewModel) {
25
+ detailsView.updateModel(viewModel);
26
+ return tabsController.selectViewDetailsTab();
27
+ });
28
+ treeView.model.on('accessible-view-selected', function(viewModel) {
29
+ viewModel.setActive();
30
+ return experimentBarModel.set({
31
+ selector: viewModel.getShelleySelector()
32
+ });
33
+ });
34
+ reportActionOutcome = function(action, numViews) {
35
+ var message;
36
+ message = (function() {
37
+ switch (numViews) {
38
+ case 0:
39
+ return "Sorry, no views matched that selector so none were " + action;
40
+ case 1:
41
+ return "1 view was " + action;
42
+ default:
43
+ return "" + numViews + " views were " + action;
44
+ }
45
+ })();
46
+ return toastController.showToastMessage(message);
47
+ };
48
+ validateViewSelector = function(selector) {
49
+ if (selector.length === 0) {
50
+ toastController.showToastMessage("You haven't provided a view selector. Please enter one below.");
51
+ return false;
52
+ } else {
53
+ return true;
54
+ }
55
+ };
56
+ experimentBarModel.on('flash-clicked', function(model) {
57
+ var selector, selectorEngine, _ref;
58
+ _ref = [model.get('selector'), model.get('selectorEngine')], selector = _ref[0], selectorEngine = _ref[1];
59
+ if (!validateViewSelector(selector)) {
60
+ return;
61
+ }
62
+ return frank.sendFlashCommand(selector, selectorEngine).done(function(data) {
63
+ return reportActionOutcome("flashed", data.length);
64
+ });
65
+ });
66
+ experimentBarModel.on('touch-clicked', function(model) {
67
+ var selector, selectorEngine, views, _ref;
68
+ _ref = [model.get('selector'), model.get('selectorEngine')], selector = _ref[0], selectorEngine = _ref[1];
69
+ if (!validateViewSelector(selector)) {
70
+ return;
71
+ }
72
+ return views = frank.sendTouchCommand(selector, selectorEngine).done(function(data) {
73
+ return reportActionOutcome("touched", data.length);
74
+ });
75
+ });
76
+ experimentBarModel.on('highlight-clicked', function(model) {
77
+ var selector, selectorEngine, views, _ref;
78
+ _ref = [model.get('selector'), model.get('selectorEngine')], selector = _ref[0], selectorEngine = _ref[1];
79
+ if (!validateViewSelector(selector)) {
80
+ return;
81
+ }
82
+ return views = frank.getAccessibilityFramesForViewsMatchingSelector(selector, selectorEngine).done(function(data) {
83
+ ersatzView.model.highlightSomeFramesForABit(data);
84
+ return reportActionOutcome("highlighted", data.length);
85
+ });
86
+ });
87
+ $asplodeButton.on('click', function() {
88
+ var isAsploded;
89
+ isAsploded = ersatzView.model.toggleAsploded();
90
+ return $asplodeButton.toggleClass('down', isAsploded);
91
+ });
92
+ $reloadButton.on('click', function() {
93
+ return reload().done(function() {
94
+ return toastController.showToastMessage('views reloaded');
95
+ });
96
+ });
97
+ liveTimeout = void 0;
98
+ reloadLoop = function() {
99
+ reload();
100
+ return liveTimeout = window.setTimeout(reloadLoop, RELOAD_INTERVAL);
101
+ };
102
+ $liveButton.on('click', function() {
103
+ if (liveTimeout != null) {
104
+ window.clearTimeout(liveTimeout);
105
+ }
106
+ if ($liveButton.hasClass('down')) {
107
+ toastController.showToastMessage('leaving live mode');
108
+ return $liveButton.removeClass('down');
109
+ } else {
110
+ reloadLoop();
111
+ toastController.showToastMessage('entering live mode');
112
+ return $liveButton.addClass('down');
113
+ }
114
+ });
115
+ reload = function() {
116
+ var deferable;
117
+ deferable = $.Deferred();
118
+ $.when(frank.fetchViewHeirarchy(), frank.fetchOrientation()).done(function(_arg1, orientation) {
119
+ var accessibleViews, deviceFamily, rawHeir;
120
+ rawHeir = _arg1[0];
121
+ deviceFamily = guessAtDeviceFamilyBasedOnViewDump(rawHeir);
122
+ treeView.model.resetViewHeir(rawHeir);
123
+ ersatzView.model.resetViews(treeView.model.get('allViews'), deviceFamily, orientation);
124
+ accessibleViews = treeView.model.getAccessibleViews();
125
+ accessibleViewsView.collection.reset(accessibleViews);
126
+ ersatzView.render();
127
+ return deferable.resolve();
128
+ });
129
+ return deferable.promise();
130
+ };
131
+ boot = function() {
132
+ tabsController.selectLocatorTab();
133
+ return reload();
134
+ };
135
+ return {
136
+ boot: boot
137
+ };
138
+ };
139
+ return createController;
140
+ });
141
+
142
+ }).call(this);