frank-cucumber 0.9.6 → 0.9.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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);