<!DOCTYPE html>
<!--
Copyright 2011 Software Freedom Conservancy. All Rights Reserved.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<title>webdriverscriptbutton_test.html</title>
<script src="test_bootstrap.js"></script>
<link href="../style.css" rel="stylesheet">
<script>
  goog.require('bot.Keyboard.Keys');
  goog.require('bot.action');
  goog.require('bot.dom');
  goog.require('goog.events');
  goog.require('goog.testing.jsunit');
  goog.require('goog.testing.recordFunction');
  goog.require('goog.ui.Component.EventType');
  goog.require('remote.ui.WebDriverScriptButton');
</script>
<script>
  var button;

  function setUp() {
    button = new remote.ui.WebDriverScriptButton();
    button.render();
  }


  function tearDown() {
    button.dispose();
  }


  function openDialog() {
    assertFalse(button.openScriptDialog_.isVisible());
    bot.action.click(button.getElement());
    assertTrue(button.openScriptDialog_.isVisible());
  }


  function testDoesNotFireLoadScriptEventOnCancel() {
    openDialog();

    var onLoad = goog.testing.recordFunction();
    goog.events.listen(button, remote.ui.WebDriverScriptButton.LOAD_SCRIPT,
        onLoad);

    bot.action.type(button.openScriptDialog_.input_.getElement(),
        'http://www.google.com');
    bot.action.click(
        button.openScriptDialog_.getButtonSet().getButton('cancel'));
    assertFalse('Dialog was not closed', button.openScriptDialog_.isVisible());
    assertEquals(0, onLoad.getCallCount());
  }


  function testFiresLoadScriptEventOnAccept() {
    openDialog();

    var onLoad = goog.testing.recordFunction();
    goog.events.listen(button, remote.ui.WebDriverScriptButton.LOAD_SCRIPT,
        onLoad);

    bot.action.type(button.openScriptDialog_.input_.getElement(),
        'http://www.google.com');
    bot.action.click(
        button.openScriptDialog_.getButtonSet().getButton('ok'));
    assertFalse('Dialog was not closed', button.openScriptDialog_.isVisible());

    assertEquals(1, onLoad.getCallCount());

    var args = onLoad.getLastCall().getArguments();
    assertEquals(1, args.length);
    assertEquals('http://www.google.com', args[0].data);
  }

</script>
