class Hatemile::Implementation::AccessibleEventImplementation

The AccessibleEventImplementation class is official implementation of AccessibleEvent interface.

Constants

ID_FUNCTION_SCRIPT_FIX

The id of script element that modify the events of elements.

ID_LIST_IDS_SCRIPT

The id of script element that contains the list of elements that has inaccessible events.

ID_SCRIPT_COMMON_FUNCTIONS

The ID of script element that contains the common functions of scripts.

ID_SCRIPT_EVENT_LISTENER

The id of script element that replace the event listener methods.

Public Class Methods

new(parser) click to toggle source

Initializes a new object that manipulate the accessibility of the Javascript events of elements of parser.

@param parser [Hatemile::Util::Html::HTMLDOMParser] The HTML parser.

# File lib/hatemile/implementation/accessible_event_implementation.rb, line 181
def initialize(parser)
  Hatemile::Helper.require_not_nil(parser)
  Hatemile::Helper.require_valid_type(
    parser,
    Hatemile::Util::Html::HTMLDOMParser
  )

  @parser = parser
  @id_generator = Hatemile::Util::IDGenerator.new('event')
  @main_script_added = false
  @script_list = nil
end

Public Instance Methods

make_accessible_all_click_events() click to toggle source

@see Hatemile::AccessibleEvent#make_accessible_all_click_events

# File lib/hatemile/implementation/accessible_event_implementation.rb, line 266
def make_accessible_all_click_events
  elements = @parser.find(
    '[onclick],[onmousedown],[onmouseup],[ondblclick]'
  ).list_results
  elements.each do |element|
    if Hatemile::Util::CommonFunctions.is_valid_element?(element)
      make_accessible_click_events(element)
    end
  end
end
make_accessible_all_drag_and_drop_events() click to toggle source

@see Hatemile::AccessibleEvent#make_accessible_all_drag_and_drop_events

# File lib/hatemile/implementation/accessible_event_implementation.rb, line 214
def make_accessible_all_drag_and_drop_events
  draggable_elements = @parser.find(
    '[ondrag],[ondragstart],[ondragend]'
  ).list_results
  draggable_elements.each do |draggable_element|
    next unless Hatemile::Util::CommonFunctions.is_valid_element?(
      draggable_element
    )

    make_accessible_drag_events(draggable_element)
  end
  droppable_elements = @parser.find(
    '[ondrop],[ondragenter],[ondragleave],[ondragover]'
  ).list_results
  droppable_elements.each do |droppable_element|
    next unless Hatemile::Util::CommonFunctions.is_valid_element?(
      droppable_element
    )

    make_accessible_drop_events(droppable_element)
  end
end
make_accessible_all_hover_events() click to toggle source

@see Hatemile::AccessibleEvent#make_accessible_all_hover_events

# File lib/hatemile/implementation/accessible_event_implementation.rb, line 247
def make_accessible_all_hover_events
  elements = @parser.find('[onmouseover],[onmouseout]').list_results
  elements.each do |element|
    if Hatemile::Util::CommonFunctions.is_valid_element?(element)
      make_accessible_hover_events(element)
    end
  end
end
make_accessible_click_events(element) click to toggle source

@see Hatemile::AccessibleEvent#make_accessible_click_events

# File lib/hatemile/implementation/accessible_event_implementation.rb, line 258
def make_accessible_click_events(element)
  keyboard_access(element)

  add_event_in_element(element, 'active')
end
make_accessible_drag_events(element) click to toggle source

@see Hatemile::AccessibleEvent#make_accessible_drag_events

# File lib/hatemile/implementation/accessible_event_implementation.rb, line 204
def make_accessible_drag_events(element)
  keyboard_access(element)

  element.set_attribute('aria-grabbed', 'false')

  add_event_in_element(element, 'drag')
end
make_accessible_drop_events(element) click to toggle source

@see Hatemile::AccessibleEvent#make_accessible_drop_events

# File lib/hatemile/implementation/accessible_event_implementation.rb, line 196
def make_accessible_drop_events(element)
  element.set_attribute('aria-dropeffect', 'none')

  add_event_in_element(element, 'drop')
end
make_accessible_hover_events(element) click to toggle source

@see Hatemile::AccessibleEvent#make_accessible_hover_events

# File lib/hatemile/implementation/accessible_event_implementation.rb, line 239
def make_accessible_hover_events(element)
  keyboard_access(element)

  add_event_in_element(element, 'hover')
end

Protected Instance Methods

add_event_in_element(element, event) click to toggle source

Add a type of event in element.

@param element [Hatemile::Util::Html::HTMLDOMElement] The element. @param event [String] The type of event. @return [void]

# File lib/hatemile/implementation/accessible_event_implementation.rb, line 163
def add_event_in_element(element, event)
  generate_main_scripts unless @main_script_added

  return if @script_list.nil?

  @id_generator.generate_id(element)
  @script_list.append_text(
    "#{event}Elements.push('#{element.get_attribute('id')}');"
  )
end
generate_main_scripts() click to toggle source

Include the scripts used by solutions.

@return [void]

# File lib/hatemile/implementation/accessible_event_implementation.rb, line 84
def generate_main_scripts
  head = @parser.find('head').first_result
  unless head.nil?
    common_functions_script = @parser.find(
      "##{ID_SCRIPT_COMMON_FUNCTIONS}"
    ).first_result
    if common_functions_script.nil?
      common_functions_script = @parser.create_element('script')
      common_functions_script.set_attribute(
        'id',
        ID_SCRIPT_COMMON_FUNCTIONS
      )
      common_functions_script.set_attribute('type', 'text/javascript')
      common_functions_script.append_text(
        File.read(
          File.join(
            File.dirname(File.dirname(File.dirname(__FILE__))),
            'js',
            'common.js'
          )
        )
      )
      head.prepend_element(common_functions_script)
    end

    if @parser.find("##{ID_SCRIPT_EVENT_LISTENER}").first_result.nil?
      script = @parser.create_element('script')
      script.set_attribute('id', ID_SCRIPT_EVENT_LISTENER)
      script.set_attribute('type', 'text/javascript')
      script.append_text(
        File.read(
          File.join(
            File.dirname(File.dirname(File.dirname(__FILE__))),
            'js',
            'eventlistener.js'
          )
        )
      )
      common_functions_script.insert_after(script)
    end
  end
  local = @parser.find('body').first_result
  unless local.nil?
    @script_list = @parser.find("##{ID_LIST_IDS_SCRIPT}").first_result
    if @script_list.nil?
      @script_list = @parser.create_element('script')
      @script_list.set_attribute('id', ID_LIST_IDS_SCRIPT)
      @script_list.set_attribute('type', 'text/javascript')
      @script_list.append_text('var activeElements = [];')
      @script_list.append_text('var hoverElements = [];')
      @script_list.append_text('var dragElements = [];')
      @script_list.append_text('var dropElements = [];')
      local.append_element(@script_list)
    end
    if @parser.find("##{ID_FUNCTION_SCRIPT_FIX}").first_result.nil?
      script_function = @parser.create_element('script')
      script_function.set_attribute('id', ID_FUNCTION_SCRIPT_FIX)
      script_function.set_attribute('type', 'text/javascript')
      script_function.append_text(
        File.read(
          File.join(
            File.dirname(File.dirname(File.dirname(__FILE__))),
            'js',
            'include.js'
          )
        )
      )
      local.append_element(script_function)
    end
  end
  @main_script_added = true
end
keyboard_access(element) click to toggle source

Provide keyboard access for element, if it not has.

@param element [Hatemile::Util::Html::HTMLDOMElement] The element. @return [void]

# File lib/hatemile/implementation/accessible_event_implementation.rb, line 65
def keyboard_access(element)
  return if element.has_attribute?('tabindex')

  tag = element.get_tag_name
  if (tag == 'A') && !element.has_attribute?('href')
    element.set_attribute('tabindex', '0')
  elsif (tag != 'A') &&
        (tag != 'INPUT') &&
        (tag != 'BUTTON') &&
        (tag != 'SELECT') &&
        (tag != 'TEXTAREA')
    element.set_attribute('tabindex', '0')
  end
end