Completed
Push — master ( 4282f9...0ed7ea )
by Yoh
7s
created

client/hyalite/event_plugin/change_event_plugin.rb (1 issue)

Labels
Severity
1
class Browser::DOM::Element
2
  def input_type
3
    `self.native.type`
4
  end
5
end
6
7
module Hyalite
8
  class ChangeEventPlugin
9
    EVENT_TYPES = {
10
      change: {
11
        phasedRegistrationNames: {
12
          bubbled: "onChange",
13
          captured: "onChangeCapture"
14
        },
15
        dependencies: [
16
          :topBlur,
17
          :topChange,
18
          :topClick,
19
          :topFocus,
20
          :topInput,
21
          :topKeyDown,
22
          :topKeyUp,
23
          :topSelectionChange
24
        ]
25
      }
26
    }
27
28
    SUPPORTED_INPUT_TYPES = [
29
      'color',
30
      'date',
31
      'datetime',
32
      'datetime-local',
33
      'email',
34
      'month',
35
      'number',
36
      'password',
37
      'range',
38
      'search',
39
      'tel',
40
      'text',
41
      'time',
42
      'url',
43
      'week'
44
    ]
45
46
    def event_types
47
      EVENT_TYPES
48
    end
49
50
    def is_text_input_element(elem)
51
      node_name = elem.node_name.downcase
52
      (node_name == 'input' && SUPPORTED_INPUT_TYPES.include?(elem.input_type)) || node_name == 'textarea'
53
    end
54 View Code Duplication
55
    def should_use_change_event(elem)
56
      node_name = elem.node_name.downcase
57
      node_name == 'select' || (node_name == 'input' && elem.input_type == 'file')
58
    end
59 View Code Duplication
60
    def should_use_click_event(elem)
61
      elem.node_name.downcase == 'input' && %w(checkbox radio).include?(elem.input_type)
62
    end
63
64
    def extract_event(top_level_type, top_level_target, top_level_target_id, event)
65
      if should_use_change_event(top_level_target)
66
        target_id = top_level_target_id if top_level_type == :topChange
67
      elsif is_text_input_element(top_level_target)
68
        target_id = top_level_target_id if top_level_type == :topInput
69
      elsif should_use_click_event(top_level_target)
70
        target_id = top_level_target_id if top_level_type == :topClick
71
      end
72
73
      if target_id
74
        SyntheticEvent.new(event).tap do |synthetic_event|
75
          InstanceHandles.traverse_two_phase(target_id) do |target_id, upwards|
1 ignored issue
show
target_id is shadowing an outer variable; are you sure this is intended?
Loading history...
76
            listener = BrowserEvent.listener_at_phase(target_id, EVENT_TYPES[:change], upwards ? :bubbled : :captured)
77
            synthetic_event.add_listener(listener, target_id) if listener
78
          end
79
        end
80
      end
81
    end
82
  end
83
end
84