123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669 |
- // Copyright 2010 The Closure Library Authors. 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.
- goog.provide('goog.ui.editor.LinkDialogTest');
- goog.setTestOnly('goog.ui.editor.LinkDialogTest');
- goog.require('goog.dom');
- goog.require('goog.dom.DomHelper');
- goog.require('goog.dom.TagName');
- goog.require('goog.editor.BrowserFeature');
- goog.require('goog.editor.Link');
- goog.require('goog.events');
- goog.require('goog.events.EventHandler');
- goog.require('goog.events.EventType');
- goog.require('goog.events.KeyCodes');
- goog.require('goog.style');
- goog.require('goog.testing.MockControl');
- goog.require('goog.testing.PropertyReplacer');
- goog.require('goog.testing.dom');
- goog.require('goog.testing.events');
- goog.require('goog.testing.events.Event');
- goog.require('goog.testing.jsunit');
- goog.require('goog.testing.mockmatchers');
- goog.require('goog.testing.mockmatchers.ArgumentMatcher');
- goog.require('goog.ui.editor.AbstractDialog');
- goog.require('goog.ui.editor.LinkDialog');
- goog.require('goog.ui.editor.messages');
- goog.require('goog.userAgent');
- var dialog;
- var mockCtrl;
- var mockLink;
- var mockOkHandler;
- var mockGetViewportSize;
- var mockWindowOpen;
- var isNew;
- var anchorElem;
- var stubs = new goog.testing.PropertyReplacer();
- var ANCHOR_TEXT = 'anchor text';
- var ANCHOR_URL = 'http://www.google.com/';
- var ANCHOR_EMAIL = 'm@r.cos';
- var ANCHOR_MAILTO = 'mailto:' + ANCHOR_EMAIL;
- function setUp() {
- anchorElem = goog.dom.createElement(goog.dom.TagName.A);
- goog.dom.appendChild(goog.dom.getDocument().body, anchorElem);
- mockCtrl = new goog.testing.MockControl();
- mockLink = mockCtrl.createLooseMock(goog.editor.Link);
- mockOkHandler = mockCtrl.createLooseMock(goog.events.EventHandler);
- isNew = false;
- mockLink.isNew();
- mockLink.$anyTimes();
- mockLink.$does(function() { return isNew; });
- mockLink.getCurrentText();
- mockLink.$anyTimes();
- mockLink.$does(function() { return anchorElem.innerHTML; });
- mockLink.setTextAndUrl(
- goog.testing.mockmatchers.isString, goog.testing.mockmatchers.isString);
- mockLink.$anyTimes();
- mockLink.$does(function(text, url) {
- anchorElem.innerHTML = text;
- anchorElem.href = url;
- });
- mockLink.$registerArgumentListVerifier(
- 'placeCursorRightOf', function() { return true; });
- mockLink.placeCursorRightOf(goog.testing.mockmatchers.iBoolean);
- mockLink.$anyTimes();
- mockLink.getAnchor();
- mockLink.$anyTimes();
- mockLink.$returns(anchorElem);
- mockWindowOpen = mockCtrl.createFunctionMock('open');
- stubs.set(window, 'open', mockWindowOpen);
- }
- function tearDown() {
- dialog.dispose();
- goog.dom.removeNode(anchorElem);
- stubs.reset();
- }
- function setUpAnchor(href, text, opt_isNew, opt_target, opt_rel) {
- anchorElem.href = href;
- anchorElem.innerHTML = text;
- isNew = !!opt_isNew;
- if (opt_target) {
- anchorElem.target = opt_target;
- }
- if (opt_rel) {
- anchorElem.rel = opt_rel;
- }
- }
- /**
- * Creates and shows the dialog to be tested.
- * @param {Document=} opt_document Document to render the dialog into.
- * Defaults to the main window's document.
- * @param {boolean=} opt_openInNewWindow Whether the open in new window
- * checkbox should be shown.
- * @param {boolean=} opt_noFollow Whether rel=nofollow checkbox should be
- * shown.
- */
- function createAndShow(opt_document, opt_openInNewWindow, opt_noFollow) {
- dialog = new goog.ui.editor.LinkDialog(
- new goog.dom.DomHelper(opt_document), mockLink);
- if (opt_openInNewWindow) {
- dialog.showOpenLinkInNewWindow(false);
- }
- if (opt_noFollow) {
- dialog.showRelNoFollow();
- }
- dialog.addEventListener(
- goog.ui.editor.AbstractDialog.EventType.OK, mockOkHandler);
- dialog.show();
- }
- /**
- * Sets up the mock event handler to expect an OK event with the given text
- * and url.
- */
- function expectOk(linkText, linkUrl, opt_openInNewWindow, opt_noFollow) {
- mockOkHandler.handleEvent(
- new goog.testing.mockmatchers.ArgumentMatcher(
- function(arg) {
- return arg.type == goog.ui.editor.AbstractDialog.EventType.OK &&
- arg.linkText == linkText && arg.linkUrl == linkUrl &&
- arg.openInNewWindow == !!opt_openInNewWindow &&
- arg.noFollow == !!opt_noFollow;
- },
- '{linkText: ' + linkText + ', linkUrl: ' + linkUrl +
- ', openInNewWindow: ' + opt_openInNewWindow + ', noFollow: ' +
- opt_noFollow + '}'));
- }
- /**
- * Return true if we should use active element in our tests.
- * @return {boolean} .
- */
- function useActiveElement() {
- return goog.editor.BrowserFeature.HAS_ACTIVE_ELEMENT ||
- goog.userAgent.WEBKIT && goog.userAgent.isVersionOrHigher(9);
- }
- /**
- * Tests that when you show the dialog for a new link, you can switch
- * to the URL view.
- * @param {Document=} opt_document Document to render the dialog into.
- * Defaults to the main window's document.
- */
- function testShowNewLinkSwitchToUrl(opt_document) {
- mockCtrl.$replayAll();
- setUpAnchor('', '', true); // Must be done before creating the dialog.
- createAndShow(opt_document);
- var webRadio = dialog.dom.getElement(goog.ui.editor.LinkDialog.Id_.ON_WEB_TAB)
- .firstChild;
- var emailRadio =
- dialog.dom.getElement(goog.ui.editor.LinkDialog.Id_.EMAIL_ADDRESS_TAB)
- .firstChild;
- assertTrue('Web Radio Button selected', webRadio.checked);
- assertFalse('Email Radio Button selected', emailRadio.checked);
- if (useActiveElement()) {
- assertEquals(
- 'Focus should be on url input', getUrlInput(),
- dialog.dom.getActiveElement());
- }
- emailRadio.click();
- assertFalse('Web Radio Button selected', webRadio.checked);
- assertTrue('Email Radio Button selected', emailRadio.checked);
- if (useActiveElement()) {
- assertEquals(
- 'Focus should be on url input', getEmailInput(),
- dialog.dom.getActiveElement());
- }
- mockCtrl.$verifyAll();
- }
- /**
- * Tests that when you show the dialog for a new link, the input fields are
- * empty, the web tab is selected and focus is in the url input field.
- * @param {Document=} opt_document Document to render the dialog into.
- * Defaults to the main window's document.
- */
- function testShowForNewLink(opt_document) {
- mockCtrl.$replayAll();
- setUpAnchor('', '', true); // Must be done before creating the dialog.
- createAndShow(opt_document);
- assertEquals(
- 'Display text input field should be empty', '', getDisplayInputText());
- assertEquals('Url input field should be empty', '', getUrlInputText());
- assertEquals(
- 'On the web tab should be selected', goog.ui.editor.LinkDialog.Id_.ON_WEB,
- dialog.curTabId_);
- if (useActiveElement()) {
- assertEquals(
- 'Focus should be on url input', getUrlInput(),
- dialog.dom.getActiveElement());
- }
- mockCtrl.$verifyAll();
- }
- /**
- * Fakes that the mock field is using an iframe and does the same test as
- * testShowForNewLink().
- */
- function testShowForNewLinkWithDiffAppWindow() {
- testShowForNewLink(goog.dom.getElement('appWindowIframe').contentDocument);
- }
- /**
- * Tests that when you show the dialog for a url link, the input fields are
- * filled in, the web tab is selected and focus is in the url input field.
- */
- function testShowForUrlLink() {
- mockCtrl.$replayAll();
- setUpAnchor(ANCHOR_URL, ANCHOR_TEXT);
- createAndShow();
- assertEquals(
- 'Display text input field should be filled in', ANCHOR_TEXT,
- getDisplayInputText());
- assertEquals(
- 'Url input field should be filled in', ANCHOR_URL, getUrlInputText());
- assertEquals(
- 'On the web tab should be selected', goog.ui.editor.LinkDialog.Id_.ON_WEB,
- dialog.curTabId_);
- if (useActiveElement()) {
- assertEquals(
- 'Focus should be on url input', getUrlInput(),
- dialog.dom.getActiveElement());
- }
- mockCtrl.$verifyAll();
- }
- /**
- * Tests that when you show the dialog for a mailto link, the input fields are
- * filled in, the email tab is selected and focus is in the email input field.
- */
- function testShowForMailtoLink() {
- mockCtrl.$replayAll();
- setUpAnchor(ANCHOR_MAILTO, ANCHOR_TEXT);
- createAndShow();
- assertEquals(
- 'Display text input field should be filled in', ANCHOR_TEXT,
- getDisplayInputText());
- assertEquals(
- 'Email input field should be filled in',
- ANCHOR_EMAIL, // The 'mailto:' is not in the input!
- getEmailInputText());
- assertEquals(
- 'Email tab should be selected',
- goog.ui.editor.LinkDialog.Id_.EMAIL_ADDRESS, dialog.curTabId_);
- if (useActiveElement()) {
- assertEquals(
- 'Focus should be on email input', getEmailInput(),
- dialog.dom.getActiveElement());
- }
- mockCtrl.$verifyAll();
- }
- /**
- * Tests that the display text is autogenerated from the url input in the
- * right situations (and not generated when appropriate too).
- */
- function testAutogeneration() {
- mockCtrl.$replayAll();
- setUpAnchor('', '', true);
- createAndShow();
- // Simulate typing a url when everything is empty, should autogen.
- setUrlInputText(ANCHOR_URL);
- assertEquals(
- 'Display text should have been autogenerated', ANCHOR_URL,
- getDisplayInputText());
- // Simulate typing text when url is set, afterwards should not autogen.
- setDisplayInputText(ANCHOR_TEXT);
- setUrlInputText(ANCHOR_MAILTO);
- assertNotEquals(
- 'Display text should not have been autogenerated', ANCHOR_MAILTO,
- getDisplayInputText());
- assertEquals(
- 'Display text should have remained the same', ANCHOR_TEXT,
- getDisplayInputText());
- // Simulate typing text equal to existing url, afterwards should autogen.
- setDisplayInputText(ANCHOR_MAILTO);
- setUrlInputText(ANCHOR_URL);
- assertEquals(
- 'Display text should have been autogenerated', ANCHOR_URL,
- getDisplayInputText());
- mockCtrl.$verifyAll();
- }
- /**
- * Tests that the display text is not autogenerated from the url input in all
- * situations when the autogeneration feature is turned off.
- */
- function testAutogenerationOff() {
- mockCtrl.$replayAll();
- setUpAnchor('', '', true);
- createAndShow();
- // Disable the autogen feature
- dialog.setAutogenFeatureEnabled(false);
- // Simulate typing a url when everything is empty, should not autogen.
- setUrlInputText(ANCHOR_URL);
- assertEquals(
- 'Display text should not have been autogenerated', '',
- getDisplayInputText());
- // Simulate typing text when url is set, afterwards should not autogen.
- setDisplayInputText(ANCHOR_TEXT);
- setUrlInputText(ANCHOR_MAILTO);
- assertNotEquals(
- 'Display text should not have been autogenerated', ANCHOR_MAILTO,
- getDisplayInputText());
- assertEquals(
- 'Display text should have remained the same', ANCHOR_TEXT,
- getDisplayInputText());
- // Simulate typing text equal to existing url, afterwards should not
- // autogen.
- setDisplayInputText(ANCHOR_MAILTO);
- setUrlInputText(ANCHOR_URL);
- assertEquals(
- 'Display text should not have been autogenerated', ANCHOR_MAILTO,
- getDisplayInputText());
- mockCtrl.$verifyAll();
- }
- /**
- * Tests that clicking OK with the url tab selected dispatches an event with
- * the proper link data.
- */
- function testOkForUrl() {
- expectOk(ANCHOR_TEXT, ANCHOR_URL);
- mockCtrl.$replayAll();
- setUpAnchor('', '', true);
- createAndShow();
- dialog.tabPane_.setSelectedTabId(goog.ui.editor.LinkDialog.Id_.ON_WEB_TAB);
- setDisplayInputText(ANCHOR_TEXT);
- setUrlInputText(ANCHOR_URL);
- goog.testing.events.fireClickSequence(dialog.getOkButtonElement());
- mockCtrl.$verifyAll();
- }
- /**
- * Tests that clicking OK with the url tab selected but with an email address
- * in the url field dispatches an event with the proper link data.
- */
- function testOkForUrlWithEmail() {
- expectOk(ANCHOR_TEXT, ANCHOR_MAILTO);
- mockCtrl.$replayAll();
- setUpAnchor('', '', true);
- createAndShow();
- dialog.tabPane_.setSelectedTabId(goog.ui.editor.LinkDialog.Id_.ON_WEB_TAB);
- setDisplayInputText(ANCHOR_TEXT);
- setUrlInputText(ANCHOR_EMAIL);
- goog.testing.events.fireClickSequence(dialog.getOkButtonElement());
- mockCtrl.$verifyAll();
- }
- /**
- * Tests that clicking OK with the email tab selected dispatches an event with
- * the proper link data.
- */
- function testOkForEmail() {
- expectOk(ANCHOR_TEXT, ANCHOR_MAILTO);
- mockCtrl.$replayAll();
- setUpAnchor('', '', true);
- createAndShow();
- dialog.tabPane_.setSelectedTabId(
- goog.ui.editor.LinkDialog.Id_.EMAIL_ADDRESS_TAB);
- setDisplayInputText(ANCHOR_TEXT);
- setEmailInputText(ANCHOR_EMAIL);
- goog.testing.events.fireClickSequence(dialog.getOkButtonElement());
- mockCtrl.$verifyAll();
- }
- function testOpenLinkInNewWindowNewLink() {
- expectOk(ANCHOR_TEXT, ANCHOR_URL, true);
- expectOk(ANCHOR_TEXT, ANCHOR_URL, false);
- mockCtrl.$replayAll();
- setUpAnchor('', '', true);
- createAndShow(undefined, true);
- dialog.tabPane_.setSelectedTabId(goog.ui.editor.LinkDialog.Id_.ON_WEB_TAB);
- setDisplayInputText(ANCHOR_TEXT);
- setUrlInputText(ANCHOR_URL);
- assertFalse(
- '"Open in new window" should start unchecked',
- getOpenInNewWindowCheckboxChecked());
- setOpenInNewWindowCheckboxChecked(true);
- assertTrue(
- '"Open in new window" should have gotten checked',
- getOpenInNewWindowCheckboxChecked());
- goog.testing.events.fireClickSequence(dialog.getOkButtonElement());
- // Reopen same dialog
- dialog.show();
- dialog.tabPane_.setSelectedTabId(goog.ui.editor.LinkDialog.Id_.ON_WEB_TAB);
- setDisplayInputText(ANCHOR_TEXT);
- setUrlInputText(ANCHOR_URL);
- assertTrue(
- '"Open in new window" should remember it was checked',
- getOpenInNewWindowCheckboxChecked());
- setOpenInNewWindowCheckboxChecked(false);
- assertFalse(
- '"Open in new window" should have gotten unchecked',
- getOpenInNewWindowCheckboxChecked());
- goog.testing.events.fireClickSequence(dialog.getOkButtonElement());
- }
- function testOpenLinkInNewWindowExistingLink() {
- mockCtrl.$replayAll();
- // Edit an existing link that already opens in a new window.
- setUpAnchor('', '', false, '_blank');
- createAndShow(undefined, true);
- dialog.tabPane_.setSelectedTabId(goog.ui.editor.LinkDialog.Id_.ON_WEB_TAB);
- setDisplayInputText(ANCHOR_TEXT);
- setUrlInputText(ANCHOR_URL);
- assertTrue(
- '"Open in new window" should start checked for existing link',
- getOpenInNewWindowCheckboxChecked());
- mockCtrl.$verifyAll();
- }
- function testRelNoFollowNewLink() {
- expectOk(ANCHOR_TEXT, ANCHOR_URL, null, true);
- expectOk(ANCHOR_TEXT, ANCHOR_URL, null, false);
- mockCtrl.$replayAll();
- setUpAnchor('', '', true, true);
- createAndShow(null, null, true);
- dialog.tabPane_.setSelectedTabId(goog.ui.editor.LinkDialog.Id_.ON_WEB_TAB);
- setDisplayInputText(ANCHOR_TEXT);
- setUrlInputText(ANCHOR_URL);
- assertFalse(
- 'rel=nofollow should start unchecked',
- dialog.relNoFollowCheckbox_.checked);
- // Check rel=nofollow and close the dialog.
- dialog.relNoFollowCheckbox_.checked = true;
- goog.testing.events.fireClickSequence(dialog.getOkButtonElement());
- // Reopen the same dialog.
- anchorElem.rel = 'foo nofollow bar';
- dialog.show();
- dialog.tabPane_.setSelectedTabId(goog.ui.editor.LinkDialog.Id_.ON_WEB_TAB);
- setDisplayInputText(ANCHOR_TEXT);
- setUrlInputText(ANCHOR_URL);
- assertTrue(
- 'rel=nofollow should start checked when reopening the dialog',
- dialog.relNoFollowCheckbox_.checked);
- }
- function testRelNoFollowExistingLink() {
- mockCtrl.$replayAll();
- setUpAnchor('', '', null, null, 'foo nofollow bar');
- createAndShow(null, null, true);
- assertTrue(
- 'rel=nofollow should start checked for existing link',
- dialog.relNoFollowCheckbox_.checked);
- mockCtrl.$verifyAll();
- }
- /**
- * Test that clicking on the test button opens a new window with the correct
- * options.
- */
- function testWebTestButton() {
- if (goog.userAgent.GECKO) {
- // TODO(robbyw): Figure out why this is flaky and fix it.
- return;
- }
- var width, height;
- mockWindowOpen(
- ANCHOR_URL, '_blank',
- new goog.testing.mockmatchers.ArgumentMatcher(function(str) {
- return str ==
- 'width=' + width + ',height=' + height +
- ',toolbar=1,scrollbars=1,location=1,statusbar=0,' +
- 'menubar=1,resizable=1';
- }, '3rd arg: (string) window.open() options'));
- mockCtrl.$replayAll();
- setUpAnchor(ANCHOR_URL, ANCHOR_TEXT);
- createAndShow();
- // Measure viewport after opening dialog because that might cause scrollbars
- // to appear and reduce the viewport size.
- var size = goog.dom.getViewportSize(window);
- width = Math.max(size.width - 50, 50);
- height = Math.max(size.height - 50, 50);
- var testLink = goog.testing.dom.findTextNode(
- goog.ui.editor.messages.MSG_TEST_THIS_LINK,
- dialog.dialogInternal_.getElement());
- goog.testing.events.fireClickSequence(testLink.parentNode);
- mockCtrl.$verifyAll();
- }
- /**
- * Test that clicking on the test button does not open a new window when
- * the event is canceled.
- */
- function testWebTestButtonPreventDefault() {
- mockCtrl.$replayAll();
- setUpAnchor(ANCHOR_URL, ANCHOR_TEXT);
- createAndShow();
- goog.events.listen(
- dialog, goog.ui.editor.LinkDialog.EventType.BEFORE_TEST_LINK,
- function(e) {
- assertEquals(e.url, ANCHOR_URL);
- e.preventDefault();
- });
- var testLink = goog.testing.dom.findTextNode(
- goog.ui.editor.messages.MSG_TEST_THIS_LINK,
- dialog.dialogInternal_.getElement());
- goog.testing.events.fireClickSequence(testLink.parentNode);
- mockCtrl.$verifyAll();
- }
- /**
- * Test that the setTextToDisplayVisible() correctly works.
- * options.
- */
- function testSetTextToDisplayVisible() {
- mockCtrl.$replayAll();
- setUpAnchor('', '', true);
- createAndShow();
- assertNotEquals(
- 'none', goog.style.getStyle(dialog.textToDisplayDiv_, 'display'));
- dialog.setTextToDisplayVisible(false);
- assertEquals(
- 'none', goog.style.getStyle(dialog.textToDisplayDiv_, 'display'));
- dialog.setTextToDisplayVisible(true);
- assertNotEquals(
- 'none', goog.style.getStyle(dialog.textToDisplayDiv_, 'display'));
- mockCtrl.$verifyAll();
- }
- function getDisplayInput() {
- return dialog.dom.getElement(goog.ui.editor.LinkDialog.Id_.TEXT_TO_DISPLAY);
- }
- function getDisplayInputText() {
- return getDisplayInput().value;
- }
- function setDisplayInputText(text) {
- var textInput = getDisplayInput();
- textInput.value = text;
- // Fire event so that dialog behaves like when user types.
- fireInputEvent(textInput, goog.events.KeyCodes.M);
- }
- function getUrlInput() {
- var elt = dialog.dom.getElement(goog.ui.editor.LinkDialog.Id_.ON_WEB_INPUT);
- assertNotNullNorUndefined('UrlInput must be found', elt);
- return elt;
- }
- function getUrlInputText() {
- return getUrlInput().value;
- }
- function setUrlInputText(text) {
- var urlInput = getUrlInput();
- urlInput.value = text;
- // Fire event so that dialog behaves like when user types.
- fireInputEvent(dialog.urlInputHandler_, goog.events.KeyCodes.M);
- }
- function getEmailInput() {
- var elt =
- dialog.dom.getElement(goog.ui.editor.LinkDialog.Id_.EMAIL_ADDRESS_INPUT);
- assertNotNullNorUndefined('EmailInput must be found', elt);
- return elt;
- }
- function getEmailInputText() {
- return getEmailInput().value;
- }
- function setEmailInputText(text) {
- var emailInput = getEmailInput();
- emailInput.value = text;
- // Fire event so that dialog behaves like when user types.
- fireInputEvent(dialog.emailInputHandler_, goog.events.KeyCodes.M);
- }
- function getOpenInNewWindowCheckboxChecked() {
- return dialog.openInNewWindowCheckbox_.checked;
- }
- function setOpenInNewWindowCheckboxChecked(checked) {
- dialog.openInNewWindowCheckbox_.checked = checked;
- }
- function fireInputEvent(input, keyCode) {
- var inputEvent =
- new goog.testing.events.Event(goog.events.EventType.INPUT, input);
- inputEvent.keyCode = keyCode;
- inputEvent.charCode = keyCode;
- goog.testing.events.fireBrowserEvent(inputEvent);
- }
|