diff options
author | Fabio Bas <ctrlaltca@gmail.com> | 2013-09-22 22:39:41 +0200 |
---|---|---|
committer | Fabio Bas <ctrlaltca@gmail.com> | 2013-09-22 22:39:41 +0200 |
commit | 7c65b2f40ea9242260eac5a746863f5925423861 (patch) | |
tree | 6c516057baa4356fde43f8d79517571bc8f0bfa2 /tests | |
parent | 60c6bfa6f7caeb122cb8fa820506bdd1c54a842e (diff) |
Phing: added target for phpunit+selenium
Functional tests were using an old selenium RC version. Ported them to
use phpunit + selenium; next: opensauce
Diffstat (limited to 'tests')
649 files changed, 238 insertions, 27884 deletions
diff --git a/tests/FunctionalTests/active-controls/assets/.gitignore b/tests/FunctionalTests/active-controls/assets/.gitignore index d6b7ef32..d6b7ef32 100644..100755 --- a/tests/FunctionalTests/active-controls/assets/.gitignore +++ b/tests/FunctionalTests/active-controls/assets/.gitignore diff --git a/tests/FunctionalTests/active-controls/index.php b/tests/FunctionalTests/active-controls/index.php index 4d4aeed2..bb7f4822 100644..100755 --- a/tests/FunctionalTests/active-controls/index.php +++ b/tests/FunctionalTests/active-controls/index.php @@ -16,5 +16,3 @@ require_once($frameworkPath); $application=new TApplication; $application->run(); - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/.htaccess b/tests/FunctionalTests/active-controls/protected/.htaccess index 3418e55a..3418e55a 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/.htaccess +++ b/tests/FunctionalTests/active-controls/protected/.htaccess diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveBricksTest.page b/tests/FunctionalTests/active-controls/protected/pages/ActiveBricksTest.page index 7cb8c6b3..7cb8c6b3 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveBricksTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveBricksTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveBricksTest.php b/tests/FunctionalTests/active-controls/protected/pages/ActiveBricksTest.php index c60d4c67..966c8be0 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveBricksTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveBricksTest.php @@ -9,5 +9,4 @@ class ActiveBricksTest extends TPage $this->placeholder->getControls()->add($x); $this->Page->CallbackClient->insertContentAfter($this->AjaxInsertPoint, $x); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveButtonTest.page b/tests/FunctionalTests/active-controls/protected/pages/ActiveButtonTest.page index 2e192c19..2e192c19 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveButtonTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveButtonTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveButtonTest.php b/tests/FunctionalTests/active-controls/protected/pages/ActiveButtonTest.php index 42322ea1..3b2ba60e 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveButtonTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveButtonTest.php @@ -17,5 +17,3 @@ class ActiveButtonTest extends TPage $this->label1->Text .= "using callback!"; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveCheckBoxTest.page b/tests/FunctionalTests/active-controls/protected/pages/ActiveCheckBoxTest.page index 431d42f2..431d42f2 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveCheckBoxTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveCheckBoxTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveCheckBoxTest.php b/tests/FunctionalTests/active-controls/protected/pages/ActiveCheckBoxTest.php index d762ab28..138afac4 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveCheckBoxTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveCheckBoxTest.php @@ -28,5 +28,3 @@ class ActiveCheckBoxTest extends TPage ($sender->checked ? ' Checked ' : ' Not Checked'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveControlExpressionTag.page b/tests/FunctionalTests/active-controls/protected/pages/ActiveControlExpressionTag.page index 7b983cd7..7b983cd7 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveControlExpressionTag.page +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveControlExpressionTag.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveControlExpressionTag.php b/tests/FunctionalTests/active-controls/protected/pages/ActiveControlExpressionTag.php index d0b8650e..12699ace 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveControlExpressionTag.php +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveControlExpressionTag.php @@ -22,5 +22,3 @@ class ActiveControlExpressionTag extends TPage $this->Page->CallbackClient->insertContentAfter('contents', $this->panel2); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveControlWithTinyMce.page b/tests/FunctionalTests/active-controls/protected/pages/ActiveControlWithTinyMce.page index aa3be754..aa3be754 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveControlWithTinyMce.page +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveControlWithTinyMce.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveControlWithTinyMce.php b/tests/FunctionalTests/active-controls/protected/pages/ActiveControlWithTinyMce.php index ec9040a1..6944dbe6 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveControlWithTinyMce.php +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveControlWithTinyMce.php @@ -7,5 +7,3 @@ class ActiveControlWithTinyMce extends TPage $this->label1->Text = $this->text1->SafeText; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveDatePicker.php b/tests/FunctionalTests/active-controls/protected/pages/ActiveDatePicker.php index 300574aa..9baa2a0a 100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveDatePicker.php +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveDatePicker.php @@ -46,5 +46,3 @@ class ActiveDatePicker extends TPage { } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveDropDownList.page b/tests/FunctionalTests/active-controls/protected/pages/ActiveDropDownList.page index dc71a228..dc71a228 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveDropDownList.page +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveDropDownList.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveDropDownList.php b/tests/FunctionalTests/active-controls/protected/pages/ActiveDropDownList.php index c7f0f6b4..413e7185 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveDropDownList.php +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveDropDownList.php @@ -48,5 +48,3 @@ class ActiveDropDownList extends TPage $this->label1->Text = $value; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveHiddenFieldTest.page b/tests/FunctionalTests/active-controls/protected/pages/ActiveHiddenFieldTest.page index f0fc4b92..f0fc4b92 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveHiddenFieldTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveHiddenFieldTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveHiddenFieldTest.php b/tests/FunctionalTests/active-controls/protected/pages/ActiveHiddenFieldTest.php index 1f7a8a2a..a07df4e0 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveHiddenFieldTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveHiddenFieldTest.php @@ -18,5 +18,3 @@ class ActiveHiddenFieldTest extends TPage $this->ResponseLabel->setText($this->HiddenFieldEmpty->getValue().'|'.$this->HiddenFieldUsed->getValue()); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveHyperLinkTest.page b/tests/FunctionalTests/active-controls/protected/pages/ActiveHyperLinkTest.page index 59098052..59098052 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveHyperLinkTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveHyperLinkTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveHyperLinkTest.php b/tests/FunctionalTests/active-controls/protected/pages/ActiveHyperLinkTest.php index cd4880d2..ef3f597e 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveHyperLinkTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveHyperLinkTest.php @@ -22,5 +22,3 @@ class ActiveHyperLinkTest extends TPage $this->link1->NavigateUrl = "http://www.xlab6.com"; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveImageButtonTest.page b/tests/FunctionalTests/active-controls/protected/pages/ActiveImageButtonTest.page index 7696261a..7696261a 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveImageButtonTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveImageButtonTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveImageButtonTest.php b/tests/FunctionalTests/active-controls/protected/pages/ActiveImageButtonTest.php index 44c20ef6..6f3d9b9e 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveImageButtonTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveImageButtonTest.php @@ -27,5 +27,3 @@ class ActiveImageButtonTest extends TPage $this->label1->Text = "Image clicked at x={$param->x}, y={$param->y}"; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveLinkButtonTest.page b/tests/FunctionalTests/active-controls/protected/pages/ActiveLinkButtonTest.page index cb9f0322..cb9f0322 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveLinkButtonTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveLinkButtonTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveLinkButtonTest.php b/tests/FunctionalTests/active-controls/protected/pages/ActiveLinkButtonTest.php index 74ce985c..31748948 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveLinkButtonTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveLinkButtonTest.php @@ -12,5 +12,3 @@ class ActiveLinkButtonTest extends TPage $this->label1->Text .= "using callback!"; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveListBoxMasterTest.page b/tests/FunctionalTests/active-controls/protected/pages/ActiveListBoxMasterTest.page index f7c6baaf..f7c6baaf 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveListBoxMasterTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveListBoxMasterTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveListBoxMasterTest.php b/tests/FunctionalTests/active-controls/protected/pages/ActiveListBoxMasterTest.php index eaa61fd6..4cea263d 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveListBoxMasterTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveListBoxMasterTest.php @@ -43,5 +43,3 @@ class ActiveListBoxMasterTest extends TPage $this->list1->SelectionMode="Single"; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveListBoxTest.page b/tests/FunctionalTests/active-controls/protected/pages/ActiveListBoxTest.page index 318d53c3..318d53c3 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveListBoxTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveListBoxTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveListBoxTest.php b/tests/FunctionalTests/active-controls/protected/pages/ActiveListBoxTest.php index a80dbc1c..219d48c7 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveListBoxTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveListBoxTest.php @@ -43,5 +43,3 @@ class ActiveListBoxTest extends TPage $this->list1->SelectionMode="Single"; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActivePanelTest.page b/tests/FunctionalTests/active-controls/protected/pages/ActivePanelTest.page index 7ab4bab9..7ab4bab9 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActivePanelTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/ActivePanelTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActivePanelTest.php b/tests/FunctionalTests/active-controls/protected/pages/ActivePanelTest.php index b29f8920..61ab7199 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActivePanelTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/ActivePanelTest.php @@ -8,5 +8,3 @@ class ActivePanelTest extends TPage $this->panel1->render($param->NewWriter); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActivePanelVisibleTest.page b/tests/FunctionalTests/active-controls/protected/pages/ActivePanelVisibleTest.page index 0795e46b..0795e46b 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActivePanelVisibleTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/ActivePanelVisibleTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActivePanelVisibleTest.php b/tests/FunctionalTests/active-controls/protected/pages/ActivePanelVisibleTest.php index aaf43abc..19c58aeb 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActivePanelVisibleTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/ActivePanelVisibleTest.php @@ -14,5 +14,3 @@ class ActivePanelVisibleTest extends TPage $this->pnlA->Visible = false; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveRadioButtonListTest.page b/tests/FunctionalTests/active-controls/protected/pages/ActiveRadioButtonListTest.page index 26feb594..26feb594 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveRadioButtonListTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveRadioButtonListTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveRadioButtonListTest.php b/tests/FunctionalTests/active-controls/protected/pages/ActiveRadioButtonListTest.php index 22d2c79c..74113cc8 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveRadioButtonListTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveRadioButtonListTest.php @@ -24,5 +24,3 @@ class ActiveRadioButtonListTest extends TPage $this->list1->setSelectedValue("value 1"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveRadioButtonTest.page b/tests/FunctionalTests/active-controls/protected/pages/ActiveRadioButtonTest.page index 2bb4c9de..2bb4c9de 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveRadioButtonTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveRadioButtonTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveRadioButtonTest.php b/tests/FunctionalTests/active-controls/protected/pages/ActiveRadioButtonTest.php index fce204d1..39fcdb0d 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveRadioButtonTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveRadioButtonTest.php @@ -30,5 +30,3 @@ class ActiveRadioButtonTest extends TPage } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListAllowInputTest.page b/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListAllowInputTest.page index 35fcadc7..35fcadc7 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListAllowInputTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListAllowInputTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListAllowInputTest.php b/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListAllowInputTest.php index 50b9817d..44ce480a 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListAllowInputTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListAllowInputTest.php @@ -23,5 +23,4 @@ class ActiveRatingListAllowInputTest extends TPage{ public function ratingChanged($sender, $param){ $this->Status->setText($sender->getRating().' : '.$sender->getSelectedValue()); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListAutoPostBackTest.page b/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListAutoPostBackTest.page index 84ce4ef3..84ce4ef3 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListAutoPostBackTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListAutoPostBackTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListAutoPostBackTest.php b/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListAutoPostBackTest.php index c094a34b..f7d6e772 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListAutoPostBackTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListAutoPostBackTest.php @@ -23,5 +23,4 @@ class ActiveRatingListAutoPostBackTest extends TPage{ public function ratingChanged($sender, $param){ $this->Status->setText($sender->getRating().' : '.$sender->getSelectedValue()); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListCheckBoxesTest.page b/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListCheckBoxesTest.page index 36f4404d..36f4404d 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListCheckBoxesTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListCheckBoxesTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListCheckBoxesTest.php b/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListCheckBoxesTest.php index 0ba260d4..50ca291b 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListCheckBoxesTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListCheckBoxesTest.php @@ -19,5 +19,4 @@ * * Modifications: */ -class ActiveRatingListCheckBoxesTest extends TPage{ } -?>
\ No newline at end of file +class ActiveRatingListCheckBoxesTest extends TPage{ }
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListEnabledTest.page b/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListEnabledTest.page index 5f732e0d..5f732e0d 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListEnabledTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListEnabledTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListEnabledTest.php b/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListEnabledTest.php index fde87812..addac252 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListEnabledTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListEnabledTest.php @@ -33,5 +33,4 @@ class ActiveRatingListEnabledTest extends TPage{ $this->RatingList->setEnabled(false); $this->Status->setText('Enabled=false'); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListHoverCaptionTest.page b/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListHoverCaptionTest.page index 01e47a34..01e47a34 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListHoverCaptionTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListHoverCaptionTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListHoverCaptionTest.php b/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListHoverCaptionTest.php index c8281256..a4b9b6c2 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListHoverCaptionTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListHoverCaptionTest.php @@ -23,5 +23,4 @@ class ActiveRatingListHoverCaptionTest extends TPage{ public function ratingChanged($sender, $param){ $sender->setCaption($sender->getRating().' : '.$sender->getSelectedValue()); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListRatingTest.page b/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListRatingTest.page index 942a5b45..942a5b45 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListRatingTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListRatingTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListRatingTest.php b/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListRatingTest.php index 97369a8d..b530da02 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListRatingTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListRatingTest.php @@ -28,5 +28,4 @@ class ActiveRatingListRatingTest extends TPage{ $this->RatingList->setRating(3); $this->ratingChanged($this->RatingList, null); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListReadOnlyTest.page b/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListReadOnlyTest.page index dad3fd6e..dad3fd6e 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListReadOnlyTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListReadOnlyTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListReadOnlyTest.php b/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListReadOnlyTest.php index 722f60ea..1e40a3bd 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListReadOnlyTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListReadOnlyTest.php @@ -34,5 +34,4 @@ class ActiveRatingListReadOnlyTest extends TPage{ $this->Status->setText('ReadOnly=false'); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListSelectedIndexTest.page b/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListSelectedIndexTest.page index 6fb52822..6fb52822 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListSelectedIndexTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListSelectedIndexTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListSelectedIndexTest.php b/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListSelectedIndexTest.php index f0d8d2ef..468285cc 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListSelectedIndexTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListSelectedIndexTest.php @@ -28,5 +28,4 @@ class ActiveRatingListSelectedIndexTest extends TPage{ $this->RatingList->setSelectedIndex(5); $this->ratingChanged($this->RatingList, null); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveRedirectionTest.page b/tests/FunctionalTests/active-controls/protected/pages/ActiveRedirectionTest.page index 5f7959c5..5f7959c5 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveRedirectionTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveRedirectionTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveRedirectionTest.php b/tests/FunctionalTests/active-controls/protected/pages/ActiveRedirectionTest.php index a3c714fe..a1516ca4 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveRedirectionTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveRedirectionTest.php @@ -8,5 +8,3 @@ class ActiveRedirectionTest extends TPage $this->Response->redirect($default); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveTextBoxCallback.page b/tests/FunctionalTests/active-controls/protected/pages/ActiveTextBoxCallback.page index b05ce62e..b05ce62e 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveTextBoxCallback.page +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveTextBoxCallback.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveTextBoxCallback.php b/tests/FunctionalTests/active-controls/protected/pages/ActiveTextBoxCallback.php index c3f729e5..85bc7225 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ActiveTextBoxCallback.php +++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveTextBoxCallback.php @@ -7,5 +7,3 @@ class ActiveTextBoxCallback extends TPage $this->label1->Text = 'Label 1: '.$sender->Text; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/AutoCompleteTest.page b/tests/FunctionalTests/active-controls/protected/pages/AutoCompleteTest.page index 477764c3..477764c3 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/AutoCompleteTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/AutoCompleteTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/AutoCompleteTest.php b/tests/FunctionalTests/active-controls/protected/pages/AutoCompleteTest.php index 88fbd760..1a767b79 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/AutoCompleteTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/AutoCompleteTest.php @@ -40,5 +40,3 @@ class AutoCompleteTest extends TPage var_dump($param->selectedIndex); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/Calculator.page b/tests/FunctionalTests/active-controls/protected/pages/Calculator.page index 7a565658..7a565658 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/Calculator.page +++ b/tests/FunctionalTests/active-controls/protected/pages/Calculator.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/Calculator.php b/tests/FunctionalTests/active-controls/protected/pages/Calculator.php index 098a8460..37ba8624 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/Calculator.php +++ b/tests/FunctionalTests/active-controls/protected/pages/Calculator.php @@ -8,5 +8,3 @@ class Calculator extends TPage } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/Callback.page b/tests/FunctionalTests/active-controls/protected/pages/Callback.page index d8744760..d8744760 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/Callback.page +++ b/tests/FunctionalTests/active-controls/protected/pages/Callback.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/Callback.php b/tests/FunctionalTests/active-controls/protected/pages/Callback.php index 00357f1e..8a85f50d 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/Callback.php +++ b/tests/FunctionalTests/active-controls/protected/pages/Callback.php @@ -9,5 +9,3 @@ class Callback extends TPage var_dump("ok!"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/CallbackCustomValidatorTest.page b/tests/FunctionalTests/active-controls/protected/pages/CallbackCustomValidatorTest.page index a99fbf55..a99fbf55 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/CallbackCustomValidatorTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/CallbackCustomValidatorTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/CallbackCustomValidatorTest.php b/tests/FunctionalTests/active-controls/protected/pages/CallbackCustomValidatorTest.php index 319cc354..edae8bf3 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/CallbackCustomValidatorTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/CallbackCustomValidatorTest.php @@ -7,5 +7,3 @@ class CallbackCustomValidatorTest extends TPage $param->IsValid = $param->Value == 'Prado'; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/CallbackOptionsTest.page b/tests/FunctionalTests/active-controls/protected/pages/CallbackOptionsTest.page index 3cecbade..3cecbade 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/CallbackOptionsTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/CallbackOptionsTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/ClientSideDispatch.page b/tests/FunctionalTests/active-controls/protected/pages/ClientSideDispatch.page index acf56bfe..acf56bfe 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ClientSideDispatch.page +++ b/tests/FunctionalTests/active-controls/protected/pages/ClientSideDispatch.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/ClientSideDispatch.php b/tests/FunctionalTests/active-controls/protected/pages/ClientSideDispatch.php index e747bb63..829ce873 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ClientSideDispatch.php +++ b/tests/FunctionalTests/active-controls/protected/pages/ClientSideDispatch.php @@ -13,5 +13,3 @@ class ClientSideDispatch extends TPage $this->status2->Text = "Method 2 callback"; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/ControlAdapterTest.page b/tests/FunctionalTests/active-controls/protected/pages/ControlAdapterTest.page index f0f3044d..f0f3044d 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ControlAdapterTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/ControlAdapterTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/ControlAdapterTest.php b/tests/FunctionalTests/active-controls/protected/pages/ControlAdapterTest.php index edaf0720..01cf442c 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ControlAdapterTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/ControlAdapterTest.php @@ -54,5 +54,3 @@ class ControlAdapterTest extends TPage $this->button2->Attributes['onclick'] = "alert('baz!')"; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/CustomTemplateComponent.php b/tests/FunctionalTests/active-controls/protected/pages/CustomTemplateComponent.php index 8a3e6c9f..375fbd21 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/CustomTemplateComponent.php +++ b/tests/FunctionalTests/active-controls/protected/pages/CustomTemplateComponent.php @@ -7,5 +7,3 @@ class CustomTemplateComponent extends TTemplateControl $sender->setText("Foo"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/CustomTemplateComponent.tpl b/tests/FunctionalTests/active-controls/protected/pages/CustomTemplateComponent.tpl index 04a0476a..04a0476a 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/CustomTemplateComponent.tpl +++ b/tests/FunctionalTests/active-controls/protected/pages/CustomTemplateComponent.tpl diff --git a/tests/FunctionalTests/active-controls/protected/pages/CustomTemplateControlTest.page b/tests/FunctionalTests/active-controls/protected/pages/CustomTemplateControlTest.page index 3bed7d5b..3bed7d5b 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/CustomTemplateControlTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/CustomTemplateControlTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/CustomTemplateControlTest.php b/tests/FunctionalTests/active-controls/protected/pages/CustomTemplateControlTest.php index a1d55adc..752b75b8 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/CustomTemplateControlTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/CustomTemplateControlTest.php @@ -23,5 +23,3 @@ class CustomTemplateControlTest extends TPage } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/CustomValidatorByPass.page b/tests/FunctionalTests/active-controls/protected/pages/CustomValidatorByPass.page index 08b7bb3e..08b7bb3e 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/CustomValidatorByPass.page +++ b/tests/FunctionalTests/active-controls/protected/pages/CustomValidatorByPass.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/CustomValidatorByPass.php b/tests/FunctionalTests/active-controls/protected/pages/CustomValidatorByPass.php index edc68ae4..b7634410 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/CustomValidatorByPass.php +++ b/tests/FunctionalTests/active-controls/protected/pages/CustomValidatorByPass.php @@ -33,5 +33,3 @@ class CustomValidatorByPass extends TPage } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/DMessagesPanel.php b/tests/FunctionalTests/active-controls/protected/pages/DMessagesPanel.php index ce3d1bc0..7949883e 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/DMessagesPanel.php +++ b/tests/FunctionalTests/active-controls/protected/pages/DMessagesPanel.php @@ -59,5 +59,3 @@ class DMessagesPanel extends TTemplateControl $this->Message->CssClass = $value; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/DMessagesPanel.tpl b/tests/FunctionalTests/active-controls/protected/pages/DMessagesPanel.tpl index b7e73119..b7e73119 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/DMessagesPanel.tpl +++ b/tests/FunctionalTests/active-controls/protected/pages/DMessagesPanel.tpl diff --git a/tests/FunctionalTests/active-controls/protected/pages/DatePickerInCallback.page b/tests/FunctionalTests/active-controls/protected/pages/DatePickerInCallback.page index 8b39dc55..8b39dc55 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/DatePickerInCallback.page +++ b/tests/FunctionalTests/active-controls/protected/pages/DatePickerInCallback.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/DatePickerInCallback.php b/tests/FunctionalTests/active-controls/protected/pages/DatePickerInCallback.php index 05fd323e..f04ad281 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/DatePickerInCallback.php +++ b/tests/FunctionalTests/active-controls/protected/pages/DatePickerInCallback.php @@ -13,5 +13,3 @@ class DatePickerInCallback extends TPage { } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/DelayedCallback.page b/tests/FunctionalTests/active-controls/protected/pages/DelayedCallback.page index b8fba648..b8fba648 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/DelayedCallback.page +++ b/tests/FunctionalTests/active-controls/protected/pages/DelayedCallback.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/DelayedCallback.php b/tests/FunctionalTests/active-controls/protected/pages/DelayedCallback.php index 1785bd34..dc0b8b3d 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/DelayedCallback.php +++ b/tests/FunctionalTests/active-controls/protected/pages/DelayedCallback.php @@ -17,5 +17,3 @@ class DelayedCallback extends TPage } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/DisplayStyleTest.page b/tests/FunctionalTests/active-controls/protected/pages/DisplayStyleTest.page index df1db27a..df1db27a 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/DisplayStyleTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/DisplayStyleTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/DisplayStyleTest.php b/tests/FunctionalTests/active-controls/protected/pages/DisplayStyleTest.php index 7c791564..5ed71109 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/DisplayStyleTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/DisplayStyleTest.php @@ -22,5 +22,3 @@ class DisplayStyleTest extends TPage $this->button2->Display="Hidden"; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/DynamicRepeaterDataTest.page b/tests/FunctionalTests/active-controls/protected/pages/DynamicRepeaterDataTest.page index 913f6a17..913f6a17 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/DynamicRepeaterDataTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/DynamicRepeaterDataTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/DynamicRepeaterDataTest.php b/tests/FunctionalTests/active-controls/protected/pages/DynamicRepeaterDataTest.php index 0df32f6a..04cd7960 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/DynamicRepeaterDataTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/DynamicRepeaterDataTest.php @@ -19,5 +19,3 @@ class DynamicRepeaterDataTest extends TPage $item->label1->Text = $sender->Text; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/EventTriggeredCallback.page b/tests/FunctionalTests/active-controls/protected/pages/EventTriggeredCallback.page index 889636f3..889636f3 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/EventTriggeredCallback.page +++ b/tests/FunctionalTests/active-controls/protected/pages/EventTriggeredCallback.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/EventTriggeredCallback.php b/tests/FunctionalTests/active-controls/protected/pages/EventTriggeredCallback.php index bcc53389..bbd30205 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/EventTriggeredCallback.php +++ b/tests/FunctionalTests/active-controls/protected/pages/EventTriggeredCallback.php @@ -17,5 +17,3 @@ class EventTriggeredCallback extends TPage $this->label1->Text = 'button 1 clicked'; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/FeatureList.php b/tests/FunctionalTests/active-controls/protected/pages/FeatureList.php index 8f28f6de..e5fad8d0 100755 --- a/tests/FunctionalTests/active-controls/protected/pages/FeatureList.php +++ b/tests/FunctionalTests/active-controls/protected/pages/FeatureList.php @@ -30,5 +30,3 @@ class FeatureList extends TPage return $list; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/GerTurno2.page b/tests/FunctionalTests/active-controls/protected/pages/GerTurno2.page index f4bf644c..f4bf644c 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/GerTurno2.page +++ b/tests/FunctionalTests/active-controls/protected/pages/GerTurno2.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/GerTurno2.php b/tests/FunctionalTests/active-controls/protected/pages/GerTurno2.php index e2ffbf07..ae996a65 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/GerTurno2.php +++ b/tests/FunctionalTests/active-controls/protected/pages/GerTurno2.php @@ -49,5 +49,3 @@ class GerTurno2 extends TPage { } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/Home.page b/tests/FunctionalTests/active-controls/protected/pages/Home.page index ff226d4e..ff226d4e 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/Home.page +++ b/tests/FunctionalTests/active-controls/protected/pages/Home.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/Home.php b/tests/FunctionalTests/active-controls/protected/pages/Home.php index 3dfb4bb0..0d748dc0 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/Home.php +++ b/tests/FunctionalTests/active-controls/protected/pages/Home.php @@ -7,5 +7,3 @@ class Home extends TPage $this->lblTest->Text = "Testing"; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/InPlaceWithValidator.page b/tests/FunctionalTests/active-controls/protected/pages/InPlaceWithValidator.page index ba3a35db..ba3a35db 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/InPlaceWithValidator.page +++ b/tests/FunctionalTests/active-controls/protected/pages/InPlaceWithValidator.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/InPlaceWithValidator.php b/tests/FunctionalTests/active-controls/protected/pages/InPlaceWithValidator.php index c58a006a..ce8fef2a 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/InPlaceWithValidator.php +++ b/tests/FunctionalTests/active-controls/protected/pages/InPlaceWithValidator.php @@ -9,5 +9,3 @@ class InPlaceWithValidator extends TPage } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/LTemplate.php b/tests/FunctionalTests/active-controls/protected/pages/LTemplate.php index 0a5c311e..f47bbaa4 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/LTemplate.php +++ b/tests/FunctionalTests/active-controls/protected/pages/LTemplate.php @@ -68,5 +68,4 @@ class LTemplate extends TTemplateControl } } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/LTemplate.tpl b/tests/FunctionalTests/active-controls/protected/pages/LTemplate.tpl index fd2bacd1..fd2bacd1 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/LTemplate.tpl +++ b/tests/FunctionalTests/active-controls/protected/pages/LTemplate.tpl diff --git a/tests/FunctionalTests/active-controls/protected/pages/LargePageStateTest.page b/tests/FunctionalTests/active-controls/protected/pages/LargePageStateTest.page index 701bd74c..701bd74c 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/LargePageStateTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/LargePageStateTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/LargePageStateTest.php b/tests/FunctionalTests/active-controls/protected/pages/LargePageStateTest.php index 51e56d48..67e92766 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/LargePageStateTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/LargePageStateTest.php @@ -18,5 +18,3 @@ class LargePageStateTest extends TPage $this->status->Text .= ' Callback Clicked... '; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/LargePageStateTest2.page b/tests/FunctionalTests/active-controls/protected/pages/LargePageStateTest2.page index 0b662617..0b662617 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/LargePageStateTest2.page +++ b/tests/FunctionalTests/active-controls/protected/pages/LargePageStateTest2.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/LargePageStateTest2.php b/tests/FunctionalTests/active-controls/protected/pages/LargePageStateTest2.php index 56f9c68f..00573624 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/LargePageStateTest2.php +++ b/tests/FunctionalTests/active-controls/protected/pages/LargePageStateTest2.php @@ -18,5 +18,3 @@ class LargePageStateTest2 extends TPage $this->status->Text .= ' Callback Clicked... '; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/Master1.php b/tests/FunctionalTests/active-controls/protected/pages/Master1.php index 1bbcb9c4..588c71d5 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/Master1.php +++ b/tests/FunctionalTests/active-controls/protected/pages/Master1.php @@ -3,5 +3,3 @@ class Master1 extends TTemplateControl { } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/Master1.tpl b/tests/FunctionalTests/active-controls/protected/pages/Master1.tpl index 5e63d57d..5e63d57d 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/Master1.tpl +++ b/tests/FunctionalTests/active-controls/protected/pages/Master1.tpl diff --git a/tests/FunctionalTests/active-controls/protected/pages/MasterTest1.page b/tests/FunctionalTests/active-controls/protected/pages/MasterTest1.page index 7f6863cf..7f6863cf 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/MasterTest1.page +++ b/tests/FunctionalTests/active-controls/protected/pages/MasterTest1.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/MessagesPanelTest.page b/tests/FunctionalTests/active-controls/protected/pages/MessagesPanelTest.page index ab4798a8..ab4798a8 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/MessagesPanelTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/MessagesPanelTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/MessagesPanelTest.php b/tests/FunctionalTests/active-controls/protected/pages/MessagesPanelTest.php index d3713308..2f768680 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/MessagesPanelTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/MessagesPanelTest.php @@ -12,5 +12,3 @@ class MessagesPanelTest extends TPage $this->panel1->setMessage(""); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/MyControl.php b/tests/FunctionalTests/active-controls/protected/pages/MyControl.php index 5ced5d3a..e8a38908 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/MyControl.php +++ b/tests/FunctionalTests/active-controls/protected/pages/MyControl.php @@ -4,5 +4,3 @@ class MyControl extends TTemplateControl { } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/MyControl.tpl b/tests/FunctionalTests/active-controls/protected/pages/MyControl.tpl index 5cc17772..5cc17772 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/MyControl.tpl +++ b/tests/FunctionalTests/active-controls/protected/pages/MyControl.tpl diff --git a/tests/FunctionalTests/active-controls/protected/pages/MyTabPanelTest.page b/tests/FunctionalTests/active-controls/protected/pages/MyTabPanelTest.page index 7371086a..7371086a 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/MyTabPanelTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/MyTabPanelTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/MyTabPanelTest.php b/tests/FunctionalTests/active-controls/protected/pages/MyTabPanelTest.php index 6736138d..07411f2a 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/MyTabPanelTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/MyTabPanelTest.php @@ -38,5 +38,3 @@ class MyTabPanelTest extends TPage } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/NestedActiveControls.page b/tests/FunctionalTests/active-controls/protected/pages/NestedActiveControls.page index 9d3a3d61..9d3a3d61 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/NestedActiveControls.page +++ b/tests/FunctionalTests/active-controls/protected/pages/NestedActiveControls.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/NestedActiveControls.php b/tests/FunctionalTests/active-controls/protected/pages/NestedActiveControls.php index 76b77ff7..ba47db39 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/NestedActiveControls.php +++ b/tests/FunctionalTests/active-controls/protected/pages/NestedActiveControls.php @@ -15,5 +15,3 @@ class NestedActiveControls extends TPage $this->label3->Text = "Label 3: Button 1 Clicked"; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/NullStateTest.page b/tests/FunctionalTests/active-controls/protected/pages/NullStateTest.page index 2ce98f5b..2ce98f5b 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/NullStateTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/NullStateTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/NullStateTest.php b/tests/FunctionalTests/active-controls/protected/pages/NullStateTest.php index f6e5071d..1dd41099 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/NullStateTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/NullStateTest.php @@ -7,5 +7,3 @@ class NullStateTest extends TPage $this->lblTest->Text = "Testing"; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/PopulateActiveList.page b/tests/FunctionalTests/active-controls/protected/pages/PopulateActiveList.page index c7bf0952..c7bf0952 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/PopulateActiveList.page +++ b/tests/FunctionalTests/active-controls/protected/pages/PopulateActiveList.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/PopulateActiveList.php b/tests/FunctionalTests/active-controls/protected/pages/PopulateActiveList.php index 8a1ba198..ea6e9f1c 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/PopulateActiveList.php +++ b/tests/FunctionalTests/active-controls/protected/pages/PopulateActiveList.php @@ -30,5 +30,3 @@ class PopulateActiveList extends TPage $this->label1->Text = $sender->ID . ': '.$text; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/PostLoadingTest.page b/tests/FunctionalTests/active-controls/protected/pages/PostLoadingTest.page index 09ab2fbc..09ab2fbc 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/PostLoadingTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/PostLoadingTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/PostLoadingTest.php b/tests/FunctionalTests/active-controls/protected/pages/PostLoadingTest.php index d22f2922..63bce75a 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/PostLoadingTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/PostLoadingTest.php @@ -41,5 +41,3 @@ class PostLoadingTest extends TPage $this->Page->CallbackClient->Highlight('heading'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/RadioButtonListTest.page b/tests/FunctionalTests/active-controls/protected/pages/RadioButtonListTest.page index 7de9c6ab..7de9c6ab 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/RadioButtonListTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/RadioButtonListTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/RadioButtonListTest.php b/tests/FunctionalTests/active-controls/protected/pages/RadioButtonListTest.php index eb77073b..4b687907 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/RadioButtonListTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/RadioButtonListTest.php @@ -24,5 +24,3 @@ class RadioButtonListTest extends TPage } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/RatingList.page b/tests/FunctionalTests/active-controls/protected/pages/RatingList.page index ba9c2e5d..ba9c2e5d 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/RatingList.page +++ b/tests/FunctionalTests/active-controls/protected/pages/RatingList.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/RatingList.php b/tests/FunctionalTests/active-controls/protected/pages/RatingList.php index 8fd879bc..81d59a32 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/RatingList.php +++ b/tests/FunctionalTests/active-controls/protected/pages/RatingList.php @@ -30,5 +30,3 @@ class RatingList extends TPage $this->list1->SelectedIndex=3; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/RepeaterWithActiveControls.page b/tests/FunctionalTests/active-controls/protected/pages/RepeaterWithActiveControls.page index b94fdbfb..b94fdbfb 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/RepeaterWithActiveControls.page +++ b/tests/FunctionalTests/active-controls/protected/pages/RepeaterWithActiveControls.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/RepeaterWithActiveControls.php b/tests/FunctionalTests/active-controls/protected/pages/RepeaterWithActiveControls.php index 013ffe61..c1fbabf3 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/RepeaterWithActiveControls.php +++ b/tests/FunctionalTests/active-controls/protected/pages/RepeaterWithActiveControls.php @@ -57,5 +57,3 @@ class RepeaterWithActiveControls extends TPage } } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/ReplaceContentTest.page b/tests/FunctionalTests/active-controls/protected/pages/ReplaceContentTest.page index 7842cde9..7842cde9 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ReplaceContentTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/ReplaceContentTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/ReplaceContentTest.php b/tests/FunctionalTests/active-controls/protected/pages/ReplaceContentTest.php index a6df2abd..06d8dab4 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ReplaceContentTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/ReplaceContentTest.php @@ -38,5 +38,3 @@ class ReplaceContentTest extends TPage return $this->content->Text; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/Sessioned/PageStateTest.page b/tests/FunctionalTests/active-controls/protected/pages/Sessioned/PageStateTest.page index fdd4a604..fdd4a604 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/Sessioned/PageStateTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/Sessioned/PageStateTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/Sessioned/PageStateTest.php b/tests/FunctionalTests/active-controls/protected/pages/Sessioned/PageStateTest.php index 9d4a7695..f9da46a2 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/Sessioned/PageStateTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/Sessioned/PageStateTest.php @@ -9,5 +9,3 @@ class PageStateTest extends TPage $this->label1->Text = " button1 clicked ".$sender->CustomData." times"; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/Sessioned/config.xml b/tests/FunctionalTests/active-controls/protected/pages/Sessioned/config.xml index 754e9bc5..754e9bc5 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/Sessioned/config.xml +++ b/tests/FunctionalTests/active-controls/protected/pages/Sessioned/config.xml diff --git a/tests/FunctionalTests/active-controls/protected/pages/TActiveCheckBoxListTest.page b/tests/FunctionalTests/active-controls/protected/pages/TActiveCheckBoxListTest.page index f3332bad..f3332bad 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/TActiveCheckBoxListTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/TActiveCheckBoxListTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/TActiveCheckBoxListTest.php b/tests/FunctionalTests/active-controls/protected/pages/TActiveCheckBoxListTest.php index 66bfe83d..6bb78240 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/TActiveCheckBoxListTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/TActiveCheckBoxListTest.php @@ -33,5 +33,3 @@ class TActiveCheckBoxListTest extends TPage $this->list1->setSelectedValues(array('value 2', 'value 5')); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/TActiveFileUploadAutoPostBackTest.php b/tests/FunctionalTests/active-controls/protected/pages/TActiveFileUploadAutoPostBackTest.php index 816a899e..742e7048 100755 --- a/tests/FunctionalTests/active-controls/protected/pages/TActiveFileUploadAutoPostBackTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/TActiveFileUploadAutoPostBackTest.php @@ -28,5 +28,4 @@ class TActiveFileUploadAutoPostBackTest extends TPage{ public function uploadComplete($sender, $param){ $this->label1->setText($sender->getFileName()); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/TInPlaceTextBoxTest.page b/tests/FunctionalTests/active-controls/protected/pages/TInPlaceTextBoxTest.page index 8c0a0d71..8c0a0d71 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/TInPlaceTextBoxTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/TInPlaceTextBoxTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/TInPlaceTextBoxTest.php b/tests/FunctionalTests/active-controls/protected/pages/TInPlaceTextBoxTest.php index 6cc5a500..e773b1b2 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/TInPlaceTextBoxTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/TInPlaceTextBoxTest.php @@ -22,5 +22,3 @@ class TInPlaceTextBoxTest extends TPage throw new TException('Exist'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/TestMasterPage.php b/tests/FunctionalTests/active-controls/protected/pages/TestMasterPage.php index 170e618b..bad9f5bd 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/TestMasterPage.php +++ b/tests/FunctionalTests/active-controls/protected/pages/TestMasterPage.php @@ -3,5 +3,3 @@ class TestMasterPage extends TTemplateControl { } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/TestMasterPage.tpl b/tests/FunctionalTests/active-controls/protected/pages/TestMasterPage.tpl index a599ded4..a599ded4 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/TestMasterPage.tpl +++ b/tests/FunctionalTests/active-controls/protected/pages/TestMasterPage.tpl diff --git a/tests/FunctionalTests/active-controls/protected/pages/TextBoxValidationCallback.page b/tests/FunctionalTests/active-controls/protected/pages/TextBoxValidationCallback.page index 79fc17e0..79fc17e0 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/TextBoxValidationCallback.page +++ b/tests/FunctionalTests/active-controls/protected/pages/TextBoxValidationCallback.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/TextBoxValidationCallback.php b/tests/FunctionalTests/active-controls/protected/pages/TextBoxValidationCallback.php index 1d2cc92f..6aa827f3 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/TextBoxValidationCallback.php +++ b/tests/FunctionalTests/active-controls/protected/pages/TextBoxValidationCallback.php @@ -7,5 +7,4 @@ class TextBoxValidationCallback extends TPage { $this->City->Text = "City: ".$this->Address->Text . ' Zip: '.$this->ZipCode->Text; } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/TimeTriggeredCallbackTest.page b/tests/FunctionalTests/active-controls/protected/pages/TimeTriggeredCallbackTest.page index a285f03d..a285f03d 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/TimeTriggeredCallbackTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/TimeTriggeredCallbackTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/TimeTriggeredCallbackTest.php b/tests/FunctionalTests/active-controls/protected/pages/TimeTriggeredCallbackTest.php index 788857f8..16161a13 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/TimeTriggeredCallbackTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/TimeTriggeredCallbackTest.php @@ -23,5 +23,3 @@ class TimeTriggeredCallbackTest extends TPage $this->label1->Text .= " ".$count; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/ValueTriggerCallbackTest.page b/tests/FunctionalTests/active-controls/protected/pages/ValueTriggerCallbackTest.page index 1281cc5c..1281cc5c 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ValueTriggerCallbackTest.page +++ b/tests/FunctionalTests/active-controls/protected/pages/ValueTriggerCallbackTest.page diff --git a/tests/FunctionalTests/active-controls/protected/pages/ValueTriggerCallbackTest.php b/tests/FunctionalTests/active-controls/protected/pages/ValueTriggerCallbackTest.php index 69985541..229522d1 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/ValueTriggerCallbackTest.php +++ b/tests/FunctionalTests/active-controls/protected/pages/ValueTriggerCallbackTest.php @@ -8,5 +8,3 @@ class ValueTriggerCallbackTest extends TPage $this->label1->Text = "Old = ".$values->OldValue." : New Value = ".$values->NewValue; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/protected/pages/group.gif b/tests/FunctionalTests/active-controls/protected/pages/group.gif Binary files differindex 89c577f7..89c577f7 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/group.gif +++ b/tests/FunctionalTests/active-controls/protected/pages/group.gif diff --git a/tests/FunctionalTests/active-controls/protected/pages/report.gif b/tests/FunctionalTests/active-controls/protected/pages/report.gif Binary files differindex f7169762..f7169762 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/pages/report.gif +++ b/tests/FunctionalTests/active-controls/protected/pages/report.gif diff --git a/tests/FunctionalTests/active-controls/protected/runtime/.gitignore b/tests/FunctionalTests/active-controls/protected/runtime/.gitignore index d6b7ef32..d6b7ef32 100644..100755 --- a/tests/FunctionalTests/active-controls/protected/runtime/.gitignore +++ b/tests/FunctionalTests/active-controls/protected/runtime/.gitignore diff --git a/tests/FunctionalTests/active-controls/tests/ActiveButtonTestCase.php b/tests/FunctionalTests/active-controls/tests/ActiveButtonTestCase.php index a8795de5..c8fcfa57 100644..100755 --- a/tests/FunctionalTests/active-controls/tests/ActiveButtonTestCase.php +++ b/tests/FunctionalTests/active-controls/tests/ActiveButtonTestCase.php @@ -1,6 +1,6 @@ <?php -class ActiveButtonTestCase extends SeleniumTestCase +class ActiveButtonTestCase extends PradoGenericSeleniumTest { function test() { @@ -12,5 +12,3 @@ class ActiveButtonTestCase extends SeleniumTestCase $this->assertText("label1", "Button 1 was clicked using callback!"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/tests/ActiveCheckBoxListTestCase.php b/tests/FunctionalTests/active-controls/tests/ActiveCheckBoxListTestCase.php index 03081f9e..312b8443 100644..100755 --- a/tests/FunctionalTests/active-controls/tests/ActiveCheckBoxListTestCase.php +++ b/tests/FunctionalTests/active-controls/tests/ActiveCheckBoxListTestCase.php @@ -1,12 +1,9 @@ <?php -class ActiveCheckBoxListTestCase extends SeleniumTestCase +class ActiveCheckBoxListTestCase extends PradoGenericSeleniumTest { function test() { - //problem with test runner clicking on radio buttons - $this->skipBrowsers(self::OPERA); - $this->open("active-controls/index.php?page=TActiveCheckBoxListTest"); $this->verifyTextPresent("TActiveCheckBoxList Test Case"); @@ -56,5 +53,3 @@ class ActiveCheckBoxListTestCase extends SeleniumTestCase } } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/tests/ActiveCheckBoxTestCase.php b/tests/FunctionalTests/active-controls/tests/ActiveCheckBoxTestCase.php index ce2ce430..6f235273 100644..100755 --- a/tests/FunctionalTests/active-controls/tests/ActiveCheckBoxTestCase.php +++ b/tests/FunctionalTests/active-controls/tests/ActiveCheckBoxTestCase.php @@ -1,12 +1,9 @@ <?php -class ActiveCheckBoxTestCase extends SeleniumTestCase +class ActiveCheckBoxTestCase extends PradoGenericSeleniumTest { function test() { - //problem with test runner clicking on checkboxes - $this->skipBrowsers(self::OPERA); - $this->open("active-controls/index.php?page=ActiveCheckBoxTest"); $this->verifyTextPresent("Active CheckBox Test"); @@ -60,5 +57,3 @@ class ActiveCheckBoxTestCase extends SeleniumTestCase } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/tests/ActiveControlExpressTagTestCase.php b/tests/FunctionalTests/active-controls/tests/ActiveControlExpressTagTestCase.php index 0cf7d927..75b86e19 100644..100755 --- a/tests/FunctionalTests/active-controls/tests/ActiveControlExpressTagTestCase.php +++ b/tests/FunctionalTests/active-controls/tests/ActiveControlExpressTagTestCase.php @@ -1,6 +1,6 @@ <?php -class ActiveControlExpressionTagTestCase extends SeleniumTestCase +class ActiveControlExpressionTagTestCase extends PradoGenericSeleniumTest { function test() { @@ -16,5 +16,3 @@ class ActiveControlExpressionTagTestCase extends SeleniumTestCase $this->assertText('contents', 'Text box content: Hello world'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/tests/ActiveDatePickerTestCase.php b/tests/FunctionalTests/active-controls/tests/ActiveDatePickerTestCase.php index f5915634..769dd356 100755 --- a/tests/FunctionalTests/active-controls/tests/ActiveDatePickerTestCase.php +++ b/tests/FunctionalTests/active-controls/tests/ActiveDatePickerTestCase.php @@ -1,5 +1,5 @@ <?php -class ActiveDatePickerTestCase extends SeleniumTestCase +class ActiveDatePickerTestCase extends PradoGenericSeleniumTest { function test() { @@ -116,5 +116,3 @@ class ActiveDatePickerTestCase extends SeleniumTestCase $this->verifyText("status3", date('m/Y', $dateToCheck)); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/tests/ActiveDropDownListTestCase.php b/tests/FunctionalTests/active-controls/tests/ActiveDropDownListTestCase.php index 9dd210df..d365c784 100644..100755 --- a/tests/FunctionalTests/active-controls/tests/ActiveDropDownListTestCase.php +++ b/tests/FunctionalTests/active-controls/tests/ActiveDropDownListTestCase.php @@ -1,6 +1,6 @@ <?php -class ActiveDropDownListTestCase extends SeleniumTestCase +class ActiveDropDownListTestCase extends PradoGenericSeleniumTest { function test() { @@ -43,5 +43,3 @@ class ActiveDropDownListTestCase extends SeleniumTestCase } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/tests/ActiveHiddenFieldTestCase.php b/tests/FunctionalTests/active-controls/tests/ActiveHiddenFieldTestCase.php index 259a6516..b8c02868 100644..100755 --- a/tests/FunctionalTests/active-controls/tests/ActiveHiddenFieldTestCase.php +++ b/tests/FunctionalTests/active-controls/tests/ActiveHiddenFieldTestCase.php @@ -1,6 +1,6 @@ <?php -class ActiveHiddenFieldTestCase extends SeleniumTestCase +class ActiveHiddenFieldTestCase extends PradoGenericSeleniumTest { function test() { @@ -20,5 +20,3 @@ class ActiveHiddenFieldTestCase extends SeleniumTestCase $this->assertText('ResponseLabel', $fieldEmpty.'|'.$fieldUsed); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/tests/ActiveHyperLinkTestCase.php b/tests/FunctionalTests/active-controls/tests/ActiveHyperLinkTestCase.php index 6707a442..bfcdd206 100644..100755 --- a/tests/FunctionalTests/active-controls/tests/ActiveHyperLinkTestCase.php +++ b/tests/FunctionalTests/active-controls/tests/ActiveHyperLinkTestCase.php @@ -1,6 +1,6 @@ <?php -class ActiveHyperLinkTestCase extends SeleniumTestCase +class ActiveHyperLinkTestCase extends PradoGenericSeleniumTest { function test() { @@ -14,5 +14,3 @@ class ActiveHyperLinkTestCase extends SeleniumTestCase $this->assertText("link1", "Pradosoft.com"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/tests/ActiveImageButtonTestCase.php b/tests/FunctionalTests/active-controls/tests/ActiveImageButtonTestCase.php index 477f7fea..2989ab27 100644..100755 --- a/tests/FunctionalTests/active-controls/tests/ActiveImageButtonTestCase.php +++ b/tests/FunctionalTests/active-controls/tests/ActiveImageButtonTestCase.php @@ -1,6 +1,6 @@ <?php -class ActiveImageButtonTestCase extends SeleniumTestCase +class ActiveImageButtonTestCase extends PradoGenericSeleniumTest { function test() { @@ -13,5 +13,3 @@ class ActiveImageButtonTestCase extends SeleniumTestCase $this->assertTextPresent("regexp:Image clicked at x=\d+, y=\d+"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/tests/ActiveLinkButtonTestCase.php b/tests/FunctionalTests/active-controls/tests/ActiveLinkButtonTestCase.php index 7024acd2..88cdf15e 100644..100755 --- a/tests/FunctionalTests/active-controls/tests/ActiveLinkButtonTestCase.php +++ b/tests/FunctionalTests/active-controls/tests/ActiveLinkButtonTestCase.php @@ -1,6 +1,6 @@ <?php -class ActiveLinkButtonTestCase extends SeleniumTestCase +class ActiveLinkButtonTestCase extends PradoGenericSeleniumTest { function test() { @@ -12,5 +12,3 @@ class ActiveLinkButtonTestCase extends SeleniumTestCase $this->assertText("label1", "Button 1 was clicked using callback!"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/tests/ActiveListBoxMasterTestCase.php b/tests/FunctionalTests/active-controls/tests/ActiveListBoxMasterTestCase.php index 116dd4ad..555d9b25 100644..100755 --- a/tests/FunctionalTests/active-controls/tests/ActiveListBoxMasterTestCase.php +++ b/tests/FunctionalTests/active-controls/tests/ActiveListBoxMasterTestCase.php @@ -1,6 +1,6 @@ <?php -class ActiveListBoxMasterTestCase extends SeleniumTestCase +class ActiveListBoxMasterTestCase extends PradoGenericSeleniumTest { function test() { @@ -45,5 +45,4 @@ class ActiveListBoxMasterTestCase extends SeleniumTestCase $this->pause(800); $this->assertText($base.'label1', 'Selection: value 1, value 4'); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/tests/ActiveListBoxTestCase.php b/tests/FunctionalTests/active-controls/tests/ActiveListBoxTestCase.php index 78dbd77e..9976211b 100644..100755 --- a/tests/FunctionalTests/active-controls/tests/ActiveListBoxTestCase.php +++ b/tests/FunctionalTests/active-controls/tests/ActiveListBoxTestCase.php @@ -1,6 +1,6 @@ <?php -class ActiveListBoxTestCase extends SeleniumTestCase +class ActiveListBoxTestCase extends PradoGenericSeleniumTest { function test() { @@ -43,5 +43,4 @@ class ActiveListBoxTestCase extends SeleniumTestCase $this->pause(800); $this->assertText('label1', 'Selection: value 1, value 4'); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/tests/ActivePanelTestCase.php b/tests/FunctionalTests/active-controls/tests/ActivePanelTestCase.php index 4c8fd3c6..9b069a14 100644..100755 --- a/tests/FunctionalTests/active-controls/tests/ActivePanelTestCase.php +++ b/tests/FunctionalTests/active-controls/tests/ActivePanelTestCase.php @@ -1,6 +1,6 @@ <?php -class ActivePanelTestCase extends SeleniumTestCase +class ActivePanelTestCase extends PradoGenericSeleniumTest { function test() { @@ -12,5 +12,3 @@ class ActivePanelTestCase extends SeleniumTestCase $this->assertTextPresent("Something lalala"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/tests/ActiveRadioButtonListTestCase.php b/tests/FunctionalTests/active-controls/tests/ActiveRadioButtonListTestCase.php index 45078830..b0942ffa 100644..100755 --- a/tests/FunctionalTests/active-controls/tests/ActiveRadioButtonListTestCase.php +++ b/tests/FunctionalTests/active-controls/tests/ActiveRadioButtonListTestCase.php @@ -1,12 +1,9 @@ <?php -class ActiveRadioButtonListTestCase extends SeleniumTestCase +class ActiveRadioButtonListTestCase extends PradoGenericSeleniumTest { function test() { - //problem with test runner clicking on radio buttons - $this->skipBrowsers(self::OPERA); - $this->open("active-controls/index.php?page=ActiveRadioButtonListTest"); $this->verifyTextPresent("TActiveRadioButtonList Test Case"); @@ -46,5 +43,3 @@ class ActiveRadioButtonListTestCase extends SeleniumTestCase } } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/tests/ActiveRadioButtonTestCase.php b/tests/FunctionalTests/active-controls/tests/ActiveRadioButtonTestCase.php index 2991da9b..fceb2e21 100644..100755 --- a/tests/FunctionalTests/active-controls/tests/ActiveRadioButtonTestCase.php +++ b/tests/FunctionalTests/active-controls/tests/ActiveRadioButtonTestCase.php @@ -1,12 +1,9 @@ <?php -class ActiveRadioButtonTestCase extends SeleniumTestCase +class ActiveRadioButtonTestCase extends PradoGenericSeleniumTest { function test() { - //problem with test runner clicking on radio buttons - $this->skipBrowsers(self::OPERA); - $this->open("active-controls/index.php?page=ActiveRadioButtonTest"); $this->verifyTextPresent("Active Radio Button Test"); $this->assertText('label1', 'Label 1'); @@ -53,5 +50,4 @@ class ActiveRadioButtonTestCase extends SeleniumTestCase } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/tests/AutoCompleteTestCase.php b/tests/FunctionalTests/active-controls/tests/AutoCompleteTestCase.php index 08ffe453..063e3d08 100644..100755 --- a/tests/FunctionalTests/active-controls/tests/AutoCompleteTestCase.php +++ b/tests/FunctionalTests/active-controls/tests/AutoCompleteTestCase.php @@ -1,11 +1,10 @@ <?php -class AutoCompleteTestCase extends SeleniumTestCase +class AutoCompleteTestCase extends PradoGenericSeleniumTest { function test() { $this->disabled(); - $this->skipBrowsers(self::INTERNET_EXPLORER); $this->open("active-controls/index.php?page=AutoCompleteTest"); $this->verifyTextPresent("TAutoComplete Test"); @@ -45,5 +44,3 @@ class AutoCompleteTestCase extends SeleniumTestCase $this->assertText("label1", "Label 1: Cuba,Mexico"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/tests/CalculatorTestCase.php b/tests/FunctionalTests/active-controls/tests/CalculatorTestCase.php index 2fb28224..1a6347f9 100644..100755 --- a/tests/FunctionalTests/active-controls/tests/CalculatorTestCase.php +++ b/tests/FunctionalTests/active-controls/tests/CalculatorTestCase.php @@ -1,6 +1,6 @@ <?php -class CalculatorTestCase extends SeleniumTestCase +class CalculatorTestCase extends PradoGenericSeleniumTest { function test() { @@ -20,5 +20,3 @@ class CalculatorTestCase extends SeleniumTestCase $this->assertValue("c", "7"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/tests/CallbackAdapterTestCase.php b/tests/FunctionalTests/active-controls/tests/CallbackAdapterTestCase.php index c733a7fd..76d8b9af 100644..100755 --- a/tests/FunctionalTests/active-controls/tests/CallbackAdapterTestCase.php +++ b/tests/FunctionalTests/active-controls/tests/CallbackAdapterTestCase.php @@ -1,10 +1,9 @@ <?php -class CallbackAdapterTestCase extends SeleniumTestCase +class CallbackAdapterTestCase extends PradoGenericSeleniumTest { function test() { - $this->skipBrowsers(self::INTERNET_EXPLORER); $this->open("active-controls/index.php?page=ControlAdapterTest"); $this->assertTextPresent('Control Adapter - State Tracking Tests'); @@ -32,8 +31,6 @@ class CallbackAdapterTestCase extends SeleniumTestCase function testIE() { - $this->targetBrowsers(self::INTERNET_EXPLORER); - $this->open("active-controls/index.php?page=ControlAdapterTest"); $this->assertTextPresent('Control Adapter - State Tracking Tests'); @@ -58,5 +55,3 @@ class CallbackAdapterTestCase extends SeleniumTestCase $this->assertAlert('ok'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/tests/CallbackOptionsTestCase.php b/tests/FunctionalTests/active-controls/tests/CallbackOptionsTestCase.php index 39fa5ec9..d1f48cf3 100644..100755 --- a/tests/FunctionalTests/active-controls/tests/CallbackOptionsTestCase.php +++ b/tests/FunctionalTests/active-controls/tests/CallbackOptionsTestCase.php @@ -1,6 +1,6 @@ <?php -class CallbackOptionsTestCase extends SeleniumTestCase +class CallbackOptionsTestCase extends PradoGenericSeleniumTest { function test() { @@ -30,5 +30,3 @@ class CallbackOptionsTestCase extends SeleniumTestCase $this->assertText("label3", "Button 3 has returned"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/tests/CustomTemplateTestCase.php b/tests/FunctionalTests/active-controls/tests/CustomTemplateTestCase.php index 59bc2e93..7e38423e 100644..100755 --- a/tests/FunctionalTests/active-controls/tests/CustomTemplateTestCase.php +++ b/tests/FunctionalTests/active-controls/tests/CustomTemplateTestCase.php @@ -1,6 +1,6 @@ <?php -class CustomTemplateTestCase extends SeleniumTestCase +class CustomTemplateTestCase extends PradoGenericSeleniumTest { function test() { @@ -18,5 +18,3 @@ class CustomTemplateTestCase extends SeleniumTestCase $this->assertText('label1', 'Button 1 was clicked Foo Bar! using callback!... and this is the textbox text: Foo Bar!'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/tests/DelayedCallbackTestCase.php b/tests/FunctionalTests/active-controls/tests/DelayedCallbackTestCase.php index c5367612..841de5aa 100644..100755 --- a/tests/FunctionalTests/active-controls/tests/DelayedCallbackTestCase.php +++ b/tests/FunctionalTests/active-controls/tests/DelayedCallbackTestCase.php @@ -1,6 +1,6 @@ <?php -class DelayedCallbackTestCase extends SeleniumTestCase +class DelayedCallbackTestCase extends PradoGenericSeleniumTest { function test() { @@ -18,5 +18,3 @@ class DelayedCallbackTestCase extends SeleniumTestCase } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/tests/EventTriggerTestCase.php b/tests/FunctionalTests/active-controls/tests/EventTriggerTestCase.php index dc10bd28..30678786 100644..100755 --- a/tests/FunctionalTests/active-controls/tests/EventTriggerTestCase.php +++ b/tests/FunctionalTests/active-controls/tests/EventTriggerTestCase.php @@ -1,6 +1,6 @@ <?php -class EventTriggerTestCase extends SeleniumTestCase +class EventTriggerTestCase extends PradoGenericSeleniumTest { function test() { @@ -18,5 +18,3 @@ class EventTriggerTestCase extends SeleniumTestCase $this->assertText('label1', 'text 1 focused'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/tests/NestedActiveControlsTestCase.php b/tests/FunctionalTests/active-controls/tests/NestedActiveControlsTestCase.php index f19773ff..e2ceb33e 100644..100755 --- a/tests/FunctionalTests/active-controls/tests/NestedActiveControlsTestCase.php +++ b/tests/FunctionalTests/active-controls/tests/NestedActiveControlsTestCase.php @@ -1,6 +1,6 @@ <?php -class NestedActiveControlsTestCase extends SeleniumTestCase +class NestedActiveControlsTestCase extends PradoGenericSeleniumTest { function test() { @@ -22,5 +22,3 @@ class NestedActiveControlsTestCase extends SeleniumTestCase $this->assertText("label3", "Label 3: Button 1 Clicked"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/tests/PopulateListTestCase.php b/tests/FunctionalTests/active-controls/tests/PopulateListTestCase.php index 25a6fde5..adb5a3a5 100644..100755 --- a/tests/FunctionalTests/active-controls/tests/PopulateListTestCase.php +++ b/tests/FunctionalTests/active-controls/tests/PopulateListTestCase.php @@ -1,6 +1,6 @@ <?php -class PopulateListTestCase extends SeleniumTestCase +class PopulateListTestCase extends PradoGenericSeleniumTest { function test() { @@ -21,5 +21,3 @@ class PopulateListTestCase extends SeleniumTestCase $this->assertText("label1", "list2: Prado"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/tests/PostLoadingTestCase.php b/tests/FunctionalTests/active-controls/tests/PostLoadingTestCase.php index 0fa95b4d..21a5128d 100644..100755 --- a/tests/FunctionalTests/active-controls/tests/PostLoadingTestCase.php +++ b/tests/FunctionalTests/active-controls/tests/PostLoadingTestCase.php @@ -1,6 +1,6 @@ <?php -class PostLoadingTestCase extends SeleniumTestCase +class PostLoadingTestCase extends PradoGenericSeleniumTest { function test() { @@ -18,5 +18,3 @@ class PostLoadingTestCase extends SeleniumTestCase $this->assertTextPresent('Result is Hello World'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/tests/ReplaceContentTestCase.php b/tests/FunctionalTests/active-controls/tests/ReplaceContentTestCase.php index 910b1063..fc1d2c28 100644..100755 --- a/tests/FunctionalTests/active-controls/tests/ReplaceContentTestCase.php +++ b/tests/FunctionalTests/active-controls/tests/ReplaceContentTestCase.php @@ -1,10 +1,9 @@ <?php -class ReplaceContentTestCase extends SeleniumTestCase +class ReplaceContentTestCase extends PradoGenericSeleniumTest { function test() { - $this->skipBrowsers(self::INTERNET_EXPLORER); $this->open('active-controls/index.php?page=ReplaceContentTest'); $this->assertTextPresent('Callback Replace Content Test'); @@ -48,8 +47,6 @@ class ReplaceContentTestCase extends SeleniumTestCase function testIE() { - $this->targetBrowsers(self::INTERNET_EXPLORER); - $this->open('active-controls/index.php?page=ReplaceContentTest'); $this->assertTextPresent('Callback Replace Content Test'); @@ -91,5 +88,3 @@ class ReplaceContentTestCase extends SeleniumTestCase } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/tests/TextBoxCallbackTestCase.php b/tests/FunctionalTests/active-controls/tests/TextBoxCallbackTestCase.php index 6e5a06be..14d575fe 100644..100755 --- a/tests/FunctionalTests/active-controls/tests/TextBoxCallbackTestCase.php +++ b/tests/FunctionalTests/active-controls/tests/TextBoxCallbackTestCase.php @@ -1,6 +1,6 @@ <?php -class TextBoxCallbackTestCase extends SeleniumTestCase +class TextBoxCallbackTestCase extends PradoGenericSeleniumTest { function test() { @@ -13,5 +13,3 @@ class TextBoxCallbackTestCase extends SeleniumTestCase $this->assertText("label1", "Label 1: hello!"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/tests/TextBoxGroupValidationTestCase.php b/tests/FunctionalTests/active-controls/tests/TextBoxGroupValidationTestCase.php index 0fa0c982..ffc1ac72 100644..100755 --- a/tests/FunctionalTests/active-controls/tests/TextBoxGroupValidationTestCase.php +++ b/tests/FunctionalTests/active-controls/tests/TextBoxGroupValidationTestCase.php @@ -1,6 +1,6 @@ <?php -class TextBoxGroupValidationTestCase extends SeleniumTestCase +class TextBoxGroupValidationTestCase extends PradoGenericSeleniumTest { function test() { @@ -20,5 +20,3 @@ class TextBoxGroupValidationTestCase extends SeleniumTestCase $this->assertValue('City', 'City: Sydney Zip: 2000'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/tests/TimeTriggeredCallbackTestCase.php b/tests/FunctionalTests/active-controls/tests/TimeTriggeredCallbackTestCase.php index 675e3311..de0ecad8 100644..100755 --- a/tests/FunctionalTests/active-controls/tests/TimeTriggeredCallbackTestCase.php +++ b/tests/FunctionalTests/active-controls/tests/TimeTriggeredCallbackTestCase.php @@ -1,6 +1,6 @@ <?php -class TimeTriggeredCallbackTestCase extends SeleniumTestCase +class TimeTriggeredCallbackTestCase extends PradoGenericSeleniumTest { function test() { @@ -17,5 +17,3 @@ class TimeTriggeredCallbackTestCase extends SeleniumTestCase } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controls/tests/ValueTriggerCallbackTestCase.php b/tests/FunctionalTests/active-controls/tests/ValueTriggerCallbackTestCase.php index 5d2e954c..5113cc92 100644..100755 --- a/tests/FunctionalTests/active-controls/tests/ValueTriggerCallbackTestCase.php +++ b/tests/FunctionalTests/active-controls/tests/ValueTriggerCallbackTestCase.php @@ -1,6 +1,6 @@ <?php -class ValueTriggerTestCase extends SeleniumTestCase +class ValueTriggerTestCase extends PradoGenericSeleniumTest { function test() { @@ -18,5 +18,3 @@ class ValueTriggerTestCase extends SeleniumTestCase $this->assertText('label1', 'Old = test : New Value = more'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/active-controlstests/ActiveRatingListTestCase.php b/tests/FunctionalTests/active-controlstests/ActiveRatingListTestCase.php index 921543cd..8034d6b2 100644..100755 --- a/tests/FunctionalTests/active-controlstests/ActiveRatingListTestCase.php +++ b/tests/FunctionalTests/active-controlstests/ActiveRatingListTestCase.php @@ -19,7 +19,7 @@ * * Modifications: */ -class ActiveRatingListTestCase extends SeleniumTestCase +class ActiveRatingListTestCase extends PradoGenericSeleniumTest { function testCheckBoxes() { @@ -249,5 +249,4 @@ class ActiveRatingListTestCase extends SeleniumTestCase $this->assertNotChecked("{$clientID}_c{$i}"); } } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/active.php b/tests/FunctionalTests/active.php deleted file mode 100755 index f8776c2e..00000000 --- a/tests/FunctionalTests/active.php +++ /dev/null @@ -1,8 +0,0 @@ -<?php - -require('../test_tools/functional_tests.php'); - -$tester=new PradoFunctionalTester(dirname(__FILE__).'/active-controls/tests'); -$tester->run(new SimpleReporter()); - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/features.php b/tests/FunctionalTests/features.php deleted file mode 100644 index 9005db14..00000000 --- a/tests/FunctionalTests/features.php +++ /dev/null @@ -1,8 +0,0 @@ -<?php - -require('../test_tools/functional_tests.php'); - -$tester=new PradoFunctionalTester(dirname(__FILE__).'/features/tests'); -$tester->run(new SimpleReporter()); - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/features/assets/.gitignore b/tests/FunctionalTests/features/assets/.gitignore index d6b7ef32..d6b7ef32 100644..100755 --- a/tests/FunctionalTests/features/assets/.gitignore +++ b/tests/FunctionalTests/features/assets/.gitignore diff --git a/tests/FunctionalTests/features/index.php b/tests/FunctionalTests/features/index.php index fe127639..77ddf367 100644..100755 --- a/tests/FunctionalTests/features/index.php +++ b/tests/FunctionalTests/features/index.php @@ -4,5 +4,3 @@ require_once(dirname(__FILE__).'/../../../framework/prado.php'); $app=new TApplication; $app->run(); - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/features/protected/application.xml b/tests/FunctionalTests/features/protected/application.xml index 9153f3f7..9153f3f7 100644..100755 --- a/tests/FunctionalTests/features/protected/application.xml +++ b/tests/FunctionalTests/features/protected/application.xml diff --git a/tests/FunctionalTests/features/protected/controls/LabeledTextBox.tpl b/tests/FunctionalTests/features/protected/controls/LabeledTextBox.tpl index 276d03b2..276d03b2 100644..100755 --- a/tests/FunctionalTests/features/protected/controls/LabeledTextBox.tpl +++ b/tests/FunctionalTests/features/protected/controls/LabeledTextBox.tpl diff --git a/tests/FunctionalTests/features/protected/controls/LabeledTextbox.php b/tests/FunctionalTests/features/protected/controls/LabeledTextbox.php index ef36863b..6a95407d 100644..100755 --- a/tests/FunctionalTests/features/protected/controls/LabeledTextbox.php +++ b/tests/FunctionalTests/features/protected/controls/LabeledTextbox.php @@ -22,4 +22,3 @@ class LabeledTextBox extends TTemplateControl } } -?> diff --git a/tests/FunctionalTests/features/protected/controls/Layout.php b/tests/FunctionalTests/features/protected/controls/Layout.php index f60a9a18..0ac4d6b3 100644..100755 --- a/tests/FunctionalTests/features/protected/controls/Layout.php +++ b/tests/FunctionalTests/features/protected/controls/Layout.php @@ -4,5 +4,3 @@ class Layout extends TTemplateControl { } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/features/protected/controls/Layout.tpl b/tests/FunctionalTests/features/protected/controls/Layout.tpl index dbd433b8..dbd433b8 100644..100755 --- a/tests/FunctionalTests/features/protected/controls/Layout.tpl +++ b/tests/FunctionalTests/features/protected/controls/Layout.tpl diff --git a/tests/FunctionalTests/features/protected/pages/ActiveControls/ActiveControl.page b/tests/FunctionalTests/features/protected/pages/ActiveControls/ActiveControl.page index 9f17d4ed..9f17d4ed 100644..100755 --- a/tests/FunctionalTests/features/protected/pages/ActiveControls/ActiveControl.page +++ b/tests/FunctionalTests/features/protected/pages/ActiveControls/ActiveControl.page diff --git a/tests/FunctionalTests/features/protected/pages/ActiveControls/ActiveControl.php b/tests/FunctionalTests/features/protected/pages/ActiveControls/ActiveControl.php index 322f4db7..d33ee43b 100644..100755 --- a/tests/FunctionalTests/features/protected/pages/ActiveControls/ActiveControl.php +++ b/tests/FunctionalTests/features/protected/pages/ActiveControls/ActiveControl.php @@ -40,4 +40,3 @@ class ActiveControl extends TPage return self::$_colors[rand(0,count(self::$_colors)-1)]; } } -?> diff --git a/tests/FunctionalTests/features/protected/pages/ActiveControls/AutoComplete.page b/tests/FunctionalTests/features/protected/pages/ActiveControls/AutoComplete.page index b98874cb..b98874cb 100644..100755 --- a/tests/FunctionalTests/features/protected/pages/ActiveControls/AutoComplete.page +++ b/tests/FunctionalTests/features/protected/pages/ActiveControls/AutoComplete.page diff --git a/tests/FunctionalTests/features/protected/pages/ActiveControls/AutoComplete.php b/tests/FunctionalTests/features/protected/pages/ActiveControls/AutoComplete.php index ac08e4ed..c13cda9b 100644..100755 --- a/tests/FunctionalTests/features/protected/pages/ActiveControls/AutoComplete.php +++ b/tests/FunctionalTests/features/protected/pages/ActiveControls/AutoComplete.php @@ -30,5 +30,3 @@ class AutoComplete extends TPage return $list; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/features/protected/pages/ActiveControls/Calculator.page b/tests/FunctionalTests/features/protected/pages/ActiveControls/Calculator.page index f0021299..f0021299 100644..100755 --- a/tests/FunctionalTests/features/protected/pages/ActiveControls/Calculator.page +++ b/tests/FunctionalTests/features/protected/pages/ActiveControls/Calculator.page diff --git a/tests/FunctionalTests/features/protected/pages/ActiveControls/Calculator.php b/tests/FunctionalTests/features/protected/pages/ActiveControls/Calculator.php index 7afd1d59..86cb3e9b 100644..100755 --- a/tests/FunctionalTests/features/protected/pages/ActiveControls/Calculator.php +++ b/tests/FunctionalTests/features/protected/pages/ActiveControls/Calculator.php @@ -11,5 +11,3 @@ class Calculator extends TPage $this->c->Text = floatval($this->a->Text) + floatval($this->b->Text); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/features/protected/pages/ActiveControls/Calculator2.page b/tests/FunctionalTests/features/protected/pages/ActiveControls/Calculator2.page index ca141c60..ca141c60 100644..100755 --- a/tests/FunctionalTests/features/protected/pages/ActiveControls/Calculator2.page +++ b/tests/FunctionalTests/features/protected/pages/ActiveControls/Calculator2.page diff --git a/tests/FunctionalTests/features/protected/pages/ActiveControls/Calculator2.php b/tests/FunctionalTests/features/protected/pages/ActiveControls/Calculator2.php index 3789a3f9..8d184cb9 100644..100755 --- a/tests/FunctionalTests/features/protected/pages/ActiveControls/Calculator2.php +++ b/tests/FunctionalTests/features/protected/pages/ActiveControls/Calculator2.php @@ -16,5 +16,3 @@ class Calculator2 extends TPage $this->panel1->renderControl($param->Output); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/features/protected/pages/ActiveControls/VisibleUpdate.page b/tests/FunctionalTests/features/protected/pages/ActiveControls/VisibleUpdate.page index a8cb3c27..a8cb3c27 100644..100755 --- a/tests/FunctionalTests/features/protected/pages/ActiveControls/VisibleUpdate.page +++ b/tests/FunctionalTests/features/protected/pages/ActiveControls/VisibleUpdate.page diff --git a/tests/FunctionalTests/features/protected/pages/ActiveControls/VisibleUpdate.php b/tests/FunctionalTests/features/protected/pages/ActiveControls/VisibleUpdate.php index 1b1d0cbc..e01e1c0a 100644..100755 --- a/tests/FunctionalTests/features/protected/pages/ActiveControls/VisibleUpdate.php +++ b/tests/FunctionalTests/features/protected/pages/ActiveControls/VisibleUpdate.php @@ -32,5 +32,3 @@ class VisibleUpdate extends TPage " and Button 2 was ".($this->button2->Enabled ? 'enabled' : 'disabled'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/features/protected/pages/ActiveControls/config.xml b/tests/FunctionalTests/features/protected/pages/ActiveControls/config.xml index 37988c44..37988c44 100644..100755 --- a/tests/FunctionalTests/features/protected/pages/ActiveControls/config.xml +++ b/tests/FunctionalTests/features/protected/pages/ActiveControls/config.xml diff --git a/tests/FunctionalTests/features/protected/pages/ClientScripts.page b/tests/FunctionalTests/features/protected/pages/ClientScripts.page index 18aca48b..18aca48b 100644..100755 --- a/tests/FunctionalTests/features/protected/pages/ClientScripts.page +++ b/tests/FunctionalTests/features/protected/pages/ClientScripts.page diff --git a/tests/FunctionalTests/features/protected/pages/ColorPicker.page b/tests/FunctionalTests/features/protected/pages/ColorPicker.page index 3d8c46db..3d8c46db 100644..100755 --- a/tests/FunctionalTests/features/protected/pages/ColorPicker.page +++ b/tests/FunctionalTests/features/protected/pages/ColorPicker.page diff --git a/tests/FunctionalTests/features/protected/pages/FeatureList.page b/tests/FunctionalTests/features/protected/pages/FeatureList.page index ef25ccb9..ef25ccb9 100644..100755 --- a/tests/FunctionalTests/features/protected/pages/FeatureList.page +++ b/tests/FunctionalTests/features/protected/pages/FeatureList.page diff --git a/tests/FunctionalTests/features/protected/pages/FeatureList.php b/tests/FunctionalTests/features/protected/pages/FeatureList.php index 8f28f6de..e5fad8d0 100644..100755 --- a/tests/FunctionalTests/features/protected/pages/FeatureList.php +++ b/tests/FunctionalTests/features/protected/pages/FeatureList.php @@ -30,5 +30,3 @@ class FeatureList extends TPage return $list; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/features/protected/pages/FocusControl.page b/tests/FunctionalTests/features/protected/pages/FocusControl.page index af414c3a..af414c3a 100644..100755 --- a/tests/FunctionalTests/features/protected/pages/FocusControl.page +++ b/tests/FunctionalTests/features/protected/pages/FocusControl.page diff --git a/tests/FunctionalTests/features/protected/pages/FocusControl.php b/tests/FunctionalTests/features/protected/pages/FocusControl.php index e534a92a..ef57a25b 100644..100755 --- a/tests/FunctionalTests/features/protected/pages/FocusControl.php +++ b/tests/FunctionalTests/features/protected/pages/FocusControl.php @@ -13,5 +13,3 @@ class FocusControl extends TPage } } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/features/protected/pages/I18N/BasicI18N.page b/tests/FunctionalTests/features/protected/pages/I18N/BasicI18N.page index e13eecf2..e13eecf2 100644..100755 --- a/tests/FunctionalTests/features/protected/pages/I18N/BasicI18N.page +++ b/tests/FunctionalTests/features/protected/pages/I18N/BasicI18N.page diff --git a/tests/FunctionalTests/features/protected/pages/I18N/BasicI18N.php b/tests/FunctionalTests/features/protected/pages/I18N/BasicI18N.php index 929e2f17..d4a98e26 100644..100755 --- a/tests/FunctionalTests/features/protected/pages/I18N/BasicI18N.php +++ b/tests/FunctionalTests/features/protected/pages/I18N/BasicI18N.php @@ -22,7 +22,7 @@ class BasicI18N extends TPage * @version $Revision: 1.66 $ $Date: ${DATE} ${TIME} $ * @package ${package} *//* -class BasicI18NTestCase extends SeleniumTestCase +class BasicI18NTestCase extends PradoGenericSeleniumTest { function setup() { @@ -41,5 +41,4 @@ class BasicI18NTestCase extends SeleniumTestCase $this->verifyTextPresent("Many things.", ""); } } -*/ -?>
\ No newline at end of file +*/
\ No newline at end of file diff --git a/tests/FunctionalTests/features/protected/pages/I18N/Home.page b/tests/FunctionalTests/features/protected/pages/I18N/Home.page index 9a49e3a2..9a49e3a2 100644..100755 --- a/tests/FunctionalTests/features/protected/pages/I18N/Home.page +++ b/tests/FunctionalTests/features/protected/pages/I18N/Home.page diff --git a/tests/FunctionalTests/features/protected/pages/I18N/Home.zh_CN.page b/tests/FunctionalTests/features/protected/pages/I18N/Home.zh_CN.page index 1b931cc2..1b931cc2 100644..100755 --- a/tests/FunctionalTests/features/protected/pages/I18N/Home.zh_CN.page +++ b/tests/FunctionalTests/features/protected/pages/I18N/Home.zh_CN.page diff --git a/tests/FunctionalTests/features/protected/pages/I18N/config.xml b/tests/FunctionalTests/features/protected/pages/I18N/config.xml index 25e26ac5..25e26ac5 100644..100755 --- a/tests/FunctionalTests/features/protected/pages/I18N/config.xml +++ b/tests/FunctionalTests/features/protected/pages/I18N/config.xml diff --git a/tests/FunctionalTests/features/protected/pages/I18N/messages/.gitignore b/tests/FunctionalTests/features/protected/pages/I18N/messages/.gitignore index e69de29b..e69de29b 100644..100755 --- a/tests/FunctionalTests/features/protected/pages/I18N/messages/.gitignore +++ b/tests/FunctionalTests/features/protected/pages/I18N/messages/.gitignore diff --git a/tests/FunctionalTests/features/protected/pages/MyJavascriptLib.php b/tests/FunctionalTests/features/protected/pages/MyJavascriptLib.php index 72e6061e..a3c4d5e4 100644..100755 --- a/tests/FunctionalTests/features/protected/pages/MyJavascriptLib.php +++ b/tests/FunctionalTests/features/protected/pages/MyJavascriptLib.php @@ -28,5 +28,3 @@ class MyJavascriptLib extends TComponent $this->_manager->registerScriptFile($url,$url); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/features/protected/pages/RatingList.page b/tests/FunctionalTests/features/protected/pages/RatingList.page index 909180c7..909180c7 100644..100755 --- a/tests/FunctionalTests/features/protected/pages/RatingList.page +++ b/tests/FunctionalTests/features/protected/pages/RatingList.page diff --git a/tests/FunctionalTests/features/protected/pages/TestComp.php b/tests/FunctionalTests/features/protected/pages/TestComp.php index 0358357a..b70a4911 100644..100755 --- a/tests/FunctionalTests/features/protected/pages/TestComp.php +++ b/tests/FunctionalTests/features/protected/pages/TestComp.php @@ -16,5 +16,3 @@ class TestComp extends TControl MyJavascriptLib::registerPackage($this,$this->_class); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/features/protected/pages/ValidatorEffects.page b/tests/FunctionalTests/features/protected/pages/ValidatorEffects.page index 78c66365..78c66365 100644..100755 --- a/tests/FunctionalTests/features/protected/pages/ValidatorEffects.page +++ b/tests/FunctionalTests/features/protected/pages/ValidatorEffects.page diff --git a/tests/FunctionalTests/features/protected/pages/myscripts/packages.php b/tests/FunctionalTests/features/protected/pages/myscripts/packages.php index e39199f9..a5666551 100644..100755 --- a/tests/FunctionalTests/features/protected/pages/myscripts/packages.php +++ b/tests/FunctionalTests/features/protected/pages/myscripts/packages.php @@ -6,5 +6,3 @@ $deps['test'] = array('test'); $deps['test2'] = array('test'); return array($packages,$deps); - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/features/protected/runtime/.gitignore b/tests/FunctionalTests/features/protected/runtime/.gitignore index d6b7ef32..d6b7ef32 100644..100755 --- a/tests/FunctionalTests/features/protected/runtime/.gitignore +++ b/tests/FunctionalTests/features/protected/runtime/.gitignore diff --git a/tests/FunctionalTests/features/tests/MyTestCase.php b/tests/FunctionalTests/features/tests/MyTestCase.php index 43a4762d..92b0886a 100644..100755 --- a/tests/FunctionalTests/features/tests/MyTestCase.php +++ b/tests/FunctionalTests/features/tests/MyTestCase.php @@ -1,19 +1,10 @@ <?php -class MyTestCase extends SeleniumTestCase +class MyTestCase extends PradoGenericSeleniumTest { function test1() { $this->open('http://127.0.0.1'); $this->assertTextNotPresent('asd'); } - - function test2() - { - $this->skipBrowsers(self::FIREFOX); - $this->open('http://127.0.0.1'); - $this->assertTextNotPresent('asd'); - } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/index.php b/tests/FunctionalTests/index.php deleted file mode 100644 index 128e80e3..00000000 --- a/tests/FunctionalTests/index.php +++ /dev/null @@ -1,17 +0,0 @@ -<html> -<head> -<title> -Prado Functional Test Suites -</title> -</head> -<body> -<h1>Prado Functional Test Suites</h1> -<ul> - <li><a href="quickstart.php">Tests of QuickStart Tutorial Demo</a></li> - <li><a href="validators.php">Tests of Validators</a> (<a href="validators/index.php">list of test samples</a>)</li> - <li><a href="active.php">Tests of Active Controls</a> (<a href="active-controls/index.php">list of test samples</a>) </li> - <li><a href="tickets.php">Tests of Trac Tickets and Goggle Code Issues</a> (<a href="tickets/index.php">list of Test Samples</a>)</li> - <li><a href="features.php">Tests of New Features</a> (<a href="features/index.php">list of new features</a>)</li> -</ul> -</body> -</html> diff --git a/tests/FunctionalTests/quickstart.php b/tests/FunctionalTests/quickstart.php deleted file mode 100755 index 3493a907..00000000 --- a/tests/FunctionalTests/quickstart.php +++ /dev/null @@ -1,8 +0,0 @@ -<?php - -require('../test_tools/functional_tests.php'); - -$tester=new PradoFunctionalTester(dirname(__FILE__).'/quickstart'); -$tester->run(new SimpleReporter()); - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/ActiveControls/ActiveButtonTestCase.php b/tests/FunctionalTests/quickstart/ActiveControls/ActiveButtonTestCase.php index 408776f3..03861440 100644..100755 --- a/tests/FunctionalTests/quickstart/ActiveControls/ActiveButtonTestCase.php +++ b/tests/FunctionalTests/quickstart/ActiveControls/ActiveButtonTestCase.php @@ -1,6 +1,6 @@ <?php //$Id: ActiveButtonTestCase.php 3187 2012-07-12 11:21:01Z ctrlaltca $ -class ActiveButtonTestCase extends SeleniumTestCase +class QuickstartActiveButtonTestCase extends PradoGenericSeleniumTest { function test () { @@ -34,5 +34,3 @@ class ActiveButtonTestCase extends SeleniumTestCase $this->verifyElementPresent("//input[@type='submit' and @value=\"I'm clicked using callback\"]", ""); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/ActiveControls/ActiveCheckBoxTestCase.php b/tests/FunctionalTests/quickstart/ActiveControls/ActiveCheckBoxTestCase.php index 15a3c798..4f210608 100644..100755 --- a/tests/FunctionalTests/quickstart/ActiveControls/ActiveCheckBoxTestCase.php +++ b/tests/FunctionalTests/quickstart/ActiveControls/ActiveCheckBoxTestCase.php @@ -1,7 +1,7 @@ <?php //$Id: ActiveCheckBoxTestCase.php 3187 2012-07-12 11:21:01Z ctrlaltca $ -class ActiveCheckBoxTestCase extends SeleniumTestCase +class QuickstartActiveCheckBoxTestCase extends PradoGenericSeleniumTest { function test () { @@ -54,5 +54,3 @@ class ActiveCheckBoxTestCase extends SeleniumTestCase $this->assertChecked("//input[@name='ctl0\$body\$CheckBox2']"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/ActiveControls/ActiveCustomValidatorTestCase.php b/tests/FunctionalTests/quickstart/ActiveControls/ActiveCustomValidatorTestCase.php index 4b81e872..967842b0 100644..100755 --- a/tests/FunctionalTests/quickstart/ActiveControls/ActiveCustomValidatorTestCase.php +++ b/tests/FunctionalTests/quickstart/ActiveControls/ActiveCustomValidatorTestCase.php @@ -1,6 +1,6 @@ <?php //$Id: ActiveButtonTestCase.php 1405 2006-09-10 01:03:56Z wei $ -class ActiveCustomValidatorTestCase extends SeleniumTestCase +class QuickstartActiveCustomValidatorTestCase extends PradoGenericSeleniumTest { function test () { @@ -30,5 +30,3 @@ class ActiveCustomValidatorTestCase extends SeleniumTestCase $this->assertNotVisible($base.'validator1'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Advanced/I18N.php b/tests/FunctionalTests/quickstart/Advanced/I18N.php index fb8aa710..726501ce 100644..100755 --- a/tests/FunctionalTests/quickstart/Advanced/I18N.php +++ b/tests/FunctionalTests/quickstart/Advanced/I18N.php @@ -1,7 +1,7 @@ <?php //New Test -class I18NTestCase extends SeleniumTestCase +class QuickstartI18NTestCase extends PradoGenericSeleniumTest { function test () { @@ -50,5 +50,3 @@ class I18NTestCase extends SeleniumTestCase } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/BulletedListTestCase.php b/tests/FunctionalTests/quickstart/Controls/BulletedListTestCase.php index e1987e38..0b272428 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/BulletedListTestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/BulletedListTestCase.php @@ -1,6 +1,6 @@ <?php -class BulletedListTestCase extends SeleniumTestCase +class QuickstartBulletedListTestCase extends PradoGenericSeleniumTest { function test() { @@ -34,5 +34,3 @@ class BulletedListTestCase extends SeleniumTestCase $this->verifyTextPresent("You clicked amazon : http://www.amazon.com/.", ""); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/ButtonTestCase.php b/tests/FunctionalTests/quickstart/Controls/ButtonTestCase.php index ca079c14..ad84e1d0 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/ButtonTestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/ButtonTestCase.php @@ -1,6 +1,6 @@ <?php -class ButtonTestCase extends SeleniumTestCase +class QuickstartButtonTestCase extends PradoGenericSeleniumTest { function test () { @@ -31,5 +31,3 @@ class ButtonTestCase extends SeleniumTestCase $this->verifyNotVisible('ctl0_body_ctl3'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/CheckBoxListTestCase.php b/tests/FunctionalTests/quickstart/Controls/CheckBoxListTestCase.php index 01db9da7..242bc815 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/CheckBoxListTestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/CheckBoxListTestCase.php @@ -1,7 +1,7 @@ <?php //New Test -class CheckBoxListTestCase extends SeleniumTestCase +class QuickstartCheckBoxListTestCase extends PradoGenericSeleniumTest { function test () { @@ -50,5 +50,3 @@ class CheckBoxListTestCase extends SeleniumTestCase $this->verifyNotVisible('ctl0_body_ctl8'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/CheckBoxTestCase.php b/tests/FunctionalTests/quickstart/Controls/CheckBoxTestCase.php index 4cd71bd4..57b50dd9 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/CheckBoxTestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/CheckBoxTestCase.php @@ -1,6 +1,6 @@ <?php -class CheckBoxTestCase extends SeleniumTestCase +class QuickstartCheckBoxTestCase extends PradoGenericSeleniumTest { function test () { @@ -51,5 +51,3 @@ class CheckBoxTestCase extends SeleniumTestCase // $this->verifyNotVisible('ctl0_body_ctl7'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/DataGrid1TestCase.php b/tests/FunctionalTests/quickstart/Controls/DataGrid1TestCase.php index 9eea13b8..57ee92ae 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/DataGrid1TestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/DataGrid1TestCase.php @@ -1,6 +1,6 @@ <?php -class DataGrid1TestCase extends SeleniumTestCase +class QuickstartDataGrid1TestCase extends PradoGenericSeleniumTest { function test() { @@ -27,5 +27,3 @@ class DataGrid1TestCase extends SeleniumTestCase $this->verifyAttribute("ctl0_body_DataGrid@cellpadding","2"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/DataGrid2TestCase.php b/tests/FunctionalTests/quickstart/Controls/DataGrid2TestCase.php index 6573125a..0473d6d5 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/DataGrid2TestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/DataGrid2TestCase.php @@ -1,6 +1,6 @@ <?php -class DataGrid2TestCase extends SeleniumTestCase +class QuickstartDataGrid2TestCase extends PradoGenericSeleniumTest { function test() { @@ -47,5 +47,3 @@ class DataGrid2TestCase extends SeleniumTestCase $this->verifyTextPresent('Head First Design Patterns',''); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/DataGrid3TestCase.php b/tests/FunctionalTests/quickstart/Controls/DataGrid3TestCase.php index d342c791..47762d7d 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/DataGrid3TestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/DataGrid3TestCase.php @@ -1,6 +1,6 @@ <?php -class DataGrid3TestCase extends SeleniumTestCase +class QuickstartDataGrid3TestCase extends PradoGenericSeleniumTest { function test() { @@ -48,5 +48,3 @@ class DataGrid3TestCase extends SeleniumTestCase $this->verifyTextPresent("Extreme Programming Explained : Embrace Change",''); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/DataGrid4TestCase.php b/tests/FunctionalTests/quickstart/Controls/DataGrid4TestCase.php index 0e554dea..9a212dd8 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/DataGrid4TestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/DataGrid4TestCase.php @@ -1,6 +1,6 @@ <?php -class DataGrid4TestCase extends SeleniumTestCase +class QuickstartDataGrid4TestCase extends PradoGenericSeleniumTest { function test() { @@ -26,5 +26,3 @@ class DataGrid4TestCase extends SeleniumTestCase $this->verifyAttribute('ctl0_body_DataGrid_ctl4_ctl5@checked','regexp:false|null'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/DataGrid5TestCase.php b/tests/FunctionalTests/quickstart/Controls/DataGrid5TestCase.php index c602ddf1..f854d44c 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/DataGrid5TestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/DataGrid5TestCase.php @@ -1,6 +1,6 @@ <?php -class DataGrid5TestCase extends SeleniumTestCase +class QuickstartDataGrid5TestCase extends PradoGenericSeleniumTest { function test() { @@ -111,5 +111,3 @@ class DataGrid5TestCase extends SeleniumTestCase $this->verifyTextNotPresent('ITN018',''); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/DataGrid6TestCase.php b/tests/FunctionalTests/quickstart/Controls/DataGrid6TestCase.php index 1bf00aff..c6fba20f 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/DataGrid6TestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/DataGrid6TestCase.php @@ -1,6 +1,6 @@ <?php -class DataGrid6TestCase extends SeleniumTestCase +class QuickstartDataGrid6TestCase extends PradoGenericSeleniumTest { function test() { @@ -46,5 +46,3 @@ class DataGrid6TestCase extends SeleniumTestCase $this->verifyTextNotPresent('ITN006',''); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/DataList1TestCase.php b/tests/FunctionalTests/quickstart/Controls/DataList1TestCase.php index 4a42bf7b..4ff6478a 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/DataList1TestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/DataList1TestCase.php @@ -1,6 +1,6 @@ <?php -class DataList1TestCase extends SeleniumTestCase +class QuickstartDataList1TestCase extends PradoGenericSeleniumTest { function test() { @@ -22,5 +22,3 @@ class DataList1TestCase extends SeleniumTestCase $this->verifyElementPresent("//td[@align='right']"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/DataList2TestCase.php b/tests/FunctionalTests/quickstart/Controls/DataList2TestCase.php index 4d91e409..4fb3743e 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/DataList2TestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/DataList2TestCase.php @@ -1,6 +1,6 @@ <?php -class DataList2TestCase extends SeleniumTestCase +class QuickstartDataList2TestCase extends PradoGenericSeleniumTest { function test() { @@ -57,5 +57,3 @@ class DataList2TestCase extends SeleniumTestCase $this->verifyTextPresent("Monitor ", ""); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/DropDownListTestCase.php b/tests/FunctionalTests/quickstart/Controls/DropDownListTestCase.php index ebd0b5e7..e374de1d 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/DropDownListTestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/DropDownListTestCase.php @@ -1,6 +1,6 @@ <?php -class DropDownListTestCase extends SeleniumTestCase +class QuickstartDropDownListTestCase extends PradoGenericSeleniumTest { function test () { @@ -63,5 +63,3 @@ class DropDownListTestCase extends SeleniumTestCase $this->verifyNotVisible('ctl0_body_ctl8'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/ExpressionTestCase.php b/tests/FunctionalTests/quickstart/Controls/ExpressionTestCase.php index b474518d..4d47fecd 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/ExpressionTestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/ExpressionTestCase.php @@ -1,6 +1,6 @@ <?php -class ExpressionTestCase extends SeleniumTestCase +class QuickstartExpressionTestCase extends PradoGenericSeleniumTest { function test () { @@ -11,5 +11,3 @@ class ExpressionTestCase extends SeleniumTestCase $this->verifyTextPresent('PRADO QuickStart Sample'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/HtmlAreaTestCase.php b/tests/FunctionalTests/quickstart/Controls/HtmlAreaTestCase.php index 82d3ad24..caa7a893 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/HtmlAreaTestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/HtmlAreaTestCase.php @@ -1,6 +1,6 @@ <?php -class HtmlAreaTestCase extends SeleniumTestCase +class QuickstartHtmlAreaTestCase extends PradoGenericSeleniumTest { function test () { @@ -11,5 +11,3 @@ class HtmlAreaTestCase extends SeleniumTestCase // can't perform any test } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/HyperLinkTestCase.php b/tests/FunctionalTests/quickstart/Controls/HyperLinkTestCase.php index 3b48e961..dc0261e7 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/HyperLinkTestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/HyperLinkTestCase.php @@ -1,6 +1,6 @@ <?php -class HyperLinkTestCase extends SeleniumTestCase +class QuickstartHyperLinkTestCase extends PradoGenericSeleniumTest { function test () { @@ -13,5 +13,3 @@ class HyperLinkTestCase extends SeleniumTestCase $this->verifyElementPresent("//a[contains(text(),'Body contents')]"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/ImageButtonTestCase.php b/tests/FunctionalTests/quickstart/Controls/ImageButtonTestCase.php index 32568e59..bf531d72 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/ImageButtonTestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/ImageButtonTestCase.php @@ -1,6 +1,6 @@ <?php -class ImageButtonTestCase extends SeleniumTestCase +class QuickstartImageButtonTestCase extends PradoGenericSeleniumTest { function test () { @@ -26,5 +26,3 @@ class ImageButtonTestCase extends SeleniumTestCase $this->verifyNotVisible('ctl0_body_ctl2'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/ImageTestCase.php b/tests/FunctionalTests/quickstart/Controls/ImageTestCase.php index f203f6aa..19e80470 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/ImageTestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/ImageTestCase.php @@ -1,7 +1,7 @@ <?php //New Test -class ImageTestCase extends SeleniumTestCase +class QuickstartImageTestCase extends PradoGenericSeleniumTest { function test () { @@ -16,5 +16,3 @@ class ImageTestCase extends SeleniumTestCase //$this->verifyElementPresent("//img[contains(@src,'/hello_world.gif') and contains(@longdesc,'HelloWorld.html')]"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/LabelTestCase.php b/tests/FunctionalTests/quickstart/Controls/LabelTestCase.php index a2a02ff5..03bba8ed 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/LabelTestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/LabelTestCase.php @@ -1,7 +1,7 @@ <?php //New Test -class LabelTestCase extends SeleniumTestCase +class QuickstartLabelTestCase extends PradoGenericSeleniumTest { function test () { @@ -19,5 +19,3 @@ class LabelTestCase extends SeleniumTestCase $this->type("ctl0\$body\$test", "test"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/LinkButtonTestCase.php b/tests/FunctionalTests/quickstart/Controls/LinkButtonTestCase.php index 1f33ba07..57e7b975 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/LinkButtonTestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/LinkButtonTestCase.php @@ -1,6 +1,6 @@ <?php -class LinkButtonTestCase extends SeleniumTestCase +class QuickstartLinkButtonTestCase extends PradoGenericSeleniumTest { function test () { @@ -30,5 +30,3 @@ class LinkButtonTestCase extends SeleniumTestCase $this->verifyNotVisible('ctl0_body_ctl4'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/ListBoxTestCase.php b/tests/FunctionalTests/quickstart/Controls/ListBoxTestCase.php index dcd048b5..bb1a8be0 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/ListBoxTestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/ListBoxTestCase.php @@ -1,7 +1,7 @@ <?php //New Test -class ListBoxTestCase extends SeleniumTestCase +class QuickstartListBoxTestCase extends PradoGenericSeleniumTest { function test () { @@ -80,5 +80,3 @@ class ListBoxTestCase extends SeleniumTestCase $this->verifyNotVisible('ctl0_body_ctl12'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/MultiViewTestCase.php b/tests/FunctionalTests/quickstart/Controls/MultiViewTestCase.php index 080af26d..4a31a0be 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/MultiViewTestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/MultiViewTestCase.php @@ -1,6 +1,6 @@ <?php -class MultiViewTestCase extends SeleniumTestCase +class QuickstartMultiViewTestCase extends PradoGenericSeleniumTest { function test () { @@ -35,5 +35,3 @@ class MultiViewTestCase extends SeleniumTestCase $this->verifySelected('ctl0$body$DropDownList', "label=Blue"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/PagerTestCase.php b/tests/FunctionalTests/quickstart/Controls/PagerTestCase.php index fac4160f..9ffbdcf6 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/PagerTestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/PagerTestCase.php @@ -1,6 +1,6 @@ <?php -class PagerTestCase extends SeleniumTestCase +class QuickstartPagerTestCase extends PradoGenericSeleniumTest { function test() { @@ -54,5 +54,3 @@ class PagerTestCase extends SeleniumTestCase $this->verifyTextNotPresent('ITN018',''); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/PanelTestCase.php b/tests/FunctionalTests/quickstart/Controls/PanelTestCase.php index 8d1e28fb..3def308b 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/PanelTestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/PanelTestCase.php @@ -1,6 +1,6 @@ <?php -class PanelTestCase extends SeleniumTestCase +class QuickstartPanelTestCase extends PradoGenericSeleniumTest { function test () { @@ -14,5 +14,3 @@ class PanelTestCase extends SeleniumTestCase $this->verifyTextPresent("You have clicked on 'button2'."); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/RadioButtonListTestCase.php b/tests/FunctionalTests/quickstart/Controls/RadioButtonListTestCase.php index 6c179a24..659f20ff 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/RadioButtonListTestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/RadioButtonListTestCase.php @@ -1,7 +1,7 @@ <?php //New Test -class RadioButtonListTestCase extends SeleniumTestCase +class QuickstartRadioButtonListTestCase extends PradoGenericSeleniumTest { function test () { @@ -50,5 +50,3 @@ class RadioButtonListTestCase extends SeleniumTestCase $this->verifyNotVisible('ctl0_body_ctl8'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/RadioButtonTestCase.php b/tests/FunctionalTests/quickstart/Controls/RadioButtonTestCase.php index 644d1c29..86a4bf86 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/RadioButtonTestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/RadioButtonTestCase.php @@ -1,6 +1,6 @@ <?php -class RadioButtonTestCase extends SeleniumTestCase +class QuickstartRadioButtonTestCase extends PradoGenericSeleniumTest { function test () { @@ -54,5 +54,3 @@ class RadioButtonTestCase extends SeleniumTestCase $this->verifyTextPresent("Your selection is 34"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/Repeater1TestCase.php b/tests/FunctionalTests/quickstart/Controls/Repeater1TestCase.php index b2d51118..948055e1 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/Repeater1TestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/Repeater1TestCase.php @@ -1,6 +1,6 @@ <?php -class Repeater1TestCase extends SeleniumTestCase +class QuickstartRepeater1TestCase extends PradoGenericSeleniumTest { function test() { @@ -25,5 +25,3 @@ class Repeater1TestCase extends SeleniumTestCase $this->verifyElementPresent("//table[@cellpadding='2']"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/Repeater2TestCase.php b/tests/FunctionalTests/quickstart/Controls/Repeater2TestCase.php index b592a135..7d989fd0 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/Repeater2TestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/Repeater2TestCase.php @@ -1,6 +1,6 @@ <?php -class Repeater2TestCase extends SeleniumTestCase +class QuickstartRepeater2TestCase extends PradoGenericSeleniumTest { function test() { @@ -33,5 +33,3 @@ class Repeater2TestCase extends SeleniumTestCase $this->verifyElementPresent("//tr[@id='ctl0_body_Repeater_ctl4_Repeater2_ctl2_Row']",""); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/Repeater3TestCase.php b/tests/FunctionalTests/quickstart/Controls/Repeater3TestCase.php index e1922ffd..a5031af5 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/Repeater3TestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/Repeater3TestCase.php @@ -1,6 +1,6 @@ <?php -class Repeater3TestCase extends SeleniumTestCase +class QuickstartRepeater3TestCase extends PradoGenericSeleniumTest { function test() { @@ -33,5 +33,3 @@ class Repeater3TestCase extends SeleniumTestCase $this->verifyElementPresent("//td[text()='99.01']",''); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/StatementsTestCase.php b/tests/FunctionalTests/quickstart/Controls/StatementsTestCase.php index b8f322d7..a7c4c579 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/StatementsTestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/StatementsTestCase.php @@ -1,6 +1,6 @@ <?php -class StatementsTestCase extends SeleniumTestCase +class QuickstartStatementsTestCase extends PradoGenericSeleniumTest { function test () { @@ -11,5 +11,3 @@ class StatementsTestCase extends SeleniumTestCase $this->verifyTextPresent('UniqueID is \'ctl0$body$ctl0\''); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/TabPanelTestCase.php b/tests/FunctionalTests/quickstart/Controls/TabPanelTestCase.php index 66417eda..d01e824d 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/TabPanelTestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/TabPanelTestCase.php @@ -1,6 +1,6 @@ <?php -class TabPanelTestCase extends SeleniumTestCase +class QuickstartTabPanelTestCase extends PradoGenericSeleniumTest { function test () { @@ -45,5 +45,3 @@ class TabPanelTestCase extends SeleniumTestCase $this->verifyVisible('ctl0_body_ctl2'); // view 3 } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/TableTestCase.php b/tests/FunctionalTests/quickstart/Controls/TableTestCase.php index 7ea6fc39..128f4b22 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/TableTestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/TableTestCase.php @@ -1,6 +1,6 @@ <?php -class TableTestCase extends SeleniumTestCase +class QuickstartTableTestCase extends PradoGenericSeleniumTest { function test () { @@ -16,5 +16,3 @@ class TableTestCase extends SeleniumTestCase $this->verifyElementPresent("//td[text()='Cell 1']"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/TextBoxTestCase.php b/tests/FunctionalTests/quickstart/Controls/TextBoxTestCase.php index 7bf46351..b17f9e9b 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/TextBoxTestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/TextBoxTestCase.php @@ -1,6 +1,6 @@ <?php -class TextBoxTestCase extends SeleniumTestCase +class QuickstartTextBoxTestCase extends PradoGenericSeleniumTest { function test () { @@ -89,5 +89,3 @@ End of message $this->verifyNotVisible('ctl0_body_ctl15'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/Wizard1TestCase.php b/tests/FunctionalTests/quickstart/Controls/Wizard1TestCase.php index 474529a6..5e7018c4 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/Wizard1TestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/Wizard1TestCase.php @@ -1,6 +1,6 @@ <?php -class Wizard1TestCase extends SeleniumTestCase +class QuickstartWizard1TestCase extends PradoGenericSeleniumTest { function test () { @@ -22,5 +22,3 @@ class Wizard1TestCase extends SeleniumTestCase $this->verifyTextPresent('Wizard Step 2'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/Wizard2TestCase.php b/tests/FunctionalTests/quickstart/Controls/Wizard2TestCase.php index 3c49bfd8..a77280ff 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/Wizard2TestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/Wizard2TestCase.php @@ -1,6 +1,6 @@ <?php -class Wizard2TestCase extends SeleniumTestCase +class QuickstartWizard2TestCase extends PradoGenericSeleniumTest { function test () { @@ -22,5 +22,3 @@ class Wizard2TestCase extends SeleniumTestCase $this->verifyTextPresent('Thank you for your answer'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/Wizard3TestCase.php b/tests/FunctionalTests/quickstart/Controls/Wizard3TestCase.php index 04224bb4..ec0efe90 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/Wizard3TestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/Wizard3TestCase.php @@ -1,6 +1,6 @@ <?php -class Wizard3TestCase extends SeleniumTestCase +class QuickstartWizard3TestCase extends PradoGenericSeleniumTest { function test () { @@ -42,5 +42,3 @@ class Wizard3TestCase extends SeleniumTestCase $this->verifyTextPresent('Your favorite sport is: Baseball'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/Wizard4TestCase.php b/tests/FunctionalTests/quickstart/Controls/Wizard4TestCase.php index b2d757dc..3cbf1bd3 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/Wizard4TestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/Wizard4TestCase.php @@ -1,6 +1,6 @@ <?php -class Wizard4TestCase extends SeleniumTestCase +class QuickstartWizard4TestCase extends PradoGenericSeleniumTest { function test () { @@ -40,5 +40,3 @@ class Wizard4TestCase extends SeleniumTestCase $this->verifyTextPresent('Step 3 of 3'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Controls/Wizard5TestCase.php b/tests/FunctionalTests/quickstart/Controls/Wizard5TestCase.php index 631167b9..debd8d43 100644..100755 --- a/tests/FunctionalTests/quickstart/Controls/Wizard5TestCase.php +++ b/tests/FunctionalTests/quickstart/Controls/Wizard5TestCase.php @@ -1,6 +1,6 @@ <?php -class Wizard5TestCase extends SeleniumTestCase +class QuickstartWizard5TestCase extends PradoGenericSeleniumTest { function test () { @@ -33,5 +33,3 @@ class Wizard5TestCase extends SeleniumTestCase $this->verifyTextPresent('Your favorite sport is: Football'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/quickstart/Fundamentals/HangmanTestCase.php b/tests/FunctionalTests/quickstart/Fundamentals/HangmanTestCase.php index 8803e352..3d531b47 100644..100755 --- a/tests/FunctionalTests/quickstart/Fundamentals/HangmanTestCase.php +++ b/tests/FunctionalTests/quickstart/Fundamentals/HangmanTestCase.php @@ -1,6 +1,6 @@ <?php -class HangmanTestCase extends SeleniumTestCase +class QuickstartHangmanTestCase extends PradoGenericSeleniumTest { function test () { @@ -30,5 +30,3 @@ class HangmanTestCase extends SeleniumTestCase $this->verifyTextPresent("maximum of 5", ""); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/selenium.css b/tests/FunctionalTests/selenium.css deleted file mode 100644 index e69de29b..00000000 --- a/tests/FunctionalTests/selenium.css +++ /dev/null diff --git a/tests/FunctionalTests/tickets.php b/tests/FunctionalTests/tickets.php deleted file mode 100644 index ef8b52d6..00000000 --- a/tests/FunctionalTests/tickets.php +++ /dev/null @@ -1,8 +0,0 @@ -<?php - -require('../test_tools/functional_tests.php'); - -$tester=new PradoFunctionalTester(dirname(__FILE__).'/tickets/tests'); -$tester->run(new SimpleReporter()); - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/assets/.gitignore b/tests/FunctionalTests/tickets/assets/.gitignore index d6b7ef32..d6b7ef32 100644..100755 --- a/tests/FunctionalTests/tickets/assets/.gitignore +++ b/tests/FunctionalTests/tickets/assets/.gitignore diff --git a/tests/FunctionalTests/tickets/index.php b/tests/FunctionalTests/tickets/index.php index fe127639..77ddf367 100644..100755 --- a/tests/FunctionalTests/tickets/index.php +++ b/tests/FunctionalTests/tickets/index.php @@ -4,5 +4,3 @@ require_once(dirname(__FILE__).'/../../../framework/prado.php'); $app=new TApplication; $app->run(); - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/index700.php b/tests/FunctionalTests/tickets/index700.php index d35f789f..a49485d6 100644..100755 --- a/tests/FunctionalTests/tickets/index700.php +++ b/tests/FunctionalTests/tickets/index700.php @@ -4,5 +4,3 @@ require_once(dirname(__FILE__).'/../../../framework/prado.php'); $app=new TApplication('protected700/application.xml'); $app->run(); - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/application.xml b/tests/FunctionalTests/tickets/protected/application.xml index 113b8455..113b8455 100644..100755 --- a/tests/FunctionalTests/tickets/protected/application.xml +++ b/tests/FunctionalTests/tickets/protected/application.xml diff --git a/tests/FunctionalTests/tickets/protected/controls/ToggleImageButton.php b/tests/FunctionalTests/tickets/protected/controls/ToggleImageButton.php index 861a8e31..9aecda84 100644..100755 --- a/tests/FunctionalTests/tickets/protected/controls/ToggleImageButton.php +++ b/tests/FunctionalTests/tickets/protected/controls/ToggleImageButton.php @@ -43,5 +43,3 @@ class ToggleImageButtonState extends TEnumerable { const Down='Down'; const Up='Up'; } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/controls/down.gif b/tests/FunctionalTests/tickets/protected/controls/down.gif Binary files differindex 9f755b5d..9f755b5d 100644..100755 --- a/tests/FunctionalTests/tickets/protected/controls/down.gif +++ b/tests/FunctionalTests/tickets/protected/controls/down.gif diff --git a/tests/FunctionalTests/tickets/protected/controls/up.gif b/tests/FunctionalTests/tickets/protected/controls/up.gif Binary files differindex 7eeb4896..7eeb4896 100644..100755 --- a/tests/FunctionalTests/tickets/protected/controls/up.gif +++ b/tests/FunctionalTests/tickets/protected/controls/up.gif diff --git a/tests/FunctionalTests/tickets/protected/messages/en/messages.xml b/tests/FunctionalTests/tickets/protected/messages/en/messages.xml index 9b04d076..9b04d076 100644..100755 --- a/tests/FunctionalTests/tickets/protected/messages/en/messages.xml +++ b/tests/FunctionalTests/tickets/protected/messages/en/messages.xml diff --git a/tests/FunctionalTests/tickets/protected/pages/DActiveDropDownList2.php b/tests/FunctionalTests/tickets/protected/pages/DActiveDropDownList2.php index 532b17b0..4d354dcc 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/DActiveDropDownList2.php +++ b/tests/FunctionalTests/tickets/protected/pages/DActiveDropDownList2.php @@ -30,5 +30,3 @@ class DActiveDropDownList2 extends TActiveDropDownList $this->dataBind(); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/ExtendedToggleImageButton.php b/tests/FunctionalTests/tickets/protected/pages/ExtendedToggleImageButton.php index 5e7c8184..934efcef 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/ExtendedToggleImageButton.php +++ b/tests/FunctionalTests/tickets/protected/pages/ExtendedToggleImageButton.php @@ -13,5 +13,4 @@ prado::using ('Application.controls.ToggleImageButton'); class ExtendedToggleImageButton extends ToggleImageButton { -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Home.php b/tests/FunctionalTests/tickets/protected/pages/Home.php index 37804419..9bb123b9 100755 --- a/tests/FunctionalTests/tickets/protected/pages/Home.php +++ b/tests/FunctionalTests/tickets/protected/pages/Home.php @@ -30,5 +30,3 @@ class Home extends TPage return $list; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Issue120.page b/tests/FunctionalTests/tickets/protected/pages/Issue120.page index 0b504849..0b504849 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Issue120.page +++ b/tests/FunctionalTests/tickets/protected/pages/Issue120.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Issue120.php b/tests/FunctionalTests/tickets/protected/pages/Issue120.php index ad6431a0..9a1d8800 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Issue120.php +++ b/tests/FunctionalTests/tickets/protected/pages/Issue120.php @@ -18,5 +18,3 @@ class Issue120 extends TPage } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Issue216.page b/tests/FunctionalTests/tickets/protected/pages/Issue216.page index 2efff728..2efff728 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Issue216.page +++ b/tests/FunctionalTests/tickets/protected/pages/Issue216.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Issue216.php b/tests/FunctionalTests/tickets/protected/pages/Issue216.php index 41eac5e9..bfd23998 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Issue216.php +++ b/tests/FunctionalTests/tickets/protected/pages/Issue216.php @@ -10,5 +10,3 @@ class Issue216 extends TPage } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Layout.php b/tests/FunctionalTests/tickets/protected/pages/Layout.php index b971fb1c..c92cd9c0 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Layout.php +++ b/tests/FunctionalTests/tickets/protected/pages/Layout.php @@ -20,5 +20,3 @@ class Layout extends TTemplateControl } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Layout.tpl b/tests/FunctionalTests/tickets/protected/pages/Layout.tpl index bf2f8fab..bf2f8fab 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Layout.tpl +++ b/tests/FunctionalTests/tickets/protected/pages/Layout.tpl diff --git a/tests/FunctionalTests/tickets/protected/pages/TestHtmlArea.php b/tests/FunctionalTests/tickets/protected/pages/TestHtmlArea.php index 13a4189b..f4f9c148 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/TestHtmlArea.php +++ b/tests/FunctionalTests/tickets/protected/pages/TestHtmlArea.php @@ -4,5 +4,3 @@ class TestHtmlArea extends THtmlArea { } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket121.page b/tests/FunctionalTests/tickets/protected/pages/Ticket121.page index 9c9633d3..9c9633d3 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket121.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket121.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket121.php b/tests/FunctionalTests/tickets/protected/pages/Ticket121.php index d913805c..5cb61ca5 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket121.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket121.php @@ -7,5 +7,3 @@ class Ticket121 extends TPage $this->Result->Text="clicked at ({$param->X},{$param->Y})"; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket163.page b/tests/FunctionalTests/tickets/protected/pages/Ticket163.page index aa05e601..aa05e601 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket163.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket163.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket169.page b/tests/FunctionalTests/tickets/protected/pages/Ticket169.page index 24c447d5..24c447d5 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket169.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket169.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket191.page b/tests/FunctionalTests/tickets/protected/pages/Ticket191.page index 2d673b8d..2d673b8d 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket191.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket191.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket191.php b/tests/FunctionalTests/tickets/protected/pages/Ticket191.php index 1b111bed..d7ef6d27 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket191.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket191.php @@ -18,5 +18,3 @@ class Ticket191 extends TPage $this->Application->setGlobalState('ticket190',$this->TextBox2->Text); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket200.page b/tests/FunctionalTests/tickets/protected/pages/Ticket200.page index 76c60f40..76c60f40 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket200.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket200.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket200.php b/tests/FunctionalTests/tickets/protected/pages/Ticket200.php index a80a3b8a..e61bb157 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket200.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket200.php @@ -12,5 +12,3 @@ class Ticket200 extends TPage } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket202.page b/tests/FunctionalTests/tickets/protected/pages/Ticket202.page index ae984c2d..ae984c2d 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket202.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket202.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket205.page b/tests/FunctionalTests/tickets/protected/pages/Ticket205.page index 376f97f7..376f97f7 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket205.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket205.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket205.php b/tests/FunctionalTests/tickets/protected/pages/Ticket205.php index 6145af9a..8df2be39 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket205.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket205.php @@ -7,5 +7,3 @@ class Ticket205 extends TPage $param->IsValid = $this->textbox1->Text == "Prado"; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket207.page b/tests/FunctionalTests/tickets/protected/pages/Ticket207.page index 6c84d953..6c84d953 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket207.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket207.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket21.page b/tests/FunctionalTests/tickets/protected/pages/Ticket21.page index e0619ea1..e0619ea1 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket21.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket21.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket21.php b/tests/FunctionalTests/tickets/protected/pages/Ticket21.php index 6a06a0f4..3caca20b 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket21.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket21.php @@ -18,5 +18,3 @@ class Ticket21 extends TPage $this->setViewState("clicks", $clicks); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket220.page b/tests/FunctionalTests/tickets/protected/pages/Ticket220.page index e4c8fa95..e4c8fa95 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket220.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket220.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket225.page b/tests/FunctionalTests/tickets/protected/pages/Ticket225.page index 362c4dce..362c4dce 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket225.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket225.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket225.php b/tests/FunctionalTests/tickets/protected/pages/Ticket225.php index 2cc3fc38..82a447d8 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket225.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket225.php @@ -15,5 +15,3 @@ class Ticket225 extends TPage return $ids; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket227.page b/tests/FunctionalTests/tickets/protected/pages/Ticket227.page index ab481fa2..ab481fa2 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket227.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket227.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket239.page b/tests/FunctionalTests/tickets/protected/pages/Ticket239.page index a67c38a8..a67c38a8 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket239.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket239.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket239.php b/tests/FunctionalTests/tickets/protected/pages/Ticket239.php index bbf908b1..c1b3440c 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket239.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket239.php @@ -12,5 +12,3 @@ class Ticket239 extends TPage $this->Result->Text.=$sender->ID." is deactivated. "; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket246.page b/tests/FunctionalTests/tickets/protected/pages/Ticket246.page index e25a484b..e25a484b 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket246.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket246.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket269.page b/tests/FunctionalTests/tickets/protected/pages/Ticket269.page index fe5721e3..fe5721e3 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket269.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket269.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket27.page b/tests/FunctionalTests/tickets/protected/pages/Ticket27.page index f92511c7..f92511c7 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket27.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket27.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket273.page b/tests/FunctionalTests/tickets/protected/pages/Ticket273.page index 02c1a48f..02c1a48f 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket273.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket273.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket273.php b/tests/FunctionalTests/tickets/protected/pages/Ticket273.php index 8dca86c9..fed130c8 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket273.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket273.php @@ -7,5 +7,3 @@ class Ticket273 extends TPage $this->label1->Text = $sender->Text . ' Clicked!'; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket274.page b/tests/FunctionalTests/tickets/protected/pages/Ticket274.page index 0b92cb40..0b92cb40 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket274.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket274.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket278.page b/tests/FunctionalTests/tickets/protected/pages/Ticket278.page index e7341bcc..e7341bcc 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket278.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket278.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket278.php b/tests/FunctionalTests/tickets/protected/pages/Ticket278.php index 2e18fd54..86968b18 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket278.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket278.php @@ -19,5 +19,3 @@ class Ticket278 extends TPage $this->check1->Checked ? "display:block" : "display:none"; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket28.page b/tests/FunctionalTests/tickets/protected/pages/Ticket28.page index 056e9985..056e9985 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket28.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket28.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket28.php b/tests/FunctionalTests/tickets/protected/pages/Ticket28.php index 7980119e..32b539c1 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket28.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket28.php @@ -8,5 +8,3 @@ class Ticket28 extends TPage } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket283.page b/tests/FunctionalTests/tickets/protected/pages/Ticket283.page index b5e1f95b..b5e1f95b 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket283.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket283.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket283.php b/tests/FunctionalTests/tickets/protected/pages/Ticket283.php index 302ad2da..f230cd40 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket283.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket283.php @@ -7,5 +7,3 @@ class Ticket283 extends TPage $this->label1->Text = $sender->Text.' Clicked!'; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket284.page b/tests/FunctionalTests/tickets/protected/pages/Ticket284.page index ff25e3fb..ff25e3fb 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket284.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket284.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket284.php b/tests/FunctionalTests/tickets/protected/pages/Ticket284.php index f9380b12..7388b94b 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket284.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket284.php @@ -7,5 +7,3 @@ class Ticket284 extends TPage } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket284Component.php b/tests/FunctionalTests/tickets/protected/pages/Ticket284Component.php index 4405ca44..71f78269 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket284Component.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket284Component.php @@ -100,4 +100,3 @@ class Ticket284Component extends TTemplateControl implements IValidatable $this->_isValid=TPropertyValue::ensureBoolean($value); } } -?> diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket284Component.tpl b/tests/FunctionalTests/tickets/protected/pages/Ticket284Component.tpl index ed787287..ed787287 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket284Component.tpl +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket284Component.tpl diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket285.page b/tests/FunctionalTests/tickets/protected/pages/Ticket285.page index 9aeb37e9..9aeb37e9 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket285.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket285.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket290.page b/tests/FunctionalTests/tickets/protected/pages/Ticket290.page index e9d40b92..e9d40b92 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket290.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket290.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket290.php b/tests/FunctionalTests/tickets/protected/pages/Ticket290.php index c5e9e357..ed7466fc 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket290.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket290.php @@ -12,5 +12,3 @@ class Ticket290 extends TPage $this->label2->Text = $sender->Text . " Clicked!"; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket306.page b/tests/FunctionalTests/tickets/protected/pages/Ticket306.page index 6a202cc6..6a202cc6 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket306.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket306.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket311.page b/tests/FunctionalTests/tickets/protected/pages/Ticket311.page index 45b41b7d..45b41b7d 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket311.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket311.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket312.page b/tests/FunctionalTests/tickets/protected/pages/Ticket312.page index f6c550c5..f6c550c5 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket312.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket312.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket351.page b/tests/FunctionalTests/tickets/protected/pages/Ticket351.page index bc148545..bc148545 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket351.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket351.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket359.page b/tests/FunctionalTests/tickets/protected/pages/Ticket359.page index 036560e6..036560e6 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket359.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket359.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket359.php b/tests/FunctionalTests/tickets/protected/pages/Ticket359.php index 6b15f699..341d3b4b 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket359.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket359.php @@ -9,5 +9,3 @@ class Ticket359 extends TPage $param->IsValid = $param->Value == 'Prado'; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket384.page b/tests/FunctionalTests/tickets/protected/pages/Ticket384.page index 79e5c0c1..79e5c0c1 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket384.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket384.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket384.php b/tests/FunctionalTests/tickets/protected/pages/Ticket384.php index b485ef2b..98ecb4cf 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket384.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket384.php @@ -42,5 +42,3 @@ class Ticket384 extends TPage return $list; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket413.page b/tests/FunctionalTests/tickets/protected/pages/Ticket413.page index 90f8226c..90f8226c 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket413.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket413.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket413.php b/tests/FunctionalTests/tickets/protected/pages/Ticket413.php index c7a7081a..164b3b4a 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket413.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket413.php @@ -27,5 +27,3 @@ class Ticket413 extends TPage } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket422.page b/tests/FunctionalTests/tickets/protected/pages/Ticket422.page index d6303d84..d6303d84 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket422.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket422.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket422.php b/tests/FunctionalTests/tickets/protected/pages/Ticket422.php index 85647ae2..c8c12077 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket422.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket422.php @@ -104,5 +104,3 @@ class Ticket422 extends TPage $this->list2->setSelectedValue("value 3 - item 3"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket433.page b/tests/FunctionalTests/tickets/protected/pages/Ticket433.page index b76245f5..b76245f5 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket433.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket433.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket433.php b/tests/FunctionalTests/tickets/protected/pages/Ticket433.php index a87f8f82..a2f63438 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket433.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket433.php @@ -20,5 +20,3 @@ class Ticket433 extends TPage $sender->Text .= ' CALLBACK DONE'; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket439.page b/tests/FunctionalTests/tickets/protected/pages/Ticket439.page index 554696e2..554696e2 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket439.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket439.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket439.php b/tests/FunctionalTests/tickets/protected/pages/Ticket439.php index dcb46412..e70e0d1e 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket439.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket439.php @@ -11,5 +11,3 @@ class Ticket439 extends TPage $this->Response->redirect($page); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket453.page b/tests/FunctionalTests/tickets/protected/pages/Ticket453.page index 23905aea..23905aea 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket453.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket453.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket463.page b/tests/FunctionalTests/tickets/protected/pages/Ticket463.page index 1cec6485..1cec6485 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket463.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket463.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket470.page b/tests/FunctionalTests/tickets/protected/pages/Ticket470.page index c0ad23e6..c0ad23e6 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket470.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket470.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket470.php b/tests/FunctionalTests/tickets/protected/pages/Ticket470.php index 2e023242..e9ebff82 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket470.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket470.php @@ -20,5 +20,3 @@ class Ticket470 extends TPage $this->Results->Text = "OK!!!"; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket472.page b/tests/FunctionalTests/tickets/protected/pages/Ticket472.page index 376f56d9..376f56d9 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket472.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket472.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket472.php b/tests/FunctionalTests/tickets/protected/pages/Ticket472.php index f0b9c092..9f987aee 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket472.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket472.php @@ -9,5 +9,3 @@ class Ticket472 extends TPage $this->label1->Text = "丧两∞…壹åƒè‚†ã…•ã…“ㆈㆆㅰڂٸשסã›ãœãŒê’²ê’ºê“‚à¸à¸™àª”இ༃í í°¦Ò–Ð‰Ó…Õ“Õ‡Ç¢Ç¼Ã…he"; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket477.page b/tests/FunctionalTests/tickets/protected/pages/Ticket477.page index b7f23bc3..b7f23bc3 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket477.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket477.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket477.php b/tests/FunctionalTests/tickets/protected/pages/Ticket477.php index a6309958..87213e08 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket477.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket477.php @@ -12,5 +12,3 @@ class Ticket477 extends TPage $param->IsValid=false; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket484.page b/tests/FunctionalTests/tickets/protected/pages/Ticket484.page index 0b1b2c5f..0b1b2c5f 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket484.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket484.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket484.php b/tests/FunctionalTests/tickets/protected/pages/Ticket484.php index 89dac261..a6010297 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket484.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket484.php @@ -26,5 +26,3 @@ class Ticket484 extends TPage $this->label1->Text .= "using callback!"; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket488.page b/tests/FunctionalTests/tickets/protected/pages/Ticket488.page index 4bb8df47..4bb8df47 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket488.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket488.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket488.php b/tests/FunctionalTests/tickets/protected/pages/Ticket488.php index 97334f21..400cda0a 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket488.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket488.php @@ -9,5 +9,3 @@ class Ticket488 extends TPage //$param->IsValid = $this->Password == 'Prado'; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket500.page b/tests/FunctionalTests/tickets/protected/pages/Ticket500.page index a5ef32ca..a5ef32ca 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket500.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket500.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket500.php b/tests/FunctionalTests/tickets/protected/pages/Ticket500.php index a0b96ed5..0c315ac5 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket500.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket500.php @@ -9,5 +9,3 @@ class Ticket500 extends TPage $this->link1->NavigateUrl = $url; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket504.page b/tests/FunctionalTests/tickets/protected/pages/Ticket504.page index 767a9c3a..767a9c3a 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket504.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket504.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket504.php b/tests/FunctionalTests/tickets/protected/pages/Ticket504.php index 3d1bdfb6..07bdcd22 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket504.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket504.php @@ -21,5 +21,3 @@ class Ticket504 extends TPage die("parameter is ".$param->CallbackParameter); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket507.page b/tests/FunctionalTests/tickets/protected/pages/Ticket507.page index f80dea44..f80dea44 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket507.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket507.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket507.php b/tests/FunctionalTests/tickets/protected/pages/Ticket507.php index ea358e65..3f6549bb 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket507.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket507.php @@ -21,5 +21,3 @@ class Ticket507 extends TPage $this->list1->enabled = true; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket511.page b/tests/FunctionalTests/tickets/protected/pages/Ticket511.page index b6b9dda4..b6b9dda4 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket511.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket511.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket518.page b/tests/FunctionalTests/tickets/protected/pages/Ticket518.page index 657dc4cf..657dc4cf 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket518.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket518.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket521.page b/tests/FunctionalTests/tickets/protected/pages/Ticket521.page index f3014020..f3014020 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket521.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket521.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket521.php b/tests/FunctionalTests/tickets/protected/pages/Ticket521.php index e7e65b86..37f005e0 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket521.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket521.php @@ -12,5 +12,4 @@ class Ticket521 extends TPage } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket526.page b/tests/FunctionalTests/tickets/protected/pages/Ticket526.page index b4ccd25e..b4ccd25e 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket526.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket526.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket526.php b/tests/FunctionalTests/tickets/protected/pages/Ticket526.php index 1500ad73..baca5d7a 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket526.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket526.php @@ -11,5 +11,3 @@ class Ticket526 extends TPage $this->activePanel->render($p->NewWriter); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket528.page b/tests/FunctionalTests/tickets/protected/pages/Ticket528.page index 15df2b62..15df2b62 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket528.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket528.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket528.php b/tests/FunctionalTests/tickets/protected/pages/Ticket528.php index 2e05dbfd..1642f6e1 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket528.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket528.php @@ -31,5 +31,3 @@ class Ticket528 extends TPage $this->loadDadosTurno($sender->getSelectedValue()); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket535.page b/tests/FunctionalTests/tickets/protected/pages/Ticket535.page index 4b9ba6fe..4b9ba6fe 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket535.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket535.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket535.php b/tests/FunctionalTests/tickets/protected/pages/Ticket535.php index 705a5474..830aa1bf 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket535.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket535.php @@ -12,5 +12,3 @@ class Ticket535 extends TPage $this->label1->Text = "bad_radio1 checked:{".$this->bad_radio1->getChecked()."} bad_radio2 checked:{".$this->bad_radio2->getChecked()."} "; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket538.page b/tests/FunctionalTests/tickets/protected/pages/Ticket538.page index 80ab5ff0..80ab5ff0 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket538.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket538.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket538.php b/tests/FunctionalTests/tickets/protected/pages/Ticket538.php index 2ba0d841..1f437ad4 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket538.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket538.php @@ -98,5 +98,3 @@ class Ticket538 extends TPage } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket54.page b/tests/FunctionalTests/tickets/protected/pages/Ticket54.page index 8ac4285b..8ac4285b 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket54.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket54.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket542.page b/tests/FunctionalTests/tickets/protected/pages/Ticket542.page index 5c39c6b5..5c39c6b5 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket542.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket542.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket542.php b/tests/FunctionalTests/tickets/protected/pages/Ticket542.php index 59169d64..627fccc0 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket542.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket542.php @@ -19,5 +19,3 @@ class Ticket542 extends TPage { } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket54Master.php b/tests/FunctionalTests/tickets/protected/pages/Ticket54Master.php index 917f45cf..7b035662 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket54Master.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket54Master.php @@ -3,5 +3,3 @@ class Ticket54Master extends TTemplateControl { } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket54Master.tpl b/tests/FunctionalTests/tickets/protected/pages/Ticket54Master.tpl index 94468a7b..94468a7b 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket54Master.tpl +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket54Master.tpl diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket573.page b/tests/FunctionalTests/tickets/protected/pages/Ticket573.page index a2c4d145..a2c4d145 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket573.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket573.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket578.page b/tests/FunctionalTests/tickets/protected/pages/Ticket578.page index e933fd33..e933fd33 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket578.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket578.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket578.php b/tests/FunctionalTests/tickets/protected/pages/Ticket578.php index 7b7463a2..ad9b50ba 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket578.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket578.php @@ -9,5 +9,3 @@ class Ticket578 extends TPage } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket583/Home.page b/tests/FunctionalTests/tickets/protected/pages/Ticket583/Home.page index c6ce65e3..c6ce65e3 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket583/Home.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket583/Home.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket585.page b/tests/FunctionalTests/tickets/protected/pages/Ticket585.page index f5e26f24..f5e26f24 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket585.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket585.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket585.php b/tests/FunctionalTests/tickets/protected/pages/Ticket585.php index 1cda7900..638b7453 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket585.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket585.php @@ -14,5 +14,3 @@ class Ticket585 extends TPage } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket586.page b/tests/FunctionalTests/tickets/protected/pages/Ticket586.page index 29751cab..29751cab 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket586.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket586.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket586.php b/tests/FunctionalTests/tickets/protected/pages/Ticket586.php index 574d6f72..4691f984 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket586.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket586.php @@ -7,5 +7,3 @@ class Ticket586 extends TPage $this->label1->Text = $sender->Text . ' Clicked!'; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket587.page b/tests/FunctionalTests/tickets/protected/pages/Ticket587.page index a28bab6a..a28bab6a 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket587.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket587.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket587.php b/tests/FunctionalTests/tickets/protected/pages/Ticket587.php index 21ce7a64..851321c5 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket587.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket587.php @@ -8,5 +8,3 @@ class Ticket587 extends TPage $this->count->setText( ++$count ); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket587_reopened.page b/tests/FunctionalTests/tickets/protected/pages/Ticket587_reopened.page index cf7d2136..cf7d2136 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket587_reopened.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket587_reopened.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket587_reopened.php b/tests/FunctionalTests/tickets/protected/pages/Ticket587_reopened.php index fea88274..ea62dfb5 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket587_reopened.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket587_reopened.php @@ -58,5 +58,3 @@ class Ticket587_reopened extends TPage $this->label1->Text = $value; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket591.page b/tests/FunctionalTests/tickets/protected/pages/Ticket591.page index 2f2fef85..2f2fef85 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket591.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket591.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket591.php b/tests/FunctionalTests/tickets/protected/pages/Ticket591.php index 8616ac02..be8b436c 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket591.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket591.php @@ -5,5 +5,3 @@ Prado::using('System.Web.UI.ActiveControls.*'); class Ticket591 extends TPage { } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket592.page b/tests/FunctionalTests/tickets/protected/pages/Ticket592.page index d39ddd99..d39ddd99 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket592.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket592.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket592.php b/tests/FunctionalTests/tickets/protected/pages/Ticket592.php index 751de056..6ace086c 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket592.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket592.php @@ -18,5 +18,3 @@ class Ticket592 extends TPage } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket593.page b/tests/FunctionalTests/tickets/protected/pages/Ticket593.page index efa8a542..efa8a542 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket593.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket593.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket595.page b/tests/FunctionalTests/tickets/protected/pages/Ticket595.page index 33c45c8e..33c45c8e 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket595.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket595.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket598.page b/tests/FunctionalTests/tickets/protected/pages/Ticket598.page index 7d618ff1..7d618ff1 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket598.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket598.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket598.php b/tests/FunctionalTests/tickets/protected/pages/Ticket598.php index a8c4c397..208867b6 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket598.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket598.php @@ -15,5 +15,4 @@ public function onLoad ($param) { public function updateLbl($sender, $param) { $this->Lbl->SetText(date("h:m:s")); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket603.page b/tests/FunctionalTests/tickets/protected/pages/Ticket603.page index d5023adc..d5023adc 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket603.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket603.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket603.php b/tests/FunctionalTests/tickets/protected/pages/Ticket603.php index 138ffbd4..d1b83220 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket603.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket603.php @@ -26,5 +26,3 @@ class Ticket603 extends TPage $this->ContentPanel->render( $param->NewWriter ); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket605.page b/tests/FunctionalTests/tickets/protected/pages/Ticket605.page index 34f859b7..34f859b7 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket605.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket605.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket606.page b/tests/FunctionalTests/tickets/protected/pages/Ticket606.page index a1a8f551..a1a8f551 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket606.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket606.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket609.page b/tests/FunctionalTests/tickets/protected/pages/Ticket609.page index 741f4d65..741f4d65 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket609.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket609.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket614.page b/tests/FunctionalTests/tickets/protected/pages/Ticket614.page index 0b1901ea..0b1901ea 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket614.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket614.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket617.page b/tests/FunctionalTests/tickets/protected/pages/Ticket617.page index d63a84a7..d63a84a7 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket617.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket617.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket622.page b/tests/FunctionalTests/tickets/protected/pages/Ticket622.page index d7973e5e..d7973e5e 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket622.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket622.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket622.php b/tests/FunctionalTests/tickets/protected/pages/Ticket622.php index 003b32de..24565d09 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket622.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket622.php @@ -7,4 +7,3 @@ class Ticket622 extends TPage { $this->ARB->setDisplay('Dynamic'); } } -?> diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket653/Layout.php b/tests/FunctionalTests/tickets/protected/pages/Ticket653/Layout.php index de4d3b3d..9af5b134 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket653/Layout.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket653/Layout.php @@ -9,5 +9,3 @@ class Layout extends TTemplateControl $this->ticketlink->setNavigateUrl("http://trac.pradosoft.com/prado/ticket/653"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket653/Layout.tpl b/tests/FunctionalTests/tickets/protected/pages/Ticket653/Layout.tpl index bf2f8fab..bf2f8fab 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket653/Layout.tpl +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket653/Layout.tpl diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket653/ticket653.page b/tests/FunctionalTests/tickets/protected/pages/Ticket653/ticket653.page index cab72cc3..cab72cc3 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket653/ticket653.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket653/ticket653.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket656.page b/tests/FunctionalTests/tickets/protected/pages/Ticket656.page index aa5d11b2..aa5d11b2 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket656.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket656.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket656.php b/tests/FunctionalTests/tickets/protected/pages/Ticket656.php index 943908c9..8fd3794e 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket656.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket656.php @@ -5,5 +5,4 @@ class Ticket656 extends TPage { $this->lblStatus->setText($this->datePicker->getDate()); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket659.page b/tests/FunctionalTests/tickets/protected/pages/Ticket659.page index 66b05eda..66b05eda 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket659.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket659.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket659.php b/tests/FunctionalTests/tickets/protected/pages/Ticket659.php index 68da138b..cb266fd7 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket659.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket659.php @@ -15,5 +15,4 @@ class Ticket659 extends TPage { public function clickToggleButton ($sender, $param) { $this->lbl->Text=$sender->State; } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket660.page b/tests/FunctionalTests/tickets/protected/pages/Ticket660.page index 8e0206da..8e0206da 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket660.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket660.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket660.php b/tests/FunctionalTests/tickets/protected/pages/Ticket660.php index 457e3ed8..e0d611b8 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket660.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket660.php @@ -23,4 +23,3 @@ class Ticket660 extends TPage { } } -?> diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket669.page b/tests/FunctionalTests/tickets/protected/pages/Ticket669.page index 9f7e6cf8..9f7e6cf8 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket669.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket669.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket669.php b/tests/FunctionalTests/tickets/protected/pages/Ticket669.php index 0131d95c..2cb86cff 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket669.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket669.php @@ -32,5 +32,3 @@ class Ticket669 extends TPage $this->panel7->render($param->getNewWriter()); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket670.page b/tests/FunctionalTests/tickets/protected/pages/Ticket670.page index b04f9d23..b04f9d23 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket670.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket670.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket670.php b/tests/FunctionalTests/tickets/protected/pages/Ticket670.php index 416b0235..fb474df6 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket670.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket670.php @@ -5,5 +5,4 @@ class Ticket670 extends TPage { $this->lbl->Text=$this->datePicker->getDate(); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket671.page b/tests/FunctionalTests/tickets/protected/pages/Ticket671.page index 22c899f5..22c899f5 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket671.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket671.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket671.php b/tests/FunctionalTests/tickets/protected/pages/Ticket671.php index 04bd1a7e..3e76739d 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket671.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket671.php @@ -29,5 +29,4 @@ class Ticket671 extends TPage } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket671_reopened.page b/tests/FunctionalTests/tickets/protected/pages/Ticket671_reopened.page index c4e7fb53..c4e7fb53 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket671_reopened.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket671_reopened.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket671_reopened.php b/tests/FunctionalTests/tickets/protected/pages/Ticket671_reopened.php index ae45bf96..fcb70751 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket671_reopened.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket671_reopened.php @@ -35,5 +35,4 @@ class Ticket671_reopened extends TPage { return $this->getViewState('CheckCount', 0); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket679.page b/tests/FunctionalTests/tickets/protected/pages/Ticket679.page index ba4b75e4..ba4b75e4 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket679.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket679.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket679.php b/tests/FunctionalTests/tickets/protected/pages/Ticket679.php index c28252bd..4f5547f7 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket679.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket679.php @@ -39,5 +39,4 @@ class Ticket679 extends TPage //$this->CallbackClient->check($this->myRadioButton, false); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket68.page b/tests/FunctionalTests/tickets/protected/pages/Ticket68.page index 3936e68c..3936e68c 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket68.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket68.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket691.page b/tests/FunctionalTests/tickets/protected/pages/Ticket691.page index b7942c8e..b7942c8e 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket691.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket691.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket691.php b/tests/FunctionalTests/tickets/protected/pages/Ticket691.php index a47a6a9d..91a72b27 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket691.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket691.php @@ -9,5 +9,4 @@ class Ticket691 extends TPage $sender->Rating=$sender->SelectedIndex+1; $this->Result->Text="You vote ".$sender->Rating; } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket695.page b/tests/FunctionalTests/tickets/protected/pages/Ticket695.page index 00add0af..00add0af 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket695.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket695.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket695.php b/tests/FunctionalTests/tickets/protected/pages/Ticket695.php index 205b01c0..175d1ebc 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket695.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket695.php @@ -5,4 +5,3 @@ class Ticket695 extends TPage { $this->X->Text=$this->X->Text+1; } } -?> diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket698.page b/tests/FunctionalTests/tickets/protected/pages/Ticket698.page index 686fef9d..686fef9d 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket698.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket698.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket698.php b/tests/FunctionalTests/tickets/protected/pages/Ticket698.php index e7bf6646..507cefbb 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket698.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket698.php @@ -11,5 +11,4 @@ class Ticket698 extends TPage public function switchContentTypeCallback( $sender, $param ) { $this->ContentPanel->render( $param->NewWriter ); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket703/Logs/LogFile.txt b/tests/FunctionalTests/tickets/protected/pages/Ticket703/Logs/LogFile.txt index e69de29b..af19780d 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket703/Logs/LogFile.txt +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket703/Logs/LogFile.txt @@ -0,0 +1 @@ +Sep 22 20:21:44 [Debug] [Tickets] Test of prado logging system diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket703/Ticket703.page b/tests/FunctionalTests/tickets/protected/pages/Ticket703/Ticket703.page index 4ca02ef5..4ca02ef5 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket703/Ticket703.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket703/Ticket703.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket703/Ticket703.php b/tests/FunctionalTests/tickets/protected/pages/Ticket703/Ticket703.php index eb446077..54240798 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket703/Ticket703.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket703/Ticket703.php @@ -27,5 +27,4 @@ class Ticket703 extends TPage { { prado::log($this->logMessage->getText(), TLogger::DEBUG, "Tickets"); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket703/config.xml b/tests/FunctionalTests/tickets/protected/pages/Ticket703/config.xml index a9fd8721..a9fd8721 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket703/config.xml +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket703/config.xml diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket708.page b/tests/FunctionalTests/tickets/protected/pages/Ticket708.page index f92fb34a..f92fb34a 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket708.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket708.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket708.php b/tests/FunctionalTests/tickets/protected/pages/Ticket708.php index 2eca39d9..275fa869 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket708.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket708.php @@ -26,5 +26,4 @@ class Ticket708 extends TPage { $this->Result->setText("You have selected Radio Button #".$sender->getValue()); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket719.page b/tests/FunctionalTests/tickets/protected/pages/Ticket719.page index b36d2d66..b36d2d66 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket719.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket719.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket719.php b/tests/FunctionalTests/tickets/protected/pages/Ticket719.php index a08aac36..376eecdd 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket719.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket719.php @@ -37,5 +37,4 @@ class Ticket719 extends TPage { $this->Result->Text = "TextBox Content : ".$this->textbox->getText()." -- Autocomplete Content :".$this->autocomplete->getText(); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket72.page b/tests/FunctionalTests/tickets/protected/pages/Ticket72.page index 26667406..26667406 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket72.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket72.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket72.php b/tests/FunctionalTests/tickets/protected/pages/Ticket72.php index 14a8a112..997c0d8d 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket72.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket72.php @@ -9,5 +9,3 @@ class Ticket72 extends TPage $this->ResultLabel->Text = $a2; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket722.page b/tests/FunctionalTests/tickets/protected/pages/Ticket722.page index 6acd9f24..6acd9f24 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket722.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket722.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket722.php b/tests/FunctionalTests/tickets/protected/pages/Ticket722.php index 91759fb0..71bf2841 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket722.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket722.php @@ -26,5 +26,4 @@ class Ticket722 extends TPage { return $this->getViewState('text', "Editable Text"); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket745.php b/tests/FunctionalTests/tickets/protected/pages/Ticket745.php index 8d7c66ce..f50d17f1 100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket745.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket745.php @@ -7,5 +7,3 @@ class Ticket745 extends TPage $this->Result->Text="Your favorite color is: " . $this->DropDownList1->SelectedValue; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket769.page b/tests/FunctionalTests/tickets/protected/pages/Ticket769.page index aca51817..aca51817 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket769.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket769.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket769.php b/tests/FunctionalTests/tickets/protected/pages/Ticket769.php index e1a86f0d..95bdd62d 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket769.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket769.php @@ -22,5 +22,4 @@ class Ticket769 extends TPage { $sender->Text = $sender->Text.' clicked'; } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket785.page b/tests/FunctionalTests/tickets/protected/pages/Ticket785.page index 1b402a17..1b402a17 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket785.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket785.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket785.php b/tests/FunctionalTests/tickets/protected/pages/Ticket785.php index 91ba918d..57b5f241 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket785.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket785.php @@ -3,5 +3,4 @@ class Ticket785 extends TPage { -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket823.page b/tests/FunctionalTests/tickets/protected/pages/Ticket823.page index 8da83c65..8da83c65 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket823.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket823.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket828.page b/tests/FunctionalTests/tickets/protected/pages/Ticket828.page index 528a28d1..528a28d1 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket828.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket828.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket849.page b/tests/FunctionalTests/tickets/protected/pages/Ticket849.page index f11b181c..f11b181c 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket849.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket849.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket876.page b/tests/FunctionalTests/tickets/protected/pages/Ticket876.page index af673461..af673461 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket876.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket876.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket876.php b/tests/FunctionalTests/tickets/protected/pages/Ticket876.php index e95a677c..f6cc22e5 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket876.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket876.php @@ -8,4 +8,3 @@ class Ticket876 extends TPage { } -?> diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket886.page b/tests/FunctionalTests/tickets/protected/pages/Ticket886.page index ea9319fd..ea9319fd 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket886.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket886.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket886.php b/tests/FunctionalTests/tickets/protected/pages/Ticket886.php index f14d067d..4a989dbb 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket886.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket886.php @@ -6,4 +6,3 @@ class Ticket886 extends TPage { } } -?> diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket897.page b/tests/FunctionalTests/tickets/protected/pages/Ticket897.page index 93237b98..93237b98 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket897.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket897.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket897.php b/tests/FunctionalTests/tickets/protected/pages/Ticket897.php index b0b8959f..358572bc 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket897.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket897.php @@ -6,4 +6,3 @@ class Ticket897 extends TPage { } } -?> diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket900.page b/tests/FunctionalTests/tickets/protected/pages/Ticket900.page index 41c0fbc2..41c0fbc2 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket900.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket900.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket900.php b/tests/FunctionalTests/tickets/protected/pages/Ticket900.php index 21e87f67..5e8a1d07 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket900.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket900.php @@ -55,4 +55,3 @@ class Ticket900 extends TPage { } } -?> diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket922.page b/tests/FunctionalTests/tickets/protected/pages/Ticket922.page index 87932680..87932680 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket922.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket922.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket922.php b/tests/FunctionalTests/tickets/protected/pages/Ticket922.php index 52d4e411..52d4e411 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket922.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket922.php diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket925.php b/tests/FunctionalTests/tickets/protected/pages/Ticket925.php index 0284bd66..02cef023 100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket925.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket925.php @@ -72,5 +72,4 @@ class Ticket925 extends TPage } } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket93.page b/tests/FunctionalTests/tickets/protected/pages/Ticket93.page index 2217ab15..2217ab15 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket93.page +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket93.page diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket93.php b/tests/FunctionalTests/tickets/protected/pages/Ticket93.php index dbee4556..6b37932a 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/Ticket93.php +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket93.php @@ -11,4 +11,3 @@ class Ticket93 extends TPage } } -?> diff --git a/tests/FunctionalTests/tickets/protected/pages/config.xml b/tests/FunctionalTests/tickets/protected/pages/config.xml index 9404e969..9404e969 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/config.xml +++ b/tests/FunctionalTests/tickets/protected/pages/config.xml diff --git a/tests/FunctionalTests/tickets/protected/pages/hotspot.jpg b/tests/FunctionalTests/tickets/protected/pages/hotspot.jpg Binary files differindex 3491813f..3491813f 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/hotspot.jpg +++ b/tests/FunctionalTests/tickets/protected/pages/hotspot.jpg diff --git a/tests/FunctionalTests/tickets/protected/pages/test.js b/tests/FunctionalTests/tickets/protected/pages/test.js index e8e80b19..e8e80b19 100644..100755 --- a/tests/FunctionalTests/tickets/protected/pages/test.js +++ b/tests/FunctionalTests/tickets/protected/pages/test.js diff --git a/tests/FunctionalTests/tickets/protected/runtime/.gitignore b/tests/FunctionalTests/tickets/protected/runtime/.gitignore index d6b7ef32..d6b7ef32 100644..100755 --- a/tests/FunctionalTests/tickets/protected/runtime/.gitignore +++ b/tests/FunctionalTests/tickets/protected/runtime/.gitignore diff --git a/tests/FunctionalTests/tickets/protected700/application.xml b/tests/FunctionalTests/tickets/protected700/application.xml index cb00aae3..cb00aae3 100644..100755 --- a/tests/FunctionalTests/tickets/protected700/application.xml +++ b/tests/FunctionalTests/tickets/protected700/application.xml diff --git a/tests/FunctionalTests/tickets/protected700/common/BasePage.php b/tests/FunctionalTests/tickets/protected700/common/BasePage.php index bbb93650..0a68f56d 100644..100755 --- a/tests/FunctionalTests/tickets/protected700/common/BasePage.php +++ b/tests/FunctionalTests/tickets/protected700/common/BasePage.php @@ -64,5 +64,3 @@ class BasePage extends TPage $this->_param5=$value; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected700/layout/MainLayout.php b/tests/FunctionalTests/tickets/protected700/layout/MainLayout.php index 6f385ce8..26bd782a 100644..100755 --- a/tests/FunctionalTests/tickets/protected700/layout/MainLayout.php +++ b/tests/FunctionalTests/tickets/protected700/layout/MainLayout.php @@ -8,5 +8,3 @@ class MainLayout extends TTemplateControl $this->Response->reload(); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected700/layout/MainLayout.tpl b/tests/FunctionalTests/tickets/protected700/layout/MainLayout.tpl index acbfa0e6..acbfa0e6 100644..100755 --- a/tests/FunctionalTests/tickets/protected700/layout/MainLayout.tpl +++ b/tests/FunctionalTests/tickets/protected700/layout/MainLayout.tpl diff --git a/tests/FunctionalTests/tickets/protected700/pages/Home.page b/tests/FunctionalTests/tickets/protected700/pages/Home.page index 7d1c1187..7d1c1187 100644..100755 --- a/tests/FunctionalTests/tickets/protected700/pages/Home.page +++ b/tests/FunctionalTests/tickets/protected700/pages/Home.page diff --git a/tests/FunctionalTests/tickets/protected700/pages/UserLogin.page b/tests/FunctionalTests/tickets/protected700/pages/UserLogin.page index 07d4ece9..07d4ece9 100644..100755 --- a/tests/FunctionalTests/tickets/protected700/pages/UserLogin.page +++ b/tests/FunctionalTests/tickets/protected700/pages/UserLogin.page diff --git a/tests/FunctionalTests/tickets/protected700/pages/UserLogin.php b/tests/FunctionalTests/tickets/protected700/pages/UserLogin.php index 8071fb29..9003adfe 100644..100755 --- a/tests/FunctionalTests/tickets/protected700/pages/UserLogin.php +++ b/tests/FunctionalTests/tickets/protected700/pages/UserLogin.php @@ -9,5 +9,3 @@ class UserLogin extends BasePage $this->Response->redirect($this->Service->constructUrl('Home')); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected700/pages/admin/Home.page b/tests/FunctionalTests/tickets/protected700/pages/admin/Home.page index 7d1c1187..7d1c1187 100644..100755 --- a/tests/FunctionalTests/tickets/protected700/pages/admin/Home.page +++ b/tests/FunctionalTests/tickets/protected700/pages/admin/Home.page diff --git a/tests/FunctionalTests/tickets/protected700/pages/admin/Home2.page b/tests/FunctionalTests/tickets/protected700/pages/admin/Home2.page index 7d1c1187..7d1c1187 100644..100755 --- a/tests/FunctionalTests/tickets/protected700/pages/admin/Home2.page +++ b/tests/FunctionalTests/tickets/protected700/pages/admin/Home2.page diff --git a/tests/FunctionalTests/tickets/protected700/pages/admin/config.xml b/tests/FunctionalTests/tickets/protected700/pages/admin/config.xml index 04ac6bdd..04ac6bdd 100644..100755 --- a/tests/FunctionalTests/tickets/protected700/pages/admin/config.xml +++ b/tests/FunctionalTests/tickets/protected700/pages/admin/config.xml diff --git a/tests/FunctionalTests/tickets/protected700/pages/admin/users/Home.page b/tests/FunctionalTests/tickets/protected700/pages/admin/users/Home.page index 7d1c1187..7d1c1187 100644..100755 --- a/tests/FunctionalTests/tickets/protected700/pages/admin/users/Home.page +++ b/tests/FunctionalTests/tickets/protected700/pages/admin/users/Home.page diff --git a/tests/FunctionalTests/tickets/protected700/pages/admin/users/Home2.page b/tests/FunctionalTests/tickets/protected700/pages/admin/users/Home2.page index 7d1c1187..7d1c1187 100644..100755 --- a/tests/FunctionalTests/tickets/protected700/pages/admin/users/Home2.page +++ b/tests/FunctionalTests/tickets/protected700/pages/admin/users/Home2.page diff --git a/tests/FunctionalTests/tickets/protected700/pages/admin/users/config.xml b/tests/FunctionalTests/tickets/protected700/pages/admin/users/config.xml index 175ea5c7..175ea5c7 100644..100755 --- a/tests/FunctionalTests/tickets/protected700/pages/admin/users/config.xml +++ b/tests/FunctionalTests/tickets/protected700/pages/admin/users/config.xml diff --git a/tests/FunctionalTests/tickets/protected700/pages/config.xml b/tests/FunctionalTests/tickets/protected700/pages/config.xml index 416de43f..416de43f 100644..100755 --- a/tests/FunctionalTests/tickets/protected700/pages/config.xml +++ b/tests/FunctionalTests/tickets/protected700/pages/config.xml diff --git a/tests/FunctionalTests/tickets/protected700/pages/content/Home.page b/tests/FunctionalTests/tickets/protected700/pages/content/Home.page index 7d1c1187..7d1c1187 100644..100755 --- a/tests/FunctionalTests/tickets/protected700/pages/content/Home.page +++ b/tests/FunctionalTests/tickets/protected700/pages/content/Home.page diff --git a/tests/FunctionalTests/tickets/protected700/runtime/.gitignore b/tests/FunctionalTests/tickets/protected700/runtime/.gitignore index d6b7ef32..d6b7ef32 100644..100755 --- a/tests/FunctionalTests/tickets/protected700/runtime/.gitignore +++ b/tests/FunctionalTests/tickets/protected700/runtime/.gitignore diff --git a/tests/FunctionalTests/tickets/tests/Issue120TestCase.php b/tests/FunctionalTests/tickets/tests/Issue120TestCase.php index 07afd06c..20a4096b 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Issue120TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Issue120TestCase.php @@ -1,6 +1,6 @@ <?php -class Issue120TestCase extends SeleniumTestCase +class Issue120TestCase extends PradoGenericSeleniumTest { function test() { @@ -17,5 +17,3 @@ class Issue120TestCase extends SeleniumTestCase $this->assertSelectedValue("ctl0_Content_ddl1", 'PromptValue'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Issue216TestCase.php b/tests/FunctionalTests/tickets/tests/Issue216TestCase.php index 0c351f33..375f90a7 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Issue216TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Issue216TestCase.php @@ -1,6 +1,6 @@ <?php -class Issue216TestCase extends SeleniumTestCase +class Issue216TestCase extends PradoGenericSeleniumTest { function test() { @@ -24,5 +24,3 @@ class Issue216TestCase extends SeleniumTestCase $this->assertText("ctl0_Content_result", "Tab ActiveIndex is : 1"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket121TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket121TestCase.php index 3cad6c77..905a31a4 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket121TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket121TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket121TestCase extends SeleniumTestCase +class Ticket121TestCase extends PradoGenericSeleniumTest { function test() { @@ -15,5 +15,3 @@ class Ticket121TestCase extends SeleniumTestCase $this->verifyTextPresent("clicked at", ""); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket163TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket163TestCase.php index cc78c466..1727ac40 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket163TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket163TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket163TestCase extends SeleniumTestCase +class Ticket163TestCase extends PradoGenericSeleniumTest { function test() { @@ -10,5 +10,3 @@ class Ticket163TestCase extends SeleniumTestCase $this->assertTextPresent('-kr 100,00'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket169TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket169TestCase.php index 30bbc92d..9889ea50 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket169TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket169TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket169TestCase extends SeleniumTestCase +class Ticket169TestCase extends PradoGenericSeleniumTest { function test() { @@ -10,5 +10,3 @@ class Ticket169TestCase extends SeleniumTestCase $this->assertVisible('ctl0_Content_validator1'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket191TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket191TestCase.php index 616a578a..88de08cc 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket191TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket191TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket191TestCase extends SeleniumTestCase +class Ticket191TestCase extends PradoGenericSeleniumTest { function test() { @@ -12,5 +12,3 @@ class Ticket191TestCase extends SeleniumTestCase $this->verifyNotVisible('ctl0_Content_ctl2'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket205TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket205TestCase.php index d883cce4..86768354 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket205TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket205TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket205TestCase extends SeleniumTestCase +class Ticket205TestCase extends PradoGenericSeleniumTest { function test() { @@ -19,5 +19,3 @@ class Ticket205TestCase extends SeleniumTestCase $this->assertNotVisible("{$base}validator1"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket207TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket207TestCase.php index 53ae6528..cd618a5d 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket207TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket207TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket207TestCase extends SeleniumTestCase +class Ticket207TestCase extends PradoGenericSeleniumTest { function test() { @@ -33,5 +33,3 @@ class Ticket207TestCase extends SeleniumTestCase $this->assertVisible("{$base}validator2"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket21TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket21TestCase.php index 24c5e346..5e48ff2d 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket21TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket21TestCase.php @@ -1,12 +1,9 @@ <?php -class Ticket21TestCase extends SeleniumTestCase +class Ticket21TestCase extends PradoGenericSeleniumTest { function test() { - //problem with test runner clicking on radio buttons - $this->skipBrowsers(self::OPERA); - $this->open('tickets/index.php?page=Ticket21'); $this->assertTitle("Verifying Ticket 21"); $this->clickAndWait("ctl0_Content_button1"); @@ -15,5 +12,3 @@ class Ticket21TestCase extends SeleniumTestCase $this->verifyTextPresent("Radio button clicks: 1", ""); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket220TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket220TestCase.php index 0753f732..72a1b227 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket220TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket220TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket220TestCase extends SeleniumTestCase +class Ticket220TestCase extends PradoGenericSeleniumTest { function test() { @@ -14,5 +14,3 @@ class Ticket220TestCase extends SeleniumTestCase $this->assertAlertNotPresent(); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket225TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket225TestCase.php index e8c0f612..c723be38 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket225TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket225TestCase.php @@ -1,12 +1,9 @@ <?php -class Ticket225TestCase extends SeleniumTestCase +class Ticket225TestCase extends PradoGenericSeleniumTest { function test() { - //problem with test runner clicking on radio buttons - $this->skipBrowsers(self::OPERA); - $base="ctl0_Content_"; $this->open('tickets/index.php?page=Ticket225'); $this->assertTextPresent('RadioButton Group Tests'); @@ -23,5 +20,3 @@ class Ticket225TestCase extends SeleniumTestCase $this->assertNotVisible("{$base}validator1"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket227TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket227TestCase.php index c0dd2a98..1f1c0fb9 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket227TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket227TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket227TestCase extends SeleniumTestCase +class Ticket227TestCase extends PradoGenericSeleniumTest { function test() { @@ -8,5 +8,3 @@ class Ticket227TestCase extends SeleniumTestCase $this->assertTitle('Verifying Ticket 227'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket239TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket239TestCase.php index 2fe84397..57251d23 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket239TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket239TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket239TestCase extends SeleniumTestCase +class Ticket239TestCase extends PradoGenericSeleniumTest { function test() { @@ -51,5 +51,3 @@ class Ticket239TestCase extends SeleniumTestCase $this->verifyTextNotPresent('view3 is deactivated',''); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket246TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket246TestCase.php index 8f07790e..bedd6e2c 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket246TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket246TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket246TestCase extends SeleniumTestCase +class Ticket246TestCase extends PradoGenericSeleniumTest { function test() { @@ -8,5 +8,3 @@ class Ticket246TestCase extends SeleniumTestCase $this->assertTitle('Verifying Ticket 246'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket274TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket274TestCase.php index b7ba1251..b2b17de7 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket274TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket274TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket274TestCase extends SeleniumTestCase +class Ticket274TestCase extends PradoGenericSeleniumTest { function test() { @@ -20,5 +20,3 @@ class Ticket274TestCase extends SeleniumTestCase $this->assertVisible($base.'validator2'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket278TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket278TestCase.php index a559ca14..4bfffede 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket278TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket278TestCase.php @@ -1,12 +1,9 @@ <?php -class Ticket278TestCase extends SeleniumTestCase +class Ticket278TestCase extends PradoGenericSeleniumTest { function test() { - //problem with test runner clicking on radio buttons - $this->skipBrowsers(self::OPERA); - $base = 'ctl0_Content_'; $this->open('tickets/index.php?page=Ticket278'); $this->assertTitle('Verifying Ticket 278'); @@ -53,5 +50,3 @@ class Ticket278TestCase extends SeleniumTestCase $this->assertVisible($base.'panel1'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket27TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket27TestCase.php index dac852e2..7defd7ae 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket27TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket27TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket27TestCase extends SeleniumTestCase +class Ticket27TestCase extends PradoGenericSeleniumTest { function test() { @@ -14,5 +14,3 @@ class Ticket27TestCase extends SeleniumTestCase $this->assertNotVisible("ctl0_Content_validator1", ""); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket284TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket284TestCase.php index 15194f60..d28ea771 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket284TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket284TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket284TestCase extends SeleniumTestCase +class Ticket284TestCase extends PradoGenericSeleniumTest { function test() { @@ -10,5 +10,3 @@ class Ticket284TestCase extends SeleniumTestCase } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket285TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket285TestCase.php index 6f4a2a8e..8b996964 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket285TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket285TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket285TestCase extends SeleniumTestCase +class Ticket285TestCase extends PradoGenericSeleniumTest { function test() { @@ -8,5 +8,4 @@ class Ticket285TestCase extends SeleniumTestCase $this->assertTextPresent('350.00'); $this->assertTextPresent('349.99'); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket28TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket28TestCase.php index 960dd2d8..1f64b3f9 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket28TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket28TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket28TestCase extends SeleniumTestCase +class Ticket28TestCase extends PradoGenericSeleniumTest { function test() @@ -11,5 +11,3 @@ class Ticket28TestCase extends SeleniumTestCase $this->assertTextPresent('Link Button 1 Clicked!'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket290TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket290TestCase.php index e32e58bf..214c728b 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket290TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket290TestCase.php @@ -3,7 +3,7 @@ /** * */ -class Ticket290TestCase extends SeleniumTestCase +class Ticket290TestCase extends PradoGenericSeleniumTest { function test() { @@ -22,5 +22,3 @@ class Ticket290TestCase extends SeleniumTestCase } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket433TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket433TestCase.php index b855edc8..b8462988 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket433TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket433TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket433TestCase extends SeleniumTestCase +class Ticket433TestCase extends PradoGenericSeleniumTest { function test() { @@ -14,5 +14,3 @@ class Ticket433TestCase extends SeleniumTestCase $this->assertText("{$base}VoteClick", "AFTER click CALLBACK DONE"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket439TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket439TestCase.php index e097a9ce..c393de91 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket439TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket439TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket439TestCase extends SeleniumTestCase +class Ticket439TestCase extends PradoGenericSeleniumTest { function test() { @@ -12,5 +12,4 @@ class Ticket439TestCase extends SeleniumTestCase $this->pause(800); $this->assertTitle("Verifying Home"); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket463TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket463TestCase.php index 9da3be34..34ffb8fd 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket463TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket463TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket463TestCase extends SeleniumTestCase +class Ticket463TestCase extends PradoGenericSeleniumTest { function test() { @@ -9,5 +9,3 @@ class Ticket463TestCase extends SeleniumTestCase $this->assertTextPresent('May 1, 2005 12:00:00 AM'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket470TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket470TestCase.php index a2c4826e..4a2804ea 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket470TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket470TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket470TestCase extends SeleniumTestCase +class Ticket470TestCase extends PradoGenericSeleniumTest { function test() { @@ -47,5 +47,3 @@ class Ticket470TestCase extends SeleniumTestCase $this->assertNotVisible("{$base}validator1"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket477TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket477TestCase.php index 10c36e7d..16ebc56e 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket477TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket477TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket477TestCase extends SeleniumTestCase +class Ticket477TestCase extends PradoGenericSeleniumTest { function test() { @@ -20,5 +20,3 @@ class Ticket477TestCase extends SeleniumTestCase $this->assertVisible("{$base}validator2"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket488TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket488TestCase.php index d96b92f1..c3b2f43f 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket488TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket488TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket488TestCase extends SeleniumTestCase +class Ticket488TestCase extends PradoGenericSeleniumTest { function test() { @@ -38,5 +38,3 @@ class Ticket488TestCase extends SeleniumTestCase //add test assertions here. } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket504TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket504TestCase.php index 5629e5f3..63ecfe2f 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket504TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket504TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket504TestCase extends SeleniumTestCase +class Ticket504TestCase extends PradoGenericSeleniumTest { function test() { @@ -49,5 +49,3 @@ class Ticket504TestCase extends SeleniumTestCase } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket507TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket507TestCase.php index a430fb4e..19d54e9b 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket507TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket507TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket507TestCase extends SeleniumTestCase +class Ticket507TestCase extends PradoGenericSeleniumTest { function test() { @@ -23,5 +23,3 @@ class Ticket507TestCase extends SeleniumTestCase $this->assertText("{$base}label1", "Selection: value 1, value 3"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket521TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket521TestCase.php index b0cdd8af..2df88612 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket521TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket521TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket521TestCase extends SeleniumTestCase +class Ticket521TestCase extends PradoGenericSeleniumTest { function test() { @@ -16,5 +16,3 @@ class Ticket521TestCase extends SeleniumTestCase } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket526TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket526TestCase.php index c8894082..7476db69 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket526TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket526TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket526TestCase extends SeleniumTestCase +class Ticket526TestCase extends PradoGenericSeleniumTest { function test() { @@ -14,5 +14,4 @@ class Ticket526TestCase extends SeleniumTestCase $this->pause(800); $this->assertElementPresent("{$base}dpbutton"); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket528TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket528TestCase.php index 79791444..3903000a 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket528TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket528TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket528TestCase extends SeleniumTestCase +class Ticket528TestCase extends PradoGenericSeleniumTest { function test() { @@ -28,5 +28,3 @@ class Ticket528TestCase extends SeleniumTestCase } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket535TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket535TestCase.php index 222f4b7b..f3ed5bf1 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket535TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket535TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket535TestCase extends SeleniumTestCase +class Ticket535TestCase extends PradoGenericSeleniumTest { function test() { @@ -32,5 +32,3 @@ class Ticket535TestCase extends SeleniumTestCase } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket538TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket538TestCase.php index 20730b25..16b0f863 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket538TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket538TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket538TestCase extends SeleniumTestCase +class Ticket538TestCase extends PradoGenericSeleniumTest { function test() { @@ -26,5 +26,3 @@ class Ticket538TestCase extends SeleniumTestCase $this->assertText("{$base}ALLog", '4- "test1", 10- "test2",'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket54TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket54TestCase.php index 62d2599d..f8e5a469 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket54TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket54TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket54TestCase extends SeleniumTestCase +class Ticket54TestCase extends PradoGenericSeleniumTest { function test() { @@ -8,5 +8,3 @@ class Ticket54TestCase extends SeleniumTestCase $this->verifyTextPresent("|A|a|B|b|C|", ""); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket573TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket573TestCase.php index 755d5dd6..996d72e9 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket573TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket573TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket573TestCase extends SeleniumTestCase +class Ticket573TestCase extends PradoGenericSeleniumTest { function test() { @@ -10,5 +10,3 @@ class Ticket573TestCase extends SeleniumTestCase $this->assertText('test1', '10.00'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket578TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket578TestCase.php index 5f3bd4d6..bc115927 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket578TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket578TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket578TestCase extends SeleniumTestCase +class Ticket578TestCase extends PradoGenericSeleniumTest { function test() { @@ -25,5 +25,3 @@ class Ticket578TestCase extends SeleniumTestCase return 'javascript{'."{$tinymce}.setHTML('{$text}') ? 0 : 1".'}'; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket585TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket585TestCase.php index 2b3f671b..8b2d36b3 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket585TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket585TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket585TestCase extends SeleniumTestCase +class Ticket585TestCase extends PradoGenericSeleniumTest { function test() { @@ -23,5 +23,3 @@ class Ticket585TestCase extends SeleniumTestCase $this->assertVisible("{$base}validator1"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket586TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket586TestCase.php index 037b9223..04b9fe57 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket586TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket586TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket586TestCase extends SeleniumTestCase +class Ticket586TestCase extends PradoGenericSeleniumTest { function test() { @@ -17,5 +17,3 @@ class Ticket586TestCase extends SeleniumTestCase $this->assertText("{$base}label1", "Button 2 (default) Clicked!"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket587TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket587TestCase.php index f8255a2f..c7662b5c 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket587TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket587TestCase.php @@ -1,10 +1,9 @@ <?php -class Ticket587TestCase extends SeleniumTestCase +class Ticket587TestCase extends PradoGenericSeleniumTest { function testKeyPress() { - $this->skipBrowsers(self::INTERNET_EXPLORER); $base = 'ctl0_Content_'; $this->open('tickets/index.php?page=Ticket587_reopened'); $this->assertTitle("Verifying Ticket 587_reopened"); @@ -43,5 +42,3 @@ class Ticket587TestCase extends SeleniumTestCase $this->assertText($base."label1", "Selection 2: asd 3 - item 2"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket592TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket592TestCase.php index b6a734b8..8f49ff91 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket592TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket592TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket592TestCase extends SeleniumTestCase +class Ticket592TestCase extends PradoGenericSeleniumTest { function test() { @@ -43,5 +43,3 @@ class Ticket592TestCase extends SeleniumTestCase } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket595TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket595TestCase.php index 4321bd67..317795d6 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket595TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket595TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket595TestCase extends SeleniumTestCase +class Ticket595TestCase extends PradoGenericSeleniumTest { function test() { @@ -36,4 +36,3 @@ class Ticket595TestCase extends SeleniumTestCase $this->assertAttribute($base.'B@class','null'); } } -?> diff --git a/tests/FunctionalTests/tickets/tests/Ticket622TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket622TestCase.php index 61b7d314..9210d9b5 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket622TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket622TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket622TestCase extends SeleniumTestCase +class Ticket622TestCase extends PradoGenericSeleniumTest { function test() { @@ -15,4 +15,3 @@ class Ticket622TestCase extends SeleniumTestCase $this->assertAttribute('css=span#arb span@style','null'); } } -?> diff --git a/tests/FunctionalTests/tickets/tests/Ticket653TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket653TestCase.php index d4a05fd8..ec5eceb4 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket653TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket653TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket653TestCase extends SeleniumTestCase +class Ticket653TestCase extends PradoGenericSeleniumTest { function test() { @@ -11,5 +11,3 @@ class Ticket653TestCase extends SeleniumTestCase $this->assertText('textspan', 'This is the page for Ticket653'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket656TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket656TestCase.php index df77334b..ff167b0e 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket656TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket656TestCase.php @@ -1,5 +1,5 @@ <?php -class Ticket656TestCase extends SeleniumTestCase +class Ticket656TestCase extends PradoGenericSeleniumTest { function test() { @@ -21,5 +21,4 @@ class Ticket656TestCase extends SeleniumTestCase $this->assertText($base."lblStatus",date("d-m-Y", mktime(0,0,0,10,20,2008))); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket659TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket659TestCase.php index 8d705772..91326e9d 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket659TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket659TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket659TestCase extends SeleniumTestCase +class Ticket659TestCase extends PradoGenericSeleniumTest { function test() { @@ -19,5 +19,3 @@ class Ticket659TestCase extends SeleniumTestCase $this->assertText("${base}lbl", "Up"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket660TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket660TestCase.php index 5156d7b4..7fcc5766 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket660TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket660TestCase.php @@ -1,5 +1,5 @@ <?php -class Ticket660TestCase extends SeleniumTestCase +class Ticket660TestCase extends PradoGenericSeleniumTest { function test() { @@ -23,4 +23,3 @@ class Ticket660TestCase extends SeleniumTestCase } } -?> diff --git a/tests/FunctionalTests/tickets/tests/Ticket669TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket669TestCase.php index c3c2fa5d..be3483f4 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket669TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket669TestCase.php @@ -1,5 +1,5 @@ <?php -class Ticket669TestCase extends SeleniumTestCase +class Ticket669TestCase extends PradoGenericSeleniumTest { function test() { @@ -44,5 +44,4 @@ class Ticket669TestCase extends SeleniumTestCase } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket670TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket670TestCase.php index 657e1137..33e45b49 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket670TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket670TestCase.php @@ -1,5 +1,5 @@ <?php -class Ticket670TestCase extends SeleniumTestCase +class Ticket670TestCase extends PradoGenericSeleniumTest { function test() { @@ -18,5 +18,4 @@ class Ticket670TestCase extends SeleniumTestCase } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket671TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket671TestCase.php index 866fc330..031dc991 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket671TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket671TestCase.php @@ -1,5 +1,5 @@ <?php -class Ticket671TestCase extends SeleniumTestCase +class Ticket671TestCase extends PradoGenericSeleniumTest { function test() { @@ -38,5 +38,4 @@ class Ticket671TestCase extends SeleniumTestCase $this->verifyText($base.'lblResult2', 'Thanks !'); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket671_reopenedTestCase.php b/tests/FunctionalTests/tickets/tests/Ticket671_reopenedTestCase.php index 63c191cb..639f9e3d 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket671_reopenedTestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket671_reopenedTestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket671_reopenedTestCase extends SeleniumTestCase +class Ticket671_reopenedTestCase extends PradoGenericSeleniumTest { function test() { @@ -46,5 +46,4 @@ class Ticket671_reopenedTestCase extends SeleniumTestCase $this->assertText($base.'Result', 'Check callback called (6) --- Save callback called DATA OK'); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket679TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket679TestCase.php index 9ab29115..4ee22c20 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket679TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket679TestCase.php @@ -1,5 +1,5 @@ <?php -class Ticket679TestCase extends SeleniumTestCase +class Ticket679TestCase extends PradoGenericSeleniumTest { function test() { @@ -33,5 +33,4 @@ class Ticket679TestCase extends SeleniumTestCase $this->pause(800); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket691TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket691TestCase.php index 12371e74..a441f82c 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket691TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket691TestCase.php @@ -1,5 +1,5 @@ <?php -class Ticket691TestCase extends SeleniumTestCase +class Ticket691TestCase extends PradoGenericSeleniumTest { function test() { @@ -13,5 +13,4 @@ class Ticket691TestCase extends SeleniumTestCase $this->assertText($base."Result", "You vote 3"); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket698TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket698TestCase.php index 30911d5d..8f58a320 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket698TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket698TestCase.php @@ -1,5 +1,5 @@ <?php -class Ticket698TestCase extends SeleniumTestCase +class Ticket698TestCase extends PradoGenericSeleniumTest { function test() { @@ -16,5 +16,4 @@ class Ticket698TestCase extends SeleniumTestCase $this->assertNotVisible($base."EditHtmlTextBox"); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket700TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket700TestCase.php index c8929693..0366c2fc 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket700TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket700TestCase.php @@ -1,5 +1,5 @@ <?php -class Ticket700TestCase extends SeleniumTestCase +class Ticket700TestCase extends PradoGenericSeleniumTest { function test() { @@ -68,5 +68,4 @@ class Ticket700TestCase extends SeleniumTestCase $this->assertTextPresent('|Param5: Set at app config|'); $this->clickAndWait('ctl0_Logout'); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket703TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket703TestCase.php index b001aa28..515bc275 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket703TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket703TestCase.php @@ -1,5 +1,5 @@ <?php -class Ticket703TestCase extends SeleniumTestCase +class Ticket703TestCase extends PradoGenericSeleniumTest { function test() { @@ -17,5 +17,4 @@ class Ticket703TestCase extends SeleniumTestCase $this->click($base.'ctl1'); $this->assertTextPresent($base.'logBox', "Test of prado logging system"); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket708TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket708TestCase.php index 7c9f706b..87509b29 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket708TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket708TestCase.php @@ -1,5 +1,5 @@ <?php -class Ticket708TestCase extends SeleniumTestCase +class Ticket708TestCase extends PradoGenericSeleniumTest { function test() { @@ -24,5 +24,4 @@ class Ticket708TestCase extends SeleniumTestCase $this->assertText($base."Result", "You have selected Radio Button #4"); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket719TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket719TestCase.php index 51b321ad..e340306a 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket719TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket719TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket719TestCase extends SeleniumTestCase +class Ticket719TestCase extends PradoGenericSeleniumTest { function test() { @@ -36,5 +36,3 @@ class Ticket719TestCase extends SeleniumTestCase $this->assertText("${base}Result", "TextBox Content : Prado -- Autocomplete Content :France"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket722TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket722TestCase.php index 68a0282c..62e13526 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket722TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket722TestCase.php @@ -1,5 +1,5 @@ <?php -class Ticket722TestCase extends SeleniumTestCase +class Ticket722TestCase extends PradoGenericSeleniumTest { function test() { @@ -25,5 +25,4 @@ class Ticket722TestCase extends SeleniumTestCase } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket72TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket72TestCase.php index 346b08e3..111b7583 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket72TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket72TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket72TestCase extends SeleniumTestCase +class Ticket72TestCase extends PradoGenericSeleniumTest { function test() { @@ -12,5 +12,3 @@ class Ticket72TestCase extends SeleniumTestCase $this->verifyTextNotPresent("abcefg", ""); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket745TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket745TestCase.php index 492b10ae..f822e37f 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket745TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket745TestCase.php @@ -1,5 +1,5 @@ <?php -class Ticket745TestCase extends SeleniumTestCase +class Ticket745TestCase extends PradoGenericSeleniumTest { function test() { @@ -14,5 +14,4 @@ class Ticket745TestCase extends SeleniumTestCase } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket769TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket769TestCase.php index 3a993d87..468342a5 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket769TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket769TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket769TestCase extends SeleniumTestCase +class Ticket769TestCase extends PradoGenericSeleniumTest { function test() { @@ -33,5 +33,4 @@ class Ticket769TestCase extends SeleniumTestCase $this->verifyTextPresent($base.'ctl0', 'T1 clicked clicked' ); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket785TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket785TestCase.php index 153422be..229a68eb 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket785TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket785TestCase.php @@ -1,5 +1,5 @@ <?php -class Ticket785TestCase extends SeleniumTestCase +class Ticket785TestCase extends PradoGenericSeleniumTest { function test() { @@ -30,5 +30,4 @@ class Ticket785TestCase extends SeleniumTestCase } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket823TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket823TestCase.php index c42990de..11e363ba 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket823TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket823TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket823TestCase extends SeleniumTestCase { +class Ticket823TestCase extends PradoGenericSeleniumTest { public function test() { $this->open('tickets/index.php?page=Ticket823'); @@ -10,4 +10,3 @@ class Ticket823TestCase extends SeleniumTestCase { } } -?> diff --git a/tests/FunctionalTests/tickets/tests/Ticket828TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket828TestCase.php index 0c753a63..bbe185ad 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket828TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket828TestCase.php @@ -1,12 +1,9 @@ <?php -class Ticket828TestCase extends SeleniumTestCase +class Ticket828TestCase extends PradoGenericSeleniumTest { function test() { - //problem with test runner clicking on radio buttons - $this->skipBrowsers(self::OPERA); - $base = "ctl0_Content_"; $this->open("tickets/index.php?page=Ticket828"); $this->click("{$base}submit1"); @@ -37,5 +34,4 @@ class Ticket828TestCase extends SeleniumTestCase $this->assertNotVisible("{$base}validator2"); $this->assertNotVisible("{$base}validator3"); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket849TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket849TestCase.php index 52f47e2e..fef9ac31 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket849TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket849TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket849TestCase extends SeleniumTestCase +class Ticket849TestCase extends PradoGenericSeleniumTest { function test() { @@ -14,5 +14,3 @@ class Ticket849TestCase extends SeleniumTestCase $this->assertValue($base.'ctl0', date('m-d-Y')); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket876TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket876TestCase.php index 0ad9ebfa..8006dd09 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket876TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket876TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket876TestCase extends SeleniumTestCase { +class Ticket876TestCase extends PradoGenericSeleniumTest { public function test() { $this->open('tickets/index.php?page=Ticket876'); @@ -20,4 +20,3 @@ class Ticket876TestCase extends SeleniumTestCase { } -?> diff --git a/tests/FunctionalTests/tickets/tests/Ticket886TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket886TestCase.php index 1350096b..99990ebf 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket886TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket886TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket886TestCase extends SeleniumTestCase +class Ticket886TestCase extends PradoGenericSeleniumTest { function test() { @@ -12,4 +12,3 @@ class Ticket886TestCase extends SeleniumTestCase } } -?> diff --git a/tests/FunctionalTests/tickets/tests/Ticket897TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket897TestCase.php index c59dbdcd..67d1f1f2 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket897TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket897TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket897TestCase extends SeleniumTestCase +class Ticket897TestCase extends PradoGenericSeleniumTest { function test() { @@ -16,4 +16,3 @@ class Ticket897TestCase extends SeleniumTestCase } } -?> diff --git a/tests/FunctionalTests/tickets/tests/Ticket900TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket900TestCase.php index b80e1187..3ec69873 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket900TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket900TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket900TestCase extends SeleniumTestCase +class Ticket900TestCase extends PradoGenericSeleniumTest { function test() { @@ -16,4 +16,3 @@ class Ticket900TestCase extends SeleniumTestCase } } -?> diff --git a/tests/FunctionalTests/tickets/tests/Ticket922TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket922TestCase.php index 8420c10d..208bd1d0 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket922TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket922TestCase.php @@ -1,6 +1,6 @@ <?php -class Ticket922TestCase extends SeleniumTestCase +class Ticket922TestCase extends PradoGenericSeleniumTest { function test() { @@ -15,4 +15,3 @@ class Ticket922TestCase extends SeleniumTestCase } } -?> diff --git a/tests/FunctionalTests/tickets/tests/Ticket93TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket93TestCase.php index 8d11f98b..a56925a8 100644..100755 --- a/tests/FunctionalTests/tickets/tests/Ticket93TestCase.php +++ b/tests/FunctionalTests/tickets/tests/Ticket93TestCase.php @@ -4,7 +4,7 @@ * */ -class Ticket93TestCase extends SeleniumTestCase +class Ticket93TestCase extends PradoGenericSeleniumTest { function test() { @@ -13,4 +13,3 @@ class Ticket93TestCase extends SeleniumTestCase } } -?> diff --git a/tests/FunctionalTests/validators.php b/tests/FunctionalTests/validators.php deleted file mode 100644 index 521cca56..00000000 --- a/tests/FunctionalTests/validators.php +++ /dev/null @@ -1,8 +0,0 @@ -<?php - -require('../test_tools/functional_tests.php'); - -$tester=new PradoFunctionalTester(dirname(__FILE__).'/validators/tests'); -$tester->run(new SimpleReporter()); - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/validators/assets/.gitignore b/tests/FunctionalTests/validators/assets/.gitignore index d6b7ef32..d6b7ef32 100644..100755 --- a/tests/FunctionalTests/validators/assets/.gitignore +++ b/tests/FunctionalTests/validators/assets/.gitignore diff --git a/tests/FunctionalTests/validators/index.php b/tests/FunctionalTests/validators/index.php index fe127639..77ddf367 100644..100755 --- a/tests/FunctionalTests/validators/index.php +++ b/tests/FunctionalTests/validators/index.php @@ -4,5 +4,3 @@ require_once(dirname(__FILE__).'/../../../framework/prado.php'); $app=new TApplication; $app->run(); - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/validators/protected/pages/Button.page b/tests/FunctionalTests/validators/protected/pages/Button.page index 5acc596b..5acc596b 100644..100755 --- a/tests/FunctionalTests/validators/protected/pages/Button.page +++ b/tests/FunctionalTests/validators/protected/pages/Button.page diff --git a/tests/FunctionalTests/validators/protected/pages/Button.php b/tests/FunctionalTests/validators/protected/pages/Button.php index 94aaf6c8..43913831 100644..100755 --- a/tests/FunctionalTests/validators/protected/pages/Button.php +++ b/tests/FunctionalTests/validators/protected/pages/Button.php @@ -23,5 +23,3 @@ class Button extends TPage $this->Result3->Text.=' and valid'; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/validators/protected/pages/CausesValidation.page b/tests/FunctionalTests/validators/protected/pages/CausesValidation.page index c6748b9a..c6748b9a 100644..100755 --- a/tests/FunctionalTests/validators/protected/pages/CausesValidation.page +++ b/tests/FunctionalTests/validators/protected/pages/CausesValidation.page diff --git a/tests/FunctionalTests/validators/protected/pages/CheckBox.page b/tests/FunctionalTests/validators/protected/pages/CheckBox.page index e5cb39ff..e5cb39ff 100644..100755 --- a/tests/FunctionalTests/validators/protected/pages/CheckBox.page +++ b/tests/FunctionalTests/validators/protected/pages/CheckBox.page diff --git a/tests/FunctionalTests/validators/protected/pages/CheckBox.php b/tests/FunctionalTests/validators/protected/pages/CheckBox.php index f29792e0..641d1419 100644..100755 --- a/tests/FunctionalTests/validators/protected/pages/CheckBox.php +++ b/tests/FunctionalTests/validators/protected/pages/CheckBox.php @@ -23,5 +23,3 @@ class CheckBox extends TPage $this->Result3->Text.=' and valid'; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/validators/protected/pages/CompareValidator.page b/tests/FunctionalTests/validators/protected/pages/CompareValidator.page index 679d2e8e..679d2e8e 100644..100755 --- a/tests/FunctionalTests/validators/protected/pages/CompareValidator.page +++ b/tests/FunctionalTests/validators/protected/pages/CompareValidator.page diff --git a/tests/FunctionalTests/validators/protected/pages/ConditionalValidation.page b/tests/FunctionalTests/validators/protected/pages/ConditionalValidation.page index ad43135b..ad43135b 100644..100755 --- a/tests/FunctionalTests/validators/protected/pages/ConditionalValidation.page +++ b/tests/FunctionalTests/validators/protected/pages/ConditionalValidation.page diff --git a/tests/FunctionalTests/validators/protected/pages/ConditionalValidation.php b/tests/FunctionalTests/validators/protected/pages/ConditionalValidation.php index 83546617..5bdf9282 100644..100755 --- a/tests/FunctionalTests/validators/protected/pages/ConditionalValidation.php +++ b/tests/FunctionalTests/validators/protected/pages/ConditionalValidation.php @@ -17,4 +17,3 @@ class ConditionalValidation extends TPage } } -?> diff --git a/tests/FunctionalTests/validators/protected/pages/CustomValidator.page b/tests/FunctionalTests/validators/protected/pages/CustomValidator.page index 2d0d490b..2d0d490b 100644..100755 --- a/tests/FunctionalTests/validators/protected/pages/CustomValidator.page +++ b/tests/FunctionalTests/validators/protected/pages/CustomValidator.page diff --git a/tests/FunctionalTests/validators/protected/pages/CustomValidator.php b/tests/FunctionalTests/validators/protected/pages/CustomValidator.php index b56a9d8b..1e630601 100644..100755 --- a/tests/FunctionalTests/validators/protected/pages/CustomValidator.php +++ b/tests/FunctionalTests/validators/protected/pages/CustomValidator.php @@ -11,4 +11,3 @@ class CustomValidator extends TPage } } -?> diff --git a/tests/FunctionalTests/validators/protected/pages/DataTypeValidator.page b/tests/FunctionalTests/validators/protected/pages/DataTypeValidator.page index 48821f83..48821f83 100644..100755 --- a/tests/FunctionalTests/validators/protected/pages/DataTypeValidator.page +++ b/tests/FunctionalTests/validators/protected/pages/DataTypeValidator.page diff --git a/tests/FunctionalTests/validators/protected/pages/DatePicker.page b/tests/FunctionalTests/validators/protected/pages/DatePicker.page index 7dfd2788..7dfd2788 100644..100755 --- a/tests/FunctionalTests/validators/protected/pages/DatePicker.page +++ b/tests/FunctionalTests/validators/protected/pages/DatePicker.page diff --git a/tests/FunctionalTests/validators/protected/pages/Home.php b/tests/FunctionalTests/validators/protected/pages/Home.php index 37804419..9bb123b9 100755 --- a/tests/FunctionalTests/validators/protected/pages/Home.php +++ b/tests/FunctionalTests/validators/protected/pages/Home.php @@ -30,5 +30,3 @@ class Home extends TPage return $list; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/validators/protected/pages/ImageButton.page b/tests/FunctionalTests/validators/protected/pages/ImageButton.page index d1fae361..d1fae361 100644..100755 --- a/tests/FunctionalTests/validators/protected/pages/ImageButton.page +++ b/tests/FunctionalTests/validators/protected/pages/ImageButton.page diff --git a/tests/FunctionalTests/validators/protected/pages/ImageButton.php b/tests/FunctionalTests/validators/protected/pages/ImageButton.php index 65392b75..175c5f55 100644..100755 --- a/tests/FunctionalTests/validators/protected/pages/ImageButton.php +++ b/tests/FunctionalTests/validators/protected/pages/ImageButton.php @@ -23,5 +23,3 @@ class ImageButton extends TPage $this->Result3->Text.=' and valid'; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/validators/protected/pages/Layout.php b/tests/FunctionalTests/validators/protected/pages/Layout.php index 7f5e5802..723f200c 100644..100755 --- a/tests/FunctionalTests/validators/protected/pages/Layout.php +++ b/tests/FunctionalTests/validators/protected/pages/Layout.php @@ -3,5 +3,3 @@ class Layout extends TTemplateControl { } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/validators/protected/pages/Layout.tpl b/tests/FunctionalTests/validators/protected/pages/Layout.tpl index 25dbea09..25dbea09 100644..100755 --- a/tests/FunctionalTests/validators/protected/pages/Layout.tpl +++ b/tests/FunctionalTests/validators/protected/pages/Layout.tpl diff --git a/tests/FunctionalTests/validators/protected/pages/LinkButton.page b/tests/FunctionalTests/validators/protected/pages/LinkButton.page index 8ed1c338..8ed1c338 100644..100755 --- a/tests/FunctionalTests/validators/protected/pages/LinkButton.page +++ b/tests/FunctionalTests/validators/protected/pages/LinkButton.page diff --git a/tests/FunctionalTests/validators/protected/pages/LinkButton.php b/tests/FunctionalTests/validators/protected/pages/LinkButton.php index 2b5a3c23..2da51c20 100644..100755 --- a/tests/FunctionalTests/validators/protected/pages/LinkButton.php +++ b/tests/FunctionalTests/validators/protected/pages/LinkButton.php @@ -23,5 +23,3 @@ class LinkButton extends TPage $this->Result3->Text.=' and valid'; } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/validators/protected/pages/ListControl.page b/tests/FunctionalTests/validators/protected/pages/ListControl.page index 1429e184..1429e184 100644..100755 --- a/tests/FunctionalTests/validators/protected/pages/ListControl.page +++ b/tests/FunctionalTests/validators/protected/pages/ListControl.page diff --git a/tests/FunctionalTests/validators/protected/pages/RangeValidatorDate.page b/tests/FunctionalTests/validators/protected/pages/RangeValidatorDate.page index f7f65460..f7f65460 100644..100755 --- a/tests/FunctionalTests/validators/protected/pages/RangeValidatorDate.page +++ b/tests/FunctionalTests/validators/protected/pages/RangeValidatorDate.page diff --git a/tests/FunctionalTests/validators/protected/pages/RangeValidatorFloat.page b/tests/FunctionalTests/validators/protected/pages/RangeValidatorFloat.page index 18c476c7..18c476c7 100644..100755 --- a/tests/FunctionalTests/validators/protected/pages/RangeValidatorFloat.page +++ b/tests/FunctionalTests/validators/protected/pages/RangeValidatorFloat.page diff --git a/tests/FunctionalTests/validators/protected/pages/RangeValidatorInteger.page b/tests/FunctionalTests/validators/protected/pages/RangeValidatorInteger.page index 922236e5..922236e5 100644..100755 --- a/tests/FunctionalTests/validators/protected/pages/RangeValidatorInteger.page +++ b/tests/FunctionalTests/validators/protected/pages/RangeValidatorInteger.page diff --git a/tests/FunctionalTests/validators/protected/pages/RangeValidatorString.page b/tests/FunctionalTests/validators/protected/pages/RangeValidatorString.page index 64e596d6..64e596d6 100644..100755 --- a/tests/FunctionalTests/validators/protected/pages/RangeValidatorString.page +++ b/tests/FunctionalTests/validators/protected/pages/RangeValidatorString.page diff --git a/tests/FunctionalTests/validators/protected/pages/RegularExpressionValidator.page b/tests/FunctionalTests/validators/protected/pages/RegularExpressionValidator.page index cfd7a333..cfd7a333 100644..100755 --- a/tests/FunctionalTests/validators/protected/pages/RegularExpressionValidator.page +++ b/tests/FunctionalTests/validators/protected/pages/RegularExpressionValidator.page diff --git a/tests/FunctionalTests/validators/protected/pages/RequiredFieldValidator.page b/tests/FunctionalTests/validators/protected/pages/RequiredFieldValidator.page index f8a1c4ca..f8a1c4ca 100644..100755 --- a/tests/FunctionalTests/validators/protected/pages/RequiredFieldValidator.page +++ b/tests/FunctionalTests/validators/protected/pages/RequiredFieldValidator.page diff --git a/tests/FunctionalTests/validators/protected/pages/RequiredListValidator.page b/tests/FunctionalTests/validators/protected/pages/RequiredListValidator.page index d527ee9d..d527ee9d 100644..100755 --- a/tests/FunctionalTests/validators/protected/pages/RequiredListValidator.page +++ b/tests/FunctionalTests/validators/protected/pages/RequiredListValidator.page diff --git a/tests/FunctionalTests/validators/protected/pages/StringRangeValidator.page b/tests/FunctionalTests/validators/protected/pages/StringRangeValidator.page index 14f63801..14f63801 100644..100755 --- a/tests/FunctionalTests/validators/protected/pages/StringRangeValidator.page +++ b/tests/FunctionalTests/validators/protected/pages/StringRangeValidator.page diff --git a/tests/FunctionalTests/validators/protected/pages/ValidationSummary.page b/tests/FunctionalTests/validators/protected/pages/ValidationSummary.page index d260a93a..d260a93a 100644..100755 --- a/tests/FunctionalTests/validators/protected/pages/ValidationSummary.page +++ b/tests/FunctionalTests/validators/protected/pages/ValidationSummary.page diff --git a/tests/FunctionalTests/validators/protected/pages/config.xml b/tests/FunctionalTests/validators/protected/pages/config.xml index 83bb5791..83bb5791 100644..100755 --- a/tests/FunctionalTests/validators/protected/pages/config.xml +++ b/tests/FunctionalTests/validators/protected/pages/config.xml diff --git a/tests/FunctionalTests/validators/protected/runtime/.gitignore b/tests/FunctionalTests/validators/protected/runtime/.gitignore index d6b7ef32..d6b7ef32 100644..100755 --- a/tests/FunctionalTests/validators/protected/runtime/.gitignore +++ b/tests/FunctionalTests/validators/protected/runtime/.gitignore diff --git a/tests/FunctionalTests/validators/tests/ButtonTestCase.php b/tests/FunctionalTests/validators/tests/ButtonTestCase.php index 99ebf4a4..58001322 100644..100755 --- a/tests/FunctionalTests/validators/tests/ButtonTestCase.php +++ b/tests/FunctionalTests/validators/tests/ButtonTestCase.php @@ -1,6 +1,6 @@ <?php -class ButtonTestCase extends SeleniumTestCase +class ButtonTestCase extends PradoGenericSeleniumTest { function test() { @@ -61,5 +61,3 @@ class ButtonTestCase extends SeleniumTestCase $this->verifyTextPresent('Button3 is clicked and valid'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/validators/tests/CheckBoxTestCase.php b/tests/FunctionalTests/validators/tests/CheckBoxTestCase.php index 957a7cbf..847cbc9a 100644..100755 --- a/tests/FunctionalTests/validators/tests/CheckBoxTestCase.php +++ b/tests/FunctionalTests/validators/tests/CheckBoxTestCase.php @@ -1,12 +1,9 @@ <?php -class CheckBoxTestCase extends SeleniumTestCase +class CheckBoxTestCase extends PradoGenericSeleniumTest { function test() { - //problem with test runner clicking on radio buttons - $this->skipBrowsers(self::OPERA); - $this->open('validators/index.php?page=CheckBox'); @@ -66,5 +63,3 @@ class CheckBoxTestCase extends SeleniumTestCase $this->verifyTextPresent('Button3 is clicked and valid'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/validators/tests/CompareValidatorTestCase.php b/tests/FunctionalTests/validators/tests/CompareValidatorTestCase.php index 5a7dbc80..187351c1 100644..100755 --- a/tests/FunctionalTests/validators/tests/CompareValidatorTestCase.php +++ b/tests/FunctionalTests/validators/tests/CompareValidatorTestCase.php @@ -1,7 +1,7 @@ <?php //New Test -class CompareValidatorTestCase extends SeleniumTestCase +class CompareValidatorTestCase extends PradoGenericSeleniumTest { function test() { @@ -42,5 +42,3 @@ class CompareValidatorTestCase extends SeleniumTestCase } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/validators/tests/ConditionalValidationTestCase.php b/tests/FunctionalTests/validators/tests/ConditionalValidationTestCase.php index 0c0ffc51..02b174ef 100644..100755 --- a/tests/FunctionalTests/validators/tests/ConditionalValidationTestCase.php +++ b/tests/FunctionalTests/validators/tests/ConditionalValidationTestCase.php @@ -1,6 +1,6 @@ <?php -class ConditionalValidationTestCase extends SeleniumTestCase +class ConditionalValidationTestCase extends PradoGenericSeleniumTest { function test() { @@ -52,4 +52,3 @@ class ConditionalValidationTestCase extends SeleniumTestCase } -?> diff --git a/tests/FunctionalTests/validators/tests/CustomValidatorTestCase.php b/tests/FunctionalTests/validators/tests/CustomValidatorTestCase.php index c5cbae8e..106f7a00 100644..100755 --- a/tests/FunctionalTests/validators/tests/CustomValidatorTestCase.php +++ b/tests/FunctionalTests/validators/tests/CustomValidatorTestCase.php @@ -1,7 +1,7 @@ <?php //New Test -class CustomValidatorTestCase extends SeleniumTestCase +class CustomValidatorTestCase extends PradoGenericSeleniumTest { function test() { @@ -27,5 +27,3 @@ class CustomValidatorTestCase extends SeleniumTestCase } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/validators/tests/DataTypeValidatorTestCase.php b/tests/FunctionalTests/validators/tests/DataTypeValidatorTestCase.php index c7c4bdb6..5ec5f065 100644..100755 --- a/tests/FunctionalTests/validators/tests/DataTypeValidatorTestCase.php +++ b/tests/FunctionalTests/validators/tests/DataTypeValidatorTestCase.php @@ -3,7 +3,7 @@ * Created on 25/04/2006 */ -class DataTypeValidatorTestCase extends SeleniumTestCase +class DataTypeValidatorTestCase extends PradoGenericSeleniumTest { function test() { @@ -46,4 +46,3 @@ class DataTypeValidatorTestCase extends SeleniumTestCase } -?> diff --git a/tests/FunctionalTests/validators/tests/DatePickerTestCase.php b/tests/FunctionalTests/validators/tests/DatePickerTestCase.php index 12368448..e7425a33 100644..100755 --- a/tests/FunctionalTests/validators/tests/DatePickerTestCase.php +++ b/tests/FunctionalTests/validators/tests/DatePickerTestCase.php @@ -1,6 +1,6 @@ <?php -class DatePickerTestCase extends SeleniumTestCase +class DatePickerTestCase extends PradoGenericSeleniumTest { function test() { @@ -69,4 +69,3 @@ class DatePickerTestCase extends SeleniumTestCase } -?> diff --git a/tests/FunctionalTests/validators/tests/ImageButtonTestCase.php b/tests/FunctionalTests/validators/tests/ImageButtonTestCase.php index a83c4f89..e6b5d6d8 100644..100755 --- a/tests/FunctionalTests/validators/tests/ImageButtonTestCase.php +++ b/tests/FunctionalTests/validators/tests/ImageButtonTestCase.php @@ -1,6 +1,6 @@ <?php -class ImageButtonTestCase extends SeleniumTestCase +class ImageButtonTestCase extends PradoGenericSeleniumTest { function test() { @@ -61,5 +61,3 @@ class ImageButtonTestCase extends SeleniumTestCase $this->verifyTextPresent('Button3 is clicked and valid'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/validators/tests/LinkButtonTestCase.php b/tests/FunctionalTests/validators/tests/LinkButtonTestCase.php index fa9508fb..b523452c 100644..100755 --- a/tests/FunctionalTests/validators/tests/LinkButtonTestCase.php +++ b/tests/FunctionalTests/validators/tests/LinkButtonTestCase.php @@ -1,6 +1,6 @@ <?php -class LinkButtonTestCase extends SeleniumTestCase +class LinkButtonTestCase extends PradoGenericSeleniumTest { function test() { @@ -60,5 +60,3 @@ class LinkButtonTestCase extends SeleniumTestCase $this->verifyTextPresent('Button3 is clicked and valid'); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/validators/tests/ListControlTestCase.php b/tests/FunctionalTests/validators/tests/ListControlTestCase.php index e4281794..68feee84 100644..100755 --- a/tests/FunctionalTests/validators/tests/ListControlTestCase.php +++ b/tests/FunctionalTests/validators/tests/ListControlTestCase.php @@ -3,13 +3,10 @@ * Created on 24/04/2006 */ -class ListControlTestCase extends SeleniumTestCase +class ListControlTestCase extends PradoGenericSeleniumTest { function test() { - //problem with test runner clicking on radio buttons - $this->skipBrowsers(self::OPERA); - $base = "ctl0_Content_"; $this->open("validators/index.php?page=ListControl", ""); $this->verifyTextPresent("List Control Required Field Validation Test", ""); @@ -48,4 +45,3 @@ class ListControlTestCase extends SeleniumTestCase } -?> diff --git a/tests/FunctionalTests/validators/tests/RangeValidatorTestCase.php b/tests/FunctionalTests/validators/tests/RangeValidatorTestCase.php index 31ad6c23..022ee7f6 100644..100755 --- a/tests/FunctionalTests/validators/tests/RangeValidatorTestCase.php +++ b/tests/FunctionalTests/validators/tests/RangeValidatorTestCase.php @@ -1,7 +1,7 @@ <?php //New Test -class RangeValidatorTestCase extends SeleniumTestCase +class RangeValidatorTestCase extends PradoGenericSeleniumTest { function testIntegerRange() { @@ -164,4 +164,3 @@ class RangeValidatorTestCase extends SeleniumTestCase } } -?> diff --git a/tests/FunctionalTests/validators/tests/RegExpValidatorTestCase.php b/tests/FunctionalTests/validators/tests/RegExpValidatorTestCase.php index 40719cf3..f269bf3b 100644..100755 --- a/tests/FunctionalTests/validators/tests/RegExpValidatorTestCase.php +++ b/tests/FunctionalTests/validators/tests/RegExpValidatorTestCase.php @@ -1,7 +1,7 @@ <?php //New Test -class RegExpValidatorTestCase extends SeleniumTestCase +class RegExpValidatorTestCase extends PradoGenericSeleniumTest { function test() { @@ -30,5 +30,3 @@ class RegExpValidatorTestCase extends SeleniumTestCase } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/validators/tests/RequiredFieldTestCase.php b/tests/FunctionalTests/validators/tests/RequiredFieldTestCase.php index 69765238..f8b54eb0 100644..100755 --- a/tests/FunctionalTests/validators/tests/RequiredFieldTestCase.php +++ b/tests/FunctionalTests/validators/tests/RequiredFieldTestCase.php @@ -1,12 +1,9 @@ <?php -class RequiredFieldTestCase extends SeleniumTestCase +class RequiredFieldTestCase extends PradoGenericSeleniumTest { function test() { - //problem with test runner clicking on radio buttons - $this->skipBrowsers(self::OPERA); - $base = "ctl0_Content_"; $this->open("validators/index.php?page=RequiredFieldValidator"); $this->assertTextPresent("RequiredFieldValidator Tests"); @@ -86,5 +83,4 @@ class RequiredFieldTestCase extends SeleniumTestCase $this->pause(250); $this->assertNotVisible("{$base}validator9"); } -} -?>
\ No newline at end of file +}
\ No newline at end of file diff --git a/tests/FunctionalTests/validators/tests/RequiredListTestCase.php b/tests/FunctionalTests/validators/tests/RequiredListTestCase.php index 2151e492..2662c721 100644..100755 --- a/tests/FunctionalTests/validators/tests/RequiredListTestCase.php +++ b/tests/FunctionalTests/validators/tests/RequiredListTestCase.php @@ -1,13 +1,10 @@ <?php -class RequiredListTestCase extends SeleniumTestCase +class RequiredListTestCase extends PradoGenericSeleniumTest { function test() { - //problem with test runner clicking on radio buttons - $this->skipBrowsers(self::OPERA); - $base = "ctl0_Content_"; $this->open("validators/index.php?page=RequiredListValidator"); $this->click("{$base}submit1"); @@ -39,5 +36,3 @@ class RequiredListTestCase extends SeleniumTestCase $this->assertNotVisible("{$base}validator3"); } } - -?>
\ No newline at end of file diff --git a/tests/FunctionalTests/validators/tests/ValidationSummaryTestCase.php b/tests/FunctionalTests/validators/tests/ValidationSummaryTestCase.php index 802392ac..7dc1d6b1 100644..100755 --- a/tests/FunctionalTests/validators/tests/ValidationSummaryTestCase.php +++ b/tests/FunctionalTests/validators/tests/ValidationSummaryTestCase.php @@ -1,7 +1,7 @@ <?php //New Test -class ValidationSummaryTestCase extends SeleniumTestCase +class ValidationSummaryTestCase extends PradoGenericSeleniumTest { function test() { @@ -46,5 +46,3 @@ class ValidationSummaryTestCase extends SeleniumTestCase */ } } - -?>
\ No newline at end of file diff --git a/tests/test_tools/PradoGenericSeleniumTest.php b/tests/test_tools/PradoGenericSeleniumTest.php new file mode 100644 index 00000000..547ff2f0 --- /dev/null +++ b/tests/test_tools/PradoGenericSeleniumTest.php @@ -0,0 +1,15 @@ +<?php +require_once 'PHPUnit/Extensions/SeleniumTestCase.php'; + +class PradoGenericSeleniumTest extends PHPUnit_Extensions_SeleniumTestCase +{ + protected function setUp() + { + $this->setBrowser('*googlechrome'); + $this->setBrowserUrl('http://127.0.0.1/prado-3.2/tests/FunctionalTests/'); + } + + protected function tearDown() + { + } +}
\ No newline at end of file diff --git a/tests/test_tools/functional_tests.php b/tests/test_tools/functional_tests.php deleted file mode 100644 index 151f77db..00000000 --- a/tests/test_tools/functional_tests.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php - -$TEST_TOOLS = dirname(__FILE__); - -if(isset($_GET['sr'])) -{ - $selenium_base=$TEST_TOOLS.'/selenium/'; - $selenium_resource=realpath($selenium_base.$_GET['sr']); - - if($selenium_resource!==false && - strpos($selenium_resource, $selenium_base) === 0) - echo file_get_contents($selenium_resource); - exit; -} - -require_once($TEST_TOOLS.'/simpletest/unit_tester.php'); -require_once($TEST_TOOLS.'/simpletest/web_tester.php'); -require_once($TEST_TOOLS.'/simpletest/mock_objects.php'); -require_once($TEST_TOOLS.'/simpletest/reporter.php'); -require_once($TEST_TOOLS.'/selenium/php/selenium.php'); - -class PradoFunctionalTester -{ - private $_name; - private $_basePath; - private $_selenium; - - public function __construct($basePath,$selenium='',$name='All Tests') - { - $this->_name=$name; - if($basePath==='' || ($this->_basePath=realpath($basePath))===false) - throw new Exception('Invalid base path '.$basePath); - $this->_basePath=strtr($this->_basePath,'\\','/'); - - $this->_selenium = $selenium.'selenium/'; - } - - public function run($simpleReporter) - { - $server=SimpleSeleniumProxyServer::getInstance(dirname(__FILE__));//, '', $this->_selenium); - - $groupTest=new GroupTest($this->_name); - $this->collectTestFiles($groupTest,$this->_basePath); - $groupTest->run($simpleReporter); - - $server->handleRequest(); - } - - protected function collectTestFiles($groupTest,$basePath) - { - $folder=@opendir($basePath); - while($entry=@readdir($folder)) - { - $fullPath=strtr($basePath.'/'.$entry,'\\','/'); - if(is_file($fullPath) && $this->isValidFile($entry)) - $groupTest->addTestFile($fullPath); - else if($entry[0]!=='.') - $this->collectTestFiles($groupTest,$fullPath); - } - @closedir($folder); - } - - protected function isValidFile($entry) - { - return preg_match('/\w+\.php$/',$entry); - } -} - -?>
\ No newline at end of file diff --git a/tests/unit/bootstrap.php b/tests/test_tools/phpunit_bootstrap.php index 97836012..dc2ce948 100644 --- a/tests/unit/bootstrap.php +++ b/tests/test_tools/phpunit_bootstrap.php @@ -17,4 +17,7 @@ if (!@include_once VENDOR_DIR.'/autoload.php') { php composer.phar install'); } -require_once(PRADO_FRAMEWORK_DIR.'/prado.php');
\ No newline at end of file +require_once(PRADO_FRAMEWORK_DIR.'/prado.php'); + +// for FunctionalTests +require_once(__DIR__.'/PradoGenericSeleniumTest.php');
\ No newline at end of file diff --git a/tests/test_tools/selenium/core/SeleniumLog.html b/tests/test_tools/selenium/core/SeleniumLog.html deleted file mode 100644 index dffa184f..00000000 --- a/tests/test_tools/selenium/core/SeleniumLog.html +++ /dev/null @@ -1,74 +0,0 @@ -<html> - -<head> -<title>Selenium Log Console</title> -<link id="cssLink" rel="stylesheet" href="selenium.css" /> - -</head> -<body id="logging-console"> - -<script language="JavaScript"> - -var logLevels = { - debug: 0, - info: 1, - warn: 2, - error: 3 -}; - -function getThresholdLevel() { - var buttons = document.getElementById('logLevelChooser').level; - for (var i = 0; i < buttons.length; i++) { - if (buttons[i].checked) { - return buttons[i].value; - } - } -} - -function setThresholdLevel(logLevel) { - var buttons = document.getElementById('logLevelChooser').level; - for (var i = 0; i < buttons.length; i++) { - if (buttons[i].value==logLevel) { - buttons[i].checked = true; - } - else { - buttons[i].checked = false; - } - } -} - -function append(message, logLevel) { - var logLevelThreshold = getThresholdLevel(); - if (logLevels[logLevel] < logLevels[logLevelThreshold]) { - return; - } - var log = document.getElementById('log'); - var newEntry = document.createElement('li'); - newEntry.className = logLevel; - newEntry.appendChild(document.createTextNode(message)); - log.appendChild(newEntry); - if (newEntry.scrollIntoView) { - newEntry.scrollIntoView(); - } -} - -</script> - -<div id="banner"> - <form id="logLevelChooser"> - <input id="level-error" type="radio" name="level" - value="error" /><label for="level-error">Error</label> - <input id="level-warn" type="radio" name="level" - value="warn" /><label for="level-warn">Warn</label> - <input id="level-info" type="radio" name="level" - value="info" /><label for="level-info">Info</label> - <input id="level-debug" type="radio" name="level" checked="yes" - value="debug" /><label for="level-debug">Debug</label> - </form> - <h1>Selenium Log Console</h1> -</div> - -<ul id="log"></ul> - -</body> -</html> diff --git a/tests/test_tools/selenium/core/TestRunner-splash.html b/tests/test_tools/selenium/core/TestRunner-splash.html deleted file mode 100644 index 1c32dd79..00000000 --- a/tests/test_tools/selenium/core/TestRunner-splash.html +++ /dev/null @@ -1,53 +0,0 @@ -<!-- -Copyright 2005 ThoughtWorks, Inc - - 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. ---> - -<html> -<link rel="stylesheet" type="text/css" href="selenium.css" /> -<body> -<table width="100%"> - -<tr> - <th>↑</th> - <th>↑</th> - <th>↑</th> -</tr> -<tr> - <th width="25%">Test Suite</th> - <th width="50%">Current Test</th> - <th width="25%">Control Panel</th> -</tr> -<tr><td> </td></tr> - -<tr> -<td></td> -<td class="selenium splash"> - -<h1>Selenium</h1> -<h2>by <a href="http://www.thoughtworks.com">ThoughtWorks</a> and friends</h2> - -<p> -For more information on Selenium, visit - -<pre> - <a href="http://selenium.openqa.org" target="_blank">http://selenium.openqa.org</a> -</pre> - -</td> -<tr> - -</table> -</body> -</html> diff --git a/tests/test_tools/selenium/core/lib/cssQuery/cssQuery-p.js b/tests/test_tools/selenium/core/lib/cssQuery/cssQuery-p.js deleted file mode 100644 index 00e43a42..00000000 --- a/tests/test_tools/selenium/core/lib/cssQuery/cssQuery-p.js +++ /dev/null @@ -1,6 +0,0 @@ -/* - cssQuery, version 2.0.2 (2005-08-19) - Copyright: 2004-2005, Dean Edwards (http://dean.edwards.name/) - License: http://creativecommons.org/licenses/LGPL/2.1/ -*/ -eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('7 x=6(){7 1D="2.0.2";7 C=/\\s*,\\s*/;7 x=6(s,A){33{7 m=[];7 u=1z.32.2c&&!A;7 b=(A)?(A.31==22)?A:[A]:[1g];7 1E=18(s).1l(C),i;9(i=0;i<1E.y;i++){s=1y(1E[i]);8(U&&s.Z(0,3).2b("")==" *#"){s=s.Z(2);A=24([],b,s[1])}1A A=b;7 j=0,t,f,a,c="";H(j<s.y){t=s[j++];f=s[j++];c+=t+f;a="";8(s[j]=="("){H(s[j++]!=")")a+=s[j];a=a.Z(0,-1);c+="("+a+")"}A=(u&&V[c])?V[c]:21(A,t,f,a);8(u)V[c]=A}m=m.30(A)}2a x.2d;5 m}2Z(e){x.2d=e;5[]}};x.1Z=6(){5"6 x() {\\n [1D "+1D+"]\\n}"};7 V={};x.2c=L;x.2Y=6(s){8(s){s=1y(s).2b("");2a V[s]}1A V={}};7 29={};7 19=L;x.15=6(n,s){8(19)1i("s="+1U(s));29[n]=12 s()};x.2X=6(c){5 c?1i(c):o};7 D={};7 h={};7 q={P:/\\[([\\w-]+(\\|[\\w-]+)?)\\s*(\\W?=)?\\s*([^\\]]*)\\]/};7 T=[];D[" "]=6(r,f,t,n){7 e,i,j;9(i=0;i<f.y;i++){7 s=X(f[i],t,n);9(j=0;(e=s[j]);j++){8(M(e)&&14(e,n))r.z(e)}}};D["#"]=6(r,f,i){7 e,j;9(j=0;(e=f[j]);j++)8(e.B==i)r.z(e)};D["."]=6(r,f,c){c=12 1t("(^|\\\\s)"+c+"(\\\\s|$)");7 e,i;9(i=0;(e=f[i]);i++)8(c.l(e.1V))r.z(e)};D[":"]=6(r,f,p,a){7 t=h[p],e,i;8(t)9(i=0;(e=f[i]);i++)8(t(e,a))r.z(e)};h["2W"]=6(e){7 d=Q(e);8(d.1C)9(7 i=0;i<d.1C.y;i++){8(d.1C[i]==e)5 K}};h["2V"]=6(e){};7 M=6(e){5(e&&e.1c==1&&e.1f!="!")?e:23};7 16=6(e){H(e&&(e=e.2U)&&!M(e))28;5 e};7 G=6(e){H(e&&(e=e.2T)&&!M(e))28;5 e};7 1r=6(e){5 M(e.27)||G(e.27)};7 1P=6(e){5 M(e.26)||16(e.26)};7 1o=6(e){7 c=[];e=1r(e);H(e){c.z(e);e=G(e)}5 c};7 U=K;7 1h=6(e){7 d=Q(e);5(2S d.25=="2R")?/\\.1J$/i.l(d.2Q):2P(d.25=="2O 2N")};7 Q=6(e){5 e.2M||e.1g};7 X=6(e,t){5(t=="*"&&e.1B)?e.1B:e.X(t)};7 17=6(e,t,n){8(t=="*")5 M(e);8(!14(e,n))5 L;8(!1h(e))t=t.2L();5 e.1f==t};7 14=6(e,n){5!n||(n=="*")||(e.2K==n)};7 1e=6(e){5 e.1G};6 24(r,f,B){7 m,i,j;9(i=0;i<f.y;i++){8(m=f[i].1B.2J(B)){8(m.B==B)r.z(m);1A 8(m.y!=23){9(j=0;j<m.y;j++){8(m[j].B==B)r.z(m[j])}}}}5 r};8(![].z)22.2I.z=6(){9(7 i=0;i<1z.y;i++){o[o.y]=1z[i]}5 o.y};7 N=/\\|/;6 21(A,t,f,a){8(N.l(f)){f=f.1l(N);a=f[0];f=f[1]}7 r=[];8(D[t]){D[t](r,A,f,a)}5 r};7 S=/^[^\\s>+~]/;7 20=/[\\s#.:>+~()@]|[^\\s#.:>+~()@]+/g;6 1y(s){8(S.l(s))s=" "+s;5 s.P(20)||[]};7 W=/\\s*([\\s>+~(),]|^|$)\\s*/g;7 I=/([\\s>+~,]|[^(]\\+|^)([#.:@])/g;7 18=6(s){5 s.O(W,"$1").O(I,"$1*$2")};7 1u={1Z:6(){5"\'"},P:/^(\'[^\']*\')|("[^"]*")$/,l:6(s){5 o.P.l(s)},1S:6(s){5 o.l(s)?s:o+s+o},1Y:6(s){5 o.l(s)?s.Z(1,-1):s}};7 1s=6(t){5 1u.1Y(t)};7 E=/([\\/()[\\]?{}|*+-])/g;6 R(s){5 s.O(E,"\\\\$1")};x.15("1j-2H",6(){D[">"]=6(r,f,t,n){7 e,i,j;9(i=0;i<f.y;i++){7 s=1o(f[i]);9(j=0;(e=s[j]);j++)8(17(e,t,n))r.z(e)}};D["+"]=6(r,f,t,n){9(7 i=0;i<f.y;i++){7 e=G(f[i]);8(e&&17(e,t,n))r.z(e)}};D["@"]=6(r,f,a){7 t=T[a].l;7 e,i;9(i=0;(e=f[i]);i++)8(t(e))r.z(e)};h["2G-10"]=6(e){5!16(e)};h["1x"]=6(e,c){c=12 1t("^"+c,"i");H(e&&!e.13("1x"))e=e.1n;5 e&&c.l(e.13("1x"))};q.1X=/\\\\:/g;q.1w="@";q.J={};q.O=6(m,a,n,c,v){7 k=o.1w+m;8(!T[k]){a=o.1W(a,c||"",v||"");T[k]=a;T.z(a)}5 T[k].B};q.1Q=6(s){s=s.O(o.1X,"|");7 m;H(m=s.P(o.P)){7 r=o.O(m[0],m[1],m[2],m[3],m[4]);s=s.O(o.P,r)}5 s};q.1W=6(p,t,v){7 a={};a.B=o.1w+T.y;a.2F=p;t=o.J[t];t=t?t(o.13(p),1s(v)):L;a.l=12 2E("e","5 "+t);5 a};q.13=6(n){1d(n.2D()){F"B":5"e.B";F"2C":5"e.1V";F"9":5"e.2B";F"1T":8(U){5"1U((e.2A.P(/1T=\\\\1v?([^\\\\s\\\\1v]*)\\\\1v?/)||[])[1]||\'\')"}}5"e.13(\'"+n.O(N,":")+"\')"};q.J[""]=6(a){5 a};q.J["="]=6(a,v){5 a+"=="+1u.1S(v)};q.J["~="]=6(a,v){5"/(^| )"+R(v)+"( |$)/.l("+a+")"};q.J["|="]=6(a,v){5"/^"+R(v)+"(-|$)/.l("+a+")"};7 1R=18;18=6(s){5 1R(q.1Q(s))}});x.15("1j-2z",6(){D["~"]=6(r,f,t,n){7 e,i;9(i=0;(e=f[i]);i++){H(e=G(e)){8(17(e,t,n))r.z(e)}}};h["2y"]=6(e,t){t=12 1t(R(1s(t)));5 t.l(1e(e))};h["2x"]=6(e){5 e==Q(e).1H};h["2w"]=6(e){7 n,i;9(i=0;(n=e.1F[i]);i++){8(M(n)||n.1c==3)5 L}5 K};h["1N-10"]=6(e){5!G(e)};h["2v-10"]=6(e){e=e.1n;5 1r(e)==1P(e)};h["2u"]=6(e,s){7 n=x(s,Q(e));9(7 i=0;i<n.y;i++){8(n[i]==e)5 L}5 K};h["1O-10"]=6(e,a){5 1p(e,a,16)};h["1O-1N-10"]=6(e,a){5 1p(e,a,G)};h["2t"]=6(e){5 e.B==2s.2r.Z(1)};h["1M"]=6(e){5 e.1M};h["2q"]=6(e){5 e.1q===L};h["1q"]=6(e){5 e.1q};h["1L"]=6(e){5 e.1L};q.J["^="]=6(a,v){5"/^"+R(v)+"/.l("+a+")"};q.J["$="]=6(a,v){5"/"+R(v)+"$/.l("+a+")"};q.J["*="]=6(a,v){5"/"+R(v)+"/.l("+a+")"};6 1p(e,a,t){1d(a){F"n":5 K;F"2p":a="2n";1a;F"2o":a="2n+1"}7 1m=1o(e.1n);6 1k(i){7 i=(t==G)?1m.y-i:i-1;5 1m[i]==e};8(!Y(a))5 1k(a);a=a.1l("n");7 m=1K(a[0]);7 s=1K(a[1]);8((Y(m)||m==1)&&s==0)5 K;8(m==0&&!Y(s))5 1k(s);8(Y(s))s=0;7 c=1;H(e=t(e))c++;8(Y(m)||m==1)5(t==G)?(c<=s):(s>=c);5(c%m)==s}});x.15("1j-2m",6(){U=1i("L;/*@2l@8(@\\2k)U=K@2j@*/");8(!U){X=6(e,t,n){5 n?e.2i("*",t):e.X(t)};14=6(e,n){5!n||(n=="*")||(e.2h==n)};1h=1g.1I?6(e){5/1J/i.l(Q(e).1I)}:6(e){5 Q(e).1H.1f!="2g"};1e=6(e){5 e.2f||e.1G||1b(e)};6 1b(e){7 t="",n,i;9(i=0;(n=e.1F[i]);i++){1d(n.1c){F 11:F 1:t+=1b(n);1a;F 3:t+=n.2e;1a}}5 t}}});19=K;5 x}();',62,190,'|||||return|function|var|if|for||||||||pseudoClasses||||test|||this||AttributeSelector|||||||cssQuery|length|push|fr|id||selectors||case|nextElementSibling|while||tests|true|false|thisElement||replace|match|getDocument|regEscape||attributeSelectors|isMSIE|cache||getElementsByTagName|isNaN|slice|child||new|getAttribute|compareNamespace|addModule|previousElementSibling|compareTagName|parseSelector|loaded|break|_0|nodeType|switch|getTextContent|tagName|document|isXML|eval|css|_1|split|ch|parentNode|childElements|nthChild|disabled|firstElementChild|getText|RegExp|Quote|x22|PREFIX|lang|_2|arguments|else|all|links|version|se|childNodes|innerText|documentElement|contentType|xml|parseInt|indeterminate|checked|last|nth|lastElementChild|parse|_3|add|href|String|className|create|NS_IE|remove|toString|ST|select|Array|null|_4|mimeType|lastChild|firstChild|continue|modules|delete|join|caching|error|nodeValue|textContent|HTML|prefix|getElementsByTagNameNS|end|x5fwin32|cc_on|standard||odd|even|enabled|hash|location|target|not|only|empty|root|contains|level3|outerHTML|htmlFor|class|toLowerCase|Function|name|first|level2|prototype|item|scopeName|toUpperCase|ownerDocument|Document|XML|Boolean|URL|unknown|typeof|nextSibling|previousSibling|visited|link|valueOf|clearCache|catch|concat|constructor|callee|try'.split('|'),0,{})) diff --git a/tests/test_tools/selenium/core/lib/cssQuery/src/cssQuery-level2.js b/tests/test_tools/selenium/core/lib/cssQuery/src/cssQuery-level2.js deleted file mode 100644 index 2987b15b..00000000 --- a/tests/test_tools/selenium/core/lib/cssQuery/src/cssQuery-level2.js +++ /dev/null @@ -1,142 +0,0 @@ -/* - cssQuery, version 2.0.2 (2005-08-19) - Copyright: 2004-2005, Dean Edwards (http://dean.edwards.name/) - License: http://creativecommons.org/licenses/LGPL/2.1/ -*/ - -cssQuery.addModule("css-level2", function() { - -// ----------------------------------------------------------------------- -// selectors -// ----------------------------------------------------------------------- - -// child selector -selectors[">"] = function($results, $from, $tagName, $namespace) { - var $element, i, j; - for (i = 0; i < $from.length; i++) { - var $subset = childElements($from[i]); - for (j = 0; ($element = $subset[j]); j++) - if (compareTagName($element, $tagName, $namespace)) - $results.push($element); - } -}; - -// sibling selector -selectors["+"] = function($results, $from, $tagName, $namespace) { - for (var i = 0; i < $from.length; i++) { - var $element = nextElementSibling($from[i]); - if ($element && compareTagName($element, $tagName, $namespace)) - $results.push($element); - } -}; - -// attribute selector -selectors["@"] = function($results, $from, $attributeSelectorID) { - var $test = attributeSelectors[$attributeSelectorID].test; - var $element, i; - for (i = 0; ($element = $from[i]); i++) - if ($test($element)) $results.push($element); -}; - -// ----------------------------------------------------------------------- -// pseudo-classes -// ----------------------------------------------------------------------- - -pseudoClasses["first-child"] = function($element) { - return !previousElementSibling($element); -}; - -pseudoClasses["lang"] = function($element, $code) { - $code = new RegExp("^" + $code, "i"); - while ($element && !$element.getAttribute("lang")) $element = $element.parentNode; - return $element && $code.test($element.getAttribute("lang")); -}; - -// ----------------------------------------------------------------------- -// attribute selectors -// ----------------------------------------------------------------------- - -// constants -AttributeSelector.NS_IE = /\\:/g; -AttributeSelector.PREFIX = "@"; -// properties -AttributeSelector.tests = {}; -// methods -AttributeSelector.replace = function($match, $attribute, $namespace, $compare, $value) { - var $key = this.PREFIX + $match; - if (!attributeSelectors[$key]) { - $attribute = this.create($attribute, $compare || "", $value || ""); - // store the selector - attributeSelectors[$key] = $attribute; - attributeSelectors.push($attribute); - } - return attributeSelectors[$key].id; -}; -AttributeSelector.parse = function($selector) { - $selector = $selector.replace(this.NS_IE, "|"); - var $match; - while ($match = $selector.match(this.match)) { - var $replace = this.replace($match[0], $match[1], $match[2], $match[3], $match[4]); - $selector = $selector.replace(this.match, $replace); - } - return $selector; -}; -AttributeSelector.create = function($propertyName, $test, $value) { - var $attributeSelector = {}; - $attributeSelector.id = this.PREFIX + attributeSelectors.length; - $attributeSelector.name = $propertyName; - $test = this.tests[$test]; - $test = $test ? $test(this.getAttribute($propertyName), getText($value)) : false; - $attributeSelector.test = new Function("e", "return " + $test); - return $attributeSelector; -}; -AttributeSelector.getAttribute = function($name) { - switch ($name.toLowerCase()) { - case "id": - return "e.id"; - case "class": - return "e.className"; - case "for": - return "e.htmlFor"; - case "href": - if (isMSIE) { - // IE always returns the full path not the fragment in the href attribute - // so we RegExp it out of outerHTML. Opera does the same thing but there - // is no way to get the original attribute. - return "String((e.outerHTML.match(/href=\\x22?([^\\s\\x22]*)\\x22?/)||[])[1]||'')"; - } - } - return "e.getAttribute('" + $name.replace($NAMESPACE, ":") + "')"; -}; - -// ----------------------------------------------------------------------- -// attribute selector tests -// ----------------------------------------------------------------------- - -AttributeSelector.tests[""] = function($attribute) { - return $attribute; -}; - -AttributeSelector.tests["="] = function($attribute, $value) { - return $attribute + "==" + Quote.add($value); -}; - -AttributeSelector.tests["~="] = function($attribute, $value) { - return "/(^| )" + regEscape($value) + "( |$)/.test(" + $attribute + ")"; -}; - -AttributeSelector.tests["|="] = function($attribute, $value) { - return "/^" + regEscape($value) + "(-|$)/.test(" + $attribute + ")"; -}; - -// ----------------------------------------------------------------------- -// parsing -// ----------------------------------------------------------------------- - -// override parseSelector to parse out attribute selectors -var _parseSelector = parseSelector; -parseSelector = function($selector) { - return _parseSelector(AttributeSelector.parse($selector)); -}; - -}); // addModule diff --git a/tests/test_tools/selenium/core/lib/cssQuery/src/cssQuery-level3.js b/tests/test_tools/selenium/core/lib/cssQuery/src/cssQuery-level3.js deleted file mode 100644 index 4dce4651..00000000 --- a/tests/test_tools/selenium/core/lib/cssQuery/src/cssQuery-level3.js +++ /dev/null @@ -1,150 +0,0 @@ -/* - cssQuery, version 2.0.2 (2005-08-19) - Copyright: 2004-2005, Dean Edwards (http://dean.edwards.name/) - License: http://creativecommons.org/licenses/LGPL/2.1/ -*/ - -/* Thanks to Bill Edney */ - -cssQuery.addModule("css-level3", function() { - -// ----------------------------------------------------------------------- -// selectors -// ----------------------------------------------------------------------- - -// indirect sibling selector -selectors["~"] = function($results, $from, $tagName, $namespace) { - var $element, i; - for (i = 0; ($element = $from[i]); i++) { - while ($element = nextElementSibling($element)) { - if (compareTagName($element, $tagName, $namespace)) - $results.push($element); - } - } -}; - -// ----------------------------------------------------------------------- -// pseudo-classes -// ----------------------------------------------------------------------- - -// I'm hoping these pseudo-classes are pretty readable. Let me know if -// any need explanation. - -pseudoClasses["contains"] = function($element, $text) { - $text = new RegExp(regEscape(getText($text))); - return $text.test(getTextContent($element)); -}; - -pseudoClasses["root"] = function($element) { - return $element == getDocument($element).documentElement; -}; - -pseudoClasses["empty"] = function($element) { - var $node, i; - for (i = 0; ($node = $element.childNodes[i]); i++) { - if (thisElement($node) || $node.nodeType == 3) return false; - } - return true; -}; - -pseudoClasses["last-child"] = function($element) { - return !nextElementSibling($element); -}; - -pseudoClasses["only-child"] = function($element) { - $element = $element.parentNode; - return firstElementChild($element) == lastElementChild($element); -}; - -pseudoClasses["not"] = function($element, $selector) { - var $negated = cssQuery($selector, getDocument($element)); - for (var i = 0; i < $negated.length; i++) { - if ($negated[i] == $element) return false; - } - return true; -}; - -pseudoClasses["nth-child"] = function($element, $arguments) { - return nthChild($element, $arguments, previousElementSibling); -}; - -pseudoClasses["nth-last-child"] = function($element, $arguments) { - return nthChild($element, $arguments, nextElementSibling); -}; - -pseudoClasses["target"] = function($element) { - return $element.id == location.hash.slice(1); -}; - -// UI element states - -pseudoClasses["checked"] = function($element) { - return $element.checked; -}; - -pseudoClasses["enabled"] = function($element) { - return $element.disabled === false; -}; - -pseudoClasses["disabled"] = function($element) { - return $element.disabled; -}; - -pseudoClasses["indeterminate"] = function($element) { - return $element.indeterminate; -}; - -// ----------------------------------------------------------------------- -// attribute selector tests -// ----------------------------------------------------------------------- - -AttributeSelector.tests["^="] = function($attribute, $value) { - return "/^" + regEscape($value) + "/.test(" + $attribute + ")"; -}; - -AttributeSelector.tests["$="] = function($attribute, $value) { - return "/" + regEscape($value) + "$/.test(" + $attribute + ")"; -}; - -AttributeSelector.tests["*="] = function($attribute, $value) { - return "/" + regEscape($value) + "/.test(" + $attribute + ")"; -}; - -// ----------------------------------------------------------------------- -// nth child support (Bill Edney) -// ----------------------------------------------------------------------- - -function nthChild($element, $arguments, $traverse) { - switch ($arguments) { - case "n": return true; - case "even": $arguments = "2n"; break; - case "odd": $arguments = "2n+1"; - } - - var $$children = childElements($element.parentNode); - function _checkIndex($index) { - var $index = ($traverse == nextElementSibling) ? $$children.length - $index : $index - 1; - return $$children[$index] == $element; - }; - - // it was just a number (no "n") - if (!isNaN($arguments)) return _checkIndex($arguments); - - $arguments = $arguments.split("n"); - var $multiplier = parseInt($arguments[0]); - var $step = parseInt($arguments[1]); - - if ((isNaN($multiplier) || $multiplier == 1) && $step == 0) return true; - if ($multiplier == 0 && !isNaN($step)) return _checkIndex($step); - if (isNaN($step)) $step = 0; - - var $count = 1; - while ($element = $traverse($element)) $count++; - - if (isNaN($multiplier) || $multiplier == 1) - return ($traverse == nextElementSibling) ? ($count <= $step) : ($step >= $count); - - return ($count % $multiplier) == $step; -}; - -}); // addModule diff --git a/tests/test_tools/selenium/core/lib/cssQuery/src/cssQuery-standard.js b/tests/test_tools/selenium/core/lib/cssQuery/src/cssQuery-standard.js deleted file mode 100644 index 309184d5..00000000 --- a/tests/test_tools/selenium/core/lib/cssQuery/src/cssQuery-standard.js +++ /dev/null @@ -1,53 +0,0 @@ -/* - cssQuery, version 2.0.2 (2005-08-19) - Copyright: 2004-2005, Dean Edwards (http://dean.edwards.name/) - License: http://creativecommons.org/licenses/LGPL/2.1/ -*/ - -cssQuery.addModule("css-standard", function() { // override IE optimisation - -// cssQuery was originally written as the CSS engine for IE7. It is -// optimised (in terms of size not speed) for IE so this module is -// provided separately to provide cross-browser support. - -// ----------------------------------------------------------------------- -// browser compatibility -// ----------------------------------------------------------------------- - -// sniff for Win32 Explorer -isMSIE = eval("false;/*@cc_on@if(@\x5fwin32)isMSIE=true@end@*/"); - -if (!isMSIE) { - getElementsByTagName = function($element, $tagName, $namespace) { - return $namespace ? $element.getElementsByTagNameNS("*", $tagName) : - $element.getElementsByTagName($tagName); - }; - - compareNamespace = function($element, $namespace) { - return !$namespace || ($namespace == "*") || ($element.prefix == $namespace); - }; - - isXML = document.contentType ? function($element) { - return /xml/i.test(getDocument($element).contentType); - } : function($element) { - return getDocument($element).documentElement.tagName != "HTML"; - }; - - getTextContent = function($element) { - // mozilla || opera || other - return $element.textContent || $element.innerText || _getTextContent($element); - }; - - function _getTextContent($element) { - var $textContent = "", $node, i; - for (i = 0; ($node = $element.childNodes[i]); i++) { - switch ($node.nodeType) { - case 11: // document fragment - case 1: $textContent += _getTextContent($node); break; - case 3: $textContent += $node.nodeValue; break; - } - } - return $textContent; - }; -} -}); // addModule diff --git a/tests/test_tools/selenium/core/lib/cssQuery/src/cssQuery.js b/tests/test_tools/selenium/core/lib/cssQuery/src/cssQuery.js deleted file mode 100644 index 7a6efee8..00000000 --- a/tests/test_tools/selenium/core/lib/cssQuery/src/cssQuery.js +++ /dev/null @@ -1,356 +0,0 @@ -/* - cssQuery, version 2.0.2 (2005-08-19) - Copyright: 2004-2005, Dean Edwards (http://dean.edwards.name/) - License: http://creativecommons.org/licenses/LGPL/2.1/ -*/ - -// the following functions allow querying of the DOM using CSS selectors -var cssQuery = function() { -var version = "2.0.2"; - -// ----------------------------------------------------------------------- -// main query function -// ----------------------------------------------------------------------- - -var $COMMA = /\s*,\s*/; -var cssQuery = function($selector, $$from) { -try { - var $match = []; - var $useCache = arguments.callee.caching && !$$from; - var $base = ($$from) ? ($$from.constructor == Array) ? $$from : [$$from] : [document]; - // process comma separated selectors - var $$selectors = parseSelector($selector).split($COMMA), i; - for (i = 0; i < $$selectors.length; i++) { - // convert the selector to a stream - $selector = _toStream($$selectors[i]); - // faster chop if it starts with id (MSIE only) - if (isMSIE && $selector.slice(0, 3).join("") == " *#") { - $selector = $selector.slice(2); - $$from = _msie_selectById([], $base, $selector[1]); - } else $$from = $base; - // process the stream - var j = 0, $token, $filter, $arguments, $cacheSelector = ""; - while (j < $selector.length) { - $token = $selector[j++]; - $filter = $selector[j++]; - $cacheSelector += $token + $filter; - // some pseudo-classes allow arguments to be passed - // e.g. nth-child(even) - $arguments = ""; - if ($selector[j] == "(") { - while ($selector[j++] != ")" && j < $selector.length) { - $arguments += $selector[j]; - } - $arguments = $arguments.slice(0, -1); - $cacheSelector += "(" + $arguments + ")"; - } - // process a token/filter pair use cached results if possible - $$from = ($useCache && cache[$cacheSelector]) ? - cache[$cacheSelector] : select($$from, $token, $filter, $arguments); - if ($useCache) cache[$cacheSelector] = $$from; - } - $match = $match.concat($$from); - } - delete cssQuery.error; - return $match; -} catch ($error) { - cssQuery.error = $error; - return []; -}}; - -// ----------------------------------------------------------------------- -// public interface -// ----------------------------------------------------------------------- - -cssQuery.toString = function() { - return "function cssQuery() {\n [version " + version + "]\n}"; -}; - -// caching -var cache = {}; -cssQuery.caching = false; -cssQuery.clearCache = function($selector) { - if ($selector) { - $selector = _toStream($selector).join(""); - delete cache[$selector]; - } else cache = {}; -}; - -// allow extensions -var modules = {}; -var loaded = false; -cssQuery.addModule = function($name, $script) { - if (loaded) eval("$script=" + String($script)); - modules[$name] = new $script();; -}; - -// hackery -cssQuery.valueOf = function($code) { - return $code ? eval($code) : this; -}; - -// ----------------------------------------------------------------------- -// declarations -// ----------------------------------------------------------------------- - -var selectors = {}; -var pseudoClasses = {}; -// a safari bug means that these have to be declared here -var AttributeSelector = {match: /\[([\w-]+(\|[\w-]+)?)\s*(\W?=)?\s*([^\]]*)\]/}; -var attributeSelectors = []; - -// ----------------------------------------------------------------------- -// selectors -// ----------------------------------------------------------------------- - -// descendant selector -selectors[" "] = function($results, $from, $tagName, $namespace) { - // loop through current selection - var $element, i, j; - for (i = 0; i < $from.length; i++) { - // get descendants - var $subset = getElementsByTagName($from[i], $tagName, $namespace); - // loop through descendants and add to results selection - for (j = 0; ($element = $subset[j]); j++) { - if (thisElement($element) && compareNamespace($element, $namespace)) - $results.push($element); - } - } -}; - -// ID selector -selectors["#"] = function($results, $from, $id) { - // loop through current selection and check ID - var $element, j; - for (j = 0; ($element = $from[j]); j++) if ($element.id == $id) $results.push($element); -}; - -// class selector -selectors["."] = function($results, $from, $className) { - // create a RegExp version of the class - $className = new RegExp("(^|\\s)" + $className + "(\\s|$)"); - // loop through current selection and check class - var $element, i; - for (i = 0; ($element = $from[i]); i++) - if ($className.test($element.className)) $results.push($element); -}; - -// pseudo-class selector -selectors[":"] = function($results, $from, $pseudoClass, $arguments) { - // retrieve the cssQuery pseudo-class function - var $test = pseudoClasses[$pseudoClass], $element, i; - // loop through current selection and apply pseudo-class filter - if ($test) for (i = 0; ($element = $from[i]); i++) - // if the cssQuery pseudo-class function returns "true" add the element - if ($test($element, $arguments)) $results.push($element); -}; - -// ----------------------------------------------------------------------- -// pseudo-classes -// ----------------------------------------------------------------------- - -pseudoClasses["link"] = function($element) { - var $document = getDocument($element); - if ($document.links) for (var i = 0; i < $document.links.length; i++) { - if ($document.links[i] == $element) return true; - } -}; - -pseudoClasses["visited"] = function($element) { - // can't do this without jiggery-pokery -}; - -// ----------------------------------------------------------------------- -// DOM traversal -// ----------------------------------------------------------------------- - -// IE5/6 includes comments (LOL) in it's elements collections. -// so we have to check for this. the test is tagName != "!". LOL (again). -var thisElement = function($element) { - return ($element && $element.nodeType == 1 && $element.tagName != "!") ? $element : null; -}; - -// return the previous element to the supplied element -// previousSibling is not good enough as it might return a text or comment node -var previousElementSibling = function($element) { - while ($element && ($element = $element.previousSibling) && !thisElement($element)) continue; - return $element; -}; - -// return the next element to the supplied element -var nextElementSibling = function($element) { - while ($element && ($element = $element.nextSibling) && !thisElement($element)) continue; - return $element; -}; - -// return the first child ELEMENT of an element -// NOT the first child node (though they may be the same thing) -var firstElementChild = function($element) { - return thisElement($element.firstChild) || nextElementSibling($element.firstChild); -}; - -var lastElementChild = function($element) { - return thisElement($element.lastChild) || previousElementSibling($element.lastChild); -}; - -// return child elements of an element (not child nodes) -var childElements = function($element) { - var $childElements = []; - $element = firstElementChild($element); - while ($element) { - $childElements.push($element); - $element = nextElementSibling($element); - } - return $childElements; -}; - -// ----------------------------------------------------------------------- -// browser compatibility -// ----------------------------------------------------------------------- - -// all of the functions in this section can be overwritten. the default -// configuration is for IE. The functions below reflect this. standard -// methods are included in a separate module. It would probably be better -// the other way round of course but this makes it easier to keep IE7 trim. - -var isMSIE = true; - -var isXML = function($element) { - var $document = getDocument($element); - return (typeof $document.mimeType == "unknown") ? - /\.xml$/i.test($document.URL) : - Boolean($document.mimeType == "XML Document"); -}; - -// return the element's containing document -var getDocument = function($element) { - return $element.ownerDocument || $element.document; -}; - -var getElementsByTagName = function($element, $tagName) { - return ($tagName == "*" && $element.all) ? $element.all : $element.getElementsByTagName($tagName); -}; - -var compareTagName = function($element, $tagName, $namespace) { - if ($tagName == "*") return thisElement($element); - if (!compareNamespace($element, $namespace)) return false; - if (!isXML($element)) $tagName = $tagName.toUpperCase(); - return $element.tagName == $tagName; -}; - -var compareNamespace = function($element, $namespace) { - return !$namespace || ($namespace == "*") || ($element.scopeName == $namespace); -}; - -var getTextContent = function($element) { - return $element.innerText; -}; - -function _msie_selectById($results, $from, id) { - var $match, i, j; - for (i = 0; i < $from.length; i++) { - if ($match = $from[i].all.item(id)) { - if ($match.id == id) $results.push($match); - else if ($match.length != null) { - for (j = 0; j < $match.length; j++) { - if ($match[j].id == id) $results.push($match[j]); - } - } - } - } - return $results; -}; - -// for IE5.0 -if (![].push) Array.prototype.push = function() { - for (var i = 0; i < arguments.length; i++) { - this[this.length] = arguments[i]; - } - return this.length; -}; - -// ----------------------------------------------------------------------- -// query support -// ----------------------------------------------------------------------- - -// select a set of matching elements. -// "from" is an array of elements. -// "token" is a character representing the type of filter -// e.g. ">" means child selector -// "filter" represents the tag name, id or class name that is being selected -// the function returns an array of matching elements -var $NAMESPACE = /\|/; -function select($$from, $token, $filter, $arguments) { - if ($NAMESPACE.test($filter)) { - $filter = $filter.split($NAMESPACE); - $arguments = $filter[0]; - $filter = $filter[1]; - } - var $results = []; - if (selectors[$token]) { - selectors[$token]($results, $$from, $filter, $arguments); - } - return $results; -}; - -// ----------------------------------------------------------------------- -// parsing -// ----------------------------------------------------------------------- - -// convert css selectors to a stream of tokens and filters -// it's not a real stream. it's just an array of strings. -var $STANDARD_SELECT = /^[^\s>+~]/; -var $$STREAM = /[\s#.:>+~()@]|[^\s#.:>+~()@]+/g; -function _toStream($selector) { - if ($STANDARD_SELECT.test($selector)) $selector = " " + $selector; - return $selector.match($$STREAM) || []; -}; - -var $WHITESPACE = /\s*([\s>+~(),]|^|$)\s*/g; -var $IMPLIED_ALL = /([\s>+~,]|[^(]\+|^)([#.:@])/g; -var parseSelector = function($selector) { - return $selector - // trim whitespace - .replace($WHITESPACE, "$1") - // e.g. ".class1" --> "*.class1" - .replace($IMPLIED_ALL, "$1*$2"); -}; - -var Quote = { - toString: function() {return "'"}, - match: /^('[^']*')|("[^"]*")$/, - test: function($string) { - return this.match.test($string); - }, - add: function($string) { - return this.test($string) ? $string : this + $string + this; - }, - remove: function($string) { - return this.test($string) ? $string.slice(1, -1) : $string; - } -}; - -var getText = function($text) { - return Quote.remove($text); -}; - -var $ESCAPE = /([\/()[\]?{}|*+-])/g; -function regEscape($string) { - return $string.replace($ESCAPE, "\\$1"); -}; - -// ----------------------------------------------------------------------- -// modules -// ----------------------------------------------------------------------- - -// -------- >> insert modules here for packaging << -------- \\ - -loaded = true; - -// ----------------------------------------------------------------------- -// return the query function -// ----------------------------------------------------------------------- - -return cssQuery; - -}(); // cssQuery diff --git a/tests/test_tools/selenium/core/lib/prototype.js b/tests/test_tools/selenium/core/lib/prototype.js deleted file mode 100644 index 0caf9cd7..00000000 --- a/tests/test_tools/selenium/core/lib/prototype.js +++ /dev/null @@ -1,2006 +0,0 @@ -/* Prototype JavaScript framework, version 1.5.0_rc0 - * (c) 2005 Sam Stephenson <sam@conio.net> - * - * Prototype is freely distributable under the terms of an MIT-style license. - * For details, see the Prototype web site: http://prototype.conio.net/ - * -/*--------------------------------------------------------------------------*/ - -var Prototype = { - Version: '1.5.0_rc0', - ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)', - - emptyFunction: function() {}, - K: function(x) {return x} -} - -var Class = { - create: function() { - return function() { - this.initialize.apply(this, arguments); - } - } -} - -var Abstract = new Object(); - -Object.extend = function(destination, source) { - for (var property in source) { - destination[property] = source[property]; - } - return destination; -} - -Object.inspect = function(object) { - try { - if (object == undefined) return 'undefined'; - if (object == null) return 'null'; - return object.inspect ? object.inspect() : object.toString(); - } catch (e) { - if (e instanceof RangeError) return '...'; - throw e; - } -} - -Function.prototype.bind = function() { - var __method = this, args = $A(arguments), object = args.shift(); - return function() { - return __method.apply(object, args.concat($A(arguments))); - } -} - -Function.prototype.bindAsEventListener = function(object) { - var __method = this; - return function(event) { - return __method.call(object, event || window.event); - } -} - -Object.extend(Number.prototype, { - toColorPart: function() { - var digits = this.toString(16); - if (this < 16) return '0' + digits; - return digits; - }, - - succ: function() { - return this + 1; - }, - - times: function(iterator) { - $R(0, this, true).each(iterator); - return this; - } -}); - -var Try = { - these: function() { - var returnValue; - - for (var i = 0; i < arguments.length; i++) { - var lambda = arguments[i]; - try { - returnValue = lambda(); - break; - } catch (e) {} - } - - return returnValue; - } -} - -/*--------------------------------------------------------------------------*/ - -var PeriodicalExecuter = Class.create(); -PeriodicalExecuter.prototype = { - initialize: function(callback, frequency) { - this.callback = callback; - this.frequency = frequency; - this.currentlyExecuting = false; - - this.registerCallback(); - }, - - registerCallback: function() { - setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); - }, - - onTimerEvent: function() { - if (!this.currentlyExecuting) { - try { - this.currentlyExecuting = true; - this.callback(); - } finally { - this.currentlyExecuting = false; - } - } - } -} -Object.extend(String.prototype, { - gsub: function(pattern, replacement) { - var result = '', source = this, match; - replacement = arguments.callee.prepareReplacement(replacement); - - while (source.length > 0) { - if (match = source.match(pattern)) { - result += source.slice(0, match.index); - result += (replacement(match) || '').toString(); - source = source.slice(match.index + match[0].length); - } else { - result += source, source = ''; - } - } - return result; - }, - - sub: function(pattern, replacement, count) { - replacement = this.gsub.prepareReplacement(replacement); - count = count === undefined ? 1 : count; - - return this.gsub(pattern, function(match) { - if (--count < 0) return match[0]; - return replacement(match); - }); - }, - - scan: function(pattern, iterator) { - this.gsub(pattern, iterator); - return this; - }, - - truncate: function(length, truncation) { - length = length || 30; - truncation = truncation === undefined ? '...' : truncation; - return this.length > length ? - this.slice(0, length - truncation.length) + truncation : this; - }, - - strip: function() { - return this.replace(/^\s+/, '').replace(/\s+$/, ''); - }, - - stripTags: function() { - return this.replace(/<\/?[^>]+>/gi, ''); - }, - - stripScripts: function() { - return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); - }, - - extractScripts: function() { - var matchAll = new RegExp(Prototype.ScriptFragment, 'img'); - var matchOne = new RegExp(Prototype.ScriptFragment, 'im'); - return (this.match(matchAll) || []).map(function(scriptTag) { - return (scriptTag.match(matchOne) || ['', ''])[1]; - }); - }, - - evalScripts: function() { - return this.extractScripts().map(function(script) { return eval(script) }); - }, - - escapeHTML: function() { - var div = document.createElement('div'); - var text = document.createTextNode(this); - div.appendChild(text); - return div.innerHTML; - }, - - unescapeHTML: function() { - var div = document.createElement('div'); - div.innerHTML = this.stripTags(); - return div.childNodes[0] ? div.childNodes[0].nodeValue : ''; - }, - - toQueryParams: function() { - var pairs = this.match(/^\??(.*)$/)[1].split('&'); - return pairs.inject({}, function(params, pairString) { - var pair = pairString.split('='); - params[pair[0]] = pair[1]; - return params; - }); - }, - - toArray: function() { - return this.split(''); - }, - - camelize: function() { - var oStringList = this.split('-'); - if (oStringList.length == 1) return oStringList[0]; - - var camelizedString = this.indexOf('-') == 0 - ? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1) - : oStringList[0]; - - for (var i = 1, len = oStringList.length; i < len; i++) { - var s = oStringList[i]; - camelizedString += s.charAt(0).toUpperCase() + s.substring(1); - } - - return camelizedString; - }, - - inspect: function() { - return "'" + this.replace(/\\/g, '\\\\').replace(/'/g, '\\\'') + "'"; - } -}); - -String.prototype.gsub.prepareReplacement = function(replacement) { - if (typeof replacement == 'function') return replacement; - var template = new Template(replacement); - return function(match) { return template.evaluate(match) }; -} - -String.prototype.parseQuery = String.prototype.toQueryParams; - -var Template = Class.create(); -Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/; -Template.prototype = { - initialize: function(template, pattern) { - this.template = template.toString(); - this.pattern = pattern || Template.Pattern; - }, - - evaluate: function(object) { - return this.template.gsub(this.pattern, function(match) { - var before = match[1]; - if (before == '\\') return match[2]; - return before + (object[match[3]] || '').toString(); - }); - } -} - -var $break = new Object(); -var $continue = new Object(); - -var Enumerable = { - each: function(iterator) { - var index = 0; - try { - this._each(function(value) { - try { - iterator(value, index++); - } catch (e) { - if (e != $continue) throw e; - } - }); - } catch (e) { - if (e != $break) throw e; - } - }, - - all: function(iterator) { - var result = true; - this.each(function(value, index) { - result = result && !!(iterator || Prototype.K)(value, index); - if (!result) throw $break; - }); - return result; - }, - - any: function(iterator) { - var result = true; - this.each(function(value, index) { - if (result = !!(iterator || Prototype.K)(value, index)) - throw $break; - }); - return result; - }, - - collect: function(iterator) { - var results = []; - this.each(function(value, index) { - results.push(iterator(value, index)); - }); - return results; - }, - - detect: function (iterator) { - var result; - this.each(function(value, index) { - if (iterator(value, index)) { - result = value; - throw $break; - } - }); - return result; - }, - - findAll: function(iterator) { - var results = []; - this.each(function(value, index) { - if (iterator(value, index)) - results.push(value); - }); - return results; - }, - - grep: function(pattern, iterator) { - var results = []; - this.each(function(value, index) { - var stringValue = value.toString(); - if (stringValue.match(pattern)) - results.push((iterator || Prototype.K)(value, index)); - }) - return results; - }, - - include: function(object) { - var found = false; - this.each(function(value) { - if (value == object) { - found = true; - throw $break; - } - }); - return found; - }, - - inject: function(memo, iterator) { - this.each(function(value, index) { - memo = iterator(memo, value, index); - }); - return memo; - }, - - invoke: function(method) { - var args = $A(arguments).slice(1); - return this.collect(function(value) { - return value[method].apply(value, args); - }); - }, - - max: function(iterator) { - var result; - this.each(function(value, index) { - value = (iterator || Prototype.K)(value, index); - if (result == undefined || value >= result) - result = value; - }); - return result; - }, - - min: function(iterator) { - var result; - this.each(function(value, index) { - value = (iterator || Prototype.K)(value, index); - if (result == undefined || value < result) - result = value; - }); - return result; - }, - - partition: function(iterator) { - var trues = [], falses = []; - this.each(function(value, index) { - ((iterator || Prototype.K)(value, index) ? - trues : falses).push(value); - }); - return [trues, falses]; - }, - - pluck: function(property) { - var results = []; - this.each(function(value, index) { - results.push(value[property]); - }); - return results; - }, - - reject: function(iterator) { - var results = []; - this.each(function(value, index) { - if (!iterator(value, index)) - results.push(value); - }); - return results; - }, - - sortBy: function(iterator) { - return this.collect(function(value, index) { - return {value: value, criteria: iterator(value, index)}; - }).sort(function(left, right) { - var a = left.criteria, b = right.criteria; - return a < b ? -1 : a > b ? 1 : 0; - }).pluck('value'); - }, - - toArray: function() { - return this.collect(Prototype.K); - }, - - zip: function() { - var iterator = Prototype.K, args = $A(arguments); - if (typeof args.last() == 'function') - iterator = args.pop(); - - var collections = [this].concat(args).map($A); - return this.map(function(value, index) { - return iterator(collections.pluck(index)); - }); - }, - - inspect: function() { - return '#<Enumerable:' + this.toArray().inspect() + '>'; - } -} - -Object.extend(Enumerable, { - map: Enumerable.collect, - find: Enumerable.detect, - select: Enumerable.findAll, - member: Enumerable.include, - entries: Enumerable.toArray -}); -var $A = Array.from = function(iterable) { - if (!iterable) return []; - if (iterable.toArray) { - return iterable.toArray(); - } else { - var results = []; - for (var i = 0; i < iterable.length; i++) - results.push(iterable[i]); - return results; - } -} - -Object.extend(Array.prototype, Enumerable); - -if (!Array.prototype._reverse) - Array.prototype._reverse = Array.prototype.reverse; - -Object.extend(Array.prototype, { - _each: function(iterator) { - for (var i = 0; i < this.length; i++) - iterator(this[i]); - }, - - clear: function() { - this.length = 0; - return this; - }, - - first: function() { - return this[0]; - }, - - last: function() { - return this[this.length - 1]; - }, - - compact: function() { - return this.select(function(value) { - return value != undefined || value != null; - }); - }, - - flatten: function() { - return this.inject([], function(array, value) { - return array.concat(value && value.constructor == Array ? - value.flatten() : [value]); - }); - }, - - without: function() { - var values = $A(arguments); - return this.select(function(value) { - return !values.include(value); - }); - }, - - indexOf: function(object) { - for (var i = 0; i < this.length; i++) - if (this[i] == object) return i; - return -1; - }, - - reverse: function(inline) { - return (inline !== false ? this : this.toArray())._reverse(); - }, - - inspect: function() { - return '[' + this.map(Object.inspect).join(', ') + ']'; - } -}); -var Hash = { - _each: function(iterator) { - for (var key in this) { - var value = this[key]; - if (typeof value == 'function') continue; - - var pair = [key, value]; - pair.key = key; - pair.value = value; - iterator(pair); - } - }, - - keys: function() { - return this.pluck('key'); - }, - - values: function() { - return this.pluck('value'); - }, - - merge: function(hash) { - return $H(hash).inject($H(this), function(mergedHash, pair) { - mergedHash[pair.key] = pair.value; - return mergedHash; - }); - }, - - toQueryString: function() { - return this.map(function(pair) { - return pair.map(encodeURIComponent).join('='); - }).join('&'); - }, - - inspect: function() { - return '#<Hash:{' + this.map(function(pair) { - return pair.map(Object.inspect).join(': '); - }).join(', ') + '}>'; - } -} - -function $H(object) { - var hash = Object.extend({}, object || {}); - Object.extend(hash, Enumerable); - Object.extend(hash, Hash); - return hash; -} -ObjectRange = Class.create(); -Object.extend(ObjectRange.prototype, Enumerable); -Object.extend(ObjectRange.prototype, { - initialize: function(start, end, exclusive) { - this.start = start; - this.end = end; - this.exclusive = exclusive; - }, - - _each: function(iterator) { - var value = this.start; - do { - iterator(value); - value = value.succ(); - } while (this.include(value)); - }, - - include: function(value) { - if (value < this.start) - return false; - if (this.exclusive) - return value < this.end; - return value <= this.end; - } -}); - -var $R = function(start, end, exclusive) { - return new ObjectRange(start, end, exclusive); -} - -var Ajax = { - getTransport: function() { - return Try.these( - function() {return new XMLHttpRequest()}, - function() {return new ActiveXObject('Msxml2.XMLHTTP')}, - function() {return new ActiveXObject('Microsoft.XMLHTTP')} - ) || false; - }, - - activeRequestCount: 0 -} - -Ajax.Responders = { - responders: [], - - _each: function(iterator) { - this.responders._each(iterator); - }, - - register: function(responderToAdd) { - if (!this.include(responderToAdd)) - this.responders.push(responderToAdd); - }, - - unregister: function(responderToRemove) { - this.responders = this.responders.without(responderToRemove); - }, - - dispatch: function(callback, request, transport, json) { - this.each(function(responder) { - if (responder[callback] && typeof responder[callback] == 'function') { - try { - responder[callback].apply(responder, [request, transport, json]); - } catch (e) {} - } - }); - } -}; - -Object.extend(Ajax.Responders, Enumerable); - -Ajax.Responders.register({ - onCreate: function() { - Ajax.activeRequestCount++; - }, - - onComplete: function() { - Ajax.activeRequestCount--; - } -}); - -Ajax.Base = function() {}; -Ajax.Base.prototype = { - setOptions: function(options) { - this.options = { - method: 'post', - asynchronous: true, - contentType: 'application/x-www-form-urlencoded', - parameters: '' - } - Object.extend(this.options, options || {}); - }, - - responseIsSuccess: function() { - return this.transport.status == undefined - || this.transport.status == 0 - || (this.transport.status >= 200 && this.transport.status < 300); - }, - - responseIsFailure: function() { - return !this.responseIsSuccess(); - } -} - -Ajax.Request = Class.create(); -Ajax.Request.Events = - ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; - -Ajax.Request.prototype = Object.extend(new Ajax.Base(), { - initialize: function(url, options) { - this.transport = Ajax.getTransport(); - this.setOptions(options); - this.request(url); - }, - - request: function(url) { - var parameters = this.options.parameters || ''; - if (parameters.length > 0) parameters += '&_='; - - try { - this.url = url; - if (this.options.method == 'get' && parameters.length > 0) - this.url += (this.url.match(/\?/) ? '&' : '?') + parameters; - - Ajax.Responders.dispatch('onCreate', this, this.transport); - - this.transport.open(this.options.method, this.url, - this.options.asynchronous); - - if (this.options.asynchronous) { - this.transport.onreadystatechange = this.onStateChange.bind(this); - setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10); - } - - this.setRequestHeaders(); - - var body = this.options.postBody ? this.options.postBody : parameters; - this.transport.send(this.options.method == 'post' ? body : null); - - } catch (e) { - this.dispatchException(e); - } - }, - - setRequestHeaders: function() { - var requestHeaders = - ['X-Requested-With', 'XMLHttpRequest', - 'X-Prototype-Version', Prototype.Version, - 'Accept', 'text/javascript, text/html, application/xml, text/xml, */*']; - - if (this.options.method == 'post') { - requestHeaders.push('Content-type', this.options.contentType); - - /* Force "Connection: close" for Mozilla browsers to work around - * a bug where XMLHttpReqeuest sends an incorrect Content-length - * header. See Mozilla Bugzilla #246651. - */ - if (this.transport.overrideMimeType) - requestHeaders.push('Connection', 'close'); - } - - if (this.options.requestHeaders) - requestHeaders.push.apply(requestHeaders, this.options.requestHeaders); - - for (var i = 0; i < requestHeaders.length; i += 2) - this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]); - }, - - onStateChange: function() { - var readyState = this.transport.readyState; - if (readyState != 1) - this.respondToReadyState(this.transport.readyState); - }, - - header: function(name) { - try { - return this.transport.getResponseHeader(name); - } catch (e) {} - }, - - evalJSON: function() { - try { - return eval('(' + this.header('X-JSON') + ')'); - } catch (e) {} - }, - - evalResponse: function() { - try { - return eval(this.transport.responseText); - } catch (e) { - this.dispatchException(e); - } - }, - - respondToReadyState: function(readyState) { - var event = Ajax.Request.Events[readyState]; - var transport = this.transport, json = this.evalJSON(); - - if (event == 'Complete') { - try { - (this.options['on' + this.transport.status] - || this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')] - || Prototype.emptyFunction)(transport, json); - } catch (e) { - this.dispatchException(e); - } - - if ((this.header('Content-type') || '').match(/^text\/javascript/i)) - this.evalResponse(); - } - - try { - (this.options['on' + event] || Prototype.emptyFunction)(transport, json); - Ajax.Responders.dispatch('on' + event, this, transport, json); - } catch (e) { - this.dispatchException(e); - } - - /* Avoid memory leak in MSIE: clean up the oncomplete event handler */ - if (event == 'Complete') - this.transport.onreadystatechange = Prototype.emptyFunction; - }, - - dispatchException: function(exception) { - (this.options.onException || Prototype.emptyFunction)(this, exception); - Ajax.Responders.dispatch('onException', this, exception); - } -}); - -Ajax.Updater = Class.create(); - -Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), { - initialize: function(container, url, options) { - this.containers = { - success: container.success ? $(container.success) : $(container), - failure: container.failure ? $(container.failure) : - (container.success ? null : $(container)) - } - - this.transport = Ajax.getTransport(); - this.setOptions(options); - - var onComplete = this.options.onComplete || Prototype.emptyFunction; - this.options.onComplete = (function(transport, object) { - this.updateContent(); - onComplete(transport, object); - }).bind(this); - - this.request(url); - }, - - updateContent: function() { - var receiver = this.responseIsSuccess() ? - this.containers.success : this.containers.failure; - var response = this.transport.responseText; - - if (!this.options.evalScripts) - response = response.stripScripts(); - - if (receiver) { - if (this.options.insertion) { - new this.options.insertion(receiver, response); - } else { - Element.update(receiver, response); - } - } - - if (this.responseIsSuccess()) { - if (this.onComplete) - setTimeout(this.onComplete.bind(this), 10); - } - } -}); - -Ajax.PeriodicalUpdater = Class.create(); -Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), { - initialize: function(container, url, options) { - this.setOptions(options); - this.onComplete = this.options.onComplete; - - this.frequency = (this.options.frequency || 2); - this.decay = (this.options.decay || 1); - - this.updater = {}; - this.container = container; - this.url = url; - - this.start(); - }, - - start: function() { - this.options.onComplete = this.updateComplete.bind(this); - this.onTimerEvent(); - }, - - stop: function() { - this.updater.onComplete = undefined; - clearTimeout(this.timer); - (this.onComplete || Prototype.emptyFunction).apply(this, arguments); - }, - - updateComplete: function(request) { - if (this.options.decay) { - this.decay = (request.responseText == this.lastText ? - this.decay * this.options.decay : 1); - - this.lastText = request.responseText; - } - this.timer = setTimeout(this.onTimerEvent.bind(this), - this.decay * this.frequency * 1000); - }, - - onTimerEvent: function() { - this.updater = new Ajax.Updater(this.container, this.url, this.options); - } -}); -function $() { - var results = [], element; - for (var i = 0; i < arguments.length; i++) { - element = arguments[i]; - if (typeof element == 'string') - element = document.getElementById(element); - results.push(Element.extend(element)); - } - return results.length < 2 ? results[0] : results; -} - -document.getElementsByClassName = function(className, parentElement) { - var children = ($(parentElement) || document.body).getElementsByTagName('*'); - return $A(children).inject([], function(elements, child) { - if (child.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)"))) - elements.push(Element.extend(child)); - return elements; - }); -} - -/*--------------------------------------------------------------------------*/ - -if (!window.Element) - var Element = new Object(); - -Element.extend = function(element) { - if (!element) return; - if (_nativeExtensions) return element; - - if (!element._extended && element.tagName && element != window) { - var methods = Element.Methods, cache = Element.extend.cache; - for (property in methods) { - var value = methods[property]; - if (typeof value == 'function') - element[property] = cache.findOrStore(value); - } - } - - element._extended = true; - return element; -} - -Element.extend.cache = { - findOrStore: function(value) { - return this[value] = this[value] || function() { - return value.apply(null, [this].concat($A(arguments))); - } - } -} - -Element.Methods = { - visible: function(element) { - return $(element).style.display != 'none'; - }, - - toggle: function() { - for (var i = 0; i < arguments.length; i++) { - var element = $(arguments[i]); - Element[Element.visible(element) ? 'hide' : 'show'](element); - } - }, - - hide: function() { - for (var i = 0; i < arguments.length; i++) { - var element = $(arguments[i]); - element.style.display = 'none'; - } - }, - - show: function() { - for (var i = 0; i < arguments.length; i++) { - var element = $(arguments[i]); - element.style.display = ''; - } - }, - - remove: function(element) { - element = $(element); - element.parentNode.removeChild(element); - }, - - update: function(element, html) { - $(element).innerHTML = html.stripScripts(); - setTimeout(function() {html.evalScripts()}, 10); - }, - - replace: function(element, html) { - element = $(element); - if (element.outerHTML) { - element.outerHTML = html.stripScripts(); - } else { - var range = element.ownerDocument.createRange(); - range.selectNodeContents(element); - element.parentNode.replaceChild( - range.createContextualFragment(html.stripScripts()), element); - } - setTimeout(function() {html.evalScripts()}, 10); - }, - - getHeight: function(element) { - element = $(element); - return element.offsetHeight; - }, - - classNames: function(element) { - return new Element.ClassNames(element); - }, - - hasClassName: function(element, className) { - if (!(element = $(element))) return; - return Element.classNames(element).include(className); - }, - - addClassName: function(element, className) { - if (!(element = $(element))) return; - return Element.classNames(element).add(className); - }, - - removeClassName: function(element, className) { - if (!(element = $(element))) return; - return Element.classNames(element).remove(className); - }, - - // removes whitespace-only text node children - cleanWhitespace: function(element) { - element = $(element); - for (var i = 0; i < element.childNodes.length; i++) { - var node = element.childNodes[i]; - if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) - Element.remove(node); - } - }, - - empty: function(element) { - return $(element).innerHTML.match(/^\s*$/); - }, - - childOf: function(element, ancestor) { - element = $(element), ancestor = $(ancestor); - while (element = element.parentNode) - if (element == ancestor) return true; - return false; - }, - - scrollTo: function(element) { - element = $(element); - var x = element.x ? element.x : element.offsetLeft, - y = element.y ? element.y : element.offsetTop; - window.scrollTo(x, y); - }, - - getStyle: function(element, style) { - element = $(element); - var value = element.style[style.camelize()]; - if (!value) { - if (document.defaultView && document.defaultView.getComputedStyle) { - var css = document.defaultView.getComputedStyle(element, null); - value = css ? css.getPropertyValue(style) : null; - } else if (element.currentStyle) { - value = element.currentStyle[style.camelize()]; - } - } - - if (window.opera && ['left', 'top', 'right', 'bottom'].include(style)) - if (Element.getStyle(element, 'position') == 'static') value = 'auto'; - - return value == 'auto' ? null : value; - }, - - setStyle: function(element, style) { - element = $(element); - for (var name in style) - element.style[name.camelize()] = style[name]; - }, - - getDimensions: function(element) { - element = $(element); - if (Element.getStyle(element, 'display') != 'none') - return {width: element.offsetWidth, height: element.offsetHeight}; - - // All *Width and *Height properties give 0 on elements with display none, - // so enable the element temporarily - var els = element.style; - var originalVisibility = els.visibility; - var originalPosition = els.position; - els.visibility = 'hidden'; - els.position = 'absolute'; - els.display = ''; - var originalWidth = element.clientWidth; - var originalHeight = element.clientHeight; - els.display = 'none'; - els.position = originalPosition; - els.visibility = originalVisibility; - return {width: originalWidth, height: originalHeight}; - }, - - makePositioned: function(element) { - element = $(element); - var pos = Element.getStyle(element, 'position'); - if (pos == 'static' || !pos) { - element._madePositioned = true; - element.style.position = 'relative'; - // Opera returns the offset relative to the positioning context, when an - // element is position relative but top and left have not been defined - if (window.opera) { - element.style.top = 0; - element.style.left = 0; - } - } - }, - - undoPositioned: function(element) { - element = $(element); - if (element._madePositioned) { - element._madePositioned = undefined; - element.style.position = - element.style.top = - element.style.left = - element.style.bottom = - element.style.right = ''; - } - }, - - makeClipping: function(element) { - element = $(element); - if (element._overflow) return; - element._overflow = element.style.overflow; - if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden') - element.style.overflow = 'hidden'; - }, - - undoClipping: function(element) { - element = $(element); - if (element._overflow) return; - element.style.overflow = element._overflow; - element._overflow = undefined; - } -} - -Object.extend(Element, Element.Methods); - -var _nativeExtensions = false; - -if(!HTMLElement && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) { - var HTMLElement = {} - HTMLElement.prototype = document.createElement('div').__proto__; -} - -Element.addMethods = function(methods) { - Object.extend(Element.Methods, methods || {}); - - if(typeof HTMLElement != 'undefined') { - var methods = Element.Methods, cache = Element.extend.cache; - for (property in methods) { - var value = methods[property]; - if (typeof value == 'function') - HTMLElement.prototype[property] = cache.findOrStore(value); - } - _nativeExtensions = true; - } -} - -Element.addMethods(); - -var Toggle = new Object(); -Toggle.display = Element.toggle; - -/*--------------------------------------------------------------------------*/ - -Abstract.Insertion = function(adjacency) { - this.adjacency = adjacency; -} - -Abstract.Insertion.prototype = { - initialize: function(element, content) { - this.element = $(element); - this.content = content.stripScripts(); - - if (this.adjacency && this.element.insertAdjacentHTML) { - try { - this.element.insertAdjacentHTML(this.adjacency, this.content); - } catch (e) { - var tagName = this.element.tagName.toLowerCase(); - if (tagName == 'tbody' || tagName == 'tr') { - this.insertContent(this.contentFromAnonymousTable()); - } else { - throw e; - } - } - } else { - this.range = this.element.ownerDocument.createRange(); - if (this.initializeRange) this.initializeRange(); - this.insertContent([this.range.createContextualFragment(this.content)]); - } - - setTimeout(function() {content.evalScripts()}, 10); - }, - - contentFromAnonymousTable: function() { - var div = document.createElement('div'); - div.innerHTML = '<table><tbody>' + this.content + '</tbody></table>'; - return $A(div.childNodes[0].childNodes[0].childNodes); - } -} - -var Insertion = new Object(); - -Insertion.Before = Class.create(); -Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), { - initializeRange: function() { - this.range.setStartBefore(this.element); - }, - - insertContent: function(fragments) { - fragments.each((function(fragment) { - this.element.parentNode.insertBefore(fragment, this.element); - }).bind(this)); - } -}); - -Insertion.Top = Class.create(); -Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), { - initializeRange: function() { - this.range.selectNodeContents(this.element); - this.range.collapse(true); - }, - - insertContent: function(fragments) { - fragments.reverse(false).each((function(fragment) { - this.element.insertBefore(fragment, this.element.firstChild); - }).bind(this)); - } -}); - -Insertion.Bottom = Class.create(); -Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), { - initializeRange: function() { - this.range.selectNodeContents(this.element); - this.range.collapse(this.element); - }, - - insertContent: function(fragments) { - fragments.each((function(fragment) { - this.element.appendChild(fragment); - }).bind(this)); - } -}); - -Insertion.After = Class.create(); -Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), { - initializeRange: function() { - this.range.setStartAfter(this.element); - }, - - insertContent: function(fragments) { - fragments.each((function(fragment) { - this.element.parentNode.insertBefore(fragment, - this.element.nextSibling); - }).bind(this)); - } -}); - -/*--------------------------------------------------------------------------*/ - -Element.ClassNames = Class.create(); -Element.ClassNames.prototype = { - initialize: function(element) { - this.element = $(element); - }, - - _each: function(iterator) { - this.element.className.split(/\s+/).select(function(name) { - return name.length > 0; - })._each(iterator); - }, - - set: function(className) { - this.element.className = className; - }, - - add: function(classNameToAdd) { - if (this.include(classNameToAdd)) return; - this.set(this.toArray().concat(classNameToAdd).join(' ')); - }, - - remove: function(classNameToRemove) { - if (!this.include(classNameToRemove)) return; - this.set(this.select(function(className) { - return className != classNameToRemove; - }).join(' ')); - }, - - toString: function() { - return this.toArray().join(' '); - } -} - -Object.extend(Element.ClassNames.prototype, Enumerable); -var Selector = Class.create(); -Selector.prototype = { - initialize: function(expression) { - this.params = {classNames: []}; - this.expression = expression.toString().strip(); - this.parseExpression(); - this.compileMatcher(); - }, - - parseExpression: function() { - function abort(message) { throw 'Parse error in selector: ' + message; } - - if (this.expression == '') abort('empty expression'); - - var params = this.params, expr = this.expression, match, modifier, clause, rest; - while (match = expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)) { - params.attributes = params.attributes || []; - params.attributes.push({name: match[2], operator: match[3], value: match[4] || match[5] || ''}); - expr = match[1]; - } - - if (expr == '*') return this.params.wildcard = true; - - while (match = expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+)(.*)/i)) { - modifier = match[1], clause = match[2], rest = match[3]; - switch (modifier) { - case '#': params.id = clause; break; - case '.': params.classNames.push(clause); break; - case '': - case undefined: params.tagName = clause.toUpperCase(); break; - default: abort(expr.inspect()); - } - expr = rest; - } - - if (expr.length > 0) abort(expr.inspect()); - }, - - buildMatchExpression: function() { - var params = this.params, conditions = [], clause; - - if (params.wildcard) - conditions.push('true'); - if (clause = params.id) - conditions.push('element.id == ' + clause.inspect()); - if (clause = params.tagName) - conditions.push('element.tagName.toUpperCase() == ' + clause.inspect()); - if ((clause = params.classNames).length > 0) - for (var i = 0; i < clause.length; i++) - conditions.push('Element.hasClassName(element, ' + clause[i].inspect() + ')'); - if (clause = params.attributes) { - clause.each(function(attribute) { - var value = 'element.getAttribute(' + attribute.name.inspect() + ')'; - var splitValueBy = function(delimiter) { - return value + ' && ' + value + '.split(' + delimiter.inspect() + ')'; - } - - switch (attribute.operator) { - case '=': conditions.push(value + ' == ' + attribute.value.inspect()); break; - case '~=': conditions.push(splitValueBy(' ') + '.include(' + attribute.value.inspect() + ')'); break; - case '|=': conditions.push( - splitValueBy('-') + '.first().toUpperCase() == ' + attribute.value.toUpperCase().inspect() - ); break; - case '!=': conditions.push(value + ' != ' + attribute.value.inspect()); break; - case '': - case undefined: conditions.push(value + ' != null'); break; - default: throw 'Unknown operator ' + attribute.operator + ' in selector'; - } - }); - } - - return conditions.join(' && '); - }, - - compileMatcher: function() { - this.match = new Function('element', 'if (!element.tagName) return false; \ - return ' + this.buildMatchExpression()); - }, - - findElements: function(scope) { - var element; - - if (element = $(this.params.id)) - if (this.match(element)) - if (!scope || Element.childOf(element, scope)) - return [element]; - - scope = (scope || document).getElementsByTagName(this.params.tagName || '*'); - - var results = []; - for (var i = 0; i < scope.length; i++) - if (this.match(element = scope[i])) - results.push(Element.extend(element)); - - return results; - }, - - toString: function() { - return this.expression; - } -} - -function $$() { - return $A(arguments).map(function(expression) { - return expression.strip().split(/\s+/).inject([null], function(results, expr) { - var selector = new Selector(expr); - return results.map(selector.findElements.bind(selector)).flatten(); - }); - }).flatten(); -} -var Field = { - clear: function() { - for (var i = 0; i < arguments.length; i++) - $(arguments[i]).value = ''; - }, - - focus: function(element) { - $(element).focus(); - }, - - present: function() { - for (var i = 0; i < arguments.length; i++) - if ($(arguments[i]).value == '') return false; - return true; - }, - - select: function(element) { - $(element).select(); - }, - - activate: function(element) { - element = $(element); - element.focus(); - if (element.select) - element.select(); - } -} - -/*--------------------------------------------------------------------------*/ - -var Form = { - serialize: function(form) { - var elements = Form.getElements($(form)); - var queryComponents = new Array(); - - for (var i = 0; i < elements.length; i++) { - var queryComponent = Form.Element.serialize(elements[i]); - if (queryComponent) - queryComponents.push(queryComponent); - } - - return queryComponents.join('&'); - }, - - getElements: function(form) { - form = $(form); - var elements = new Array(); - - for (var tagName in Form.Element.Serializers) { - var tagElements = form.getElementsByTagName(tagName); - for (var j = 0; j < tagElements.length; j++) - elements.push(tagElements[j]); - } - return elements; - }, - - getInputs: function(form, typeName, name) { - form = $(form); - var inputs = form.getElementsByTagName('input'); - - if (!typeName && !name) - return inputs; - - var matchingInputs = new Array(); - for (var i = 0; i < inputs.length; i++) { - var input = inputs[i]; - if ((typeName && input.type != typeName) || - (name && input.name != name)) - continue; - matchingInputs.push(input); - } - - return matchingInputs; - }, - - disable: function(form) { - var elements = Form.getElements(form); - for (var i = 0; i < elements.length; i++) { - var element = elements[i]; - element.blur(); - element.disabled = 'true'; - } - }, - - enable: function(form) { - var elements = Form.getElements(form); - for (var i = 0; i < elements.length; i++) { - var element = elements[i]; - element.disabled = ''; - } - }, - - findFirstElement: function(form) { - return Form.getElements(form).find(function(element) { - return element.type != 'hidden' && !element.disabled && - ['input', 'select', 'textarea'].include(element.tagName.toLowerCase()); - }); - }, - - focusFirstElement: function(form) { - Field.activate(Form.findFirstElement(form)); - }, - - reset: function(form) { - $(form).reset(); - } -} - -Form.Element = { - serialize: function(element) { - element = $(element); - var method = element.tagName.toLowerCase(); - var parameter = Form.Element.Serializers[method](element); - - if (parameter) { - var key = encodeURIComponent(parameter[0]); - if (key.length == 0) return; - - if (parameter[1].constructor != Array) - parameter[1] = [parameter[1]]; - - return parameter[1].map(function(value) { - return key + '=' + encodeURIComponent(value); - }).join('&'); - } - }, - - getValue: function(element) { - element = $(element); - var method = element.tagName.toLowerCase(); - var parameter = Form.Element.Serializers[method](element); - - if (parameter) - return parameter[1]; - } -} - -Form.Element.Serializers = { - input: function(element) { - switch (element.type.toLowerCase()) { - case 'submit': - case 'hidden': - case 'password': - case 'text': - return Form.Element.Serializers.textarea(element); - case 'checkbox': - case 'radio': - return Form.Element.Serializers.inputSelector(element); - } - return false; - }, - - inputSelector: function(element) { - if (element.checked) - return [element.name, element.value]; - }, - - textarea: function(element) { - return [element.name, element.value]; - }, - - select: function(element) { - return Form.Element.Serializers[element.type == 'select-one' ? - 'selectOne' : 'selectMany'](element); - }, - - selectOne: function(element) { - var value = '', opt, index = element.selectedIndex; - if (index >= 0) { - opt = element.options[index]; - value = opt.value || opt.text; - } - return [element.name, value]; - }, - - selectMany: function(element) { - var value = []; - for (var i = 0; i < element.length; i++) { - var opt = element.options[i]; - if (opt.selected) - value.push(opt.value || opt.text); - } - return [element.name, value]; - } -} - -/*--------------------------------------------------------------------------*/ - -var $F = Form.Element.getValue; - -/*--------------------------------------------------------------------------*/ - -Abstract.TimedObserver = function() {} -Abstract.TimedObserver.prototype = { - initialize: function(element, frequency, callback) { - this.frequency = frequency; - this.element = $(element); - this.callback = callback; - - this.lastValue = this.getValue(); - this.registerCallback(); - }, - - registerCallback: function() { - setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); - }, - - onTimerEvent: function() { - var value = this.getValue(); - if (this.lastValue != value) { - this.callback(this.element, value); - this.lastValue = value; - } - } -} - -Form.Element.Observer = Class.create(); -Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), { - getValue: function() { - return Form.Element.getValue(this.element); - } -}); - -Form.Observer = Class.create(); -Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), { - getValue: function() { - return Form.serialize(this.element); - } -}); - -/*--------------------------------------------------------------------------*/ - -Abstract.EventObserver = function() {} -Abstract.EventObserver.prototype = { - initialize: function(element, callback) { - this.element = $(element); - this.callback = callback; - - this.lastValue = this.getValue(); - if (this.element.tagName.toLowerCase() == 'form') - this.registerFormCallbacks(); - else - this.registerCallback(this.element); - }, - - onElementEvent: function() { - var value = this.getValue(); - if (this.lastValue != value) { - this.callback(this.element, value); - this.lastValue = value; - } - }, - - registerFormCallbacks: function() { - var elements = Form.getElements(this.element); - for (var i = 0; i < elements.length; i++) - this.registerCallback(elements[i]); - }, - - registerCallback: function(element) { - if (element.type) { - switch (element.type.toLowerCase()) { - case 'checkbox': - case 'radio': - Event.observe(element, 'click', this.onElementEvent.bind(this)); - break; - case 'password': - case 'text': - case 'textarea': - case 'select-one': - case 'select-multiple': - Event.observe(element, 'change', this.onElementEvent.bind(this)); - break; - } - } - } -} - -Form.Element.EventObserver = Class.create(); -Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), { - getValue: function() { - return Form.Element.getValue(this.element); - } -}); - -Form.EventObserver = Class.create(); -Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), { - getValue: function() { - return Form.serialize(this.element); - } -}); -if (!window.Event) { - var Event = new Object(); -} - -Object.extend(Event, { - KEY_BACKSPACE: 8, - KEY_TAB: 9, - KEY_RETURN: 13, - KEY_ESC: 27, - KEY_LEFT: 37, - KEY_UP: 38, - KEY_RIGHT: 39, - KEY_DOWN: 40, - KEY_DELETE: 46, - - element: function(event) { - return event.target || event.srcElement; - }, - - isLeftClick: function(event) { - return (((event.which) && (event.which == 1)) || - ((event.button) && (event.button == 1))); - }, - - pointerX: function(event) { - return event.pageX || (event.clientX + - (document.documentElement.scrollLeft || document.body.scrollLeft)); - }, - - pointerY: function(event) { - return event.pageY || (event.clientY + - (document.documentElement.scrollTop || document.body.scrollTop)); - }, - - stop: function(event) { - if (event.preventDefault) { - event.preventDefault(); - event.stopPropagation(); - } else { - event.returnValue = false; - event.cancelBubble = true; - } - }, - - // find the first node with the given tagName, starting from the - // node the event was triggered on; traverses the DOM upwards - findElement: function(event, tagName) { - var element = Event.element(event); - while (element.parentNode && (!element.tagName || - (element.tagName.toUpperCase() != tagName.toUpperCase()))) - element = element.parentNode; - return element; - }, - - observers: false, - - _observeAndCache: function(element, name, observer, useCapture) { - if (!this.observers) this.observers = []; - if (element.addEventListener) { - this.observers.push([element, name, observer, useCapture]); - element.addEventListener(name, observer, useCapture); - } else if (element.attachEvent) { - this.observers.push([element, name, observer, useCapture]); - element.attachEvent('on' + name, observer); - } - }, - - unloadCache: function() { - if (!Event.observers) return; - for (var i = 0; i < Event.observers.length; i++) { - Event.stopObserving.apply(this, Event.observers[i]); - Event.observers[i][0] = null; - } - Event.observers = false; - }, - - observe: function(element, name, observer, useCapture) { - var element = $(element); - useCapture = useCapture || false; - - if (name == 'keypress' && - (navigator.appVersion.match(/Konqueror|Safari|KHTML/) - || element.attachEvent)) - name = 'keydown'; - - this._observeAndCache(element, name, observer, useCapture); - }, - - stopObserving: function(element, name, observer, useCapture) { - var element = $(element); - useCapture = useCapture || false; - - if (name == 'keypress' && - (navigator.appVersion.match(/Konqueror|Safari|KHTML/) - || element.detachEvent)) - name = 'keydown'; - - if (element.removeEventListener) { - element.removeEventListener(name, observer, useCapture); - } else if (element.detachEvent) { - element.detachEvent('on' + name, observer); - } - } -}); - -/* prevent memory leaks in IE */ -if (navigator.appVersion.match(/\bMSIE\b/)) - Event.observe(window, 'unload', Event.unloadCache, false); -var Position = { - // set to true if needed, warning: firefox performance problems - // NOT neeeded for page scrolling, only if draggable contained in - // scrollable elements - includeScrollOffsets: false, - - // must be called before calling withinIncludingScrolloffset, every time the - // page is scrolled - prepare: function() { - this.deltaX = window.pageXOffset - || document.documentElement.scrollLeft - || document.body.scrollLeft - || 0; - this.deltaY = window.pageYOffset - || document.documentElement.scrollTop - || document.body.scrollTop - || 0; - }, - - realOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.scrollTop || 0; - valueL += element.scrollLeft || 0; - element = element.parentNode; - } while (element); - return [valueL, valueT]; - }, - - cumulativeOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - element = element.offsetParent; - } while (element); - return [valueL, valueT]; - }, - - positionedOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - element = element.offsetParent; - if (element) { - p = Element.getStyle(element, 'position'); - if (p == 'relative' || p == 'absolute') break; - } - } while (element); - return [valueL, valueT]; - }, - - offsetParent: function(element) { - if (element.offsetParent) return element.offsetParent; - if (element == document.body) return element; - - while ((element = element.parentNode) && element != document.body) - if (Element.getStyle(element, 'position') != 'static') - return element; - - return document.body; - }, - - // caches x/y coordinate pair to use with overlap - within: function(element, x, y) { - if (this.includeScrollOffsets) - return this.withinIncludingScrolloffsets(element, x, y); - this.xcomp = x; - this.ycomp = y; - this.offset = this.cumulativeOffset(element); - - return (y >= this.offset[1] && - y < this.offset[1] + element.offsetHeight && - x >= this.offset[0] && - x < this.offset[0] + element.offsetWidth); - }, - - withinIncludingScrolloffsets: function(element, x, y) { - var offsetcache = this.realOffset(element); - - this.xcomp = x + offsetcache[0] - this.deltaX; - this.ycomp = y + offsetcache[1] - this.deltaY; - this.offset = this.cumulativeOffset(element); - - return (this.ycomp >= this.offset[1] && - this.ycomp < this.offset[1] + element.offsetHeight && - this.xcomp >= this.offset[0] && - this.xcomp < this.offset[0] + element.offsetWidth); - }, - - // within must be called directly before - overlap: function(mode, element) { - if (!mode) return 0; - if (mode == 'vertical') - return ((this.offset[1] + element.offsetHeight) - this.ycomp) / - element.offsetHeight; - if (mode == 'horizontal') - return ((this.offset[0] + element.offsetWidth) - this.xcomp) / - element.offsetWidth; - }, - - clone: function(source, target) { - source = $(source); - target = $(target); - target.style.position = 'absolute'; - var offsets = this.cumulativeOffset(source); - target.style.top = offsets[1] + 'px'; - target.style.left = offsets[0] + 'px'; - target.style.width = source.offsetWidth + 'px'; - target.style.height = source.offsetHeight + 'px'; - }, - - page: function(forElement) { - var valueT = 0, valueL = 0; - - var element = forElement; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - - // Safari fix - if (element.offsetParent==document.body) - if (Element.getStyle(element,'position')=='absolute') break; - - } while (element = element.offsetParent); - - element = forElement; - do { - valueT -= element.scrollTop || 0; - valueL -= element.scrollLeft || 0; - } while (element = element.parentNode); - - return [valueL, valueT]; - }, - - clone: function(source, target) { - var options = Object.extend({ - setLeft: true, - setTop: true, - setWidth: true, - setHeight: true, - offsetTop: 0, - offsetLeft: 0 - }, arguments[2] || {}) - - // find page position of source - source = $(source); - var p = Position.page(source); - - // find coordinate system to use - target = $(target); - var delta = [0, 0]; - var parent = null; - // delta [0,0] will do fine with position: fixed elements, - // position:absolute needs offsetParent deltas - if (Element.getStyle(target,'position') == 'absolute') { - parent = Position.offsetParent(target); - delta = Position.page(parent); - } - - // correct by body offsets (fixes Safari) - if (parent == document.body) { - delta[0] -= document.body.offsetLeft; - delta[1] -= document.body.offsetTop; - } - - // set position - if(options.setLeft) target.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px'; - if(options.setTop) target.style.top = (p[1] - delta[1] + options.offsetTop) + 'px'; - if(options.setWidth) target.style.width = source.offsetWidth + 'px'; - if(options.setHeight) target.style.height = source.offsetHeight + 'px'; - }, - - absolutize: function(element) { - element = $(element); - if (element.style.position == 'absolute') return; - Position.prepare(); - - var offsets = Position.positionedOffset(element); - var top = offsets[1]; - var left = offsets[0]; - var width = element.clientWidth; - var height = element.clientHeight; - - element._originalLeft = left - parseFloat(element.style.left || 0); - element._originalTop = top - parseFloat(element.style.top || 0); - element._originalWidth = element.style.width; - element._originalHeight = element.style.height; - - element.style.position = 'absolute'; - element.style.top = top + 'px';; - element.style.left = left + 'px';; - element.style.width = width + 'px';; - element.style.height = height + 'px';; - }, - - relativize: function(element) { - element = $(element); - if (element.style.position == 'relative') return; - Position.prepare(); - - element.style.position = 'relative'; - var top = parseFloat(element.style.top || 0) - (element._originalTop || 0); - var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0); - - element.style.top = top + 'px'; - element.style.left = left + 'px'; - element.style.height = element._originalHeight; - element.style.width = element._originalWidth; - } -} - -// Safari returns margins on body which is incorrect if the child is absolutely -// positioned. For performance reasons, redefine Position.cumulativeOffset for -// KHTML/WebKit only. -if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) { - Position.cumulativeOffset = function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - if (element.offsetParent == document.body) - if (Element.getStyle(element, 'position') == 'absolute') break; - - element = element.offsetParent; - } while (element); - - return [valueL, valueT]; - } -}
\ No newline at end of file diff --git a/tests/test_tools/selenium/core/lib/scriptaculous/builder.js b/tests/test_tools/selenium/core/lib/scriptaculous/builder.js deleted file mode 100644 index 5b15ba93..00000000 --- a/tests/test_tools/selenium/core/lib/scriptaculous/builder.js +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// -// See scriptaculous.js for full license. - -var Builder = { - NODEMAP: { - AREA: 'map', - CAPTION: 'table', - COL: 'table', - COLGROUP: 'table', - LEGEND: 'fieldset', - OPTGROUP: 'select', - OPTION: 'select', - PARAM: 'object', - TBODY: 'table', - TD: 'table', - TFOOT: 'table', - TH: 'table', - THEAD: 'table', - TR: 'table' - }, - // note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken, - // due to a Firefox bug - node: function(elementName) { - elementName = elementName.toUpperCase(); - - // try innerHTML approach - var parentTag = this.NODEMAP[elementName] || 'div'; - var parentElement = document.createElement(parentTag); - try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707 - parentElement.innerHTML = "<" + elementName + "></" + elementName + ">"; - } catch(e) {} - var element = parentElement.firstChild || null; - - // see if browser added wrapping tags - if(element && (element.tagName != elementName)) - element = element.getElementsByTagName(elementName)[0]; - - // fallback to createElement approach - if(!element) element = document.createElement(elementName); - - // abort if nothing could be created - if(!element) return; - - // attributes (or text) - if(arguments[1]) - if(this._isStringOrNumber(arguments[1]) || - (arguments[1] instanceof Array)) { - this._children(element, arguments[1]); - } else { - var attrs = this._attributes(arguments[1]); - if(attrs.length) { - try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707 - parentElement.innerHTML = "<" +elementName + " " + - attrs + "></" + elementName + ">"; - } catch(e) {} - element = parentElement.firstChild || null; - // workaround firefox 1.0.X bug - if(!element) { - element = document.createElement(elementName); - for(attr in arguments[1]) - element[attr == 'class' ? 'className' : attr] = arguments[1][attr]; - } - if(element.tagName != elementName) - element = parentElement.getElementsByTagName(elementName)[0]; - } - } - - // text, or array of children - if(arguments[2]) - this._children(element, arguments[2]); - - return element; - }, - _text: function(text) { - return document.createTextNode(text); - }, - _attributes: function(attributes) { - var attrs = []; - for(attribute in attributes) - attrs.push((attribute=='className' ? 'class' : attribute) + - '="' + attributes[attribute].toString().escapeHTML() + '"'); - return attrs.join(" "); - }, - _children: function(element, children) { - if(typeof children=='object') { // array can hold nodes and text - children.flatten().each( function(e) { - if(typeof e=='object') - element.appendChild(e) - else - if(Builder._isStringOrNumber(e)) - element.appendChild(Builder._text(e)); - }); - } else - if(Builder._isStringOrNumber(children)) - element.appendChild(Builder._text(children)); - }, - _isStringOrNumber: function(param) { - return(typeof param=='string' || typeof param=='number'); - } -}
\ No newline at end of file diff --git a/tests/test_tools/selenium/core/lib/scriptaculous/controls.js b/tests/test_tools/selenium/core/lib/scriptaculous/controls.js deleted file mode 100644 index de0261ed..00000000 --- a/tests/test_tools/selenium/core/lib/scriptaculous/controls.js +++ /dev/null @@ -1,815 +0,0 @@ -// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// (c) 2005 Ivan Krstic (http://blogs.law.harvard.edu/ivan) -// (c) 2005 Jon Tirsen (http://www.tirsen.com) -// Contributors: -// Richard Livsey -// Rahul Bhargava -// Rob Wills -// -// See scriptaculous.js for full license. - -// Autocompleter.Base handles all the autocompletion functionality -// that's independent of the data source for autocompletion. This -// includes drawing the autocompletion menu, observing keyboard -// and mouse events, and similar. -// -// Specific autocompleters need to provide, at the very least, -// a getUpdatedChoices function that will be invoked every time -// the text inside the monitored textbox changes. This method -// should get the text for which to provide autocompletion by -// invoking this.getToken(), NOT by directly accessing -// this.element.value. This is to allow incremental tokenized -// autocompletion. Specific auto-completion logic (AJAX, etc) -// belongs in getUpdatedChoices. -// -// Tokenized incremental autocompletion is enabled automatically -// when an autocompleter is instantiated with the 'tokens' option -// in the options parameter, e.g.: -// new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' }); -// will incrementally autocomplete with a comma as the token. -// Additionally, ',' in the above example can be replaced with -// a token array, e.g. { tokens: [',', '\n'] } which -// enables autocompletion on multiple tokens. This is most -// useful when one of the tokens is \n (a newline), as it -// allows smart autocompletion after linebreaks. - -var Autocompleter = {} -Autocompleter.Base = function() {}; -Autocompleter.Base.prototype = { - baseInitialize: function(element, update, options) { - this.element = $(element); - this.update = $(update); - this.hasFocus = false; - this.changed = false; - this.active = false; - this.index = 0; - this.entryCount = 0; - - if (this.setOptions) - this.setOptions(options); - else - this.options = options || {}; - - this.options.paramName = this.options.paramName || this.element.name; - this.options.tokens = this.options.tokens || []; - this.options.frequency = this.options.frequency || 0.4; - this.options.minChars = this.options.minChars || 1; - this.options.onShow = this.options.onShow || - function(element, update){ - if(!update.style.position || update.style.position=='absolute') { - update.style.position = 'absolute'; - Position.clone(element, update, {setHeight: false, offsetTop: element.offsetHeight}); - } - Effect.Appear(update,{duration:0.15}); - }; - this.options.onHide = this.options.onHide || - function(element, update){ new Effect.Fade(update,{duration:0.15}) }; - - if (typeof(this.options.tokens) == 'string') - this.options.tokens = new Array(this.options.tokens); - - this.observer = null; - - this.element.setAttribute('autocomplete','off'); - - Element.hide(this.update); - - Event.observe(this.element, "blur", this.onBlur.bindAsEventListener(this)); - Event.observe(this.element, "keypress", this.onKeyPress.bindAsEventListener(this)); - }, - - show: function() { - if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update); - if(!this.iefix && - (navigator.appVersion.indexOf('MSIE')>0) && - (navigator.userAgent.indexOf('Opera')<0) && - (Element.getStyle(this.update, 'position')=='absolute')) { - new Insertion.After(this.update, - '<iframe id="' + this.update.id + '_iefix" '+ - 'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' + - 'src="javascript:false;" frameborder="0" scrolling="no"></iframe>'); - this.iefix = $(this.update.id+'_iefix'); - } - if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50); - }, - - fixIEOverlapping: function() { - Position.clone(this.update, this.iefix); - this.iefix.style.zIndex = 1; - this.update.style.zIndex = 2; - Element.show(this.iefix); - }, - - hide: function() { - this.stopIndicator(); - if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update); - if(this.iefix) Element.hide(this.iefix); - }, - - startIndicator: function() { - if(this.options.indicator) Element.show(this.options.indicator); - }, - - stopIndicator: function() { - if(this.options.indicator) Element.hide(this.options.indicator); - }, - - onKeyPress: function(event) { - if(this.active) - switch(event.keyCode) { - case Event.KEY_TAB: - case Event.KEY_RETURN: - this.selectEntry(); - Event.stop(event); - case Event.KEY_ESC: - this.hide(); - this.active = false; - Event.stop(event); - return; - case Event.KEY_LEFT: - case Event.KEY_RIGHT: - return; - case Event.KEY_UP: - this.markPrevious(); - this.render(); - if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event); - return; - case Event.KEY_DOWN: - this.markNext(); - this.render(); - if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event); - return; - } - else - if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN || - (navigator.appVersion.indexOf('AppleWebKit') > 0 && event.keyCode == 0)) return; - - this.changed = true; - this.hasFocus = true; - - if(this.observer) clearTimeout(this.observer); - this.observer = - setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000); - }, - - activate: function() { - this.changed = false; - this.hasFocus = true; - this.getUpdatedChoices(); - }, - - onHover: function(event) { - var element = Event.findElement(event, 'LI'); - if(this.index != element.autocompleteIndex) - { - this.index = element.autocompleteIndex; - this.render(); - } - Event.stop(event); - }, - - onClick: function(event) { - var element = Event.findElement(event, 'LI'); - this.index = element.autocompleteIndex; - this.selectEntry(); - this.hide(); - }, - - onBlur: function(event) { - // needed to make click events working - setTimeout(this.hide.bind(this), 250); - this.hasFocus = false; - this.active = false; - }, - - render: function() { - if(this.entryCount > 0) { - for (var i = 0; i < this.entryCount; i++) - this.index==i ? - Element.addClassName(this.getEntry(i),"selected") : - Element.removeClassName(this.getEntry(i),"selected"); - - if(this.hasFocus) { - this.show(); - this.active = true; - } - } else { - this.active = false; - this.hide(); - } - }, - - markPrevious: function() { - if(this.index > 0) this.index-- - else this.index = this.entryCount-1; - }, - - markNext: function() { - if(this.index < this.entryCount-1) this.index++ - else this.index = 0; - }, - - getEntry: function(index) { - return this.update.firstChild.childNodes[index]; - }, - - getCurrentEntry: function() { - return this.getEntry(this.index); - }, - - selectEntry: function() { - this.active = false; - this.updateElement(this.getCurrentEntry()); - }, - - updateElement: function(selectedElement) { - if (this.options.updateElement) { - this.options.updateElement(selectedElement); - return; - } - var value = ''; - if (this.options.select) { - var nodes = document.getElementsByClassName(this.options.select, selectedElement) || []; - if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select); - } else - value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal'); - - var lastTokenPos = this.findLastToken(); - if (lastTokenPos != -1) { - var newValue = this.element.value.substr(0, lastTokenPos + 1); - var whitespace = this.element.value.substr(lastTokenPos + 1).match(/^\s+/); - if (whitespace) - newValue += whitespace[0]; - this.element.value = newValue + value; - } else { - this.element.value = value; - } - this.element.focus(); - - if (this.options.afterUpdateElement) - this.options.afterUpdateElement(this.element, selectedElement); - }, - - updateChoices: function(choices) { - if(!this.changed && this.hasFocus) { - this.update.innerHTML = choices; - Element.cleanWhitespace(this.update); - Element.cleanWhitespace(this.update.firstChild); - - if(this.update.firstChild && this.update.firstChild.childNodes) { - this.entryCount = - this.update.firstChild.childNodes.length; - for (var i = 0; i < this.entryCount; i++) { - var entry = this.getEntry(i); - entry.autocompleteIndex = i; - this.addObservers(entry); - } - } else { - this.entryCount = 0; - } - - this.stopIndicator(); - - this.index = 0; - this.render(); - } - }, - - addObservers: function(element) { - Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this)); - Event.observe(element, "click", this.onClick.bindAsEventListener(this)); - }, - - onObserverEvent: function() { - this.changed = false; - if(this.getToken().length>=this.options.minChars) { - this.startIndicator(); - this.getUpdatedChoices(); - } else { - this.active = false; - this.hide(); - } - }, - - getToken: function() { - var tokenPos = this.findLastToken(); - if (tokenPos != -1) - var ret = this.element.value.substr(tokenPos + 1).replace(/^\s+/,'').replace(/\s+$/,''); - else - var ret = this.element.value; - - return /\n/.test(ret) ? '' : ret; - }, - - findLastToken: function() { - var lastTokenPos = -1; - - for (var i=0; i<this.options.tokens.length; i++) { - var thisTokenPos = this.element.value.lastIndexOf(this.options.tokens[i]); - if (thisTokenPos > lastTokenPos) - lastTokenPos = thisTokenPos; - } - return lastTokenPos; - } -} - -Ajax.Autocompleter = Class.create(); -Object.extend(Object.extend(Ajax.Autocompleter.prototype, Autocompleter.Base.prototype), { - initialize: function(element, update, url, options) { - this.baseInitialize(element, update, options); - this.options.asynchronous = true; - this.options.onComplete = this.onComplete.bind(this); - this.options.defaultParams = this.options.parameters || null; - this.url = url; - }, - - getUpdatedChoices: function() { - entry = encodeURIComponent(this.options.paramName) + '=' + - encodeURIComponent(this.getToken()); - - this.options.parameters = this.options.callback ? - this.options.callback(this.element, entry) : entry; - - if(this.options.defaultParams) - this.options.parameters += '&' + this.options.defaultParams; - - new Ajax.Request(this.url, this.options); - }, - - onComplete: function(request) { - this.updateChoices(request.responseText); - } - -}); - -// The local array autocompleter. Used when you'd prefer to -// inject an array of autocompletion options into the page, rather -// than sending out Ajax queries, which can be quite slow sometimes. -// -// The constructor takes four parameters. The first two are, as usual, -// the id of the monitored textbox, and id of the autocompletion menu. -// The third is the array you want to autocomplete from, and the fourth -// is the options block. -// -// Extra local autocompletion options: -// - choices - How many autocompletion choices to offer -// -// - partialSearch - If false, the autocompleter will match entered -// text only at the beginning of strings in the -// autocomplete array. Defaults to true, which will -// match text at the beginning of any *word* in the -// strings in the autocomplete array. If you want to -// search anywhere in the string, additionally set -// the option fullSearch to true (default: off). -// -// - fullSsearch - Search anywhere in autocomplete array strings. -// -// - partialChars - How many characters to enter before triggering -// a partial match (unlike minChars, which defines -// how many characters are required to do any match -// at all). Defaults to 2. -// -// - ignoreCase - Whether to ignore case when autocompleting. -// Defaults to true. -// -// It's possible to pass in a custom function as the 'selector' -// option, if you prefer to write your own autocompletion logic. -// In that case, the other options above will not apply unless -// you support them. - -Autocompleter.Local = Class.create(); -Autocompleter.Local.prototype = Object.extend(new Autocompleter.Base(), { - initialize: function(element, update, array, options) { - this.baseInitialize(element, update, options); - this.options.array = array; - }, - - getUpdatedChoices: function() { - this.updateChoices(this.options.selector(this)); - }, - - setOptions: function(options) { - this.options = Object.extend({ - choices: 10, - partialSearch: true, - partialChars: 2, - ignoreCase: true, - fullSearch: false, - selector: function(instance) { - var ret = []; // Beginning matches - var partial = []; // Inside matches - var entry = instance.getToken(); - var count = 0; - - for (var i = 0; i < instance.options.array.length && - ret.length < instance.options.choices ; i++) { - - var elem = instance.options.array[i]; - var foundPos = instance.options.ignoreCase ? - elem.toLowerCase().indexOf(entry.toLowerCase()) : - elem.indexOf(entry); - - while (foundPos != -1) { - if (foundPos == 0 && elem.length != entry.length) { - ret.push("<li><strong>" + elem.substr(0, entry.length) + "</strong>" + - elem.substr(entry.length) + "</li>"); - break; - } else if (entry.length >= instance.options.partialChars && - instance.options.partialSearch && foundPos != -1) { - if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) { - partial.push("<li>" + elem.substr(0, foundPos) + "<strong>" + - elem.substr(foundPos, entry.length) + "</strong>" + elem.substr( - foundPos + entry.length) + "</li>"); - break; - } - } - - foundPos = instance.options.ignoreCase ? - elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) : - elem.indexOf(entry, foundPos + 1); - - } - } - if (partial.length) - ret = ret.concat(partial.slice(0, instance.options.choices - ret.length)) - return "<ul>" + ret.join('') + "</ul>"; - } - }, options || {}); - } -}); - -// AJAX in-place editor -// -// see documentation on http://wiki.script.aculo.us/scriptaculous/show/Ajax.InPlaceEditor - -// Use this if you notice weird scrolling problems on some browsers, -// the DOM might be a bit confused when this gets called so do this -// waits 1 ms (with setTimeout) until it does the activation -Field.scrollFreeActivate = function(field) { - setTimeout(function() { - Field.activate(field); - }, 1); -} - -Ajax.InPlaceEditor = Class.create(); -Ajax.InPlaceEditor.defaultHighlightColor = "#FFFF99"; -Ajax.InPlaceEditor.prototype = { - initialize: function(element, url, options) { - this.url = url; - this.element = $(element); - - this.options = Object.extend({ - okButton: true, - okText: "ok", - cancelLink: true, - cancelText: "cancel", - savingText: "Saving...", - clickToEditText: "Click to edit", - okText: "ok", - rows: 1, - onComplete: function(transport, element) { - new Effect.Highlight(element, {startcolor: this.options.highlightcolor}); - }, - onFailure: function(transport) { - alert("Error communicating with the server: " + transport.responseText.stripTags()); - }, - callback: function(form) { - return Form.serialize(form); - }, - handleLineBreaks: true, - loadingText: 'Loading...', - savingClassName: 'inplaceeditor-saving', - loadingClassName: 'inplaceeditor-loading', - formClassName: 'inplaceeditor-form', - highlightcolor: Ajax.InPlaceEditor.defaultHighlightColor, - highlightendcolor: "#FFFFFF", - externalControl: null, - submitOnBlur: false, - ajaxOptions: {}, - evalScripts: false - }, options || {}); - - if(!this.options.formId && this.element.id) { - this.options.formId = this.element.id + "-inplaceeditor"; - if ($(this.options.formId)) { - // there's already a form with that name, don't specify an id - this.options.formId = null; - } - } - - if (this.options.externalControl) { - this.options.externalControl = $(this.options.externalControl); - } - - this.originalBackground = Element.getStyle(this.element, 'background-color'); - if (!this.originalBackground) { - this.originalBackground = "transparent"; - } - - this.element.title = this.options.clickToEditText; - - this.onclickListener = this.enterEditMode.bindAsEventListener(this); - this.mouseoverListener = this.enterHover.bindAsEventListener(this); - this.mouseoutListener = this.leaveHover.bindAsEventListener(this); - Event.observe(this.element, 'click', this.onclickListener); - Event.observe(this.element, 'mouseover', this.mouseoverListener); - Event.observe(this.element, 'mouseout', this.mouseoutListener); - if (this.options.externalControl) { - Event.observe(this.options.externalControl, 'click', this.onclickListener); - Event.observe(this.options.externalControl, 'mouseover', this.mouseoverListener); - Event.observe(this.options.externalControl, 'mouseout', this.mouseoutListener); - } - }, - enterEditMode: function(evt) { - if (this.saving) return; - if (this.editing) return; - this.editing = true; - this.onEnterEditMode(); - if (this.options.externalControl) { - Element.hide(this.options.externalControl); - } - Element.hide(this.element); - this.createForm(); - this.element.parentNode.insertBefore(this.form, this.element); - Field.scrollFreeActivate(this.editField); - // stop the event to avoid a page refresh in Safari - if (evt) { - Event.stop(evt); - } - return false; - }, - createForm: function() { - this.form = document.createElement("form"); - this.form.id = this.options.formId; - Element.addClassName(this.form, this.options.formClassName) - this.form.onsubmit = this.onSubmit.bind(this); - - this.createEditField(); - - if (this.options.textarea) { - var br = document.createElement("br"); - this.form.appendChild(br); - } - - if (this.options.okButton) { - okButton = document.createElement("input"); - okButton.type = "submit"; - okButton.value = this.options.okText; - okButton.className = 'editor_ok_button'; - this.form.appendChild(okButton); - } - - if (this.options.cancelLink) { - cancelLink = document.createElement("a"); - cancelLink.href = "#"; - cancelLink.appendChild(document.createTextNode(this.options.cancelText)); - cancelLink.onclick = this.onclickCancel.bind(this); - cancelLink.className = 'editor_cancel'; - this.form.appendChild(cancelLink); - } - }, - hasHTMLLineBreaks: function(string) { - if (!this.options.handleLineBreaks) return false; - return string.match(/<br/i) || string.match(/<p>/i); - }, - convertHTMLLineBreaks: function(string) { - return string.replace(/<br>/gi, "\n").replace(/<br\/>/gi, "\n").replace(/<\/p>/gi, "\n").replace(/<p>/gi, ""); - }, - createEditField: function() { - var text; - if(this.options.loadTextURL) { - text = this.options.loadingText; - } else { - text = this.getText(); - } - - var obj = this; - - if (this.options.rows == 1 && !this.hasHTMLLineBreaks(text)) { - this.options.textarea = false; - var textField = document.createElement("input"); - textField.obj = this; - textField.type = "text"; - textField.name = "value"; - textField.value = text; - textField.style.backgroundColor = this.options.highlightcolor; - textField.className = 'editor_field'; - var size = this.options.size || this.options.cols || 0; - if (size != 0) textField.size = size; - if (this.options.submitOnBlur) - textField.onblur = this.onSubmit.bind(this); - this.editField = textField; - } else { - this.options.textarea = true; - var textArea = document.createElement("textarea"); - textArea.obj = this; - textArea.name = "value"; - textArea.value = this.convertHTMLLineBreaks(text); - textArea.rows = this.options.rows; - textArea.cols = this.options.cols || 40; - textArea.className = 'editor_field'; - if (this.options.submitOnBlur) - textArea.onblur = this.onSubmit.bind(this); - this.editField = textArea; - } - - if(this.options.loadTextURL) { - this.loadExternalText(); - } - this.form.appendChild(this.editField); - }, - getText: function() { - return this.element.innerHTML; - }, - loadExternalText: function() { - Element.addClassName(this.form, this.options.loadingClassName); - this.editField.disabled = true; - new Ajax.Request( - this.options.loadTextURL, - Object.extend({ - asynchronous: true, - onComplete: this.onLoadedExternalText.bind(this) - }, this.options.ajaxOptions) - ); - }, - onLoadedExternalText: function(transport) { - Element.removeClassName(this.form, this.options.loadingClassName); - this.editField.disabled = false; - this.editField.value = transport.responseText.stripTags(); - }, - onclickCancel: function() { - this.onComplete(); - this.leaveEditMode(); - return false; - }, - onFailure: function(transport) { - this.options.onFailure(transport); - if (this.oldInnerHTML) { - this.element.innerHTML = this.oldInnerHTML; - this.oldInnerHTML = null; - } - return false; - }, - onSubmit: function() { - // onLoading resets these so we need to save them away for the Ajax call - var form = this.form; - var value = this.editField.value; - - // do this first, sometimes the ajax call returns before we get a chance to switch on Saving... - // which means this will actually switch on Saving... *after* we've left edit mode causing Saving... - // to be displayed indefinitely - this.onLoading(); - - if (this.options.evalScripts) { - new Ajax.Request( - this.url, Object.extend({ - parameters: this.options.callback(form, value), - onComplete: this.onComplete.bind(this), - onFailure: this.onFailure.bind(this), - asynchronous:true, - evalScripts:true - }, this.options.ajaxOptions)); - } else { - new Ajax.Updater( - { success: this.element, - // don't update on failure (this could be an option) - failure: null }, - this.url, Object.extend({ - parameters: this.options.callback(form, value), - onComplete: this.onComplete.bind(this), - onFailure: this.onFailure.bind(this) - }, this.options.ajaxOptions)); - } - // stop the event to avoid a page refresh in Safari - if (arguments.length > 1) { - Event.stop(arguments[0]); - } - return false; - }, - onLoading: function() { - this.saving = true; - this.removeForm(); - this.leaveHover(); - this.showSaving(); - }, - showSaving: function() { - this.oldInnerHTML = this.element.innerHTML; - this.element.innerHTML = this.options.savingText; - Element.addClassName(this.element, this.options.savingClassName); - this.element.style.backgroundColor = this.originalBackground; - Element.show(this.element); - }, - removeForm: function() { - if(this.form) { - if (this.form.parentNode) Element.remove(this.form); - this.form = null; - } - }, - enterHover: function() { - if (this.saving) return; - this.element.style.backgroundColor = this.options.highlightcolor; - if (this.effect) { - this.effect.cancel(); - } - Element.addClassName(this.element, this.options.hoverClassName) - }, - leaveHover: function() { - if (this.options.backgroundColor) { - this.element.style.backgroundColor = this.oldBackground; - } - Element.removeClassName(this.element, this.options.hoverClassName) - if (this.saving) return; - this.effect = new Effect.Highlight(this.element, { - startcolor: this.options.highlightcolor, - endcolor: this.options.highlightendcolor, - restorecolor: this.originalBackground - }); - }, - leaveEditMode: function() { - Element.removeClassName(this.element, this.options.savingClassName); - this.removeForm(); - this.leaveHover(); - this.element.style.backgroundColor = this.originalBackground; - Element.show(this.element); - if (this.options.externalControl) { - Element.show(this.options.externalControl); - } - this.editing = false; - this.saving = false; - this.oldInnerHTML = null; - this.onLeaveEditMode(); - }, - onComplete: function(transport) { - this.leaveEditMode(); - this.options.onComplete.bind(this)(transport, this.element); - }, - onEnterEditMode: function() {}, - onLeaveEditMode: function() {}, - dispose: function() { - if (this.oldInnerHTML) { - this.element.innerHTML = this.oldInnerHTML; - } - this.leaveEditMode(); - Event.stopObserving(this.element, 'click', this.onclickListener); - Event.stopObserving(this.element, 'mouseover', this.mouseoverListener); - Event.stopObserving(this.element, 'mouseout', this.mouseoutListener); - if (this.options.externalControl) { - Event.stopObserving(this.options.externalControl, 'click', this.onclickListener); - Event.stopObserving(this.options.externalControl, 'mouseover', this.mouseoverListener); - Event.stopObserving(this.options.externalControl, 'mouseout', this.mouseoutListener); - } - } -}; - -Ajax.InPlaceCollectionEditor = Class.create(); -Object.extend(Ajax.InPlaceCollectionEditor.prototype, Ajax.InPlaceEditor.prototype); -Object.extend(Ajax.InPlaceCollectionEditor.prototype, { - createEditField: function() { - if (!this.cached_selectTag) { - var selectTag = document.createElement("select"); - var collection = this.options.collection || []; - var optionTag; - collection.each(function(e,i) { - optionTag = document.createElement("option"); - optionTag.value = (e instanceof Array) ? e[0] : e; - if(this.options.value==optionTag.value) optionTag.selected = true; - optionTag.appendChild(document.createTextNode((e instanceof Array) ? e[1] : e)); - selectTag.appendChild(optionTag); - }.bind(this)); - this.cached_selectTag = selectTag; - } - - this.editField = this.cached_selectTag; - if(this.options.loadTextURL) this.loadExternalText(); - this.form.appendChild(this.editField); - this.options.callback = function(form, value) { - return "value=" + encodeURIComponent(value); - } - } -}); - -// Delayed observer, like Form.Element.Observer, -// but waits for delay after last key input -// Ideal for live-search fields - -Form.Element.DelayedObserver = Class.create(); -Form.Element.DelayedObserver.prototype = { - initialize: function(element, delay, callback) { - this.delay = delay || 0.5; - this.element = $(element); - this.callback = callback; - this.timer = null; - this.lastValue = $F(this.element); - Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this)); - }, - delayedListener: function(event) { - if(this.lastValue == $F(this.element)) return; - if(this.timer) clearTimeout(this.timer); - this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000); - this.lastValue = $F(this.element); - }, - onTimerEvent: function() { - this.timer = null; - this.callback(this.element, $F(this.element)); - } -}; diff --git a/tests/test_tools/selenium/core/lib/scriptaculous/dragdrop.js b/tests/test_tools/selenium/core/lib/scriptaculous/dragdrop.js deleted file mode 100644 index be2a30f5..00000000 --- a/tests/test_tools/selenium/core/lib/scriptaculous/dragdrop.js +++ /dev/null @@ -1,915 +0,0 @@ -// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// (c) 2005 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz) -// -// See scriptaculous.js for full license. - -/*--------------------------------------------------------------------------*/ - -var Droppables = { - drops: [], - - remove: function(element) { - this.drops = this.drops.reject(function(d) { return d.element==$(element) }); - }, - - add: function(element) { - element = $(element); - var options = Object.extend({ - greedy: true, - hoverclass: null, - tree: false - }, arguments[1] || {}); - - // cache containers - if(options.containment) { - options._containers = []; - var containment = options.containment; - if((typeof containment == 'object') && - (containment.constructor == Array)) { - containment.each( function(c) { options._containers.push($(c)) }); - } else { - options._containers.push($(containment)); - } - } - - if(options.accept) options.accept = [options.accept].flatten(); - - Element.makePositioned(element); // fix IE - options.element = element; - - this.drops.push(options); - }, - - findDeepestChild: function(drops) { - deepest = drops[0]; - - for (i = 1; i < drops.length; ++i) - if (Element.isParent(drops[i].element, deepest.element)) - deepest = drops[i]; - - return deepest; - }, - - isContained: function(element, drop) { - var containmentNode; - if(drop.tree) { - containmentNode = element.treeNode; - } else { - containmentNode = element.parentNode; - } - return drop._containers.detect(function(c) { return containmentNode == c }); - }, - - isAffected: function(point, element, drop) { - return ( - (drop.element!=element) && - ((!drop._containers) || - this.isContained(element, drop)) && - ((!drop.accept) || - (Element.classNames(element).detect( - function(v) { return drop.accept.include(v) } ) )) && - Position.within(drop.element, point[0], point[1]) ); - }, - - deactivate: function(drop) { - if(drop.hoverclass) - Element.removeClassName(drop.element, drop.hoverclass); - this.last_active = null; - }, - - activate: function(drop) { - if(drop.hoverclass) - Element.addClassName(drop.element, drop.hoverclass); - this.last_active = drop; - }, - - show: function(point, element) { - if(!this.drops.length) return; - var affected = []; - - if(this.last_active) this.deactivate(this.last_active); - this.drops.each( function(drop) { - if(Droppables.isAffected(point, element, drop)) - affected.push(drop); - }); - - if(affected.length>0) { - drop = Droppables.findDeepestChild(affected); - Position.within(drop.element, point[0], point[1]); - if(drop.onHover) - drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element)); - - Droppables.activate(drop); - } - }, - - fire: function(event, element) { - if(!this.last_active) return; - Position.prepare(); - - if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active)) - if (this.last_active.onDrop) - this.last_active.onDrop(element, this.last_active.element, event); - }, - - reset: function() { - if(this.last_active) - this.deactivate(this.last_active); - } -} - -var Draggables = { - drags: [], - observers: [], - - register: function(draggable) { - if(this.drags.length == 0) { - this.eventMouseUp = this.endDrag.bindAsEventListener(this); - this.eventMouseMove = this.updateDrag.bindAsEventListener(this); - this.eventKeypress = this.keyPress.bindAsEventListener(this); - - Event.observe(document, "mouseup", this.eventMouseUp); - Event.observe(document, "mousemove", this.eventMouseMove); - Event.observe(document, "keypress", this.eventKeypress); - } - this.drags.push(draggable); - }, - - unregister: function(draggable) { - this.drags = this.drags.reject(function(d) { return d==draggable }); - if(this.drags.length == 0) { - Event.stopObserving(document, "mouseup", this.eventMouseUp); - Event.stopObserving(document, "mousemove", this.eventMouseMove); - Event.stopObserving(document, "keypress", this.eventKeypress); - } - }, - - activate: function(draggable) { - window.focus(); // allows keypress events if window isn't currently focused, fails for Safari - this.activeDraggable = draggable; - }, - - deactivate: function() { - this.activeDraggable = null; - }, - - updateDrag: function(event) { - if(!this.activeDraggable) return; - var pointer = [Event.pointerX(event), Event.pointerY(event)]; - // Mozilla-based browsers fire successive mousemove events with - // the same coordinates, prevent needless redrawing (moz bug?) - if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return; - this._lastPointer = pointer; - this.activeDraggable.updateDrag(event, pointer); - }, - - endDrag: function(event) { - if(!this.activeDraggable) return; - this._lastPointer = null; - this.activeDraggable.endDrag(event); - this.activeDraggable = null; - }, - - keyPress: function(event) { - if(this.activeDraggable) - this.activeDraggable.keyPress(event); - }, - - addObserver: function(observer) { - this.observers.push(observer); - this._cacheObserverCallbacks(); - }, - - removeObserver: function(element) { // element instead of observer fixes mem leaks - this.observers = this.observers.reject( function(o) { return o.element==element }); - this._cacheObserverCallbacks(); - }, - - notify: function(eventName, draggable, event) { // 'onStart', 'onEnd', 'onDrag' - if(this[eventName+'Count'] > 0) - this.observers.each( function(o) { - if(o[eventName]) o[eventName](eventName, draggable, event); - }); - }, - - _cacheObserverCallbacks: function() { - ['onStart','onEnd','onDrag'].each( function(eventName) { - Draggables[eventName+'Count'] = Draggables.observers.select( - function(o) { return o[eventName]; } - ).length; - }); - } -} - -/*--------------------------------------------------------------------------*/ - -var Draggable = Class.create(); -Draggable.prototype = { - initialize: function(element) { - var options = Object.extend({ - handle: false, - starteffect: function(element) { - element._opacity = Element.getOpacity(element); - new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7}); - }, - reverteffect: function(element, top_offset, left_offset) { - var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02; - element._revert = new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur}); - }, - endeffect: function(element) { - var toOpacity = typeof element._opacity == 'number' ? element._opacity : 1.0 - new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity}); - }, - zindex: 1000, - revert: false, - scroll: false, - scrollSensitivity: 20, - scrollSpeed: 15, - snap: false // false, or xy or [x,y] or function(x,y){ return [x,y] } - }, arguments[1] || {}); - - this.element = $(element); - - if(options.handle && (typeof options.handle == 'string')) { - var h = Element.childrenWithClassName(this.element, options.handle, true); - if(h.length>0) this.handle = h[0]; - } - if(!this.handle) this.handle = $(options.handle); - if(!this.handle) this.handle = this.element; - - if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) - options.scroll = $(options.scroll); - - Element.makePositioned(this.element); // fix IE - - this.delta = this.currentDelta(); - this.options = options; - this.dragging = false; - - this.eventMouseDown = this.initDrag.bindAsEventListener(this); - Event.observe(this.handle, "mousedown", this.eventMouseDown); - - Draggables.register(this); - }, - - destroy: function() { - Event.stopObserving(this.handle, "mousedown", this.eventMouseDown); - Draggables.unregister(this); - }, - - currentDelta: function() { - return([ - parseInt(Element.getStyle(this.element,'left') || '0'), - parseInt(Element.getStyle(this.element,'top') || '0')]); - }, - - initDrag: function(event) { - if(Event.isLeftClick(event)) { - // abort on form elements, fixes a Firefox issue - var src = Event.element(event); - if(src.tagName && ( - src.tagName=='INPUT' || - src.tagName=='SELECT' || - src.tagName=='OPTION' || - src.tagName=='BUTTON' || - src.tagName=='TEXTAREA')) return; - - if(this.element._revert) { - this.element._revert.cancel(); - this.element._revert = null; - } - - var pointer = [Event.pointerX(event), Event.pointerY(event)]; - var pos = Position.cumulativeOffset(this.element); - this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) }); - - Draggables.activate(this); - Event.stop(event); - } - }, - - startDrag: function(event) { - this.dragging = true; - - if(this.options.zindex) { - this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0); - this.element.style.zIndex = this.options.zindex; - } - - if(this.options.ghosting) { - this._clone = this.element.cloneNode(true); - Position.absolutize(this.element); - this.element.parentNode.insertBefore(this._clone, this.element); - } - - if(this.options.scroll) { - if (this.options.scroll == window) { - var where = this._getWindowScroll(this.options.scroll); - this.originalScrollLeft = where.left; - this.originalScrollTop = where.top; - } else { - this.originalScrollLeft = this.options.scroll.scrollLeft; - this.originalScrollTop = this.options.scroll.scrollTop; - } - } - - Draggables.notify('onStart', this, event); - if(this.options.starteffect) this.options.starteffect(this.element); - }, - - updateDrag: function(event, pointer) { - if(!this.dragging) this.startDrag(event); - Position.prepare(); - Droppables.show(pointer, this.element); - Draggables.notify('onDrag', this, event); - this.draw(pointer); - if(this.options.change) this.options.change(this); - - if(this.options.scroll) { - this.stopScrolling(); - - var p; - if (this.options.scroll == window) { - with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; } - } else { - p = Position.page(this.options.scroll); - p[0] += this.options.scroll.scrollLeft; - p[1] += this.options.scroll.scrollTop; - p.push(p[0]+this.options.scroll.offsetWidth); - p.push(p[1]+this.options.scroll.offsetHeight); - } - var speed = [0,0]; - if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity); - if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity); - if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity); - if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity); - this.startScrolling(speed); - } - - // fix AppleWebKit rendering - if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0); - - Event.stop(event); - }, - - finishDrag: function(event, success) { - this.dragging = false; - - if(this.options.ghosting) { - Position.relativize(this.element); - Element.remove(this._clone); - this._clone = null; - } - - if(success) Droppables.fire(event, this.element); - Draggables.notify('onEnd', this, event); - - var revert = this.options.revert; - if(revert && typeof revert == 'function') revert = revert(this.element); - - var d = this.currentDelta(); - if(revert && this.options.reverteffect) { - this.options.reverteffect(this.element, - d[1]-this.delta[1], d[0]-this.delta[0]); - } else { - this.delta = d; - } - - if(this.options.zindex) - this.element.style.zIndex = this.originalZ; - - if(this.options.endeffect) - this.options.endeffect(this.element); - - Draggables.deactivate(this); - Droppables.reset(); - }, - - keyPress: function(event) { - if(event.keyCode!=Event.KEY_ESC) return; - this.finishDrag(event, false); - Event.stop(event); - }, - - endDrag: function(event) { - if(!this.dragging) return; - this.stopScrolling(); - this.finishDrag(event, true); - Event.stop(event); - }, - - draw: function(point) { - var pos = Position.cumulativeOffset(this.element); - var d = this.currentDelta(); - pos[0] -= d[0]; pos[1] -= d[1]; - - if(this.options.scroll && (this.options.scroll != window)) { - pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft; - pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop; - } - - var p = [0,1].map(function(i){ - return (point[i]-pos[i]-this.offset[i]) - }.bind(this)); - - if(this.options.snap) { - if(typeof this.options.snap == 'function') { - p = this.options.snap(p[0],p[1],this); - } else { - if(this.options.snap instanceof Array) { - p = p.map( function(v, i) { - return Math.round(v/this.options.snap[i])*this.options.snap[i] }.bind(this)) - } else { - p = p.map( function(v) { - return Math.round(v/this.options.snap)*this.options.snap }.bind(this)) - } - }} - - var style = this.element.style; - if((!this.options.constraint) || (this.options.constraint=='horizontal')) - style.left = p[0] + "px"; - if((!this.options.constraint) || (this.options.constraint=='vertical')) - style.top = p[1] + "px"; - if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering - }, - - stopScrolling: function() { - if(this.scrollInterval) { - clearInterval(this.scrollInterval); - this.scrollInterval = null; - Draggables._lastScrollPointer = null; - } - }, - - startScrolling: function(speed) { - this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed]; - this.lastScrolled = new Date(); - this.scrollInterval = setInterval(this.scroll.bind(this), 10); - }, - - scroll: function() { - var current = new Date(); - var delta = current - this.lastScrolled; - this.lastScrolled = current; - if(this.options.scroll == window) { - with (this._getWindowScroll(this.options.scroll)) { - if (this.scrollSpeed[0] || this.scrollSpeed[1]) { - var d = delta / 1000; - this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] ); - } - } - } else { - this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000; - this.options.scroll.scrollTop += this.scrollSpeed[1] * delta / 1000; - } - - Position.prepare(); - Droppables.show(Draggables._lastPointer, this.element); - Draggables.notify('onDrag', this); - Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer); - Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000; - Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000; - if (Draggables._lastScrollPointer[0] < 0) - Draggables._lastScrollPointer[0] = 0; - if (Draggables._lastScrollPointer[1] < 0) - Draggables._lastScrollPointer[1] = 0; - this.draw(Draggables._lastScrollPointer); - - if(this.options.change) this.options.change(this); - }, - - _getWindowScroll: function(w) { - var T, L, W, H; - with (w.document) { - if (w.document.documentElement && documentElement.scrollTop) { - T = documentElement.scrollTop; - L = documentElement.scrollLeft; - } else if (w.document.body) { - T = body.scrollTop; - L = body.scrollLeft; - } - if (w.innerWidth) { - W = w.innerWidth; - H = w.innerHeight; - } else if (w.document.documentElement && documentElement.clientWidth) { - W = documentElement.clientWidth; - H = documentElement.clientHeight; - } else { - W = body.offsetWidth; - H = body.offsetHeight - } - } - return { top: T, left: L, width: W, height: H }; - } -} - -/*--------------------------------------------------------------------------*/ - -var SortableObserver = Class.create(); -SortableObserver.prototype = { - initialize: function(element, observer) { - this.element = $(element); - this.observer = observer; - this.lastValue = Sortable.serialize(this.element); - }, - - onStart: function() { - this.lastValue = Sortable.serialize(this.element); - }, - - onEnd: function() { - Sortable.unmark(); - if(this.lastValue != Sortable.serialize(this.element)) - this.observer(this.element) - } -} - -var Sortable = { - sortables: {}, - - _findRootElement: function(element) { - while (element.tagName != "BODY") { - if(element.id && Sortable.sortables[element.id]) return element; - element = element.parentNode; - } - }, - - options: function(element) { - element = Sortable._findRootElement($(element)); - if(!element) return; - return Sortable.sortables[element.id]; - }, - - destroy: function(element){ - var s = Sortable.options(element); - - if(s) { - Draggables.removeObserver(s.element); - s.droppables.each(function(d){ Droppables.remove(d) }); - s.draggables.invoke('destroy'); - - delete Sortable.sortables[s.element.id]; - } - }, - - create: function(element) { - element = $(element); - var options = Object.extend({ - element: element, - tag: 'li', // assumes li children, override with tag: 'tagname' - dropOnEmpty: false, - tree: false, - treeTag: 'ul', - overlap: 'vertical', // one of 'vertical', 'horizontal' - constraint: 'vertical', // one of 'vertical', 'horizontal', false - containment: element, // also takes array of elements (or id's); or false - handle: false, // or a CSS class - only: false, - hoverclass: null, - ghosting: false, - scroll: false, - scrollSensitivity: 20, - scrollSpeed: 15, - format: /^[^_]*_(.*)$/, - onChange: Prototype.emptyFunction, - onUpdate: Prototype.emptyFunction - }, arguments[1] || {}); - - // clear any old sortable with same element - this.destroy(element); - - // build options for the draggables - var options_for_draggable = { - revert: true, - scroll: options.scroll, - scrollSpeed: options.scrollSpeed, - scrollSensitivity: options.scrollSensitivity, - ghosting: options.ghosting, - constraint: options.constraint, - handle: options.handle }; - - if(options.starteffect) - options_for_draggable.starteffect = options.starteffect; - - if(options.reverteffect) - options_for_draggable.reverteffect = options.reverteffect; - else - if(options.ghosting) options_for_draggable.reverteffect = function(element) { - element.style.top = 0; - element.style.left = 0; - }; - - if(options.endeffect) - options_for_draggable.endeffect = options.endeffect; - - if(options.zindex) - options_for_draggable.zindex = options.zindex; - - // build options for the droppables - var options_for_droppable = { - overlap: options.overlap, - containment: options.containment, - tree: options.tree, - hoverclass: options.hoverclass, - onHover: Sortable.onHover - //greedy: !options.dropOnEmpty - } - - var options_for_tree = { - onHover: Sortable.onEmptyHover, - overlap: options.overlap, - containment: options.containment, - hoverclass: options.hoverclass - } - - // fix for gecko engine - Element.cleanWhitespace(element); - - options.draggables = []; - options.droppables = []; - - // drop on empty handling - if(options.dropOnEmpty || options.tree) { - Droppables.add(element, options_for_tree); - options.droppables.push(element); - } - - (this.findElements(element, options) || []).each( function(e) { - // handles are per-draggable - var handle = options.handle ? - Element.childrenWithClassName(e, options.handle)[0] : e; - options.draggables.push( - new Draggable(e, Object.extend(options_for_draggable, { handle: handle }))); - Droppables.add(e, options_for_droppable); - if(options.tree) e.treeNode = element; - options.droppables.push(e); - }); - - if(options.tree) { - (Sortable.findTreeElements(element, options) || []).each( function(e) { - Droppables.add(e, options_for_tree); - e.treeNode = element; - options.droppables.push(e); - }); - } - - // keep reference - this.sortables[element.id] = options; - - // for onupdate - Draggables.addObserver(new SortableObserver(element, options.onUpdate)); - - }, - - // return all suitable-for-sortable elements in a guaranteed order - findElements: function(element, options) { - return Element.findChildren( - element, options.only, options.tree ? true : false, options.tag); - }, - - findTreeElements: function(element, options) { - return Element.findChildren( - element, options.only, options.tree ? true : false, options.treeTag); - }, - - onHover: function(element, dropon, overlap) { - if(Element.isParent(dropon, element)) return; - - if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) { - return; - } else if(overlap>0.5) { - Sortable.mark(dropon, 'before'); - if(dropon.previousSibling != element) { - var oldParentNode = element.parentNode; - element.style.visibility = "hidden"; // fix gecko rendering - dropon.parentNode.insertBefore(element, dropon); - if(dropon.parentNode!=oldParentNode) - Sortable.options(oldParentNode).onChange(element); - Sortable.options(dropon.parentNode).onChange(element); - } - } else { - Sortable.mark(dropon, 'after'); - var nextElement = dropon.nextSibling || null; - if(nextElement != element) { - var oldParentNode = element.parentNode; - element.style.visibility = "hidden"; // fix gecko rendering - dropon.parentNode.insertBefore(element, nextElement); - if(dropon.parentNode!=oldParentNode) - Sortable.options(oldParentNode).onChange(element); - Sortable.options(dropon.parentNode).onChange(element); - } - } - }, - - onEmptyHover: function(element, dropon, overlap) { - var oldParentNode = element.parentNode; - var droponOptions = Sortable.options(dropon); - - if(!Element.isParent(dropon, element)) { - var index; - - var children = Sortable.findElements(dropon, {tag: droponOptions.tag}); - var child = null; - - if(children) { - var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap); - - for (index = 0; index < children.length; index += 1) { - if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) { - offset -= Element.offsetSize (children[index], droponOptions.overlap); - } else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) { - child = index + 1 < children.length ? children[index + 1] : null; - break; - } else { - child = children[index]; - break; - } - } - } - - dropon.insertBefore(element, child); - - Sortable.options(oldParentNode).onChange(element); - droponOptions.onChange(element); - } - }, - - unmark: function() { - if(Sortable._marker) Element.hide(Sortable._marker); - }, - - mark: function(dropon, position) { - // mark on ghosting only - var sortable = Sortable.options(dropon.parentNode); - if(sortable && !sortable.ghosting) return; - - if(!Sortable._marker) { - Sortable._marker = $('dropmarker') || document.createElement('DIV'); - Element.hide(Sortable._marker); - Element.addClassName(Sortable._marker, 'dropmarker'); - Sortable._marker.style.position = 'absolute'; - document.getElementsByTagName("body").item(0).appendChild(Sortable._marker); - } - var offsets = Position.cumulativeOffset(dropon); - Sortable._marker.style.left = offsets[0] + 'px'; - Sortable._marker.style.top = offsets[1] + 'px'; - - if(position=='after') - if(sortable.overlap == 'horizontal') - Sortable._marker.style.left = (offsets[0]+dropon.clientWidth) + 'px'; - else - Sortable._marker.style.top = (offsets[1]+dropon.clientHeight) + 'px'; - - Element.show(Sortable._marker); - }, - - _tree: function(element, options, parent) { - var children = Sortable.findElements(element, options) || []; - - for (var i = 0; i < children.length; ++i) { - var match = children[i].id.match(options.format); - - if (!match) continue; - - var child = { - id: encodeURIComponent(match ? match[1] : null), - element: element, - parent: parent, - children: new Array, - position: parent.children.length, - container: Sortable._findChildrenElement(children[i], options.treeTag.toUpperCase()) - } - - /* Get the element containing the children and recurse over it */ - if (child.container) - this._tree(child.container, options, child) - - parent.children.push (child); - } - - return parent; - }, - - /* Finds the first element of the given tag type within a parent element. - Used for finding the first LI[ST] within a L[IST]I[TEM].*/ - _findChildrenElement: function (element, containerTag) { - if (element && element.hasChildNodes) - for (var i = 0; i < element.childNodes.length; ++i) - if (element.childNodes[i].tagName == containerTag) - return element.childNodes[i]; - - return null; - }, - - tree: function(element) { - element = $(element); - var sortableOptions = this.options(element); - var options = Object.extend({ - tag: sortableOptions.tag, - treeTag: sortableOptions.treeTag, - only: sortableOptions.only, - name: element.id, - format: sortableOptions.format - }, arguments[1] || {}); - - var root = { - id: null, - parent: null, - children: new Array, - container: element, - position: 0 - } - - return Sortable._tree (element, options, root); - }, - - /* Construct a [i] index for a particular node */ - _constructIndex: function(node) { - var index = ''; - do { - if (node.id) index = '[' + node.position + ']' + index; - } while ((node = node.parent) != null); - return index; - }, - - sequence: function(element) { - element = $(element); - var options = Object.extend(this.options(element), arguments[1] || {}); - - return $(this.findElements(element, options) || []).map( function(item) { - return item.id.match(options.format) ? item.id.match(options.format)[1] : ''; - }); - }, - - setSequence: function(element, new_sequence) { - element = $(element); - var options = Object.extend(this.options(element), arguments[2] || {}); - - var nodeMap = {}; - this.findElements(element, options).each( function(n) { - if (n.id.match(options.format)) - nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode]; - n.parentNode.removeChild(n); - }); - - new_sequence.each(function(ident) { - var n = nodeMap[ident]; - if (n) { - n[1].appendChild(n[0]); - delete nodeMap[ident]; - } - }); - }, - - serialize: function(element) { - element = $(element); - var options = Object.extend(Sortable.options(element), arguments[1] || {}); - var name = encodeURIComponent( - (arguments[1] && arguments[1].name) ? arguments[1].name : element.id); - - if (options.tree) { - return Sortable.tree(element, arguments[1]).children.map( function (item) { - return [name + Sortable._constructIndex(item) + "=" + - encodeURIComponent(item.id)].concat(item.children.map(arguments.callee)); - }).flatten().join('&'); - } else { - return Sortable.sequence(element, arguments[1]).map( function(item) { - return name + "[]=" + encodeURIComponent(item); - }).join('&'); - } - } -} - -/* Returns true if child is contained within element */ -Element.isParent = function(child, element) { - if (!child.parentNode || child == element) return false; - - if (child.parentNode == element) return true; - - return Element.isParent(child.parentNode, element); -} - -Element.findChildren = function(element, only, recursive, tagName) { - if(!element.hasChildNodes()) return null; - tagName = tagName.toUpperCase(); - if(only) only = [only].flatten(); - var elements = []; - $A(element.childNodes).each( function(e) { - if(e.tagName && e.tagName.toUpperCase()==tagName && - (!only || (Element.classNames(e).detect(function(v) { return only.include(v) })))) - elements.push(e); - if(recursive) { - var grandchildren = Element.findChildren(e, only, recursive, tagName); - if(grandchildren) elements.push(grandchildren); - } - }); - - return (elements.length>0 ? elements.flatten() : []); -} - -Element.offsetSize = function (element, type) { - if (type == 'vertical' || type == 'height') - return element.offsetHeight; - else - return element.offsetWidth; -}
\ No newline at end of file diff --git a/tests/test_tools/selenium/core/lib/scriptaculous/effects.js b/tests/test_tools/selenium/core/lib/scriptaculous/effects.js deleted file mode 100644 index 0864323e..00000000 --- a/tests/test_tools/selenium/core/lib/scriptaculous/effects.js +++ /dev/null @@ -1,958 +0,0 @@ -// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// Contributors: -// Justin Palmer (http://encytemedia.com/) -// Mark Pilgrim (http://diveintomark.org/) -// Martin Bialasinki -// -// See scriptaculous.js for full license. - -// converts rgb() and #xxx to #xxxxxx format, -// returns self (or first argument) if not convertable -String.prototype.parseColor = function() { - var color = '#'; - if(this.slice(0,4) == 'rgb(') { - var cols = this.slice(4,this.length-1).split(','); - var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3); - } else { - if(this.slice(0,1) == '#') { - if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase(); - if(this.length==7) color = this.toLowerCase(); - } - } - return(color.length==7 ? color : (arguments[0] || this)); -} - -/*--------------------------------------------------------------------------*/ - -Element.collectTextNodes = function(element) { - return $A($(element).childNodes).collect( function(node) { - return (node.nodeType==3 ? node.nodeValue : - (node.hasChildNodes() ? Element.collectTextNodes(node) : '')); - }).flatten().join(''); -} - -Element.collectTextNodesIgnoreClass = function(element, className) { - return $A($(element).childNodes).collect( function(node) { - return (node.nodeType==3 ? node.nodeValue : - ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? - Element.collectTextNodesIgnoreClass(node, className) : '')); - }).flatten().join(''); -} - -Element.setContentZoom = function(element, percent) { - element = $(element); - Element.setStyle(element, {fontSize: (percent/100) + 'em'}); - if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0); -} - -Element.getOpacity = function(element){ - var opacity; - if (opacity = Element.getStyle(element, 'opacity')) - return parseFloat(opacity); - if (opacity = (Element.getStyle(element, 'filter') || '').match(/alpha\(opacity=(.*)\)/)) - if(opacity[1]) return parseFloat(opacity[1]) / 100; - return 1.0; -} - -Element.setOpacity = function(element, value){ - element= $(element); - if (value == 1){ - Element.setStyle(element, { opacity: - (/Gecko/.test(navigator.userAgent) && !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? - 0.999999 : null }); - if(/MSIE/.test(navigator.userAgent)) - Element.setStyle(element, {filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')}); - } else { - if(value < 0.00001) value = 0; - Element.setStyle(element, {opacity: value}); - if(/MSIE/.test(navigator.userAgent)) - Element.setStyle(element, - { filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'') + - 'alpha(opacity='+value*100+')' }); - } -} - -Element.getInlineOpacity = function(element){ - return $(element).style.opacity || ''; -} - -Element.childrenWithClassName = function(element, className, findFirst) { - var classNameRegExp = new RegExp("(^|\\s)" + className + "(\\s|$)"); - var results = $A($(element).getElementsByTagName('*'))[findFirst ? 'detect' : 'select']( function(c) { - return (c.className && c.className.match(classNameRegExp)); - }); - if(!results) results = []; - return results; -} - -Element.forceRerendering = function(element) { - try { - element = $(element); - var n = document.createTextNode(' '); - element.appendChild(n); - element.removeChild(n); - } catch(e) { } -}; - -/*--------------------------------------------------------------------------*/ - -Array.prototype.call = function() { - var args = arguments; - this.each(function(f){ f.apply(this, args) }); -} - -/*--------------------------------------------------------------------------*/ - -var Effect = { - tagifyText: function(element) { - var tagifyStyle = 'position:relative'; - if(/MSIE/.test(navigator.userAgent)) tagifyStyle += ';zoom:1'; - element = $(element); - $A(element.childNodes).each( function(child) { - if(child.nodeType==3) { - child.nodeValue.toArray().each( function(character) { - element.insertBefore( - Builder.node('span',{style: tagifyStyle}, - character == ' ' ? String.fromCharCode(160) : character), - child); - }); - Element.remove(child); - } - }); - }, - multiple: function(element, effect) { - var elements; - if(((typeof element == 'object') || - (typeof element == 'function')) && - (element.length)) - elements = element; - else - elements = $(element).childNodes; - - var options = Object.extend({ - speed: 0.1, - delay: 0.0 - }, arguments[2] || {}); - var masterDelay = options.delay; - - $A(elements).each( function(element, index) { - new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay })); - }); - }, - PAIRS: { - 'slide': ['SlideDown','SlideUp'], - 'blind': ['BlindDown','BlindUp'], - 'appear': ['Appear','Fade'] - }, - toggle: function(element, effect) { - element = $(element); - effect = (effect || 'appear').toLowerCase(); - var options = Object.extend({ - queue: { position:'end', scope:(element.id || 'global'), limit: 1 } - }, arguments[2] || {}); - Effect[element.visible() ? - Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options); - } -}; - -var Effect2 = Effect; // deprecated - -/* ------------- transitions ------------- */ - -Effect.Transitions = {} - -Effect.Transitions.linear = function(pos) { - return pos; -} -Effect.Transitions.sinoidal = function(pos) { - return (-Math.cos(pos*Math.PI)/2) + 0.5; -} -Effect.Transitions.reverse = function(pos) { - return 1-pos; -} -Effect.Transitions.flicker = function(pos) { - return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4; -} -Effect.Transitions.wobble = function(pos) { - return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5; -} -Effect.Transitions.pulse = function(pos) { - return (Math.floor(pos*10) % 2 == 0 ? - (pos*10-Math.floor(pos*10)) : 1-(pos*10-Math.floor(pos*10))); -} -Effect.Transitions.none = function(pos) { - return 0; -} -Effect.Transitions.full = function(pos) { - return 1; -} - -/* ------------- core effects ------------- */ - -Effect.ScopedQueue = Class.create(); -Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), { - initialize: function() { - this.effects = []; - this.interval = null; - }, - _each: function(iterator) { - this.effects._each(iterator); - }, - add: function(effect) { - var timestamp = new Date().getTime(); - - var position = (typeof effect.options.queue == 'string') ? - effect.options.queue : effect.options.queue.position; - - switch(position) { - case 'front': - // move unstarted effects after this effect - this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) { - e.startOn += effect.finishOn; - e.finishOn += effect.finishOn; - }); - break; - case 'end': - // start effect after last queued effect has finished - timestamp = this.effects.pluck('finishOn').max() || timestamp; - break; - } - - effect.startOn += timestamp; - effect.finishOn += timestamp; - - if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit)) - this.effects.push(effect); - - if(!this.interval) - this.interval = setInterval(this.loop.bind(this), 40); - }, - remove: function(effect) { - this.effects = this.effects.reject(function(e) { return e==effect }); - if(this.effects.length == 0) { - clearInterval(this.interval); - this.interval = null; - } - }, - loop: function() { - var timePos = new Date().getTime(); - this.effects.invoke('loop', timePos); - } -}); - -Effect.Queues = { - instances: $H(), - get: function(queueName) { - if(typeof queueName != 'string') return queueName; - - if(!this.instances[queueName]) - this.instances[queueName] = new Effect.ScopedQueue(); - - return this.instances[queueName]; - } -} -Effect.Queue = Effect.Queues.get('global'); - -Effect.DefaultOptions = { - transition: Effect.Transitions.sinoidal, - duration: 1.0, // seconds - fps: 25.0, // max. 25fps due to Effect.Queue implementation - sync: false, // true for combining - from: 0.0, - to: 1.0, - delay: 0.0, - queue: 'parallel' -} - -Effect.Base = function() {}; -Effect.Base.prototype = { - position: null, - start: function(options) { - this.options = Object.extend(Object.extend({},Effect.DefaultOptions), options || {}); - this.currentFrame = 0; - this.state = 'idle'; - this.startOn = this.options.delay*1000; - this.finishOn = this.startOn + (this.options.duration*1000); - this.event('beforeStart'); - if(!this.options.sync) - Effect.Queues.get(typeof this.options.queue == 'string' ? - 'global' : this.options.queue.scope).add(this); - }, - loop: function(timePos) { - if(timePos >= this.startOn) { - if(timePos >= this.finishOn) { - this.render(1.0); - this.cancel(); - this.event('beforeFinish'); - if(this.finish) this.finish(); - this.event('afterFinish'); - return; - } - var pos = (timePos - this.startOn) / (this.finishOn - this.startOn); - var frame = Math.round(pos * this.options.fps * this.options.duration); - if(frame > this.currentFrame) { - this.render(pos); - this.currentFrame = frame; - } - } - }, - render: function(pos) { - if(this.state == 'idle') { - this.state = 'running'; - this.event('beforeSetup'); - if(this.setup) this.setup(); - this.event('afterSetup'); - } - if(this.state == 'running') { - if(this.options.transition) pos = this.options.transition(pos); - pos *= (this.options.to-this.options.from); - pos += this.options.from; - this.position = pos; - this.event('beforeUpdate'); - if(this.update) this.update(pos); - this.event('afterUpdate'); - } - }, - cancel: function() { - if(!this.options.sync) - Effect.Queues.get(typeof this.options.queue == 'string' ? - 'global' : this.options.queue.scope).remove(this); - this.state = 'finished'; - }, - event: function(eventName) { - if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this); - if(this.options[eventName]) this.options[eventName](this); - }, - inspect: function() { - return '#<Effect:' + $H(this).inspect() + ',options:' + $H(this.options).inspect() + '>'; - } -} - -Effect.Parallel = Class.create(); -Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), { - initialize: function(effects) { - this.effects = effects || []; - this.start(arguments[1]); - }, - update: function(position) { - this.effects.invoke('render', position); - }, - finish: function(position) { - this.effects.each( function(effect) { - effect.render(1.0); - effect.cancel(); - effect.event('beforeFinish'); - if(effect.finish) effect.finish(position); - effect.event('afterFinish'); - }); - } -}); - -Effect.Opacity = Class.create(); -Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), { - initialize: function(element) { - this.element = $(element); - // make this work on IE on elements without 'layout' - if(/MSIE/.test(navigator.userAgent) && (!this.element.hasLayout)) - this.element.setStyle({zoom: 1}); - var options = Object.extend({ - from: this.element.getOpacity() || 0.0, - to: 1.0 - }, arguments[1] || {}); - this.start(options); - }, - update: function(position) { - this.element.setOpacity(position); - } -}); - -Effect.Move = Class.create(); -Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), { - initialize: function(element) { - this.element = $(element); - var options = Object.extend({ - x: 0, - y: 0, - mode: 'relative' - }, arguments[1] || {}); - this.start(options); - }, - setup: function() { - // Bug in Opera: Opera returns the "real" position of a static element or - // relative element that does not have top/left explicitly set. - // ==> Always set top and left for position relative elements in your stylesheets - // (to 0 if you do not need them) - this.element.makePositioned(); - this.originalLeft = parseFloat(this.element.getStyle('left') || '0'); - this.originalTop = parseFloat(this.element.getStyle('top') || '0'); - if(this.options.mode == 'absolute') { - // absolute movement, so we need to calc deltaX and deltaY - this.options.x = this.options.x - this.originalLeft; - this.options.y = this.options.y - this.originalTop; - } - }, - update: function(position) { - this.element.setStyle({ - left: this.options.x * position + this.originalLeft + 'px', - top: this.options.y * position + this.originalTop + 'px' - }); - } -}); - -// for backwards compatibility -Effect.MoveBy = function(element, toTop, toLeft) { - return new Effect.Move(element, - Object.extend({ x: toLeft, y: toTop }, arguments[3] || {})); -}; - -Effect.Scale = Class.create(); -Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), { - initialize: function(element, percent) { - this.element = $(element) - var options = Object.extend({ - scaleX: true, - scaleY: true, - scaleContent: true, - scaleFromCenter: false, - scaleMode: 'box', // 'box' or 'contents' or {} with provided values - scaleFrom: 100.0, - scaleTo: percent - }, arguments[2] || {}); - this.start(options); - }, - setup: function() { - this.restoreAfterFinish = this.options.restoreAfterFinish || false; - this.elementPositioning = this.element.getStyle('position'); - - this.originalStyle = {}; - ['top','left','width','height','fontSize'].each( function(k) { - this.originalStyle[k] = this.element.style[k]; - }.bind(this)); - - this.originalTop = this.element.offsetTop; - this.originalLeft = this.element.offsetLeft; - - var fontSize = this.element.getStyle('font-size') || '100%'; - ['em','px','%'].each( function(fontSizeType) { - if(fontSize.indexOf(fontSizeType)>0) { - this.fontSize = parseFloat(fontSize); - this.fontSizeType = fontSizeType; - } - }.bind(this)); - - this.factor = (this.options.scaleTo - this.options.scaleFrom)/100; - - this.dims = null; - if(this.options.scaleMode=='box') - this.dims = [this.element.offsetHeight, this.element.offsetWidth]; - if(/^content/.test(this.options.scaleMode)) - this.dims = [this.element.scrollHeight, this.element.scrollWidth]; - if(!this.dims) - this.dims = [this.options.scaleMode.originalHeight, - this.options.scaleMode.originalWidth]; - }, - update: function(position) { - var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position); - if(this.options.scaleContent && this.fontSize) - this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType }); - this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale); - }, - finish: function(position) { - if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle); - }, - setDimensions: function(height, width) { - var d = {}; - if(this.options.scaleX) d.width = width + 'px'; - if(this.options.scaleY) d.height = height + 'px'; - if(this.options.scaleFromCenter) { - var topd = (height - this.dims[0])/2; - var leftd = (width - this.dims[1])/2; - if(this.elementPositioning == 'absolute') { - if(this.options.scaleY) d.top = this.originalTop-topd + 'px'; - if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px'; - } else { - if(this.options.scaleY) d.top = -topd + 'px'; - if(this.options.scaleX) d.left = -leftd + 'px'; - } - } - this.element.setStyle(d); - } -}); - -Effect.Highlight = Class.create(); -Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), { - initialize: function(element) { - this.element = $(element); - var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {}); - this.start(options); - }, - setup: function() { - // Prevent executing on elements not in the layout flow - if(this.element.getStyle('display')=='none') { this.cancel(); return; } - // Disable background image during the effect - this.oldStyle = { - backgroundImage: this.element.getStyle('background-image') }; - this.element.setStyle({backgroundImage: 'none'}); - if(!this.options.endcolor) - this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff'); - if(!this.options.restorecolor) - this.options.restorecolor = this.element.getStyle('background-color'); - // init color calculations - this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this)); - this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this)); - }, - update: function(position) { - this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){ - return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) }); - }, - finish: function() { - this.element.setStyle(Object.extend(this.oldStyle, { - backgroundColor: this.options.restorecolor - })); - } -}); - -Effect.ScrollTo = Class.create(); -Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), { - initialize: function(element) { - this.element = $(element); - this.start(arguments[1] || {}); - }, - setup: function() { - Position.prepare(); - var offsets = Position.cumulativeOffset(this.element); - if(this.options.offset) offsets[1] += this.options.offset; - var max = window.innerHeight ? - window.height - window.innerHeight : - document.body.scrollHeight - - (document.documentElement.clientHeight ? - document.documentElement.clientHeight : document.body.clientHeight); - this.scrollStart = Position.deltaY; - this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart; - }, - update: function(position) { - Position.prepare(); - window.scrollTo(Position.deltaX, - this.scrollStart + (position*this.delta)); - } -}); - -/* ------------- combination effects ------------- */ - -Effect.Fade = function(element) { - element = $(element); - var oldOpacity = element.getInlineOpacity(); - var options = Object.extend({ - from: element.getOpacity() || 1.0, - to: 0.0, - afterFinishInternal: function(effect) { - if(effect.options.to!=0) return; - effect.element.hide(); - effect.element.setStyle({opacity: oldOpacity}); - }}, arguments[1] || {}); - return new Effect.Opacity(element,options); -} - -Effect.Appear = function(element) { - element = $(element); - var options = Object.extend({ - from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0), - to: 1.0, - // force Safari to render floated elements properly - afterFinishInternal: function(effect) { - effect.element.forceRerendering(); - }, - beforeSetup: function(effect) { - effect.element.setOpacity(effect.options.from); - effect.element.show(); - }}, arguments[1] || {}); - return new Effect.Opacity(element,options); -} - -Effect.Puff = function(element) { - element = $(element); - var oldStyle = { opacity: element.getInlineOpacity(), position: element.getStyle('position') }; - return new Effect.Parallel( - [ new Effect.Scale(element, 200, - { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), - new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], - Object.extend({ duration: 1.0, - beforeSetupInternal: function(effect) { - effect.effects[0].element.setStyle({position: 'absolute'}); }, - afterFinishInternal: function(effect) { - effect.effects[0].element.hide(); - effect.effects[0].element.setStyle(oldStyle); } - }, arguments[1] || {}) - ); -} - -Effect.BlindUp = function(element) { - element = $(element); - element.makeClipping(); - return new Effect.Scale(element, 0, - Object.extend({ scaleContent: false, - scaleX: false, - restoreAfterFinish: true, - afterFinishInternal: function(effect) { - effect.element.hide(); - effect.element.undoClipping(); - } - }, arguments[1] || {}) - ); -} - -Effect.BlindDown = function(element) { - element = $(element); - var elementDimensions = element.getDimensions(); - return new Effect.Scale(element, 100, - Object.extend({ scaleContent: false, - scaleX: false, - scaleFrom: 0, - scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, - restoreAfterFinish: true, - afterSetup: function(effect) { - effect.element.makeClipping(); - effect.element.setStyle({height: '0px'}); - effect.element.show(); - }, - afterFinishInternal: function(effect) { - effect.element.undoClipping(); - } - }, arguments[1] || {}) - ); -} - -Effect.SwitchOff = function(element) { - element = $(element); - var oldOpacity = element.getInlineOpacity(); - return new Effect.Appear(element, { - duration: 0.4, - from: 0, - transition: Effect.Transitions.flicker, - afterFinishInternal: function(effect) { - new Effect.Scale(effect.element, 1, { - duration: 0.3, scaleFromCenter: true, - scaleX: false, scaleContent: false, restoreAfterFinish: true, - beforeSetup: function(effect) { - effect.element.makePositioned(); - effect.element.makeClipping(); - }, - afterFinishInternal: function(effect) { - effect.element.hide(); - effect.element.undoClipping(); - effect.element.undoPositioned(); - effect.element.setStyle({opacity: oldOpacity}); - } - }) - } - }); -} - -Effect.DropOut = function(element) { - element = $(element); - var oldStyle = { - top: element.getStyle('top'), - left: element.getStyle('left'), - opacity: element.getInlineOpacity() }; - return new Effect.Parallel( - [ new Effect.Move(element, {x: 0, y: 100, sync: true }), - new Effect.Opacity(element, { sync: true, to: 0.0 }) ], - Object.extend( - { duration: 0.5, - beforeSetup: function(effect) { - effect.effects[0].element.makePositioned(); - }, - afterFinishInternal: function(effect) { - effect.effects[0].element.hide(); - effect.effects[0].element.undoPositioned(); - effect.effects[0].element.setStyle(oldStyle); - } - }, arguments[1] || {})); -} - -Effect.Shake = function(element) { - element = $(element); - var oldStyle = { - top: element.getStyle('top'), - left: element.getStyle('left') }; - return new Effect.Move(element, - { x: 20, y: 0, duration: 0.05, afterFinishInternal: function(effect) { - new Effect.Move(effect.element, - { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { - new Effect.Move(effect.element, - { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { - new Effect.Move(effect.element, - { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { - new Effect.Move(effect.element, - { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { - new Effect.Move(effect.element, - { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) { - effect.element.undoPositioned(); - effect.element.setStyle(oldStyle); - }}) }}) }}) }}) }}) }}); -} - -Effect.SlideDown = function(element) { - element = $(element); - element.cleanWhitespace(); - // SlideDown need to have the content of the element wrapped in a container element with fixed height! - var oldInnerBottom = $(element.firstChild).getStyle('bottom'); - var elementDimensions = element.getDimensions(); - return new Effect.Scale(element, 100, Object.extend({ - scaleContent: false, - scaleX: false, - scaleFrom: window.opera ? 0 : 1, - scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, - restoreAfterFinish: true, - afterSetup: function(effect) { - effect.element.makePositioned(); - effect.element.firstChild.makePositioned(); - if(window.opera) effect.element.setStyle({top: ''}); - effect.element.makeClipping(); - effect.element.setStyle({height: '0px'}); - effect.element.show(); }, - afterUpdateInternal: function(effect) { - effect.element.firstChild.setStyle({bottom: - (effect.dims[0] - effect.element.clientHeight) + 'px' }); - }, - afterFinishInternal: function(effect) { - effect.element.undoClipping(); - // IE will crash if child is undoPositioned first - if(/MSIE/.test(navigator.userAgent)){ - effect.element.undoPositioned(); - effect.element.firstChild.undoPositioned(); - }else{ - effect.element.firstChild.undoPositioned(); - effect.element.undoPositioned(); - } - effect.element.firstChild.setStyle({bottom: oldInnerBottom}); } - }, arguments[1] || {}) - ); -} - -Effect.SlideUp = function(element) { - element = $(element); - element.cleanWhitespace(); - var oldInnerBottom = $(element.firstChild).getStyle('bottom'); - return new Effect.Scale(element, window.opera ? 0 : 1, - Object.extend({ scaleContent: false, - scaleX: false, - scaleMode: 'box', - scaleFrom: 100, - restoreAfterFinish: true, - beforeStartInternal: function(effect) { - effect.element.makePositioned(); - effect.element.firstChild.makePositioned(); - if(window.opera) effect.element.setStyle({top: ''}); - effect.element.makeClipping(); - effect.element.show(); }, - afterUpdateInternal: function(effect) { - effect.element.firstChild.setStyle({bottom: - (effect.dims[0] - effect.element.clientHeight) + 'px' }); }, - afterFinishInternal: function(effect) { - effect.element.hide(); - effect.element.undoClipping(); - effect.element.firstChild.undoPositioned(); - effect.element.undoPositioned(); - effect.element.setStyle({bottom: oldInnerBottom}); } - }, arguments[1] || {}) - ); -} - -// Bug in opera makes the TD containing this element expand for a instance after finish -Effect.Squish = function(element) { - return new Effect.Scale(element, window.opera ? 1 : 0, - { restoreAfterFinish: true, - beforeSetup: function(effect) { - effect.element.makeClipping(effect.element); }, - afterFinishInternal: function(effect) { - effect.element.hide(effect.element); - effect.element.undoClipping(effect.element); } - }); -} - -Effect.Grow = function(element) { - element = $(element); - var options = Object.extend({ - direction: 'center', - moveTransition: Effect.Transitions.sinoidal, - scaleTransition: Effect.Transitions.sinoidal, - opacityTransition: Effect.Transitions.full - }, arguments[1] || {}); - var oldStyle = { - top: element.style.top, - left: element.style.left, - height: element.style.height, - width: element.style.width, - opacity: element.getInlineOpacity() }; - - var dims = element.getDimensions(); - var initialMoveX, initialMoveY; - var moveX, moveY; - - switch (options.direction) { - case 'top-left': - initialMoveX = initialMoveY = moveX = moveY = 0; - break; - case 'top-right': - initialMoveX = dims.width; - initialMoveY = moveY = 0; - moveX = -dims.width; - break; - case 'bottom-left': - initialMoveX = moveX = 0; - initialMoveY = dims.height; - moveY = -dims.height; - break; - case 'bottom-right': - initialMoveX = dims.width; - initialMoveY = dims.height; - moveX = -dims.width; - moveY = -dims.height; - break; - case 'center': - initialMoveX = dims.width / 2; - initialMoveY = dims.height / 2; - moveX = -dims.width / 2; - moveY = -dims.height / 2; - break; - } - - return new Effect.Move(element, { - x: initialMoveX, - y: initialMoveY, - duration: 0.01, - beforeSetup: function(effect) { - effect.element.hide(); - effect.element.makeClipping(); - effect.element.makePositioned(); - }, - afterFinishInternal: function(effect) { - new Effect.Parallel( - [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }), - new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }), - new Effect.Scale(effect.element, 100, { - scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, - sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true}) - ], Object.extend({ - beforeSetup: function(effect) { - effect.effects[0].element.setStyle({height: '0px'}); - effect.effects[0].element.show(); - }, - afterFinishInternal: function(effect) { - effect.effects[0].element.undoClipping(); - effect.effects[0].element.undoPositioned(); - effect.effects[0].element.setStyle(oldStyle); - } - }, options) - ) - } - }); -} - -Effect.Shrink = function(element) { - element = $(element); - var options = Object.extend({ - direction: 'center', - moveTransition: Effect.Transitions.sinoidal, - scaleTransition: Effect.Transitions.sinoidal, - opacityTransition: Effect.Transitions.none - }, arguments[1] || {}); - var oldStyle = { - top: element.style.top, - left: element.style.left, - height: element.style.height, - width: element.style.width, - opacity: element.getInlineOpacity() }; - - var dims = element.getDimensions(); - var moveX, moveY; - - switch (options.direction) { - case 'top-left': - moveX = moveY = 0; - break; - case 'top-right': - moveX = dims.width; - moveY = 0; - break; - case 'bottom-left': - moveX = 0; - moveY = dims.height; - break; - case 'bottom-right': - moveX = dims.width; - moveY = dims.height; - break; - case 'center': - moveX = dims.width / 2; - moveY = dims.height / 2; - break; - } - - return new Effect.Parallel( - [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }), - new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}), - new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }) - ], Object.extend({ - beforeStartInternal: function(effect) { - effect.effects[0].element.makePositioned(); - effect.effects[0].element.makeClipping(); }, - afterFinishInternal: function(effect) { - effect.effects[0].element.hide(); - effect.effects[0].element.undoClipping(); - effect.effects[0].element.undoPositioned(); - effect.effects[0].element.setStyle(oldStyle); } - }, options) - ); -} - -Effect.Pulsate = function(element) { - element = $(element); - var options = arguments[1] || {}; - var oldOpacity = element.getInlineOpacity(); - var transition = options.transition || Effect.Transitions.sinoidal; - var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos)) }; - reverser.bind(transition); - return new Effect.Opacity(element, - Object.extend(Object.extend({ duration: 3.0, from: 0, - afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); } - }, options), {transition: reverser})); -} - -Effect.Fold = function(element) { - element = $(element); - var oldStyle = { - top: element.style.top, - left: element.style.left, - width: element.style.width, - height: element.style.height }; - Element.makeClipping(element); - return new Effect.Scale(element, 5, Object.extend({ - scaleContent: false, - scaleX: false, - afterFinishInternal: function(effect) { - new Effect.Scale(element, 1, { - scaleContent: false, - scaleY: false, - afterFinishInternal: function(effect) { - effect.element.hide(); - effect.element.undoClipping(); - effect.element.setStyle(oldStyle); - } }); - }}, arguments[1] || {})); -}; - -['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setContentZoom', - 'collectTextNodes','collectTextNodesIgnoreClass','childrenWithClassName'].each( - function(f) { Element.Methods[f] = Element[f]; } -); - -Element.Methods.visualEffect = function(element, effect, options) { - s = effect.gsub(/_/, '-').camelize(); - effect_class = s.charAt(0).toUpperCase() + s.substring(1); - new Effect[effect_class](element, options); - return $(element); -}; - -Element.addMethods();
\ No newline at end of file diff --git a/tests/test_tools/selenium/core/lib/scriptaculous/scriptaculous.js b/tests/test_tools/selenium/core/lib/scriptaculous/scriptaculous.js deleted file mode 100644 index f61fc57f..00000000 --- a/tests/test_tools/selenium/core/lib/scriptaculous/scriptaculous.js +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -var Scriptaculous = { - Version: '1.6.1', - require: function(libraryName) { - // inserting via DOM fails in Safari 2.0, so brute force approach - document.write('<script type="text/javascript" src="'+libraryName+'"></script>'); - }, - load: function() { - if((typeof Prototype=='undefined') || - (typeof Element == 'undefined') || - (typeof Element.Methods=='undefined') || - parseFloat(Prototype.Version.split(".")[0] + "." + - Prototype.Version.split(".")[1]) < 1.5) - throw("script.aculo.us requires the Prototype JavaScript framework >= 1.5.0"); - - $A(document.getElementsByTagName("script")).findAll( function(s) { - return (s.src && s.src.match(/scriptaculous\.js(\?.*)?$/)) - }).each( function(s) { - var path = s.src.replace(/scriptaculous\.js(\?.*)?$/,''); - var includes = s.src.match(/\?.*load=([a-z,]*)/); - (includes ? includes[1] : 'builder,effects,dragdrop,controls,slider').split(',').each( - function(include) { Scriptaculous.require(path+include+'.js') }); - }); - } -} - -Scriptaculous.load();
\ No newline at end of file diff --git a/tests/test_tools/selenium/core/lib/scriptaculous/slider.js b/tests/test_tools/selenium/core/lib/scriptaculous/slider.js deleted file mode 100644 index c0f1fc01..00000000 --- a/tests/test_tools/selenium/core/lib/scriptaculous/slider.js +++ /dev/null @@ -1,283 +0,0 @@ -// Copyright (c) 2005 Marty Haught, Thomas Fuchs -// -// See http://script.aculo.us for more info -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -if(!Control) var Control = {}; -Control.Slider = Class.create(); - -// options: -// axis: 'vertical', or 'horizontal' (default) -// -// callbacks: -// onChange(value) -// onSlide(value) -Control.Slider.prototype = { - initialize: function(handle, track, options) { - var slider = this; - - if(handle instanceof Array) { - this.handles = handle.collect( function(e) { return $(e) }); - } else { - this.handles = [$(handle)]; - } - - this.track = $(track); - this.options = options || {}; - - this.axis = this.options.axis || 'horizontal'; - this.increment = this.options.increment || 1; - this.step = parseInt(this.options.step || '1'); - this.range = this.options.range || $R(0,1); - - this.value = 0; // assure backwards compat - this.values = this.handles.map( function() { return 0 }); - this.spans = this.options.spans ? this.options.spans.map(function(s){ return $(s) }) : false; - this.options.startSpan = $(this.options.startSpan || null); - this.options.endSpan = $(this.options.endSpan || null); - - this.restricted = this.options.restricted || false; - - this.maximum = this.options.maximum || this.range.end; - this.minimum = this.options.minimum || this.range.start; - - // Will be used to align the handle onto the track, if necessary - this.alignX = parseInt(this.options.alignX || '0'); - this.alignY = parseInt(this.options.alignY || '0'); - - this.trackLength = this.maximumOffset() - this.minimumOffset(); - this.handleLength = this.isVertical() ? this.handles[0].offsetHeight : this.handles[0].offsetWidth; - - this.active = false; - this.dragging = false; - this.disabled = false; - - if(this.options.disabled) this.setDisabled(); - - // Allowed values array - this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false; - if(this.allowedValues) { - this.minimum = this.allowedValues.min(); - this.maximum = this.allowedValues.max(); - } - - this.eventMouseDown = this.startDrag.bindAsEventListener(this); - this.eventMouseUp = this.endDrag.bindAsEventListener(this); - this.eventMouseMove = this.update.bindAsEventListener(this); - - // Initialize handles in reverse (make sure first handle is active) - this.handles.each( function(h,i) { - i = slider.handles.length-1-i; - slider.setValue(parseFloat( - (slider.options.sliderValue instanceof Array ? - slider.options.sliderValue[i] : slider.options.sliderValue) || - slider.range.start), i); - Element.makePositioned(h); // fix IE - Event.observe(h, "mousedown", slider.eventMouseDown); - }); - - Event.observe(this.track, "mousedown", this.eventMouseDown); - Event.observe(document, "mouseup", this.eventMouseUp); - Event.observe(document, "mousemove", this.eventMouseMove); - - this.initialized = true; - }, - dispose: function() { - var slider = this; - Event.stopObserving(this.track, "mousedown", this.eventMouseDown); - Event.stopObserving(document, "mouseup", this.eventMouseUp); - Event.stopObserving(document, "mousemove", this.eventMouseMove); - this.handles.each( function(h) { - Event.stopObserving(h, "mousedown", slider.eventMouseDown); - }); - }, - setDisabled: function(){ - this.disabled = true; - }, - setEnabled: function(){ - this.disabled = false; - }, - getNearestValue: function(value){ - if(this.allowedValues){ - if(value >= this.allowedValues.max()) return(this.allowedValues.max()); - if(value <= this.allowedValues.min()) return(this.allowedValues.min()); - - var offset = Math.abs(this.allowedValues[0] - value); - var newValue = this.allowedValues[0]; - this.allowedValues.each( function(v) { - var currentOffset = Math.abs(v - value); - if(currentOffset <= offset){ - newValue = v; - offset = currentOffset; - } - }); - return newValue; - } - if(value > this.range.end) return this.range.end; - if(value < this.range.start) return this.range.start; - return value; - }, - setValue: function(sliderValue, handleIdx){ - if(!this.active) { - this.activeHandle = this.handles[handleIdx]; - this.activeHandleIdx = handleIdx; - this.updateStyles(); - } - handleIdx = handleIdx || this.activeHandleIdx || 0; - if(this.initialized && this.restricted) { - if((handleIdx>0) && (sliderValue<this.values[handleIdx-1])) - sliderValue = this.values[handleIdx-1]; - if((handleIdx < (this.handles.length-1)) && (sliderValue>this.values[handleIdx+1])) - sliderValue = this.values[handleIdx+1]; - } - sliderValue = this.getNearestValue(sliderValue); - this.values[handleIdx] = sliderValue; - this.value = this.values[0]; // assure backwards compat - - this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] = - this.translateToPx(sliderValue); - - this.drawSpans(); - if(!this.dragging || !this.event) this.updateFinished(); - }, - setValueBy: function(delta, handleIdx) { - this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta, - handleIdx || this.activeHandleIdx || 0); - }, - translateToPx: function(value) { - return Math.round( - ((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) * - (value - this.range.start)) + "px"; - }, - translateToValue: function(offset) { - return ((offset/(this.trackLength-this.handleLength) * - (this.range.end-this.range.start)) + this.range.start); - }, - getRange: function(range) { - var v = this.values.sortBy(Prototype.K); - range = range || 0; - return $R(v[range],v[range+1]); - }, - minimumOffset: function(){ - return(this.isVertical() ? this.alignY : this.alignX); - }, - maximumOffset: function(){ - return(this.isVertical() ? - this.track.offsetHeight - this.alignY : this.track.offsetWidth - this.alignX); - }, - isVertical: function(){ - return (this.axis == 'vertical'); - }, - drawSpans: function() { - var slider = this; - if(this.spans) - $R(0, this.spans.length-1).each(function(r) { slider.setSpan(slider.spans[r], slider.getRange(r)) }); - if(this.options.startSpan) - this.setSpan(this.options.startSpan, - $R(0, this.values.length>1 ? this.getRange(0).min() : this.value )); - if(this.options.endSpan) - this.setSpan(this.options.endSpan, - $R(this.values.length>1 ? this.getRange(this.spans.length-1).max() : this.value, this.maximum)); - }, - setSpan: function(span, range) { - if(this.isVertical()) { - span.style.top = this.translateToPx(range.start); - span.style.height = this.translateToPx(range.end - range.start + this.range.start); - } else { - span.style.left = this.translateToPx(range.start); - span.style.width = this.translateToPx(range.end - range.start + this.range.start); - } - }, - updateStyles: function() { - this.handles.each( function(h){ Element.removeClassName(h, 'selected') }); - Element.addClassName(this.activeHandle, 'selected'); - }, - startDrag: function(event) { - if(Event.isLeftClick(event)) { - if(!this.disabled){ - this.active = true; - - var handle = Event.element(event); - var pointer = [Event.pointerX(event), Event.pointerY(event)]; - if(handle==this.track) { - var offsets = Position.cumulativeOffset(this.track); - this.event = event; - this.setValue(this.translateToValue( - (this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2) - )); - var offsets = Position.cumulativeOffset(this.activeHandle); - this.offsetX = (pointer[0] - offsets[0]); - this.offsetY = (pointer[1] - offsets[1]); - } else { - // find the handle (prevents issues with Safari) - while((this.handles.indexOf(handle) == -1) && handle.parentNode) - handle = handle.parentNode; - - this.activeHandle = handle; - this.activeHandleIdx = this.handles.indexOf(this.activeHandle); - this.updateStyles(); - - var offsets = Position.cumulativeOffset(this.activeHandle); - this.offsetX = (pointer[0] - offsets[0]); - this.offsetY = (pointer[1] - offsets[1]); - } - } - Event.stop(event); - } - }, - update: function(event) { - if(this.active) { - if(!this.dragging) this.dragging = true; - this.draw(event); - // fix AppleWebKit rendering - if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0); - Event.stop(event); - } - }, - draw: function(event) { - var pointer = [Event.pointerX(event), Event.pointerY(event)]; - var offsets = Position.cumulativeOffset(this.track); - pointer[0] -= this.offsetX + offsets[0]; - pointer[1] -= this.offsetY + offsets[1]; - this.event = event; - this.setValue(this.translateToValue( this.isVertical() ? pointer[1] : pointer[0] )); - if(this.initialized && this.options.onSlide) - this.options.onSlide(this.values.length>1 ? this.values : this.value, this); - }, - endDrag: function(event) { - if(this.active && this.dragging) { - this.finishDrag(event, true); - Event.stop(event); - } - this.active = false; - this.dragging = false; - }, - finishDrag: function(event, success) { - this.active = false; - this.dragging = false; - this.updateFinished(); - }, - updateFinished: function() { - if(this.initialized && this.options.onChange) - this.options.onChange(this.values.length>1 ? this.values : this.value, this); - this.event = null; - } -}
\ No newline at end of file diff --git a/tests/test_tools/selenium/core/lib/scriptaculous/unittest.js b/tests/test_tools/selenium/core/lib/scriptaculous/unittest.js deleted file mode 100644 index d2c2d817..00000000 --- a/tests/test_tools/selenium/core/lib/scriptaculous/unittest.js +++ /dev/null @@ -1,383 +0,0 @@ -// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// (c) 2005 Jon Tirsen (http://www.tirsen.com) -// (c) 2005 Michael Schuerig (http://www.schuerig.de/michael/) -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -// experimental, Firefox-only -Event.simulateMouse = function(element, eventName) { - var options = Object.extend({ - pointerX: 0, - pointerY: 0, - buttons: 0 - }, arguments[2] || {}); - var oEvent = document.createEvent("MouseEvents"); - oEvent.initMouseEvent(eventName, true, true, document.defaultView, - options.buttons, options.pointerX, options.pointerY, options.pointerX, options.pointerY, - false, false, false, false, 0, $(element)); - - if(this.mark) Element.remove(this.mark); - this.mark = document.createElement('div'); - this.mark.appendChild(document.createTextNode(" ")); - document.body.appendChild(this.mark); - this.mark.style.position = 'absolute'; - this.mark.style.top = options.pointerY + "px"; - this.mark.style.left = options.pointerX + "px"; - this.mark.style.width = "5px"; - this.mark.style.height = "5px;"; - this.mark.style.borderTop = "1px solid red;" - this.mark.style.borderLeft = "1px solid red;" - - if(this.step) - alert('['+new Date().getTime().toString()+'] '+eventName+'/'+Test.Unit.inspect(options)); - - $(element).dispatchEvent(oEvent); -}; - -// Note: Due to a fix in Firefox 1.0.5/6 that probably fixed "too much", this doesn't work in 1.0.6 or DP2. -// You need to downgrade to 1.0.4 for now to get this working -// See https://bugzilla.mozilla.org/show_bug.cgi?id=289940 for the fix that fixed too much -Event.simulateKey = function(element, eventName) { - var options = Object.extend({ - ctrlKey: false, - altKey: false, - shiftKey: false, - metaKey: false, - keyCode: 0, - charCode: 0 - }, arguments[2] || {}); - - var oEvent = document.createEvent("KeyEvents"); - oEvent.initKeyEvent(eventName, true, true, window, - options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, - options.keyCode, options.charCode ); - $(element).dispatchEvent(oEvent); -}; - -Event.simulateKeys = function(element, command) { - for(var i=0; i<command.length; i++) { - Event.simulateKey(element,'keypress',{charCode:command.charCodeAt(i)}); - } -}; - -var Test = {} -Test.Unit = {}; - -// security exception workaround -Test.Unit.inspect = Object.inspect; - -Test.Unit.Logger = Class.create(); -Test.Unit.Logger.prototype = { - initialize: function(log) { - this.log = $(log); - if (this.log) { - this._createLogTable(); - } - }, - start: function(testName) { - if (!this.log) return; - this.testName = testName; - this.lastLogLine = document.createElement('tr'); - this.statusCell = document.createElement('td'); - this.nameCell = document.createElement('td'); - this.nameCell.appendChild(document.createTextNode(testName)); - this.messageCell = document.createElement('td'); - this.lastLogLine.appendChild(this.statusCell); - this.lastLogLine.appendChild(this.nameCell); - this.lastLogLine.appendChild(this.messageCell); - this.loglines.appendChild(this.lastLogLine); - }, - finish: function(status, summary) { - if (!this.log) return; - this.lastLogLine.className = status; - this.statusCell.innerHTML = status; - this.messageCell.innerHTML = this._toHTML(summary); - }, - message: function(message) { - if (!this.log) return; - this.messageCell.innerHTML = this._toHTML(message); - }, - summary: function(summary) { - if (!this.log) return; - this.logsummary.innerHTML = this._toHTML(summary); - }, - _createLogTable: function() { - this.log.innerHTML = - '<div id="logsummary"></div>' + - '<table id="logtable">' + - '<thead><tr><th>Status</th><th>Test</th><th>Message</th></tr></thead>' + - '<tbody id="loglines"></tbody>' + - '</table>'; - this.logsummary = $('logsummary') - this.loglines = $('loglines'); - }, - _toHTML: function(txt) { - return txt.escapeHTML().replace(/\n/g,"<br/>"); - } -} - -Test.Unit.Runner = Class.create(); -Test.Unit.Runner.prototype = { - initialize: function(testcases) { - this.options = Object.extend({ - testLog: 'testlog' - }, arguments[1] || {}); - this.options.resultsURL = this.parseResultsURLQueryParameter(); - if (this.options.testLog) { - this.options.testLog = $(this.options.testLog) || null; - } - if(this.options.tests) { - this.tests = []; - for(var i = 0; i < this.options.tests.length; i++) { - if(/^test/.test(this.options.tests[i])) { - this.tests.push(new Test.Unit.Testcase(this.options.tests[i], testcases[this.options.tests[i]], testcases["setup"], testcases["teardown"])); - } - } - } else { - if (this.options.test) { - this.tests = [new Test.Unit.Testcase(this.options.test, testcases[this.options.test], testcases["setup"], testcases["teardown"])]; - } else { - this.tests = []; - for(var testcase in testcases) { - if(/^test/.test(testcase)) { - this.tests.push(new Test.Unit.Testcase(testcase, testcases[testcase], testcases["setup"], testcases["teardown"])); - } - } - } - } - this.currentTest = 0; - this.logger = new Test.Unit.Logger(this.options.testLog); - setTimeout(this.runTests.bind(this), 1000); - }, - parseResultsURLQueryParameter: function() { - return window.location.search.parseQuery()["resultsURL"]; - }, - // Returns: - // "ERROR" if there was an error, - // "FAILURE" if there was a failure, or - // "SUCCESS" if there was neither - getResult: function() { - var hasFailure = false; - for(var i=0;i<this.tests.length;i++) { - if (this.tests[i].errors > 0) { - return "ERROR"; - } - if (this.tests[i].failures > 0) { - hasFailure = true; - } - } - if (hasFailure) { - return "FAILURE"; - } else { - return "SUCCESS"; - } - }, - postResults: function() { - if (this.options.resultsURL) { - new Ajax.Request(this.options.resultsURL, - { method: 'get', parameters: 'result=' + this.getResult(), asynchronous: false }); - } - }, - runTests: function() { - var test = this.tests[this.currentTest]; - if (!test) { - // finished! - this.postResults(); - this.logger.summary(this.summary()); - return; - } - if(!test.isWaiting) { - this.logger.start(test.name); - } - test.run(); - if(test.isWaiting) { - this.logger.message("Waiting for " + test.timeToWait + "ms"); - setTimeout(this.runTests.bind(this), test.timeToWait || 1000); - } else { - this.logger.finish(test.status(), test.summary()); - this.currentTest++; - // tail recursive, hopefully the browser will skip the stackframe - this.runTests(); - } - }, - summary: function() { - var assertions = 0; - var failures = 0; - var errors = 0; - var messages = []; - for(var i=0;i<this.tests.length;i++) { - assertions += this.tests[i].assertions; - failures += this.tests[i].failures; - errors += this.tests[i].errors; - } - return ( - this.tests.length + " tests, " + - assertions + " assertions, " + - failures + " failures, " + - errors + " errors"); - } -} - -Test.Unit.Assertions = Class.create(); -Test.Unit.Assertions.prototype = { - initialize: function() { - this.assertions = 0; - this.failures = 0; - this.errors = 0; - this.messages = []; - }, - summary: function() { - return ( - this.assertions + " assertions, " + - this.failures + " failures, " + - this.errors + " errors" + "\n" + - this.messages.join("\n")); - }, - pass: function() { - this.assertions++; - }, - fail: function(message) { - this.failures++; - this.messages.push("Failure: " + message); - }, - info: function(message) { - this.messages.push("Info: " + message); - }, - error: function(error) { - this.errors++; - this.messages.push(error.name + ": "+ error.message + "(" + Test.Unit.inspect(error) +")"); - }, - status: function() { - if (this.failures > 0) return 'failed'; - if (this.errors > 0) return 'error'; - return 'passed'; - }, - assert: function(expression) { - var message = arguments[1] || 'assert: got "' + Test.Unit.inspect(expression) + '"'; - try { expression ? this.pass() : - this.fail(message); } - catch(e) { this.error(e); } - }, - assertEqual: function(expected, actual) { - var message = arguments[2] || "assertEqual"; - try { (expected == actual) ? this.pass() : - this.fail(message + ': expected "' + Test.Unit.inspect(expected) + - '", actual "' + Test.Unit.inspect(actual) + '"'); } - catch(e) { this.error(e); } - }, - assertEnumEqual: function(expected, actual) { - var message = arguments[2] || "assertEnumEqual"; - try { $A(expected).length == $A(actual).length && - expected.zip(actual).all(function(pair) { return pair[0] == pair[1] }) ? - this.pass() : this.fail(message + ': expected ' + Test.Unit.inspect(expected) + - ', actual ' + Test.Unit.inspect(actual)); } - catch(e) { this.error(e); } - }, - assertNotEqual: function(expected, actual) { - var message = arguments[2] || "assertNotEqual"; - try { (expected != actual) ? this.pass() : - this.fail(message + ': got "' + Test.Unit.inspect(actual) + '"'); } - catch(e) { this.error(e); } - }, - assertNull: function(obj) { - var message = arguments[1] || 'assertNull' - try { (obj==null) ? this.pass() : - this.fail(message + ': got "' + Test.Unit.inspect(obj) + '"'); } - catch(e) { this.error(e); } - }, - assertHidden: function(element) { - var message = arguments[1] || 'assertHidden'; - this.assertEqual("none", element.style.display, message); - }, - assertNotNull: function(object) { - var message = arguments[1] || 'assertNotNull'; - this.assert(object != null, message); - }, - assertInstanceOf: function(expected, actual) { - var message = arguments[2] || 'assertInstanceOf'; - try { - (actual instanceof expected) ? this.pass() : - this.fail(message + ": object was not an instance of the expected type"); } - catch(e) { this.error(e); } - }, - assertNotInstanceOf: function(expected, actual) { - var message = arguments[2] || 'assertNotInstanceOf'; - try { - !(actual instanceof expected) ? this.pass() : - this.fail(message + ": object was an instance of the not expected type"); } - catch(e) { this.error(e); } - }, - _isVisible: function(element) { - element = $(element); - if(!element.parentNode) return true; - this.assertNotNull(element); - if(element.style && Element.getStyle(element, 'display') == 'none') - return false; - - return this._isVisible(element.parentNode); - }, - assertNotVisible: function(element) { - this.assert(!this._isVisible(element), Test.Unit.inspect(element) + " was not hidden and didn't have a hidden parent either. " + ("" || arguments[1])); - }, - assertVisible: function(element) { - this.assert(this._isVisible(element), Test.Unit.inspect(element) + " was not visible. " + ("" || arguments[1])); - }, - benchmark: function(operation, iterations) { - var startAt = new Date(); - (iterations || 1).times(operation); - var timeTaken = ((new Date())-startAt); - this.info((arguments[2] || 'Operation') + ' finished ' + - iterations + ' iterations in ' + (timeTaken/1000)+'s' ); - return timeTaken; - } -} - -Test.Unit.Testcase = Class.create(); -Object.extend(Object.extend(Test.Unit.Testcase.prototype, Test.Unit.Assertions.prototype), { - initialize: function(name, test, setup, teardown) { - Test.Unit.Assertions.prototype.initialize.bind(this)(); - this.name = name; - this.test = test || function() {}; - this.setup = setup || function() {}; - this.teardown = teardown || function() {}; - this.isWaiting = false; - this.timeToWait = 1000; - }, - wait: function(time, nextPart) { - this.isWaiting = true; - this.test = nextPart; - this.timeToWait = time; - }, - run: function() { - try { - try { - if (!this.isWaiting) this.setup.bind(this)(); - this.isWaiting = false; - this.test.bind(this)(); - } finally { - if(!this.isWaiting) { - this.teardown.bind(this)(); - } - } - } - catch(e) { this.error(e); } - } -}); diff --git a/tests/test_tools/selenium/core/scripts/find_matching_child.js b/tests/test_tools/selenium/core/scripts/find_matching_child.js deleted file mode 100644 index fbf35b75..00000000 --- a/tests/test_tools/selenium/core/scripts/find_matching_child.js +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2004 ThoughtWorks, Inc - * - * 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. - * - */ - -elementFindMatchingChildren = function(element, selector) { - var matches = []; - - var childCount = element.childNodes.length; - for (var i=0; i<childCount; i++) { - var child = element.childNodes[i]; - if (selector(child)) { - matches.push(child); - } else { - childMatches = elementFindMatchingChildren(child, selector); - matches.push(childMatches); - } - } - - return matches.flatten(); -} - -ELEMENT_NODE_TYPE = 1; - -elementFindFirstMatchingChild = function(element, selector) { - - var childCount = element.childNodes.length; - for (var i=0; i<childCount; i++) { - var child = element.childNodes[i]; - if (child.nodeType == ELEMENT_NODE_TYPE) { - if (selector(child)) { - return child; - } - result = elementFindFirstMatchingChild(child, selector); - if (result) { - return result; - } - } - } - return null; -} - -elementFindFirstMatchingParent = function(element, selector) { - var current = element.parentNode; - while (current != null) { - if (selector(current)) { - break; - } - current = current.parentNode; - } - return current; -} - -elementFindMatchingChildById = function(element, id) { - return elementFindFirstMatchingChild(element, function(element){return element.id==id} ); -} - diff --git a/tests/test_tools/selenium/core/scripts/htmlutils.js b/tests/test_tools/selenium/core/scripts/htmlutils.js deleted file mode 100644 index a3cd3dd9..00000000 --- a/tests/test_tools/selenium/core/scripts/htmlutils.js +++ /dev/null @@ -1,842 +0,0 @@ -/* - * Copyright 2004 ThoughtWorks, Inc - * - * 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. - * - */ - -// This script contains a badly-organised collection of miscellaneous -// functions that really better homes. - -function classCreate() { - return function() { - this.initialize.apply(this, arguments); - } -} - -function objectExtend(destination, source) { - for (var property in source) { - destination[property] = source[property]; - } - return destination; -} - -function $() { - var results = [], element; - for (var i = 0; i < arguments.length; i++) { - element = arguments[i]; - if (typeof element == 'string') - element = document.getElementById(element); - results[results.length] = element; - } - return results.length < 2 ? results[0] : results; -} - -function $A(iterable) { - if (!iterable) return []; - if (iterable.toArray) { - return iterable.toArray(); - } else { - var results = []; - for (var i = 0; i < iterable.length; i++) - results.push(iterable[i]); - return results; - } -} - -function fnBind() { - var args = $A(arguments), __method = args.shift(), object = args.shift(); - var retval = function() { - return __method.apply(object, args.concat($A(arguments))); - } - retval.__method = __method; - return retval; -} - -function fnBindAsEventListener(fn, object) { - var __method = fn; - return function(event) { - return __method.call(object, event || window.event); - } -} - -function removeClassName(element, name) { - var re = new RegExp("\\b" + name + "\\b", "g"); - element.className = element.className.replace(re, ""); -} - -function addClassName(element, name) { - element.className = element.className + ' ' + name; -} - -function elementSetStyle(element, style) { - for (var name in style) { - var value = style[name]; - if (value == null) value = ""; - element.style[name] = value; - } -} - -function elementGetStyle(element, style) { - var value = element.style[style]; - if (!value) { - if (document.defaultView && document.defaultView.getComputedStyle) { - var css = document.defaultView.getComputedStyle(element, null); - value = css ? css.getPropertyValue(style) : null; - } else if (element.currentStyle) { - value = element.currentStyle[style]; - } - } - - /** DGF necessary? - if (window.opera && ['left', 'top', 'right', 'bottom'].include(style)) - if (Element.getStyle(element, 'position') == 'static') value = 'auto'; */ - - return value == 'auto' ? null : value; - } - -String.prototype.trim = function() { - var result = this.replace(/^\s+/g, ""); - // strip leading - return result.replace(/\s+$/g, ""); - // strip trailing -}; -String.prototype.lcfirst = function() { - return this.charAt(0).toLowerCase() + this.substr(1); -}; -String.prototype.ucfirst = function() { - return this.charAt(0).toUpperCase() + this.substr(1); -}; -String.prototype.startsWith = function(str) { - return this.indexOf(str) == 0; -}; - -// Returns the text in this element -function getText(element) { - var text = ""; - - var isRecentFirefox = (browserVersion.isFirefox && browserVersion.firefoxVersion >= "1.5"); - if (isRecentFirefox || browserVersion.isKonqueror || browserVersion.isSafari || browserVersion.isOpera) { - text = getTextContent(element); - } else if (element.textContent) { - text = element.textContent; - } else if (element.innerText) { - text = element.innerText; - } - - text = normalizeNewlines(text); - text = normalizeSpaces(text); - - return text.trim(); -} - -function getTextContent(element, preformatted) { - if (element.nodeType == 3 /*Node.TEXT_NODE*/) { - var text = element.data; - if (!preformatted) { - text = text.replace(/\n|\r|\t/g, " "); - } - return text; - } - if (element.nodeType == 1 /*Node.ELEMENT_NODE*/) { - var childrenPreformatted = preformatted || (element.tagName == "PRE"); - var text = ""; - for (var i = 0; i < element.childNodes.length; i++) { - var child = element.childNodes.item(i); - text += getTextContent(child, childrenPreformatted); - } - // Handle block elements that introduce newlines - // -- From HTML spec: - //<!ENTITY % block - // "P | %heading; | %list; | %preformatted; | DL | DIV | NOSCRIPT | - // BLOCKQUOTE | F:wORM | HR | TABLE | FIELDSET | ADDRESS"> - // - // TODO: should potentially introduce multiple newlines to separate blocks - if (element.tagName == "P" || element.tagName == "BR" || element.tagName == "HR" || element.tagName == "DIV") { - text += "\n"; - } - return text; - } - return ''; -} - -/** - * Convert all newlines to \m - */ -function normalizeNewlines(text) -{ - return text.replace(/\r\n|\r/g, "\n"); -} - -/** - * Replace multiple sequential spaces with a single space, and then convert to space. - */ -function normalizeSpaces(text) -{ - // IE has already done this conversion, so doing it again will remove multiple nbsp - if (browserVersion.isIE) - { - return text; - } - - // Replace multiple spaces with a single space - // TODO - this shouldn't occur inside PRE elements - text = text.replace(/\ +/g, " "); - - // Replace with a space - var nbspPattern = new RegExp(String.fromCharCode(160), "g"); - if (browserVersion.isSafari) { - return replaceAll(text, String.fromCharCode(160), " "); - } else { - return text.replace(nbspPattern, " "); - } -} - -function replaceAll(text, oldText, newText) { - while (text.indexOf(oldText) != -1) { - text = text.replace(oldText, newText); - } - return text; -} - - -function xmlDecode(text) { - text = text.replace(/"/g, '"'); - text = text.replace(/'/g, "'"); - text = text.replace(/</g, "<"); - text = text.replace(/>/g, ">"); - text = text.replace(/&/g, "&"); - return text; -} - -// Sets the text in this element -function setText(element, text) { - if (element.textContent != null) { - element.textContent = text; - } else if (element.innerText != null) { - element.innerText = text; - } -} - -// Get the value of an <input> element -function getInputValue(inputElement) { - if (inputElement.type) { - if (inputElement.type.toUpperCase() == 'CHECKBOX' || - inputElement.type.toUpperCase() == 'RADIO') - { - return (inputElement.checked ? 'on' : 'off'); - } - } - if (inputElement.value == null) { - throw new SeleniumError("This element has no value; is it really a form field?"); - } - return inputElement.value; -} - -/* Fire an event in a browser-compatible manner */ -function triggerEvent(element, eventType, canBubble, controlKeyDown, altKeyDown, shiftKeyDown, metaKeyDown) { - canBubble = (typeof(canBubble) == undefined) ? true : canBubble; - if (element.fireEvent) { - var evt = createEventObject(element, controlKeyDown, altKeyDown, shiftKeyDown, metaKeyDown); - element.fireEvent('on' + eventType, evt); - } - else { - var evt = document.createEvent('HTMLEvents'); - - try { - evt.shiftKey = shiftKeyDown; - evt.metaKey = metaKeyDown; - evt.altKey = altKeyDown; - evt.ctrlKey = controlKeyDown; - } catch (e) { - // On Firefox 1.0, you can only set these during initMouseEvent or initKeyEvent - // we'll have to ignore them here - LOG.exception(e); - } - - evt.initEvent(eventType, canBubble, true); - element.dispatchEvent(evt); - } -} - -function getKeyCodeFromKeySequence(keySequence) { - var match = /^\\(\d{1,3})$/.exec(keySequence); - if (match != null) { - return match[1]; - } - match = /^.$/.exec(keySequence); - if (match != null) { - return match[0].charCodeAt(0); - } - // this is for backward compatibility with existing tests - // 1 digit ascii codes will break however because they are used for the digit chars - match = /^\d{2,3}$/.exec(keySequence); - if (match != null) { - return match[0]; - } - throw new SeleniumError("invalid keySequence"); -} - -function createEventObject(element, controlKeyDown, altKeyDown, shiftKeyDown, metaKeyDown) { - var evt = element.ownerDocument.createEventObject(); - evt.shiftKey = shiftKeyDown; - evt.metaKey = metaKeyDown; - evt.altKey = altKeyDown; - evt.ctrlKey = controlKeyDown; - return evt; -} - -function triggerKeyEvent(element, eventType, keySequence, canBubble, controlKeyDown, altKeyDown, shiftKeyDown, metaKeyDown) { - var keycode = getKeyCodeFromKeySequence(keySequence); - canBubble = (typeof(canBubble) == undefined) ? true : canBubble; - if (element.fireEvent) { - var keyEvent = createEventObject(element, controlKeyDown, altKeyDown, shiftKeyDown, metaKeyDown); - keyEvent.keyCode = keycode; - element.fireEvent('on' + eventType, keyEvent); - } - else { - var evt; - if (window.KeyEvent) { - evt = document.createEvent('KeyEvents'); - evt.initKeyEvent(eventType, true, true, window, controlKeyDown, altKeyDown, shiftKeyDown, metaKeyDown, keycode, keycode); - } else { - evt = document.createEvent('UIEvents'); - - evt.shiftKey = shiftKeyDown; - evt.metaKey = metaKeyDown; - evt.altKey = altKeyDown; - evt.ctrlKey = controlKeyDown; - - evt.initUIEvent(eventType, true, true, window, 1); - evt.keyCode = keycode; - evt.which = keycode; - } - - element.dispatchEvent(evt); - } -} - -function removeLoadListener(element, command) { - LOG.info('Removing loadListenter for ' + element + ', ' + command); - if (window.removeEventListener) - element.removeEventListener("load", command, true); - else if (window.detachEvent) - element.detachEvent("onload", command); -} - -function addLoadListener(element, command) { - LOG.info('Adding loadListenter for ' + element + ', ' + command); - var augmentedCommand = function() { - command.call(this, element); - } - if (window.addEventListener && !browserVersion.isOpera) - element.addEventListener("load", augmentedCommand, true); - else if (window.attachEvent) - element.attachEvent("onload", augmentedCommand); -} - -/** - * Override the broken getFunctionName() method from JsUnit - * This file must be loaded _after_ the jsunitCore.js - */ -function getFunctionName(aFunction) { - var regexpResult = aFunction.toString().match(/function (\w*)/); - if (regexpResult && regexpResult[1]) { - return regexpResult[1]; - } - return 'anonymous'; -} - -function getDocumentBase(doc) { - var bases = document.getElementsByTagName("base"); - if (bases && bases.length && bases[0].href) { - return bases[0].href; - } - return ""; -} - -function getTagName(element) { - var tagName; - if (element && element.tagName && element.tagName.toLowerCase) { - tagName = element.tagName.toLowerCase(); - } - return tagName; -} - -function absolutify(url, baseUrl) { - /** returns a relative url in its absolute form, given by baseUrl. - * - * This function is a little odd, because it can take baseUrls that - * aren't necessarily directories. It uses the same rules as the HTML - * <base> tag; if the baseUrl doesn't end with "/", we'll assume - * that it points to a file, and strip the filename off to find its - * base directory. - * - * So absolutify("foo", "http://x/bar") will return "http://x/foo" (stripping off bar), - * whereas absolutify("foo", "http://x/bar/") will return "http://x/bar/foo" (preserving bar). - * Naturally absolutify("foo", "http://x") will return "http://x/foo", appropriately. - * - * @param url the url to make absolute; if this url is already absolute, we'll just return that, unchanged - * @param baseUrl the baseUrl from which we'll absolutify, following the rules above. - * @return 'url' if it was already absolute, or the absolutized version of url if it was not absolute. - */ - - // DGF isn't there some library we could use for this? - - if (/^\w+:/.test(url)) { - // it's already absolute - return url; - } - - var loc; - try { - loc = parseUrl(baseUrl); - } catch (e) { - // is it an absolute windows file path? let's play the hero in that case - if (/^\w:\\/.test(baseUrl)) { - baseUrl = "file:///" + baseUrl.replace(/\\/g, "/"); - loc = parseUrl(baseUrl); - } else { - throw new SeleniumError("baseUrl wasn't absolute: " + baseUrl); - } - } - loc.search = null; - loc.hash = null; - - // if url begins with /, then that's the whole pathname - if (/^\//.test(url)) { - loc.pathname = url; - var result = reassembleLocation(loc); - return result; - } - - // if pathname is null, then we'll just append "/" + the url - if (!loc.pathname) { - loc.pathname = "/" + url; - var result = reassembleLocation(loc); - return result; - } - - // if pathname ends with /, just append url - if (/\/$/.test(loc.pathname)) { - loc.pathname += url; - var result = reassembleLocation(loc); - return result; - } - - // if we're here, then the baseUrl has a pathname, but it doesn't end with / - // in that case, we replace everything after the final / with the relative url - loc.pathname = loc.pathname.replace(/[^\/\\]+$/, url); - var result = reassembleLocation(loc); - return result; - -} - -var URL_REGEX = /^((\w+):\/\/)(([^:]+):?([^@]+)?@)?([^\/\?:]*):?(\d+)?(\/?[^\?#]+)?\??([^#]+)?#?(.+)?/; - -function parseUrl(url) { - var fields = ['url', null, 'protocol', null, 'username', 'password', 'host', 'port', 'pathname', 'search', 'hash']; - var result = URL_REGEX.exec(url); - if (!result) { - throw new SeleniumError("Invalid URL: " + url); - } - var loc = new Object(); - for (var i = 0; i < fields.length; i++) { - var field = fields[i]; - if (field == null) { - continue; - } - loc[field] = result[i]; - } - return loc; -} - -function reassembleLocation(loc) { - if (!loc.protocol) { - throw new Error("Not a valid location object: " + o2s(loc)); - } - var protocol = loc.protocol; - protocol = protocol.replace(/:$/, ""); - var url = protocol + "://"; - if (loc.username) { - url += loc.username; - if (loc.password) { - url += ":" + loc.password; - } - url += "@"; - } - if (loc.host) { - url += loc.host; - } - - if (loc.port) { - url += ":" + loc.port; - } - - if (loc.pathname) { - url += loc.pathname; - } - - if (loc.search) { - url += "?" + loc.search; - } - if (loc.hash) { - var hash = loc.hash; - hash = loc.hash.replace(/^#/, ""); - url += "#" + hash; - } - return url; -} - -function canonicalize(url) { - var tempLink = window.document.createElement("link"); - tempLink.href = url; // this will canonicalize the href - return tempLink.href; -} - -function extractExceptionMessage(ex) { - if (ex == null) return "null exception"; - if (ex.message != null) return ex.message; - if (ex.toString && ex.toString() != null) return ex.toString(); -} - - -function describe(object, delimiter) { - var props = new Array(); - for (var prop in object) { - try { - props.push(prop + " -> " + object[prop]); - } catch (e) { - props.push(prop + " -> [htmlutils: ack! couldn't read this property! (Permission Denied?)]"); - } - } - return props.join(delimiter || '\n'); -} - -var PatternMatcher = function(pattern) { - this.selectStrategy(pattern); -}; -PatternMatcher.prototype = { - - selectStrategy: function(pattern) { - this.pattern = pattern; - var strategyName = 'glob'; - // by default - if (/^([a-z-]+):(.*)/.test(pattern)) { - var possibleNewStrategyName = RegExp.$1; - var possibleNewPattern = RegExp.$2; - if (PatternMatcher.strategies[possibleNewStrategyName]) { - strategyName = possibleNewStrategyName; - pattern = possibleNewPattern; - } - } - var matchStrategy = PatternMatcher.strategies[strategyName]; - if (!matchStrategy) { - throw new SeleniumError("cannot find PatternMatcher.strategies." + strategyName); - } - this.strategy = matchStrategy; - this.matcher = new matchStrategy(pattern); - }, - - matches: function(actual) { - return this.matcher.matches(actual + ''); - // Note: appending an empty string avoids a Konqueror bug - } - -}; - -/** - * A "static" convenience method for easy matching - */ -PatternMatcher.matches = function(pattern, actual) { - return new PatternMatcher(pattern).matches(actual); -}; - -PatternMatcher.strategies = { - -/** - * Exact matching, e.g. "exact:***" - */ - exact: function(expected) { - this.expected = expected; - this.matches = function(actual) { - return actual == this.expected; - }; - }, - -/** - * Match by regular expression, e.g. "regexp:^[0-9]+$" - */ - regexp: function(regexpString) { - this.regexp = new RegExp(regexpString); - this.matches = function(actual) { - return this.regexp.test(actual); - }; - }, - - regex: function(regexpString) { - this.regexp = new RegExp(regexpString); - this.matches = function(actual) { - return this.regexp.test(actual); - }; - }, - -/** - * "globContains" (aka "wildmat") patterns, e.g. "glob:one,two,*", - * but don't require a perfect match; instead succeed if actual - * contains something that matches globString. - * Making this distinction is motivated by a bug in IE6 which - * leads to the browser hanging if we implement *TextPresent tests - * by just matching against a regular expression beginning and - * ending with ".*". The globcontains strategy allows us to satisfy - * the functional needs of the *TextPresent ops more efficiently - * and so avoid running into this IE6 freeze. - */ - globContains: function(globString) { - this.regexp = new RegExp(PatternMatcher.regexpFromGlobContains(globString)); - this.matches = function(actual) { - return this.regexp.test(actual); - }; - }, - - -/** - * "glob" (aka "wildmat") patterns, e.g. "glob:one,two,*" - */ - glob: function(globString) { - this.regexp = new RegExp(PatternMatcher.regexpFromGlob(globString)); - this.matches = function(actual) { - return this.regexp.test(actual); - }; - } - -}; - -PatternMatcher.convertGlobMetaCharsToRegexpMetaChars = function(glob) { - var re = glob; - re = re.replace(/([.^$+(){}\[\]\\|])/g, "\\$1"); - re = re.replace(/\?/g, "(.|[\r\n])"); - re = re.replace(/\*/g, "(.|[\r\n])*"); - return re; -}; - -PatternMatcher.regexpFromGlobContains = function(globContains) { - return PatternMatcher.convertGlobMetaCharsToRegexpMetaChars(globContains); -}; - -PatternMatcher.regexpFromGlob = function(glob) { - return "^" + PatternMatcher.convertGlobMetaCharsToRegexpMetaChars(glob) + "$"; -}; - -var Assert = { - - fail: function(message) { - throw new AssertionFailedError(message); - }, - -/* -* Assert.equals(comment?, expected, actual) -*/ - equals: function() { - var args = new AssertionArguments(arguments); - if (args.expected === args.actual) { - return; - } - Assert.fail(args.comment + - "Expected '" + args.expected + - "' but was '" + args.actual + "'"); - }, - -/* -* Assert.matches(comment?, pattern, actual) -*/ - matches: function() { - var args = new AssertionArguments(arguments); - if (PatternMatcher.matches(args.expected, args.actual)) { - return; - } - Assert.fail(args.comment + - "Actual value '" + args.actual + - "' did not match '" + args.expected + "'"); - }, - -/* -* Assert.notMtches(comment?, pattern, actual) -*/ - notMatches: function() { - var args = new AssertionArguments(arguments); - if (!PatternMatcher.matches(args.expected, args.actual)) { - return; - } - Assert.fail(args.comment + - "Actual value '" + args.actual + - "' did match '" + args.expected + "'"); - } - -}; - -// Preprocess the arguments to allow for an optional comment. -function AssertionArguments(args) { - if (args.length == 2) { - this.comment = ""; - this.expected = args[0]; - this.actual = args[1]; - } else { - this.comment = args[0] + "; "; - this.expected = args[1]; - this.actual = args[2]; - } -} - -function AssertionFailedError(message) { - this.isAssertionFailedError = true; - this.isSeleniumError = true; - this.message = message; - this.failureMessage = message; -} - -function SeleniumError(message) { - var error = new Error(message); - error.isSeleniumError = true; - return error; -} - -function highlight(element) { - var highLightColor = "yellow"; - if (element.originalColor == undefined) { // avoid picking up highlight - element.originalColor = elementGetStyle(element, "background-color"); - } - elementSetStyle(element, {"backgroundColor" : highLightColor}); - window.setTimeout(function() { - try { - //if element is orphan, probably page of it has already gone, so ignore - if (!element.parentNode) { - return; - } - elementSetStyle(element, {"backgroundColor" : element.originalColor}); - } catch (e) {} // DGF unhighlighting is very dangerous and low priority - }, 200); -} - - - -// for use from vs.2003 debugger -function o2s(obj) { - var s = ""; - for (key in obj) { - var line = key + "->" + obj[key]; - line.replace("\n", " "); - s += line + "\n"; - } - return s; -} - -var seenReadyStateWarning = false; - -function openSeparateApplicationWindow(url, suppressMozillaWarning) { - // resize the Selenium window itself - window.resizeTo(1200, 500); - window.moveTo(window.screenX, 0); - - var appWindow = window.open(url + '?start=true', 'main'); - try { - var windowHeight = 500; - if (window.outerHeight) { - windowHeight = window.outerHeight; - } else if (document.documentElement && document.documentElement.offsetHeight) { - windowHeight = document.documentElement.offsetHeight; - } - - if (window.screenLeft && !window.screenX) window.screenX = window.screenLeft; - if (window.screenTop && !window.screenY) window.screenY = window.screenTop; - - appWindow.resizeTo(1200, screen.availHeight - windowHeight - 60); - appWindow.moveTo(window.screenX, window.screenY + windowHeight + 25); - } catch (e) { - LOG.error("Couldn't resize app window"); - LOG.exception(e); - } - - - if (!suppressMozillaWarning && window.document.readyState == null && !seenReadyStateWarning) { - alert("Beware! Mozilla bug 300992 means that we can't always reliably detect when a new page has loaded. Install the Selenium IDE extension or the readyState extension available from selenium.openqa.org to make page load detection more reliable."); - seenReadyStateWarning = true; - } - - return appWindow; -} - -var URLConfiguration = classCreate(); -objectExtend(URLConfiguration.prototype, { - initialize: function() { - }, - _isQueryParameterTrue: function (name) { - var parameterValue = this._getQueryParameter(name); - if (parameterValue == null) return false; - if (parameterValue.toLowerCase() == "true") return true; - if (parameterValue.toLowerCase() == "on") return true; - return false; - }, - - _getQueryParameter: function(searchKey) { - var str = this.queryString - if (str == null) return null; - var clauses = str.split('&'); - for (var i = 0; i < clauses.length; i++) { - var keyValuePair = clauses[i].split('=', 2); - var key = unescape(keyValuePair[0]); - if (key == searchKey) { - return unescape(keyValuePair[1]); - } - } - return null; - }, - - _extractArgs: function() { - var str = SeleniumHTARunner.commandLine; - if (str == null || str == "") return new Array(); - var matches = str.match(/(?:\"([^\"]+)\"|(?!\"([^\"]+)\")(\S+))/g); - // We either want non quote stuff ([^"]+) surrounded by quotes - // or we want to look-ahead, see that the next character isn't - // a quoted argument, and then grab all the non-space stuff - // this will return for the line: "foo" bar - // the results "\"foo\"" and "bar" - - // So, let's unquote the quoted arguments: - var args = new Array; - for (var i = 0; i < matches.length; i++) { - args[i] = matches[i]; - args[i] = args[i].replace(/^"(.*)"$/, "$1"); - } - return args; - }, - - isMultiWindowMode:function() { - return this._isQueryParameterTrue('multiWindow'); - }, - - getBaseUrl:function() { - return this._getQueryParameter('baseUrl'); - - } -}); - - -function safeScrollIntoView(element) { - if (element.scrollIntoView) { - element.scrollIntoView(false); - return; - } - // TODO: work out how to scroll browsers that don't support - // scrollIntoView (like Konqueror) -} diff --git a/tests/test_tools/selenium/core/scripts/injection.html b/tests/test_tools/selenium/core/scripts/injection.html deleted file mode 100644 index a75c7211..00000000 --- a/tests/test_tools/selenium/core/scripts/injection.html +++ /dev/null @@ -1,79 +0,0 @@ -<script language="JavaScript"> - if (window["selenium_has_been_loaded_into_this_window"]==null) - { - - __SELENIUM_JS__ - -// Some background on the code below: broadly speaking, where we are relative to other windows -// when running in proxy injection mode depends on whether we are in a frame set file or not. -// -// In regular HTML files, the selenium JavaScript is injected into an iframe called "selenium" -// in order to reduce its impact on the JavaScript environment (through namespace pollution, -// etc.). So in regular HTML files, we need to look at the parent of the current window when we want -// a handle to, e.g., the application window. -// -// In frame set files, we can't use an iframe, so we put the JavaScript in the head element and share -// the window with the frame set. So in this case, we need to look at the current window, not the -// parent when looking for, e.g., the application window. (TODO: Perhaps I should have just -// assigned a regular frame for selenium?) -// -BrowserBot.prototype.getContentWindow = function() { - if (window["seleniumInSameWindow"] != null) return window; - return window.parent; -}; - -BrowserBot.prototype.getTargetWindow = function(windowName) { - if (window["seleniumInSameWindow"] != null) return window; - return window.parent; -}; - -BrowserBot.prototype.getCurrentWindow = function() { - if (window["seleniumInSameWindow"] != null) return window; - return window.parent; -}; - -LOG.openLogWindow = function(message, className) { - // disable for now -}; - -BrowserBot.prototype.relayToRC = function(name) { - var object = eval(name); - var s = 'state:' + serializeObject(name, object) + "\n"; - sendToRC(s,"state=true"); -} - -BrowserBot.prototype.relayBotToRC = function(s) { - this.relayToRC("selenium." + s); -} - -function selenium_frameRunTest(oldOnLoadRoutine) { - if (oldOnLoadRoutine) { - eval(oldOnLoadRoutine); - } - runSeleniumTest(); -} - -function seleniumOnLoad() { - injectedSessionId = @SESSION_ID@; - window["selenium_has_been_loaded_into_this_window"] = true; - runSeleniumTest(); -} - -function seleniumOnUnload() { - sendToRC("OK"); // just in case some poor PI server thread is waiting for a response -} - -if (window.addEventListener) { - window.addEventListener("load", seleniumOnLoad, false); // firefox - window.addEventListener("unload", seleniumOnUnload, false); // firefox -} else if (window.attachEvent){ - window.attachEvent("onload", seleniumOnLoad); // IE - window.attachEvent("onunload", seleniumOnUnload); // IE -} -else { - throw "causing a JavaScript error to tell the world that I did not arrange to be run on load"; -} - -injectedSessionId = @SESSION_ID@; -} -</script> diff --git a/tests/test_tools/selenium/core/scripts/injection_iframe.html b/tests/test_tools/selenium/core/scripts/injection_iframe.html deleted file mode 100644 index bc26e859..00000000 --- a/tests/test_tools/selenium/core/scripts/injection_iframe.html +++ /dev/null @@ -1,7 +0,0 @@ -<script language="JavaScript"> - // Ideally I would avoid polluting the namespace by enclosing this snippet with - // curly braces, but I want to make it easy to look at what URL I used for anyone - // who is interested in looking into http://jira.openqa.org/browse/SRC-101: - var _sel_url_ = "http://" + location.host + "/selenium-server/core/scripts/injection.html"; - document.write('<iframe name="selenium" width=0 height=0 id="selenium" src="' + _sel_url_ + '"></iframe>'); -</script> diff --git a/tests/test_tools/selenium/core/scripts/js2html.js b/tests/test_tools/selenium/core/scripts/js2html.js deleted file mode 100644 index 407709df..00000000 --- a/tests/test_tools/selenium/core/scripts/js2html.js +++ /dev/null @@ -1,70 +0,0 @@ -/* - -This is an experiment in using the Narcissus JavaScript engine -to allow Selenium scripts to be written in plain JavaScript. - -The 'jsparse' function will compile each high level block into a Selenium table script. - - -TODO: -1) Test! (More browsers, more sample scripts) -2) Stepping and walking lower levels of the parse tree -3) Calling Selenium commands directly from JavaScript -4) Do we want comments to appear in the TestRunner? -5) Fix context so variables don't have to be global - For now, variables defined with "var" won't be found - if used later on in a script. -6) Fix formatting -*/ - - -function jsparse() { - var script = document.getElementById('sejs') - var fname = 'javascript script'; - parse_result = parse(script.text, fname, 0); - - var x2 = new ExecutionContext(GLOBAL_CODE); - ExecutionContext.current = x2; - - - var new_test_source = ''; - var new_line = ''; - - for (i=0;i<parse_result.$length;i++){ - var the_start = parse_result[i].start; - var the_end; - if ( i == (parse_result.$length-1)) { - the_end = parse_result.tokenizer.source.length; - } else { - the_end = parse_result[i+1].start; - } - - var script_fragment = parse_result.tokenizer.source.slice(the_start,the_end) - - new_line = '<tr><td style="display:none;" class="js">getEval</td>' + - '<td style="display:none;">currentTest.doNextCommand()</td>' + - '<td style="white-space: pre;">' + script_fragment + '</td>' + - '<td></td></tr>\n'; - new_test_source += new_line; - //eval(script_fragment); - - - }; - - - - execute(parse_result,x2) - - // Create HTML Table - body = document.body - body.innerHTML += "<table class='selenium' id='se-js-table'>"+ - "<tbody>" + - "<tr><td>// " + document.title + "</td></tr>" + - new_test_source + - "</tbody" + - "</table>"; - - //body.innerHTML = "<pre>" + parse_result + "</pre>" -} - - diff --git a/tests/test_tools/selenium/core/scripts/narcissus-defs.js b/tests/test_tools/selenium/core/scripts/narcissus-defs.js deleted file mode 100644 index 5869397d..00000000 --- a/tests/test_tools/selenium/core/scripts/narcissus-defs.js +++ /dev/null @@ -1,175 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (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.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is the Narcissus JavaScript engine. - * - * The Initial Developer of the Original Code is - * Brendan Eich <brendan@mozilla.org>. - * Portions created by the Initial Developer are Copyright (C) 2004 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -/* - * Narcissus - JS implemented in JS. - * - * Well-known constants and lookup tables. Many consts are generated from the - * tokens table via eval to minimize redundancy, so consumers must be compiled - * separately to take advantage of the simple switch-case constant propagation - * done by SpiderMonkey. - */ - -// jrh -//module('JS.Defs'); - -GLOBAL = this; - -var tokens = [ - // End of source. - "END", - - // Operators and punctuators. Some pair-wise order matters, e.g. (+, -) - // and (UNARY_PLUS, UNARY_MINUS). - "\n", ";", - ",", - "=", - "?", ":", "CONDITIONAL", - "||", - "&&", - "|", - "^", - "&", - "==", "!=", "===", "!==", - "<", "<=", ">=", ">", - "<<", ">>", ">>>", - "+", "-", - "*", "/", "%", - "!", "~", "UNARY_PLUS", "UNARY_MINUS", - "++", "--", - ".", - "[", "]", - "{", "}", - "(", ")", - - // Nonterminal tree node type codes. - "SCRIPT", "BLOCK", "LABEL", "FOR_IN", "CALL", "NEW_WITH_ARGS", "INDEX", - "ARRAY_INIT", "OBJECT_INIT", "PROPERTY_INIT", "GETTER", "SETTER", - "GROUP", "LIST", - - // Terminals. - "IDENTIFIER", "NUMBER", "STRING", "REGEXP", - - // Keywords. - "break", - "case", "catch", "const", "continue", - "debugger", "default", "delete", "do", - "else", "enum", - "false", "finally", "for", "function", - "if", "in", "instanceof", - "new", "null", - "return", - "switch", - "this", "throw", "true", "try", "typeof", - "var", "void", - "while", "with", - // Extensions - "require", "bless", "mixin", "import" -]; - -// Operator and punctuator mapping from token to tree node type name. -// NB: superstring tokens (e.g., ++) must come before their substring token -// counterparts (+ in the example), so that the opRegExp regular expression -// synthesized from this list makes the longest possible match. -var opTypeNames = { - '\n': "NEWLINE", - ';': "SEMICOLON", - ',': "COMMA", - '?': "HOOK", - ':': "COLON", - '||': "OR", - '&&': "AND", - '|': "BITWISE_OR", - '^': "BITWISE_XOR", - '&': "BITWISE_AND", - '===': "STRICT_EQ", - '==': "EQ", - '=': "ASSIGN", - '!==': "STRICT_NE", - '!=': "NE", - '<<': "LSH", - '<=': "LE", - '<': "LT", - '>>>': "URSH", - '>>': "RSH", - '>=': "GE", - '>': "GT", - '++': "INCREMENT", - '--': "DECREMENT", - '+': "PLUS", - '-': "MINUS", - '*': "MUL", - '/': "DIV", - '%': "MOD", - '!': "NOT", - '~': "BITWISE_NOT", - '.': "DOT", - '[': "LEFT_BRACKET", - ']': "RIGHT_BRACKET", - '{': "LEFT_CURLY", - '}': "RIGHT_CURLY", - '(': "LEFT_PAREN", - ')': "RIGHT_PAREN" -}; - -// Hash of keyword identifier to tokens index. NB: we must null __proto__ to -// avoid toString, etc. namespace pollution. -var keywords = {__proto__: null}; - -// Define const END, etc., based on the token names. Also map name to index. -var consts = " "; -for (var i = 0, j = tokens.length; i < j; i++) { - if (i > 0) - consts += "; "; - var t = tokens[i]; - if (/^[a-z]/.test(t)) { - consts += t.toUpperCase(); - keywords[t] = i; - } else { - consts += (/^\W/.test(t) ? opTypeNames[t] : t); - } - consts += " = " + i; - tokens[t] = i; -} -eval(consts + ";"); - -// Map assignment operators to their indexes in the tokens array. -var assignOps = ['|', '^', '&', '<<', '>>', '>>>', '+', '-', '*', '/', '%']; - -for (i = 0, j = assignOps.length; i < j; i++) { - t = assignOps[i]; - assignOps[t] = tokens[t]; -} diff --git a/tests/test_tools/selenium/core/scripts/narcissus-exec.js b/tests/test_tools/selenium/core/scripts/narcissus-exec.js deleted file mode 100644 index e2c88f81..00000000 --- a/tests/test_tools/selenium/core/scripts/narcissus-exec.js +++ /dev/null @@ -1,1054 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * vim: set ts=4 sw=4 et tw=80: - * - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (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.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is the Narcissus JavaScript engine. - * - * The Initial Developer of the Original Code is - * Brendan Eich <brendan@mozilla.org>. - * Portions created by the Initial Developer are Copyright (C) 2004 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -/* - * Narcissus - JS implemented in JS. - * - * Execution of parse trees. - * - * Standard classes except for eval, Function, Array, and String are borrowed - * from the host JS environment. Function is metacircular. Array and String - * are reflected via wrapping the corresponding native constructor and adding - * an extra level of prototype-based delegation. - */ - -// jrh -//module('JS.Exec'); -// end jrh - -GLOBAL_CODE = 0; EVAL_CODE = 1; FUNCTION_CODE = 2; - -function ExecutionContext(type) { - this.type = type; -} - -// jrh -var agenda = new Array(); -var skip_setup = 0; -// end jrh - -var global = { - // Value properties. - NaN: NaN, Infinity: Infinity, undefined: undefined, - alert : function(msg) { alert(msg) }, - confirm : function(msg) { return confirm(msg) }, - document : document, - window : window, - // jrh - //debug: window.open('','debugwindow','width=600,height=400,scrollbars=yes,resizable=yes'), - // end jrh - navigator : navigator, - XMLHttpRequest : function() { return new XMLHttpRequest() }, - // Function properties. - eval: function(s) { - if (typeof s != "string") { - return s; - } - - var x = ExecutionContext.current; - var x2 = new ExecutionContext(EVAL_CODE); - x2.thisObject = x.thisObject; - x2.caller = x.caller; - x2.callee = x.callee; - x2.scope = x.scope; - ExecutionContext.current = x2; - try { - execute(parse(s), x2); - } catch (e) { - x.result = x2.result; - throw e; - } finally { - ExecutionContext.current = x; - } - return x2.result; - }, - parseInt: parseInt, parseFloat: parseFloat, - isNaN: isNaN, isFinite: isFinite, - decodeURI: decodeURI, encodeURI: encodeURI, - decodeURIComponent: decodeURIComponent, - encodeURIComponent: encodeURIComponent, - - // Class constructors. Where ECMA-262 requires C.length == 1, we declare - // a dummy formal parameter. - Object: Object, - Function: function(dummy) { - var p = "", b = "", n = arguments.length; - if (n) { - var m = n - 1; - if (m) { - p += arguments[0]; - for (var k = 1; k < m; k++) - p += "," + arguments[k]; - } - b += arguments[m]; - } - - // XXX We want to pass a good file and line to the tokenizer. - // Note the anonymous name to maintain parity with Spidermonkey. - var t = new Tokenizer("anonymous(" + p + ") {" + b + "}"); - - // NB: Use the STATEMENT_FORM constant since we don't want to push this - // function onto the null compilation context. - var f = FunctionDefinition(t, null, false, STATEMENT_FORM); - var s = {object: global, parent: null}; - return new FunctionObject(f, s); - }, - Array: function(dummy) { - // Array when called as a function acts as a constructor. - return GLOBAL.Array.apply(this, arguments); - }, - String: function(s) { - // Called as function or constructor: convert argument to string type. - s = arguments.length ? "" + s : ""; - if (this instanceof String) { - // Called as constructor: save the argument as the string value - // of this String object and return this object. - this.value = s; - return this; - } - return s; - }, - Boolean: Boolean, Number: Number, Date: Date, RegExp: RegExp, - Error: Error, EvalError: EvalError, RangeError: RangeError, - ReferenceError: ReferenceError, SyntaxError: SyntaxError, - TypeError: TypeError, URIError: URIError, - - // Other properties. - Math: Math, - - // Extensions to ECMA. - //snarf: snarf, - evaluate: evaluate, - load: function(s) { - if (typeof s != "string") - return s; - var req = new XMLHttpRequest(); - req.open('GET', s, false); - req.send(null); - - evaluate(req.responseText, s, 1) - }, - print: print, version: null -}; - -// jrh -//global.debug.document.body.innerHTML = '' -// end jrh - -// Helper to avoid Object.prototype.hasOwnProperty polluting scope objects. -function hasDirectProperty(o, p) { - return Object.prototype.hasOwnProperty.call(o, p); -} - -// Reflect a host class into the target global environment by delegation. -function reflectClass(name, proto) { - var gctor = global[name]; - gctor.prototype = proto; - proto.constructor = gctor; - return proto; -} - -// Reflect Array -- note that all Array methods are generic. -reflectClass('Array', new Array); - -// Reflect String, overriding non-generic methods. -var gSp = reflectClass('String', new String); -gSp.toSource = function () { return this.value.toSource(); }; -gSp.toString = function () { return this.value; }; -gSp.valueOf = function () { return this.value; }; -global.String.fromCharCode = String.fromCharCode; - -var XCp = ExecutionContext.prototype; -ExecutionContext.current = XCp.caller = XCp.callee = null; -XCp.scope = {object: global, parent: null}; -XCp.thisObject = global; -XCp.result = undefined; -XCp.target = null; -XCp.ecmaStrictMode = false; - -function Reference(base, propertyName, node) { - this.base = base; - this.propertyName = propertyName; - this.node = node; -} - -Reference.prototype.toString = function () { return this.node.getSource(); } - -function getValue(v) { - if (v instanceof Reference) { - if (!v.base) { - throw new ReferenceError(v.propertyName + " is not defined", - v.node.filename(), v.node.lineno); - } - return v.base[v.propertyName]; - } - return v; -} - -function putValue(v, w, vn) { - if (v instanceof Reference) - return (v.base || global)[v.propertyName] = w; - throw new ReferenceError("Invalid assignment left-hand side", - vn.filename(), vn.lineno); -} - -function isPrimitive(v) { - var t = typeof v; - return (t == "object") ? v === null : t != "function"; -} - -function isObject(v) { - var t = typeof v; - return (t == "object") ? v !== null : t == "function"; -} - -// If r instanceof Reference, v == getValue(r); else v === r. If passed, rn -// is the node whose execute result was r. -function toObject(v, r, rn) { - switch (typeof v) { - case "boolean": - return new global.Boolean(v); - case "number": - return new global.Number(v); - case "string": - return new global.String(v); - case "function": - return v; - case "object": - if (v !== null) - return v; - } - var message = r + " (type " + (typeof v) + ") has no properties"; - throw rn ? new TypeError(message, rn.filename(), rn.lineno) - : new TypeError(message); -} - -function execute(n, x) { - if (!this.new_block) - new_block = new Array(); - //alert (n) - var a, f, i, j, r, s, t, u, v; - switch (n.type) { - case FUNCTION: - if (n.functionForm != DECLARED_FORM) { - if (!n.name || n.functionForm == STATEMENT_FORM) { - v = new FunctionObject(n, x.scope); - if (n.functionForm == STATEMENT_FORM) - x.scope.object[n.name] = v; - } else { - t = new Object; - x.scope = {object: t, parent: x.scope}; - try { - v = new FunctionObject(n, x.scope); - t[n.name] = v; - } finally { - x.scope = x.scope.parent; - } - } - } - break; - - case SCRIPT: - t = x.scope.object; - a = n.funDecls; - for (i = 0, j = a.length; i < j; i++) { - s = a[i].name; - f = new FunctionObject(a[i], x.scope); - t[s] = f; - } - a = n.varDecls; - for (i = 0, j = a.length; i < j; i++) { - u = a[i]; - s = u.name; - if (u.readOnly && hasDirectProperty(t, s)) { - throw new TypeError("Redeclaration of const " + s, - u.filename(), u.lineno); - } - if (u.readOnly || !hasDirectProperty(t, s)) { - t[s] = null; - } - } - // FALL THROUGH - - case BLOCK: - for (i = 0, j = n.$length; i < j; i++) { - //jrh - //execute(n[i], x); - //new_block.unshift([n[i], x]); - new_block.push([n[i], x]); - } - new_block.reverse(); - agenda = agenda.concat(new_block); - //agenda = new_block.concat(agenda) - // end jrh - break; - - case IF: - if (getValue(execute(n.condition, x))) - execute(n.thenPart, x); - else if (n.elsePart) - execute(n.elsePart, x); - break; - - case SWITCH: - s = getValue(execute(n.discriminant, x)); - a = n.cases; - var matchDefault = false; - switch_loop: - for (i = 0, j = a.length; ; i++) { - if (i == j) { - if (n.defaultIndex >= 0) { - i = n.defaultIndex - 1; // no case matched, do default - matchDefault = true; - continue; - } - break; // no default, exit switch_loop - } - t = a[i]; // next case (might be default!) - if (t.type == CASE) { - u = getValue(execute(t.caseLabel, x)); - } else { - if (!matchDefault) // not defaulting, skip for now - continue; - u = s; // force match to do default - } - if (u === s) { - for (;;) { // this loop exits switch_loop - if (t.statements.length) { - try { - execute(t.statements, x); - } catch (e) { - if (!(e == BREAK && x.target == n)) { throw e } - break switch_loop; - } - } - if (++i == j) - break switch_loop; - t = a[i]; - } - // NOT REACHED - } - } - break; - - case FOR: - // jrh - // added "skip_setup" so initialization doesn't get called - // on every call.. - if (!skip_setup) - n.setup && getValue(execute(n.setup, x)); - // FALL THROUGH - case WHILE: - // jrh - //while (!n.condition || getValue(execute(n.condition, x))) { - if (!n.condition || getValue(execute(n.condition, x))) { - try { - // jrh - //execute(n.body, x); - new_block.push([n.body, x]); - agenda.push([n.body, x]) - //agenda.unshift([n.body, x]) - // end jrh - } catch (e) { - if (e == BREAK && x.target == n) { - break; - } else if (e == CONTINUE && x.target == n) { - // jrh - // 'continue' is invalid inside an 'if' clause - // I don't know what commenting this out will break! - //continue; - // end jrh - - } else { - throw e; - } - } - n.update && getValue(execute(n.update, x)); - // jrh - new_block.unshift([n, x]) - agenda.splice(agenda.length-1,0,[n, x]) - //agenda.splice(1,0,[n, x]) - skip_setup = 1 - // end jrh - } else { - skip_setup = 0 - } - - break; - - case FOR_IN: - u = n.varDecl; - if (u) - execute(u, x); - r = n.iterator; - s = execute(n.object, x); - v = getValue(s); - - // ECMA deviation to track extant browser JS implementation behavior. - t = (v == null && !x.ecmaStrictMode) ? v : toObject(v, s, n.object); - a = []; - for (i in t) - a.push(i); - for (i = 0, j = a.length; i < j; i++) { - putValue(execute(r, x), a[i], r); - try { - execute(n.body, x); - } catch (e) { - if (e == BREAK && x.target == n) { - break; - } else if (e == CONTINUE && x.target == n) { - continue; - } else { - throw e; - } - } - } - break; - - case DO: - do { - try { - execute(n.body, x); - } catch (e) { - if (e == BREAK && x.target == n) { - break; - } else if (e == CONTINUE && x.target == n) { - continue; - } else { - throw e; - } - } - } while (getValue(execute(n.condition, x))); - break; - - case BREAK: - case CONTINUE: - x.target = n.target; - throw n.type; - - case TRY: - try { - execute(n.tryBlock, x); - } catch (e) { - if (!(e == THROW && (j = n.catchClauses.length))) { - throw e; - } - e = x.result; - x.result = undefined; - for (i = 0; ; i++) { - if (i == j) { - x.result = e; - throw THROW; - } - t = n.catchClauses[i]; - x.scope = {object: {}, parent: x.scope}; - x.scope.object[t.varName] = e; - try { - if (t.guard && !getValue(execute(t.guard, x))) - continue; - execute(t.block, x); - break; - } finally { - x.scope = x.scope.parent; - } - } - } finally { - if (n.finallyBlock) - execute(n.finallyBlock, x); - } - break; - - case THROW: - x.result = getValue(execute(n.exception, x)); - throw THROW; - - case RETURN: - x.result = getValue(execute(n.value, x)); - throw RETURN; - - case WITH: - r = execute(n.object, x); - t = toObject(getValue(r), r, n.object); - x.scope = {object: t, parent: x.scope}; - try { - execute(n.body, x); - } finally { - x.scope = x.scope.parent; - } - break; - - case VAR: - case CONST: - for (i = 0, j = n.$length; i < j; i++) { - u = n[i].initializer; - if (!u) - continue; - t = n[i].name; - for (s = x.scope; s; s = s.parent) { - if (hasDirectProperty(s.object, t)) - break; - } - u = getValue(execute(u, x)); - if (n.type == CONST) - s.object[t] = u; - else - s.object[t] = u; - } - break; - - case DEBUGGER: - throw "NYI: " + tokens[n.type]; - - case REQUIRE: - var req = new XMLHttpRequest(); - req.open('GET', n.filename, 'false'); - - case SEMICOLON: - if (n.expression) - // print debugging statements - - var the_start = n.start - var the_end = n.end - var the_statement = parse_result.tokenizer.source.slice(the_start,the_end) - //global.debug.document.body.innerHTML += ('<pre>>>> <b>' + the_statement + '</b></pre>') - LOG.info('>>>' + the_statement) - x.result = getValue(execute(n.expression, x)); - //if (x.result) - //global.debug.document.body.innerHTML += ( '<pre>>>> ' + x.result + '</pre>') - - break; - - case LABEL: - try { - execute(n.statement, x); - } catch (e) { - if (!(e == BREAK && x.target == n)) { throw e } - } - break; - - case COMMA: - for (i = 0, j = n.$length; i < j; i++) - v = getValue(execute(n[i], x)); - break; - - case ASSIGN: - r = execute(n[0], x); - t = n[0].assignOp; - if (t) - u = getValue(r); - v = getValue(execute(n[1], x)); - if (t) { - switch (t) { - case BITWISE_OR: v = u | v; break; - case BITWISE_XOR: v = u ^ v; break; - case BITWISE_AND: v = u & v; break; - case LSH: v = u << v; break; - case RSH: v = u >> v; break; - case URSH: v = u >>> v; break; - case PLUS: v = u + v; break; - case MINUS: v = u - v; break; - case MUL: v = u * v; break; - case DIV: v = u / v; break; - case MOD: v = u % v; break; - } - } - putValue(r, v, n[0]); - break; - - case CONDITIONAL: - v = getValue(execute(n[0], x)) ? getValue(execute(n[1], x)) - : getValue(execute(n[2], x)); - break; - - case OR: - v = getValue(execute(n[0], x)) || getValue(execute(n[1], x)); - break; - - case AND: - v = getValue(execute(n[0], x)) && getValue(execute(n[1], x)); - break; - - case BITWISE_OR: - v = getValue(execute(n[0], x)) | getValue(execute(n[1], x)); - break; - - case BITWISE_XOR: - v = getValue(execute(n[0], x)) ^ getValue(execute(n[1], x)); - break; - - case BITWISE_AND: - v = getValue(execute(n[0], x)) & getValue(execute(n[1], x)); - break; - - case EQ: - v = getValue(execute(n[0], x)) == getValue(execute(n[1], x)); - break; - - case NE: - v = getValue(execute(n[0], x)) != getValue(execute(n[1], x)); - break; - - case STRICT_EQ: - v = getValue(execute(n[0], x)) === getValue(execute(n[1], x)); - break; - - case STRICT_NE: - v = getValue(execute(n[0], x)) !== getValue(execute(n[1], x)); - break; - - case LT: - v = getValue(execute(n[0], x)) < getValue(execute(n[1], x)); - break; - - case LE: - v = getValue(execute(n[0], x)) <= getValue(execute(n[1], x)); - break; - - case GE: - v = getValue(execute(n[0], x)) >= getValue(execute(n[1], x)); - break; - - case GT: - v = getValue(execute(n[0], x)) > getValue(execute(n[1], x)); - break; - - case IN: - v = getValue(execute(n[0], x)) in getValue(execute(n[1], x)); - break; - - case INSTANCEOF: - t = getValue(execute(n[0], x)); - u = getValue(execute(n[1], x)); - if (isObject(u) && typeof u.__hasInstance__ == "function") - v = u.__hasInstance__(t); - else - v = t instanceof u; - break; - - case LSH: - v = getValue(execute(n[0], x)) << getValue(execute(n[1], x)); - break; - - case RSH: - v = getValue(execute(n[0], x)) >> getValue(execute(n[1], x)); - break; - - case URSH: - v = getValue(execute(n[0], x)) >>> getValue(execute(n[1], x)); - break; - - case PLUS: - v = getValue(execute(n[0], x)) + getValue(execute(n[1], x)); - break; - - case MINUS: - v = getValue(execute(n[0], x)) - getValue(execute(n[1], x)); - break; - - case MUL: - v = getValue(execute(n[0], x)) * getValue(execute(n[1], x)); - break; - - case DIV: - v = getValue(execute(n[0], x)) / getValue(execute(n[1], x)); - break; - - case MOD: - v = getValue(execute(n[0], x)) % getValue(execute(n[1], x)); - break; - - case DELETE: - t = execute(n[0], x); - v = !(t instanceof Reference) || delete t.base[t.propertyName]; - break; - - case VOID: - getValue(execute(n[0], x)); - break; - - case TYPEOF: - t = execute(n[0], x); - if (t instanceof Reference) - t = t.base ? t.base[t.propertyName] : undefined; - v = typeof t; - break; - - case NOT: - v = !getValue(execute(n[0], x)); - break; - - case BITWISE_NOT: - v = ~getValue(execute(n[0], x)); - break; - - case UNARY_PLUS: - v = +getValue(execute(n[0], x)); - break; - - case UNARY_MINUS: - v = -getValue(execute(n[0], x)); - break; - - case INCREMENT: - case DECREMENT: - t = execute(n[0], x); - u = Number(getValue(t)); - if (n.postfix) - v = u; - putValue(t, (n.type == INCREMENT) ? ++u : --u, n[0]); - if (!n.postfix) - v = u; - break; - - case DOT: - r = execute(n[0], x); - t = getValue(r); - u = n[1].value; - v = new Reference(toObject(t, r, n[0]), u, n); - break; - - case INDEX: - r = execute(n[0], x); - t = getValue(r); - u = getValue(execute(n[1], x)); - v = new Reference(toObject(t, r, n[0]), String(u), n); - break; - - case LIST: - // Curse ECMA for specifying that arguments is not an Array object! - v = {}; - for (i = 0, j = n.$length; i < j; i++) { - u = getValue(execute(n[i], x)); - v[i] = u; - } - v.length = i; - break; - - case CALL: - r = execute(n[0], x); - a = execute(n[1], x); - f = getValue(r); - if (isPrimitive(f) || typeof f.__call__ != "function") { - throw new TypeError(r + " is not callable", - n[0].filename(), n[0].lineno); - } - t = (r instanceof Reference) ? r.base : null; - if (t instanceof Activation) - t = null; - v = f.__call__(t, a, x); - break; - - case NEW: - case NEW_WITH_ARGS: - r = execute(n[0], x); - f = getValue(r); - if (n.type == NEW) { - a = {}; - a.length = 0; - } else { - a = execute(n[1], x); - } - if (isPrimitive(f) || typeof f.__construct__ != "function") { - throw new TypeError(r + " is not a constructor", - n[0].filename(), n[0].lineno); - } - v = f.__construct__(a, x); - break; - - case ARRAY_INIT: - v = []; - for (i = 0, j = n.$length; i < j; i++) { - if (n[i]) - v[i] = getValue(execute(n[i], x)); - } - v.length = j; - break; - - case OBJECT_INIT: - v = {}; - for (i = 0, j = n.$length; i < j; i++) { - t = n[i]; - if (t.type == PROPERTY_INIT) { - v[t[0].value] = getValue(execute(t[1], x)); - } else { - f = new FunctionObject(t, x.scope); - /* - u = (t.type == GETTER) ? '__defineGetter__' - : '__defineSetter__'; - v[u](t.name, thunk(f, x)); - */ - } - } - break; - - case NULL: - v = null; - break; - - case THIS: - v = x.thisObject; - break; - - case TRUE: - v = true; - break; - - case FALSE: - v = false; - break; - - case IDENTIFIER: - for (s = x.scope; s; s = s.parent) { - if (n.value in s.object) - break; - } - v = new Reference(s && s.object, n.value, n); - break; - - case NUMBER: - case STRING: - case REGEXP: - v = n.value; - break; - - case GROUP: - v = execute(n[0], x); - break; - - default: - throw "PANIC: unknown operation " + n.type + ": " + uneval(n); - } - return v; -} - -function Activation(f, a) { - for (var i = 0, j = f.params.length; i < j; i++) - this[f.params[i]] = a[i]; - this.arguments = a; -} - -// Null Activation.prototype's proto slot so that Object.prototype.* does not -// pollute the scope of heavyweight functions. Also delete its 'constructor' -// property so that it doesn't pollute function scopes. - -Activation.prototype.__proto__ = null; -delete Activation.prototype.constructor; - -function FunctionObject(node, scope) { - this.node = node; - this.scope = scope; - this.length = node.params.length; - var proto = {}; - this.prototype = proto; - proto.constructor = this; -} - -var FOp = FunctionObject.prototype = { - // Internal methods. - __call__: function (t, a, x) { - var x2 = new ExecutionContext(FUNCTION_CODE); - x2.thisObject = t || global; - x2.caller = x; - x2.callee = this; - a.callee = this; - var f = this.node; - x2.scope = {object: new Activation(f, a), parent: this.scope}; - - ExecutionContext.current = x2; - try { - execute(f.body, x2); - } catch (e) { - if (!(e == RETURN)) { throw e } else if (e == RETURN) { - return x2.result; - } - if (e != THROW) { throw e } - x.result = x2.result; - throw THROW; - } finally { - ExecutionContext.current = x; - } - return undefined; - }, - - __construct__: function (a, x) { - var o = new Object; - var p = this.prototype; - if (isObject(p)) - o.__proto__ = p; - // else o.__proto__ defaulted to Object.prototype - - var v = this.__call__(o, a, x); - if (isObject(v)) - return v; - return o; - }, - - __hasInstance__: function (v) { - if (isPrimitive(v)) - return false; - var p = this.prototype; - if (isPrimitive(p)) { - throw new TypeError("'prototype' property is not an object", - this.node.filename(), this.node.lineno); - } - var o; - while ((o = v.__proto__)) { - if (o == p) - return true; - v = o; - } - return false; - }, - - // Standard methods. - toString: function () { - return this.node.getSource(); - }, - - apply: function (t, a) { - // Curse ECMA again! - if (typeof this.__call__ != "function") { - throw new TypeError("Function.prototype.apply called on" + - " uncallable object"); - } - - if (t === undefined || t === null) - t = global; - else if (typeof t != "object") - t = toObject(t, t); - - if (a === undefined || a === null) { - a = {}; - a.length = 0; - } else if (a instanceof Array) { - var v = {}; - for (var i = 0, j = a.length; i < j; i++) - v[i] = a[i]; - v.length = i; - a = v; - } else if (!(a instanceof Object)) { - // XXX check for a non-arguments object - throw new TypeError("Second argument to Function.prototype.apply" + - " must be an array or arguments object", - this.node.filename(), this.node.lineno); - } - - return this.__call__(t, a, ExecutionContext.current); - }, - - call: function (t) { - // Curse ECMA a third time! - var a = Array.prototype.splice.call(arguments, 1); - return this.apply(t, a); - } -}; - -// Connect Function.prototype and Function.prototype.constructor in global. -reflectClass('Function', FOp); - -// Help native and host-scripted functions be like FunctionObjects. -var Fp = Function.prototype; -var REp = RegExp.prototype; - -if (!('__call__' in Fp)) { - Fp.__call__ = function (t, a, x) { - // Curse ECMA yet again! - a = Array.prototype.splice.call(a, 0, a.length); - return this.apply(t, a); - }; - - REp.__call__ = function (t, a, x) { - a = Array.prototype.splice.call(a, 0, a.length); - return this.exec.apply(this, a); - }; - - Fp.__construct__ = function (a, x) { - switch (a.length) { - case 0: - return new this(); - case 1: - return new this(a[0]); - case 2: - return new this(a[0], a[1]); - case 3: - return new this(a[0], a[1], a[2]); - case 4: - return new this(a[0], a[1], a[2], a[3]); - case 5: - return new this(a[0], a[1], a[2], a[3], a[4]); - case 6: - return new this(a[0], a[1], a[2], a[3], a[4], a[5]); - case 7: - return new this(a[0], a[1], a[2], a[3], a[4], a[5], a[6]); - } - throw "PANIC: too many arguments to constructor"; - } - - // Since we use native functions such as Date along with host ones such - // as global.eval, we want both to be considered instances of the native - // Function constructor. - Fp.__hasInstance__ = function (v) { - return v instanceof Function || v instanceof global.Function; - }; -} - -function thunk(f, x) { - return function () { return f.__call__(this, arguments, x); }; -} - -function evaluate(s, f, l) { - if (typeof s != "string") - return s; - - var x = ExecutionContext.current; - var x2 = new ExecutionContext(GLOBAL_CODE); - ExecutionContext.current = x2; - try { - execute(parse(s, f, l), x2); - } catch (e) { - if (e != THROW) { throw e } - if (x) { - x.result = x2.result; - throw(THROW); - } - throw x2.result; - } finally { - ExecutionContext.current = x; - } - return x2.result; -} diff --git a/tests/test_tools/selenium/core/scripts/narcissus-parse.js b/tests/test_tools/selenium/core/scripts/narcissus-parse.js deleted file mode 100644 index d6acb836..00000000 --- a/tests/test_tools/selenium/core/scripts/narcissus-parse.js +++ /dev/null @@ -1,1003 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (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.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is the Narcissus JavaScript engine. - * - * The Initial Developer of the Original Code is - * Brendan Eich <brendan@mozilla.org>. - * Portions created by the Initial Developer are Copyright (C) 2004 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): Richard Hundt <www.plextk.org> - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -/* - * Narcissus - JS implemented in JS. - * - * Lexical scanner and parser. - */ - -// jrh -//module('JS.Parse'); - -// Build a regexp that recognizes operators and punctuators (except newline). -var opRegExp = -/^;|^,|^\?|^:|^\|\||^\&\&|^\||^\^|^\&|^===|^==|^=|^!==|^!=|^<<|^<=|^<|^>>>|^>>|^>=|^>|^\+\+|^\-\-|^\+|^\-|^\*|^\/|^%|^!|^~|^\.|^\[|^\]|^\{|^\}|^\(|^\)/; - -// A regexp to match floating point literals (but not integer literals). -var fpRegExp = /^\d+\.\d*(?:[eE][-+]?\d+)?|^\d+(?:\.\d*)?[eE][-+]?\d+|^\.\d+(?:[eE][-+]?\d+)?/; - -function Tokenizer(s, f, l) { - this.cursor = 0; - this.source = String(s); - this.tokens = []; - this.tokenIndex = 0; - this.lookahead = 0; - this.scanNewlines = false; - this.scanOperand = true; - this.filename = f || ""; - this.lineno = l || 1; -} - -Tokenizer.prototype = { - input : function() { - return this.source.substring(this.cursor); - }, - - done : function() { - return this.peek() == END; - }, - - token : function() { - return this.tokens[this.tokenIndex]; - }, - - match: function (tt) { - return this.get() == tt || this.unget(); - }, - - mustMatch: function (tt) { - if (!this.match(tt)) - throw this.newSyntaxError("Missing " + this.tokens[tt].toLowerCase()); - return this.token(); - }, - - peek: function () { - var tt; - if (this.lookahead) { - tt = this.tokens[(this.tokenIndex + this.lookahead) & 3].type; - } else { - tt = this.get(); - this.unget(); - } - return tt; - }, - - peekOnSameLine: function () { - this.scanNewlines = true; - var tt = this.peek(); - this.scanNewlines = false; - return tt; - }, - - get: function () { - var token; - while (this.lookahead) { - --this.lookahead; - this.tokenIndex = (this.tokenIndex + 1) & 3; - token = this.tokens[this.tokenIndex]; - if (token.type != NEWLINE || this.scanNewlines) - return token.type; - } - - for (;;) { - var input = this.input(); - var rx = this.scanNewlines ? /^[ \t]+/ : /^\s+/; - var match = input.match(rx); - if (match) { - var spaces = match[0]; - this.cursor += spaces.length; - var newlines = spaces.match(/\n/g); - if (newlines) - this.lineno += newlines.length; - input = this.input(); - } - - if (!(match = input.match(/^\/(?:\*(?:.|\n)*?\*\/|\/.*)/))) - break; - var comment = match[0]; - this.cursor += comment.length; - newlines = comment.match(/\n/g); - if (newlines) - this.lineno += newlines.length - } - - this.tokenIndex = (this.tokenIndex + 1) & 3; - token = this.tokens[this.tokenIndex]; - if (!token) - this.tokens[this.tokenIndex] = token = {}; - if (!input) - return token.type = END; - if ((match = input.match(fpRegExp))) { - token.type = NUMBER; - token.value = parseFloat(match[0]); - } else if ((match = input.match(/^0[xX][\da-fA-F]+|^0[0-7]*|^\d+/))) { - token.type = NUMBER; - token.value = parseInt(match[0]); - } else if ((match = input.match(/^((\$\w*)|(\w+))/))) { - var id = match[0]; - token.type = keywords[id] || IDENTIFIER; - token.value = id; - } else if ((match = input.match(/^"(?:\\.|[^"])*"|^'(?:[^']|\\.)*'/))) { - token.type = STRING; - token.value = eval(match[0]); - } else if (this.scanOperand && - (match = input.match(/^\/((?:\\.|[^\/])+)\/([gi]*)/))) { - token.type = REGEXP; - token.value = new RegExp(match[1], match[2]); - } else if ((match = input.match(opRegExp))) { - var op = match[0]; - if (assignOps[op] && input[op.length] == '=') { - token.type = ASSIGN; - token.assignOp = GLOBAL[opTypeNames[op]]; - match[0] += '='; - } else { - token.type = GLOBAL[opTypeNames[op]]; - if (this.scanOperand && - (token.type == PLUS || token.type == MINUS)) { - token.type += UNARY_PLUS - PLUS; - } - token.assignOp = null; - } - //debug('token.value => '+op+', token.type => '+token.type); - token.value = op; - } else { - throw this.newSyntaxError("Illegal token"); - } - - token.start = this.cursor; - this.cursor += match[0].length; - token.end = this.cursor; - token.lineno = this.lineno; - return token.type; - }, - - unget: function () { - if (++this.lookahead == 4) throw "PANIC: too much lookahead!"; - this.tokenIndex = (this.tokenIndex - 1) & 3; - }, - - newSyntaxError: function (m) { - var e = new SyntaxError(m, this.filename, this.lineno); - e.source = this.source; - e.cursor = this.cursor; - return e; - } -}; - -function CompilerContext(inFunction) { - this.inFunction = inFunction; - this.stmtStack = []; - this.funDecls = []; - this.varDecls = []; -} - -var CCp = CompilerContext.prototype; -CCp.bracketLevel = CCp.curlyLevel = CCp.parenLevel = CCp.hookLevel = 0; -CCp.ecmaStrictMode = CCp.inForLoopInit = false; - -function Script(t, x) { - var n = Statements(t, x); - n.type = SCRIPT; - n.funDecls = x.funDecls; - n.varDecls = x.varDecls; - return n; -} - -// Node extends Array, which we extend slightly with a top-of-stack method. -Array.prototype.top = function() { - return this.length && this[this.length-1]; -} - -function NarcNode(t, type) { - var token = t.token(); - if (token) { - this.type = type || token.type; - this.value = token.value; - this.lineno = token.lineno; - this.start = token.start; - this.end = token.end; - } else { - this.type = type; - this.lineno = t.lineno; - } - this.tokenizer = t; - for (var i = 2; i < arguments.length; i++) - this.push(arguments[i]); -} - -var Np = NarcNode.prototype = new Array(); -Np.constructor = NarcNode; -Np.$length = 0; -Np.toSource = Object.prototype.toSource; - -// Always use push to add operands to an expression, to update start and end. -Np.push = function (kid) { - if (kid.start < this.start) - this.start = kid.start; - if (this.end < kid.end) - this.end = kid.end; - //debug('length before => '+this.$length); - this[this.$length] = kid; - this.$length++; - //debug('length after => '+this.$length); -} - -NarcNode.indentLevel = 0; - -function tokenstr(tt) { - var t = tokens[tt]; - return /^\W/.test(t) ? opTypeNames[t] : t.toUpperCase(); -} - -Np.toString = function () { - var a = []; - for (var i in this) { - if (this.hasOwnProperty(i) && i != 'type') - a.push({id: i, value: this[i]}); - } - a.sort(function (a,b) { return (a.id < b.id) ? -1 : 1; }); - INDENTATION = " "; - var n = ++NarcNode.indentLevel; - var s = "{\n" + INDENTATION.repeat(n) + "type: " + tokenstr(this.type); - for (i = 0; i < a.length; i++) - s += ",\n" + INDENTATION.repeat(n) + a[i].id + ": " + a[i].value; - n = --NarcNode.indentLevel; - s += "\n" + INDENTATION.repeat(n) + "}"; - return s; -} - -Np.getSource = function () { - return this.tokenizer.source.slice(this.start, this.end); -}; - -Np.filename = function () { return this.tokenizer.filename; }; - -String.prototype.repeat = function (n) { - var s = "", t = this + s; - while (--n >= 0) - s += t; - return s; -} - -// Statement stack and nested statement handler. -function nest(t, x, node, func, end) { - x.stmtStack.push(node); - var n = func(t, x); - x.stmtStack.pop(); - end && t.mustMatch(end); - return n; -} - -function Statements(t, x) { - var n = new NarcNode(t, BLOCK); - x.stmtStack.push(n); - while (!t.done() && t.peek() != RIGHT_CURLY) - n.push(Statement(t, x)); - x.stmtStack.pop(); - return n; -} - -function Block(t, x) { - t.mustMatch(LEFT_CURLY); - var n = Statements(t, x); - t.mustMatch(RIGHT_CURLY); - return n; -} - -DECLARED_FORM = 0; EXPRESSED_FORM = 1; STATEMENT_FORM = 2; - -function Statement(t, x) { - var i, label, n, n2, ss, tt = t.get(); - - // Cases for statements ending in a right curly return early, avoiding the - // common semicolon insertion magic after this switch. - switch (tt) { - case FUNCTION: - return FunctionDefinition(t, x, true, - (x.stmtStack.length > 1) - ? STATEMENT_FORM - : DECLARED_FORM); - - case LEFT_CURLY: - n = Statements(t, x); - t.mustMatch(RIGHT_CURLY); - return n; - - case IF: - n = new NarcNode(t); - n.condition = ParenExpression(t, x); - x.stmtStack.push(n); - n.thenPart = Statement(t, x); - n.elsePart = t.match(ELSE) ? Statement(t, x) : null; - x.stmtStack.pop(); - return n; - - case SWITCH: - n = new NarcNode(t); - t.mustMatch(LEFT_PAREN); - n.discriminant = Expression(t, x); - t.mustMatch(RIGHT_PAREN); - n.cases = []; - n.defaultIndex = -1; - x.stmtStack.push(n); - t.mustMatch(LEFT_CURLY); - while ((tt = t.get()) != RIGHT_CURLY) { - switch (tt) { - case DEFAULT: - if (n.defaultIndex >= 0) - throw t.newSyntaxError("More than one switch default"); - // FALL THROUGH - case CASE: - n2 = new NarcNode(t); - if (tt == DEFAULT) - n.defaultIndex = n.cases.length; - else - n2.caseLabel = Expression(t, x, COLON); - break; - default: - throw t.newSyntaxError("Invalid switch case"); - } - t.mustMatch(COLON); - n2.statements = new NarcNode(t, BLOCK); - while ((tt=t.peek()) != CASE && tt != DEFAULT && tt != RIGHT_CURLY) - n2.statements.push(Statement(t, x)); - n.cases.push(n2); - } - x.stmtStack.pop(); - return n; - - case FOR: - n = new NarcNode(t); - n.isLoop = true; - t.mustMatch(LEFT_PAREN); - if ((tt = t.peek()) != SEMICOLON) { - x.inForLoopInit = true; - if (tt == VAR || tt == CONST) { - t.get(); - n2 = Variables(t, x); - } else { - n2 = Expression(t, x); - } - x.inForLoopInit = false; - } - if (n2 && t.match(IN)) { - n.type = FOR_IN; - if (n2.type == VAR) { - if (n2.$length != 1) { - throw new SyntaxError("Invalid for..in left-hand side", - t.filename, n2.lineno); - } - - // NB: n2[0].type == IDENTIFIER and n2[0].value == n2[0].name. - n.iterator = n2[0]; - n.varDecl = n2; - } else { - n.iterator = n2; - n.varDecl = null; - } - n.object = Expression(t, x); - } else { - n.setup = n2 || null; - t.mustMatch(SEMICOLON); - n.condition = (t.peek() == SEMICOLON) ? null : Expression(t, x); - t.mustMatch(SEMICOLON); - n.update = (t.peek() == RIGHT_PAREN) ? null : Expression(t, x); - } - t.mustMatch(RIGHT_PAREN); - n.body = nest(t, x, n, Statement); - return n; - - case WHILE: - n = new NarcNode(t); - n.isLoop = true; - n.condition = ParenExpression(t, x); - n.body = nest(t, x, n, Statement); - return n; - - case DO: - n = new NarcNode(t); - n.isLoop = true; - n.body = nest(t, x, n, Statement, WHILE); - n.condition = ParenExpression(t, x); - if (!x.ecmaStrictMode) { - // <script language="JavaScript"> (without version hints) may need - // automatic semicolon insertion without a newline after do-while. - // See http://bugzilla.mozilla.org/show_bug.cgi?id=238945. - t.match(SEMICOLON); - return n; - } - break; - - case BREAK: - case CONTINUE: - n = new NarcNode(t); - if (t.peekOnSameLine() == IDENTIFIER) { - t.get(); - n.label = t.token().value; - } - ss = x.stmtStack; - i = ss.length; - label = n.label; - if (label) { - do { - if (--i < 0) - throw t.newSyntaxError("Label not found"); - } while (ss[i].label != label); - } else { - do { - if (--i < 0) { - throw t.newSyntaxError("Invalid " + ((tt == BREAK) - ? "break" - : "continue")); - } - } while (!ss[i].isLoop && (tt != BREAK || ss[i].type != SWITCH)); - } - n.target = ss[i]; - break; - - case TRY: - n = new NarcNode(t); - n.tryBlock = Block(t, x); - n.catchClauses = []; - while (t.match(CATCH)) { - n2 = new NarcNode(t); - t.mustMatch(LEFT_PAREN); - n2.varName = t.mustMatch(IDENTIFIER).value; - if (t.match(IF)) { - if (x.ecmaStrictMode) - throw t.newSyntaxError("Illegal catch guard"); - if (n.catchClauses.length && !n.catchClauses.top().guard) - throw t.newSyntaxError("Guarded catch after unguarded"); - n2.guard = Expression(t, x); - } else { - n2.guard = null; - } - t.mustMatch(RIGHT_PAREN); - n2.block = Block(t, x); - n.catchClauses.push(n2); - } - if (t.match(FINALLY)) - n.finallyBlock = Block(t, x); - if (!n.catchClauses.length && !n.finallyBlock) - throw t.newSyntaxError("Invalid try statement"); - return n; - - case CATCH: - case FINALLY: - throw t.newSyntaxError(tokens[tt] + " without preceding try"); - - case THROW: - n = new NarcNode(t); - n.exception = Expression(t, x); - break; - - case RETURN: - if (!x.inFunction) - throw t.newSyntaxError("Invalid return"); - n = new NarcNode(t); - tt = t.peekOnSameLine(); - if (tt != END && tt != NEWLINE && tt != SEMICOLON && tt != RIGHT_CURLY) - n.value = Expression(t, x); - break; - - case WITH: - n = new NarcNode(t); - n.object = ParenExpression(t, x); - n.body = nest(t, x, n, Statement); - return n; - - case VAR: - case CONST: - n = Variables(t, x); - break; - - case DEBUGGER: - n = new NarcNode(t); - break; - - case REQUIRE: - n = new NarcNode(t); - n.classPath = ParenExpression(t, x); - break; - - case NEWLINE: - case SEMICOLON: - n = new NarcNode(t, SEMICOLON); - n.expression = null; - return n; - - default: - if (tt == IDENTIFIER && t.peek() == COLON) { - label = t.token().value; - ss = x.stmtStack; - for (i = ss.length-1; i >= 0; --i) { - if (ss[i].label == label) - throw t.newSyntaxError("Duplicate label"); - } - t.get(); - n = new NarcNode(t, LABEL); - n.label = label; - n.statement = nest(t, x, n, Statement); - return n; - } - - n = new NarcNode(t, SEMICOLON); - t.unget(); - n.expression = Expression(t, x); - n.end = n.expression.end; - break; - } - - if (t.lineno == t.token().lineno) { - tt = t.peekOnSameLine(); - if (tt != END && tt != NEWLINE && tt != SEMICOLON && tt != RIGHT_CURLY) - throw t.newSyntaxError("Missing ; before statement"); - } - t.match(SEMICOLON); - return n; -} - -function FunctionDefinition(t, x, requireName, functionForm) { - var f = new NarcNode(t); - if (f.type != FUNCTION) - f.type = (f.value == "get") ? GETTER : SETTER; - if (t.match(IDENTIFIER)) { - f.name = t.token().value; - } - else if (requireName) - throw t.newSyntaxError("Missing function identifier"); - - t.mustMatch(LEFT_PAREN); - f.params = []; - var tt; - while ((tt = t.get()) != RIGHT_PAREN) { - if (tt != IDENTIFIER) - throw t.newSyntaxError("Missing formal parameter"); - f.params.push(t.token().value); - if (t.peek() != RIGHT_PAREN) - t.mustMatch(COMMA); - } - - t.mustMatch(LEFT_CURLY); - var x2 = new CompilerContext(true); - f.body = Script(t, x2); - t.mustMatch(RIGHT_CURLY); - f.end = t.token().end; - - f.functionForm = functionForm; - if (functionForm == DECLARED_FORM) { - x.funDecls.push(f); - } - - return f; -} - -function Variables(t, x) { - var n = new NarcNode(t); - do { - t.mustMatch(IDENTIFIER); - var n2 = new NarcNode(t); - n2.name = n2.value; - if (t.match(ASSIGN)) { - if (t.token().assignOp) - throw t.newSyntaxError("Invalid variable initialization"); - n2.initializer = Expression(t, x, COMMA); - } - n2.readOnly = (n.type == CONST); - n.push(n2); - x.varDecls.push(n2); - } while (t.match(COMMA)); - return n; -} - -function ParenExpression(t, x) { - t.mustMatch(LEFT_PAREN); - var n = Expression(t, x); - t.mustMatch(RIGHT_PAREN); - return n; -} - -var opPrecedence = { - SEMICOLON: 0, - COMMA: 1, - ASSIGN: 2, HOOK: 2, COLON: 2, CONDITIONAL: 2, - // The above all have to have the same precedence, see bug 330975. - OR: 4, - AND: 5, - BITWISE_OR: 6, - BITWISE_XOR: 7, - BITWISE_AND: 8, - EQ: 9, NE: 9, STRICT_EQ: 9, STRICT_NE: 9, - LT: 10, LE: 10, GE: 10, GT: 10, IN: 10, INSTANCEOF: 10, - LSH: 11, RSH: 11, URSH: 11, - PLUS: 12, MINUS: 12, - MUL: 13, DIV: 13, MOD: 13, - DELETE: 14, VOID: 14, TYPEOF: 14, // PRE_INCREMENT: 14, PRE_DECREMENT: 14, - NOT: 14, BITWISE_NOT: 14, UNARY_PLUS: 14, UNARY_MINUS: 14, - INCREMENT: 15, DECREMENT: 15, // postfix - NEW: 16, - DOT: 17 -}; - -// Map operator type code to precedence. -for (i in opPrecedence) - opPrecedence[GLOBAL[i]] = opPrecedence[i]; - -var opArity = { - COMMA: -2, - ASSIGN: 2, - CONDITIONAL: 3, - OR: 2, - AND: 2, - BITWISE_OR: 2, - BITWISE_XOR: 2, - BITWISE_AND: 2, - EQ: 2, NE: 2, STRICT_EQ: 2, STRICT_NE: 2, - LT: 2, LE: 2, GE: 2, GT: 2, IN: 2, INSTANCEOF: 2, - LSH: 2, RSH: 2, URSH: 2, - PLUS: 2, MINUS: 2, - MUL: 2, DIV: 2, MOD: 2, - DELETE: 1, VOID: 1, TYPEOF: 1, // PRE_INCREMENT: 1, PRE_DECREMENT: 1, - NOT: 1, BITWISE_NOT: 1, UNARY_PLUS: 1, UNARY_MINUS: 1, - INCREMENT: 1, DECREMENT: 1, // postfix - NEW: 1, NEW_WITH_ARGS: 2, DOT: 2, INDEX: 2, CALL: 2, - ARRAY_INIT: 1, OBJECT_INIT: 1, GROUP: 1 -}; - -// Map operator type code to arity. -for (i in opArity) - opArity[GLOBAL[i]] = opArity[i]; - -function Expression(t, x, stop) { - var n, id, tt, operators = [], operands = []; - var bl = x.bracketLevel, cl = x.curlyLevel, pl = x.parenLevel, - hl = x.hookLevel; - - function reduce() { - //debug('OPERATORS => '+operators); - var n = operators.pop(); - var op = n.type; - var arity = opArity[op]; - if (arity == -2) { - // Flatten left-associative trees. - var left = operands.length >= 2 && operands[operands.length-2]; - if (left.type == op) { - var right = operands.pop(); - left.push(right); - return left; - } - arity = 2; - } - - // Always use push to add operands to n, to update start and end. - var a = operands.splice(operands.length - arity, operands.length); - for (var i = 0; i < arity; i++) { - n.push(a[i]); - } - - // Include closing bracket or postfix operator in [start,end). - if (n.end < t.token().end) - n.end = t.token().end; - - operands.push(n); - return n; - } - -loop: - while ((tt = t.get()) != END) { - //debug('TT => '+tokens[tt]); - if (tt == stop && - x.bracketLevel == bl && x.curlyLevel == cl && x.parenLevel == pl && - x.hookLevel == hl) { - // Stop only if tt matches the optional stop parameter, and that - // token is not quoted by some kind of bracket. - break; - } - switch (tt) { - case SEMICOLON: - // NB: cannot be empty, Statement handled that. - break loop; - - case ASSIGN: - case HOOK: - case COLON: - if (t.scanOperand) - break loop; - // Use >, not >=, for right-associative ASSIGN and HOOK/COLON. - while (operators.length && opPrecedence[operators.top().type] > opPrecedence[tt] || - (tt == COLON && operators.top().type == ASSIGN)) { - reduce(); - } - if (tt == COLON) { - n = operators.top(); - if (n.type != HOOK) - throw t.newSyntaxError("Invalid label"); - n.type = CONDITIONAL; - --x.hookLevel; - } else { - operators.push(new NarcNode(t)); - if (tt == ASSIGN) - operands.top().assignOp = t.token().assignOp; - else - ++x.hookLevel; // tt == HOOK - } - t.scanOperand = true; - break; - - case IN: - // An in operator should not be parsed if we're parsing the head of - // a for (...) loop, unless it is in the then part of a conditional - // expression, or parenthesized somehow. - if (x.inForLoopInit && !x.hookLevel && - !x.bracketLevel && !x.curlyLevel && !x.parenLevel) { - break loop; - } - // FALL THROUGH - case COMMA: - // Treat comma as left-associative so reduce can fold left-heavy - // COMMA trees into a single array. - // FALL THROUGH - case OR: - case AND: - case BITWISE_OR: - case BITWISE_XOR: - case BITWISE_AND: - case EQ: case NE: case STRICT_EQ: case STRICT_NE: - case LT: case LE: case GE: case GT: - case INSTANCEOF: - case LSH: case RSH: case URSH: - case PLUS: case MINUS: - case MUL: case DIV: case MOD: - case DOT: - if (t.scanOperand) - break loop; - while (operators.length && opPrecedence[operators.top().type] >= opPrecedence[tt]) - reduce(); - if (tt == DOT) { - t.mustMatch(IDENTIFIER); - operands.push(new NarcNode(t, DOT, operands.pop(), new NarcNode(t))); - } else { - operators.push(new NarcNode(t)); - t.scanOperand = true; - } - break; - - case DELETE: case VOID: case TYPEOF: - case NOT: case BITWISE_NOT: case UNARY_PLUS: case UNARY_MINUS: - case NEW: - if (!t.scanOperand) - break loop; - operators.push(new NarcNode(t)); - break; - - case INCREMENT: case DECREMENT: - if (t.scanOperand) { - operators.push(new NarcNode(t)); // prefix increment or decrement - } else { - // Use >, not >=, so postfix has higher precedence than prefix. - while (operators.length && opPrecedence[operators.top().type] > opPrecedence[tt]) - reduce(); - n = new NarcNode(t, tt, operands.pop()); - n.postfix = true; - operands.push(n); - } - break; - - case FUNCTION: - if (!t.scanOperand) - break loop; - operands.push(FunctionDefinition(t, x, false, EXPRESSED_FORM)); - t.scanOperand = false; - break; - - case NULL: case THIS: case TRUE: case FALSE: - case IDENTIFIER: case NUMBER: case STRING: case REGEXP: - if (!t.scanOperand) - break loop; - operands.push(new NarcNode(t)); - t.scanOperand = false; - break; - - case LEFT_BRACKET: - if (t.scanOperand) { - // Array initialiser. Parse using recursive descent, as the - // sub-grammar here is not an operator grammar. - n = new NarcNode(t, ARRAY_INIT); - while ((tt = t.peek()) != RIGHT_BRACKET) { - if (tt == COMMA) { - t.get(); - n.push(null); - continue; - } - n.push(Expression(t, x, COMMA)); - if (!t.match(COMMA)) - break; - } - t.mustMatch(RIGHT_BRACKET); - operands.push(n); - t.scanOperand = false; - } else { - // Property indexing operator. - operators.push(new NarcNode(t, INDEX)); - t.scanOperand = true; - ++x.bracketLevel; - } - break; - - case RIGHT_BRACKET: - if (t.scanOperand || x.bracketLevel == bl) - break loop; - while (reduce().type != INDEX) - continue; - --x.bracketLevel; - break; - - case LEFT_CURLY: - if (!t.scanOperand) - break loop; - // Object initialiser. As for array initialisers (see above), - // parse using recursive descent. - ++x.curlyLevel; - n = new NarcNode(t, OBJECT_INIT); - object_init: - if (!t.match(RIGHT_CURLY)) { - do { - tt = t.get(); - if ((t.token().value == "get" || t.token().value == "set") && - t.peek() == IDENTIFIER) { - if (x.ecmaStrictMode) - throw t.newSyntaxError("Illegal property accessor"); - n.push(FunctionDefinition(t, x, true, EXPRESSED_FORM)); - } else { - switch (tt) { - case IDENTIFIER: - case NUMBER: - case STRING: - id = new NarcNode(t); - break; - case RIGHT_CURLY: - if (x.ecmaStrictMode) - throw t.newSyntaxError("Illegal trailing ,"); - break object_init; - default: - throw t.newSyntaxError("Invalid property name"); - } - t.mustMatch(COLON); - n.push(new NarcNode(t, PROPERTY_INIT, id, - Expression(t, x, COMMA))); - } - } while (t.match(COMMA)); - t.mustMatch(RIGHT_CURLY); - } - operands.push(n); - t.scanOperand = false; - --x.curlyLevel; - break; - - case RIGHT_CURLY: - if (!t.scanOperand && x.curlyLevel != cl) - throw "PANIC: right curly botch"; - break loop; - - case LEFT_PAREN: - if (t.scanOperand) { - operators.push(new NarcNode(t, GROUP)); - } else { - while (operators.length && opPrecedence[operators.top().type] > opPrecedence[NEW]) - reduce(); - - // Handle () now, to regularize the n-ary case for n > 0. - // We must set scanOperand in case there are arguments and - // the first one is a regexp or unary+/-. - n = operators.top(); - t.scanOperand = true; - if (t.match(RIGHT_PAREN)) { - if (n.type == NEW) { - --operators.length; - n.push(operands.pop()); - } else { - n = new NarcNode(t, CALL, operands.pop(), - new NarcNode(t, LIST)); - } - operands.push(n); - t.scanOperand = false; - break; - } - if (n.type == NEW) - n.type = NEW_WITH_ARGS; - else - operators.push(new NarcNode(t, CALL)); - } - ++x.parenLevel; - break; - - case RIGHT_PAREN: - if (t.scanOperand || x.parenLevel == pl) - break loop; - while ((tt = reduce().type) != GROUP && tt != CALL && - tt != NEW_WITH_ARGS) { - continue; - } - if (tt != GROUP) { - n = operands.top(); - if (n[1].type != COMMA) - n[1] = new NarcNode(t, LIST, n[1]); - else - n[1].type = LIST; - } - --x.parenLevel; - break; - - // Automatic semicolon insertion means we may scan across a newline - // and into the beginning of another statement. If so, break out of - // the while loop and let the t.scanOperand logic handle errors. - default: - break loop; - } - } - if (x.hookLevel != hl) - throw t.newSyntaxError("Missing : after ?"); - if (x.parenLevel != pl) - throw t.newSyntaxError("Missing ) in parenthetical"); - if (x.bracketLevel != bl) - throw t.newSyntaxError("Missing ] in index expression"); - if (t.scanOperand) - throw t.newSyntaxError("Missing operand"); - - // Resume default mode, scanning for operands, not operators. - t.scanOperand = true; - t.unget(); - - while (operators.length) - reduce(); - return operands.pop(); -} - -function parse(s, f, l) { - var t = new Tokenizer(s, f, l); - var x = new CompilerContext(false); - var n = Script(t, x); - if (!t.done()) - throw t.newSyntaxError("Syntax error"); - return n; -} - -debug = function(msg) { - document.body.appendChild(document.createTextNode(msg)); - document.body.appendChild(document.createElement('br')); -} - diff --git a/tests/test_tools/selenium/core/scripts/prototype-1.4.0.js b/tests/test_tools/selenium/core/scripts/prototype-1.4.0.js deleted file mode 100644 index 0e85338b..00000000 --- a/tests/test_tools/selenium/core/scripts/prototype-1.4.0.js +++ /dev/null @@ -1,1781 +0,0 @@ -/* Prototype JavaScript framework, version 1.4.0 - * (c) 2005 Sam Stephenson <sam@conio.net> - * - * Prototype is freely distributable under the terms of an MIT-style license. - * For details, see the Prototype web site: http://prototype.conio.net/ - * -/*--------------------------------------------------------------------------*/ - -var Prototype = { - Version: '1.4.0', - ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)', - - emptyFunction: function() {}, - K: function(x) {return x} -} - -var Class = { - create: function() { - return function() { - this.initialize.apply(this, arguments); - } - } -} - -var Abstract = new Object(); - -Object.extend = function(destination, source) { - for (property in source) { - destination[property] = source[property]; - } - return destination; -} - -Object.inspect = function(object) { - try { - if (object == undefined) return 'undefined'; - if (object == null) return 'null'; - return object.inspect ? object.inspect() : object.toString(); - } catch (e) { - if (e instanceof RangeError) return '...'; - throw e; - } -} - -Function.prototype.bind = function() { - var __method = this, args = $A(arguments), object = args.shift(); - return function() { - return __method.apply(object, args.concat($A(arguments))); - } -} - -Function.prototype.bindAsEventListener = function(object) { - var __method = this; - return function(event) { - return __method.call(object, event || window.event); - } -} - -Object.extend(Number.prototype, { - toColorPart: function() { - var digits = this.toString(16); - if (this < 16) return '0' + digits; - return digits; - }, - - succ: function() { - return this + 1; - }, - - times: function(iterator) { - $R(0, this, true).each(iterator); - return this; - } -}); - -var Try = { - these: function() { - var returnValue; - - for (var i = 0; i < arguments.length; i++) { - var lambda = arguments[i]; - try { - returnValue = lambda(); - break; - } catch (e) {} - } - - return returnValue; - } -} - -/*--------------------------------------------------------------------------*/ - -var PeriodicalExecuter = Class.create(); -PeriodicalExecuter.prototype = { - initialize: function(callback, frequency) { - this.callback = callback; - this.frequency = frequency; - this.currentlyExecuting = false; - - this.registerCallback(); - }, - - registerCallback: function() { - setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); - }, - - onTimerEvent: function() { - if (!this.currentlyExecuting) { - try { - this.currentlyExecuting = true; - this.callback(); - } finally { - this.currentlyExecuting = false; - } - } - } -} - -/*--------------------------------------------------------------------------*/ - -function $() { - var elements = new Array(); - - for (var i = 0; i < arguments.length; i++) { - var element = arguments[i]; - if (typeof element == 'string') - element = document.getElementById(element); - - if (arguments.length == 1) - return element; - - elements.push(element); - } - - return elements; -} -Object.extend(String.prototype, { - stripTags: function() { - return this.replace(/<\/?[^>]+>/gi, ''); - }, - - stripScripts: function() { - return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); - }, - - extractScripts: function() { - var matchAll = new RegExp(Prototype.ScriptFragment, 'img'); - var matchOne = new RegExp(Prototype.ScriptFragment, 'im'); - return (this.match(matchAll) || []).map(function(scriptTag) { - return (scriptTag.match(matchOne) || ['', ''])[1]; - }); - }, - - evalScripts: function() { - return this.extractScripts().map(eval); - }, - - escapeHTML: function() { - var div = document.createElement('div'); - var text = document.createTextNode(this); - div.appendChild(text); - return div.innerHTML; - }, - - unescapeHTML: function() { - var div = document.createElement('div'); - div.innerHTML = this.stripTags(); - return div.childNodes[0] ? div.childNodes[0].nodeValue : ''; - }, - - toQueryParams: function() { - var pairs = this.match(/^\??(.*)$/)[1].split('&'); - return pairs.inject({}, function(params, pairString) { - var pair = pairString.split('='); - params[pair[0]] = pair[1]; - return params; - }); - }, - - toArray: function() { - return this.split(''); - }, - - camelize: function() { - var oStringList = this.split('-'); - if (oStringList.length == 1) return oStringList[0]; - - var camelizedString = this.indexOf('-') == 0 - ? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1) - : oStringList[0]; - - for (var i = 1, len = oStringList.length; i < len; i++) { - var s = oStringList[i]; - camelizedString += s.charAt(0).toUpperCase() + s.substring(1); - } - - return camelizedString; - }, - - inspect: function() { - return "'" + this.replace('\\', '\\\\').replace("'", '\\\'') + "'"; - } -}); - -String.prototype.parseQuery = String.prototype.toQueryParams; - -var $break = new Object(); -var $continue = new Object(); - -var Enumerable = { - each: function(iterator) { - var index = 0; - try { - this._each(function(value) { - try { - iterator(value, index++); - } catch (e) { - if (e != $continue) throw e; - } - }); - } catch (e) { - if (e != $break) throw e; - } - }, - - all: function(iterator) { - var result = true; - this.each(function(value, index) { - result = result && !!(iterator || Prototype.K)(value, index); - if (!result) throw $break; - }); - return result; - }, - - any: function(iterator) { - var result = true; - this.each(function(value, index) { - if (result = !!(iterator || Prototype.K)(value, index)) - throw $break; - }); - return result; - }, - - collect: function(iterator) { - var results = []; - this.each(function(value, index) { - results.push(iterator(value, index)); - }); - return results; - }, - - detect: function (iterator) { - var result; - this.each(function(value, index) { - if (iterator(value, index)) { - result = value; - throw $break; - } - }); - return result; - }, - - findAll: function(iterator) { - var results = []; - this.each(function(value, index) { - if (iterator(value, index)) - results.push(value); - }); - return results; - }, - - grep: function(pattern, iterator) { - var results = []; - this.each(function(value, index) { - var stringValue = value.toString(); - if (stringValue.match(pattern)) - results.push((iterator || Prototype.K)(value, index)); - }) - return results; - }, - - include: function(object) { - var found = false; - this.each(function(value) { - if (value == object) { - found = true; - throw $break; - } - }); - return found; - }, - - inject: function(memo, iterator) { - this.each(function(value, index) { - memo = iterator(memo, value, index); - }); - return memo; - }, - - invoke: function(method) { - var args = $A(arguments).slice(1); - return this.collect(function(value) { - return value[method].apply(value, args); - }); - }, - - max: function(iterator) { - var result; - this.each(function(value, index) { - value = (iterator || Prototype.K)(value, index); - if (value >= (result || value)) - result = value; - }); - return result; - }, - - min: function(iterator) { - var result; - this.each(function(value, index) { - value = (iterator || Prototype.K)(value, index); - if (value <= (result || value)) - result = value; - }); - return result; - }, - - partition: function(iterator) { - var trues = [], falses = []; - this.each(function(value, index) { - ((iterator || Prototype.K)(value, index) ? - trues : falses).push(value); - }); - return [trues, falses]; - }, - - pluck: function(property) { - var results = []; - this.each(function(value, index) { - results.push(value[property]); - }); - return results; - }, - - reject: function(iterator) { - var results = []; - this.each(function(value, index) { - if (!iterator(value, index)) - results.push(value); - }); - return results; - }, - - sortBy: function(iterator) { - return this.collect(function(value, index) { - return {value: value, criteria: iterator(value, index)}; - }).sort(function(left, right) { - var a = left.criteria, b = right.criteria; - return a < b ? -1 : a > b ? 1 : 0; - }).pluck('value'); - }, - - toArray: function() { - return this.collect(Prototype.K); - }, - - zip: function() { - var iterator = Prototype.K, args = $A(arguments); - if (typeof args.last() == 'function') - iterator = args.pop(); - - var collections = [this].concat(args).map($A); - return this.map(function(value, index) { - iterator(value = collections.pluck(index)); - return value; - }); - }, - - inspect: function() { - return '#<Enumerable:' + this.toArray().inspect() + '>'; - } -} - -Object.extend(Enumerable, { - map: Enumerable.collect, - find: Enumerable.detect, - select: Enumerable.findAll, - member: Enumerable.include, - entries: Enumerable.toArray -}); -var $A = Array.from = function(iterable) { - if (!iterable) return []; - if (iterable.toArray) { - return iterable.toArray(); - } else { - var results = []; - for (var i = 0; i < iterable.length; i++) - results.push(iterable[i]); - return results; - } -} - -Object.extend(Array.prototype, Enumerable); - -Array.prototype._reverse = Array.prototype.reverse; - -Object.extend(Array.prototype, { - _each: function(iterator) { - for (var i = 0; i < this.length; i++) - iterator(this[i]); - }, - - clear: function() { - this.length = 0; - return this; - }, - - first: function() { - return this[0]; - }, - - last: function() { - return this[this.length - 1]; - }, - - compact: function() { - return this.select(function(value) { - return value != undefined || value != null; - }); - }, - - flatten: function() { - return this.inject([], function(array, value) { - return array.concat(value.constructor == Array ? - value.flatten() : [value]); - }); - }, - - without: function() { - var values = $A(arguments); - return this.select(function(value) { - return !values.include(value); - }); - }, - - indexOf: function(object) { - for (var i = 0; i < this.length; i++) - if (this[i] == object) return i; - return -1; - }, - - reverse: function(inline) { - return (inline !== false ? this : this.toArray())._reverse(); - }, - - shift: function() { - var result = this[0]; - for (var i = 0; i < this.length - 1; i++) - this[i] = this[i + 1]; - this.length--; - return result; - }, - - inspect: function() { - return '[' + this.map(Object.inspect).join(', ') + ']'; - } -}); -var Hash = { - _each: function(iterator) { - for (key in this) { - var value = this[key]; - if (typeof value == 'function') continue; - - var pair = [key, value]; - pair.key = key; - pair.value = value; - iterator(pair); - } - }, - - keys: function() { - return this.pluck('key'); - }, - - values: function() { - return this.pluck('value'); - }, - - merge: function(hash) { - return $H(hash).inject($H(this), function(mergedHash, pair) { - mergedHash[pair.key] = pair.value; - return mergedHash; - }); - }, - - toQueryString: function() { - return this.map(function(pair) { - return pair.map(encodeURIComponent).join('='); - }).join('&'); - }, - - inspect: function() { - return '#<Hash:{' + this.map(function(pair) { - return pair.map(Object.inspect).join(': '); - }).join(', ') + '}>'; - } -} - -function $H(object) { - var hash = Object.extend({}, object || {}); - Object.extend(hash, Enumerable); - Object.extend(hash, Hash); - return hash; -} -ObjectRange = Class.create(); -Object.extend(ObjectRange.prototype, Enumerable); -Object.extend(ObjectRange.prototype, { - initialize: function(start, end, exclusive) { - this.start = start; - this.end = end; - this.exclusive = exclusive; - }, - - _each: function(iterator) { - var value = this.start; - do { - iterator(value); - value = value.succ(); - } while (this.include(value)); - }, - - include: function(value) { - if (value < this.start) - return false; - if (this.exclusive) - return value < this.end; - return value <= this.end; - } -}); - -var $R = function(start, end, exclusive) { - return new ObjectRange(start, end, exclusive); -} - -var Ajax = { - getTransport: function() { - return Try.these( - function() {return new ActiveXObject('Msxml2.XMLHTTP')}, - function() {return new ActiveXObject('Microsoft.XMLHTTP')}, - function() {return new XMLHttpRequest()} - ) || false; - }, - - activeRequestCount: 0 -} - -Ajax.Responders = { - responders: [], - - _each: function(iterator) { - this.responders._each(iterator); - }, - - register: function(responderToAdd) { - if (!this.include(responderToAdd)) - this.responders.push(responderToAdd); - }, - - unregister: function(responderToRemove) { - this.responders = this.responders.without(responderToRemove); - }, - - dispatch: function(callback, request, transport, json) { - this.each(function(responder) { - if (responder[callback] && typeof responder[callback] == 'function') { - try { - responder[callback].apply(responder, [request, transport, json]); - } catch (e) {} - } - }); - } -}; - -Object.extend(Ajax.Responders, Enumerable); - -Ajax.Responders.register({ - onCreate: function() { - Ajax.activeRequestCount++; - }, - - onComplete: function() { - Ajax.activeRequestCount--; - } -}); - -Ajax.Base = function() {}; -Ajax.Base.prototype = { - setOptions: function(options) { - this.options = { - method: 'post', - asynchronous: true, - parameters: '' - } - Object.extend(this.options, options || {}); - }, - - responseIsSuccess: function() { - return this.transport.status == undefined - || this.transport.status == 0 - || (this.transport.status >= 200 && this.transport.status < 300); - }, - - responseIsFailure: function() { - return !this.responseIsSuccess(); - } -} - -Ajax.Request = Class.create(); -Ajax.Request.Events = - ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; - -Ajax.Request.prototype = Object.extend(new Ajax.Base(), { - initialize: function(url, options) { - this.transport = Ajax.getTransport(); - this.setOptions(options); - this.request(url); - }, - - request: function(url) { - var parameters = this.options.parameters || ''; - if (parameters.length > 0) parameters += '&_='; - - try { - this.url = url; - if (this.options.method == 'get' && parameters.length > 0) - this.url += (this.url.match(/\?/) ? '&' : '?') + parameters; - - Ajax.Responders.dispatch('onCreate', this, this.transport); - - this.transport.open(this.options.method, this.url, - this.options.asynchronous); - - if (this.options.asynchronous) { - this.transport.onreadystatechange = this.onStateChange.bind(this); - setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10); - } - - this.setRequestHeaders(); - - var body = this.options.postBody ? this.options.postBody : parameters; - this.transport.send(this.options.method == 'post' ? body : null); - - } catch (e) { - this.dispatchException(e); - } - }, - - setRequestHeaders: function() { - var requestHeaders = - ['X-Requested-With', 'XMLHttpRequest', - 'X-Prototype-Version', Prototype.Version]; - - if (this.options.method == 'post') { - requestHeaders.push('Content-type', - 'application/x-www-form-urlencoded'); - - /* Force "Connection: close" for Mozilla browsers to work around - * a bug where XMLHttpReqeuest sends an incorrect Content-length - * header. See Mozilla Bugzilla #246651. - */ - if (this.transport.overrideMimeType) - requestHeaders.push('Connection', 'close'); - } - - if (this.options.requestHeaders) - requestHeaders.push.apply(requestHeaders, this.options.requestHeaders); - - for (var i = 0; i < requestHeaders.length; i += 2) - this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]); - }, - - onStateChange: function() { - var readyState = this.transport.readyState; - if (readyState != 1) - this.respondToReadyState(this.transport.readyState); - }, - - header: function(name) { - try { - return this.transport.getResponseHeader(name); - } catch (e) {} - }, - - evalJSON: function() { - try { - return eval(this.header('X-JSON')); - } catch (e) {} - }, - - evalResponse: function() { - try { - return eval(this.transport.responseText); - } catch (e) { - this.dispatchException(e); - } - }, - - respondToReadyState: function(readyState) { - var event = Ajax.Request.Events[readyState]; - var transport = this.transport, json = this.evalJSON(); - - if (event == 'Complete') { - try { - (this.options['on' + this.transport.status] - || this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')] - || Prototype.emptyFunction)(transport, json); - } catch (e) { - this.dispatchException(e); - } - - if ((this.header('Content-type') || '').match(/^text\/javascript/i)) - this.evalResponse(); - } - - try { - (this.options['on' + event] || Prototype.emptyFunction)(transport, json); - Ajax.Responders.dispatch('on' + event, this, transport, json); - } catch (e) { - this.dispatchException(e); - } - - /* Avoid memory leak in MSIE: clean up the oncomplete event handler */ - if (event == 'Complete') - this.transport.onreadystatechange = Prototype.emptyFunction; - }, - - dispatchException: function(exception) { - (this.options.onException || Prototype.emptyFunction)(this, exception); - Ajax.Responders.dispatch('onException', this, exception); - } -}); - -Ajax.Updater = Class.create(); - -Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), { - initialize: function(container, url, options) { - this.containers = { - success: container.success ? $(container.success) : $(container), - failure: container.failure ? $(container.failure) : - (container.success ? null : $(container)) - } - - this.transport = Ajax.getTransport(); - this.setOptions(options); - - var onComplete = this.options.onComplete || Prototype.emptyFunction; - this.options.onComplete = (function(transport, object) { - this.updateContent(); - onComplete(transport, object); - }).bind(this); - - this.request(url); - }, - - updateContent: function() { - var receiver = this.responseIsSuccess() ? - this.containers.success : this.containers.failure; - var response = this.transport.responseText; - - if (!this.options.evalScripts) - response = response.stripScripts(); - - if (receiver) { - if (this.options.insertion) { - new this.options.insertion(receiver, response); - } else { - Element.update(receiver, response); - } - } - - if (this.responseIsSuccess()) { - if (this.onComplete) - setTimeout(this.onComplete.bind(this), 10); - } - } -}); - -Ajax.PeriodicalUpdater = Class.create(); -Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), { - initialize: function(container, url, options) { - this.setOptions(options); - this.onComplete = this.options.onComplete; - - this.frequency = (this.options.frequency || 2); - this.decay = (this.options.decay || 1); - - this.updater = {}; - this.container = container; - this.url = url; - - this.start(); - }, - - start: function() { - this.options.onComplete = this.updateComplete.bind(this); - this.onTimerEvent(); - }, - - stop: function() { - this.updater.onComplete = undefined; - clearTimeout(this.timer); - (this.onComplete || Prototype.emptyFunction).apply(this, arguments); - }, - - updateComplete: function(request) { - if (this.options.decay) { - this.decay = (request.responseText == this.lastText ? - this.decay * this.options.decay : 1); - - this.lastText = request.responseText; - } - this.timer = setTimeout(this.onTimerEvent.bind(this), - this.decay * this.frequency * 1000); - }, - - onTimerEvent: function() { - this.updater = new Ajax.Updater(this.container, this.url, this.options); - } -}); -document.getElementsByClassName = function(className, parentElement) { - var children = ($(parentElement) || document.body).getElementsByTagName('*'); - return $A(children).inject([], function(elements, child) { - if (child.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)"))) - elements.push(child); - return elements; - }); -} - -/*--------------------------------------------------------------------------*/ - -if (!window.Element) { - var Element = new Object(); -} - -Object.extend(Element, { - visible: function(element) { - return $(element).style.display != 'none'; - }, - - toggle: function() { - for (var i = 0; i < arguments.length; i++) { - var element = $(arguments[i]); - Element[Element.visible(element) ? 'hide' : 'show'](element); - } - }, - - hide: function() { - for (var i = 0; i < arguments.length; i++) { - var element = $(arguments[i]); - element.style.display = 'none'; - } - }, - - show: function() { - for (var i = 0; i < arguments.length; i++) { - var element = $(arguments[i]); - element.style.display = ''; - } - }, - - remove: function(element) { - element = $(element); - element.parentNode.removeChild(element); - }, - - update: function(element, html) { - $(element).innerHTML = html.stripScripts(); - setTimeout(function() {html.evalScripts()}, 10); - }, - - getHeight: function(element) { - element = $(element); - return element.offsetHeight; - }, - - classNames: function(element) { - return new Element.ClassNames(element); - }, - - hasClassName: function(element, className) { - if (!(element = $(element))) return; - return Element.classNames(element).include(className); - }, - - addClassName: function(element, className) { - if (!(element = $(element))) return; - return Element.classNames(element).add(className); - }, - - removeClassName: function(element, className) { - if (!(element = $(element))) return; - return Element.classNames(element).remove(className); - }, - - // removes whitespace-only text node children - cleanWhitespace: function(element) { - element = $(element); - for (var i = 0; i < element.childNodes.length; i++) { - var node = element.childNodes[i]; - if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) - Element.remove(node); - } - }, - - empty: function(element) { - return $(element).innerHTML.match(/^\s*$/); - }, - - scrollTo: function(element) { - element = $(element); - var x = element.x ? element.x : element.offsetLeft, - y = element.y ? element.y : element.offsetTop; - window.scrollTo(x, y); - }, - - getStyle: function(element, style) { - element = $(element); - var value = element.style[style.camelize()]; - if (!value) { - if (document.defaultView && document.defaultView.getComputedStyle) { - var css = document.defaultView.getComputedStyle(element, null); - value = css ? css.getPropertyValue(style) : null; - } else if (element.currentStyle) { - value = element.currentStyle[style.camelize()]; - } - } - - if (window.opera && ['left', 'top', 'right', 'bottom'].include(style)) - if (Element.getStyle(element, 'position') == 'static') value = 'auto'; - - return value == 'auto' ? null : value; - }, - - setStyle: function(element, style) { - element = $(element); - for (name in style) - element.style[name.camelize()] = style[name]; - }, - - getDimensions: function(element) { - element = $(element); - if (Element.getStyle(element, 'display') != 'none') - return {width: element.offsetWidth, height: element.offsetHeight}; - - // All *Width and *Height properties give 0 on elements with display none, - // so enable the element temporarily - var els = element.style; - var originalVisibility = els.visibility; - var originalPosition = els.position; - els.visibility = 'hidden'; - els.position = 'absolute'; - els.display = ''; - var originalWidth = element.clientWidth; - var originalHeight = element.clientHeight; - els.display = 'none'; - els.position = originalPosition; - els.visibility = originalVisibility; - return {width: originalWidth, height: originalHeight}; - }, - - makePositioned: function(element) { - element = $(element); - var pos = Element.getStyle(element, 'position'); - if (pos == 'static' || !pos) { - element._madePositioned = true; - element.style.position = 'relative'; - // Opera returns the offset relative to the positioning context, when an - // element is position relative but top and left have not been defined - if (window.opera) { - element.style.top = 0; - element.style.left = 0; - } - } - }, - - undoPositioned: function(element) { - element = $(element); - if (element._madePositioned) { - element._madePositioned = undefined; - element.style.position = - element.style.top = - element.style.left = - element.style.bottom = - element.style.right = ''; - } - }, - - makeClipping: function(element) { - element = $(element); - if (element._overflow) return; - element._overflow = element.style.overflow; - if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden') - element.style.overflow = 'hidden'; - }, - - undoClipping: function(element) { - element = $(element); - if (element._overflow) return; - element.style.overflow = element._overflow; - element._overflow = undefined; - } -}); - -var Toggle = new Object(); -Toggle.display = Element.toggle; - -/*--------------------------------------------------------------------------*/ - -Abstract.Insertion = function(adjacency) { - this.adjacency = adjacency; -} - -Abstract.Insertion.prototype = { - initialize: function(element, content) { - this.element = $(element); - this.content = content.stripScripts(); - - if (this.adjacency && this.element.insertAdjacentHTML) { - try { - this.element.insertAdjacentHTML(this.adjacency, this.content); - } catch (e) { - if (this.element.tagName.toLowerCase() == 'tbody') { - this.insertContent(this.contentFromAnonymousTable()); - } else { - throw e; - } - } - } else { - this.range = this.element.ownerDocument.createRange(); - if (this.initializeRange) this.initializeRange(); - this.insertContent([this.range.createContextualFragment(this.content)]); - } - - setTimeout(function() {content.evalScripts()}, 10); - }, - - contentFromAnonymousTable: function() { - var div = document.createElement('div'); - div.innerHTML = '<table><tbody>' + this.content + '</tbody></table>'; - return $A(div.childNodes[0].childNodes[0].childNodes); - } -} - -var Insertion = new Object(); - -Insertion.Before = Class.create(); -Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), { - initializeRange: function() { - this.range.setStartBefore(this.element); - }, - - insertContent: function(fragments) { - fragments.each((function(fragment) { - this.element.parentNode.insertBefore(fragment, this.element); - }).bind(this)); - } -}); - -Insertion.Top = Class.create(); -Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), { - initializeRange: function() { - this.range.selectNodeContents(this.element); - this.range.collapse(true); - }, - - insertContent: function(fragments) { - fragments.reverse(false).each((function(fragment) { - this.element.insertBefore(fragment, this.element.firstChild); - }).bind(this)); - } -}); - -Insertion.Bottom = Class.create(); -Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), { - initializeRange: function() { - this.range.selectNodeContents(this.element); - this.range.collapse(this.element); - }, - - insertContent: function(fragments) { - fragments.each((function(fragment) { - this.element.appendChild(fragment); - }).bind(this)); - } -}); - -Insertion.After = Class.create(); -Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), { - initializeRange: function() { - this.range.setStartAfter(this.element); - }, - - insertContent: function(fragments) { - fragments.each((function(fragment) { - this.element.parentNode.insertBefore(fragment, - this.element.nextSibling); - }).bind(this)); - } -}); - -/*--------------------------------------------------------------------------*/ - -Element.ClassNames = Class.create(); -Element.ClassNames.prototype = { - initialize: function(element) { - this.element = $(element); - }, - - _each: function(iterator) { - this.element.className.split(/\s+/).select(function(name) { - return name.length > 0; - })._each(iterator); - }, - - set: function(className) { - this.element.className = className; - }, - - add: function(classNameToAdd) { - if (this.include(classNameToAdd)) return; - this.set(this.toArray().concat(classNameToAdd).join(' ')); - }, - - remove: function(classNameToRemove) { - if (!this.include(classNameToRemove)) return; - this.set(this.select(function(className) { - return className != classNameToRemove; - }).join(' ')); - }, - - toString: function() { - return this.toArray().join(' '); - } -} - -Object.extend(Element.ClassNames.prototype, Enumerable); -var Field = { - clear: function() { - for (var i = 0; i < arguments.length; i++) - $(arguments[i]).value = ''; - }, - - focus: function(element) { - $(element).focus(); - }, - - present: function() { - for (var i = 0; i < arguments.length; i++) - if ($(arguments[i]).value == '') return false; - return true; - }, - - select: function(element) { - $(element).select(); - }, - - activate: function(element) { - element = $(element); - element.focus(); - if (element.select) - element.select(); - } -} - -/*--------------------------------------------------------------------------*/ - -var Form = { - serialize: function(form) { - var elements = Form.getElements($(form)); - var queryComponents = new Array(); - - for (var i = 0; i < elements.length; i++) { - var queryComponent = Form.Element.serialize(elements[i]); - if (queryComponent) - queryComponents.push(queryComponent); - } - - return queryComponents.join('&'); - }, - - getElements: function(form) { - form = $(form); - var elements = new Array(); - - for (tagName in Form.Element.Serializers) { - var tagElements = form.getElementsByTagName(tagName); - for (var j = 0; j < tagElements.length; j++) - elements.push(tagElements[j]); - } - return elements; - }, - - getInputs: function(form, typeName, name) { - form = $(form); - var inputs = form.getElementsByTagName('input'); - - if (!typeName && !name) - return inputs; - - var matchingInputs = new Array(); - for (var i = 0; i < inputs.length; i++) { - var input = inputs[i]; - if ((typeName && input.type != typeName) || - (name && input.name != name)) - continue; - matchingInputs.push(input); - } - - return matchingInputs; - }, - - disable: function(form) { - var elements = Form.getElements(form); - for (var i = 0; i < elements.length; i++) { - var element = elements[i]; - element.blur(); - element.disabled = 'true'; - } - }, - - enable: function(form) { - var elements = Form.getElements(form); - for (var i = 0; i < elements.length; i++) { - var element = elements[i]; - element.disabled = ''; - } - }, - - findFirstElement: function(form) { - return Form.getElements(form).find(function(element) { - return element.type != 'hidden' && !element.disabled && - ['input', 'select', 'textarea'].include(element.tagName.toLowerCase()); - }); - }, - - focusFirstElement: function(form) { - Field.activate(Form.findFirstElement(form)); - }, - - reset: function(form) { - $(form).reset(); - } -} - -Form.Element = { - serialize: function(element) { - element = $(element); - var method = element.tagName.toLowerCase(); - var parameter = Form.Element.Serializers[method](element); - - if (parameter) { - var key = encodeURIComponent(parameter[0]); - if (key.length == 0) return; - - if (parameter[1].constructor != Array) - parameter[1] = [parameter[1]]; - - return parameter[1].map(function(value) { - return key + '=' + encodeURIComponent(value); - }).join('&'); - } - }, - - getValue: function(element) { - element = $(element); - var method = element.tagName.toLowerCase(); - var parameter = Form.Element.Serializers[method](element); - - if (parameter) - return parameter[1]; - } -} - -Form.Element.Serializers = { - input: function(element) { - switch (element.type.toLowerCase()) { - case 'submit': - case 'hidden': - case 'password': - case 'text': - return Form.Element.Serializers.textarea(element); - case 'checkbox': - case 'radio': - return Form.Element.Serializers.inputSelector(element); - } - return false; - }, - - inputSelector: function(element) { - if (element.checked) - return [element.name, element.value]; - }, - - textarea: function(element) { - return [element.name, element.value]; - }, - - select: function(element) { - return Form.Element.Serializers[element.type == 'select-one' ? - 'selectOne' : 'selectMany'](element); - }, - - selectOne: function(element) { - var value = '', opt, index = element.selectedIndex; - if (index >= 0) { - opt = element.options[index]; - value = opt.value; - if (!value && !('value' in opt)) - value = opt.text; - } - return [element.name, value]; - }, - - selectMany: function(element) { - var value = new Array(); - for (var i = 0; i < element.length; i++) { - var opt = element.options[i]; - if (opt.selected) { - var optValue = opt.value; - if (!optValue && !('value' in opt)) - optValue = opt.text; - value.push(optValue); - } - } - return [element.name, value]; - } -} - -/*--------------------------------------------------------------------------*/ - -var $F = Form.Element.getValue; - -/*--------------------------------------------------------------------------*/ - -Abstract.TimedObserver = function() {} -Abstract.TimedObserver.prototype = { - initialize: function(element, frequency, callback) { - this.frequency = frequency; - this.element = $(element); - this.callback = callback; - - this.lastValue = this.getValue(); - this.registerCallback(); - }, - - registerCallback: function() { - setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); - }, - - onTimerEvent: function() { - var value = this.getValue(); - if (this.lastValue != value) { - this.callback(this.element, value); - this.lastValue = value; - } - } -} - -Form.Element.Observer = Class.create(); -Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), { - getValue: function() { - return Form.Element.getValue(this.element); - } -}); - -Form.Observer = Class.create(); -Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), { - getValue: function() { - return Form.serialize(this.element); - } -}); - -/*--------------------------------------------------------------------------*/ - -Abstract.EventObserver = function() {} -Abstract.EventObserver.prototype = { - initialize: function(element, callback) { - this.element = $(element); - this.callback = callback; - - this.lastValue = this.getValue(); - if (this.element.tagName.toLowerCase() == 'form') - this.registerFormCallbacks(); - else - this.registerCallback(this.element); - }, - - onElementEvent: function() { - var value = this.getValue(); - if (this.lastValue != value) { - this.callback(this.element, value); - this.lastValue = value; - } - }, - - registerFormCallbacks: function() { - var elements = Form.getElements(this.element); - for (var i = 0; i < elements.length; i++) - this.registerCallback(elements[i]); - }, - - registerCallback: function(element) { - if (element.type) { - switch (element.type.toLowerCase()) { - case 'checkbox': - case 'radio': - Event.observe(element, 'click', this.onElementEvent.bind(this)); - break; - case 'password': - case 'text': - case 'textarea': - case 'select-one': - case 'select-multiple': - Event.observe(element, 'change', this.onElementEvent.bind(this)); - break; - } - } - } -} - -Form.Element.EventObserver = Class.create(); -Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), { - getValue: function() { - return Form.Element.getValue(this.element); - } -}); - -Form.EventObserver = Class.create(); -Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), { - getValue: function() { - return Form.serialize(this.element); - } -}); -if (!window.Event) { - var Event = new Object(); -} - -Object.extend(Event, { - KEY_BACKSPACE: 8, - KEY_TAB: 9, - KEY_RETURN: 13, - KEY_ESC: 27, - KEY_LEFT: 37, - KEY_UP: 38, - KEY_RIGHT: 39, - KEY_DOWN: 40, - KEY_DELETE: 46, - - element: function(event) { - return event.target || event.srcElement; - }, - - isLeftClick: function(event) { - return (((event.which) && (event.which == 1)) || - ((event.button) && (event.button == 1))); - }, - - pointerX: function(event) { - return event.pageX || (event.clientX + - (document.documentElement.scrollLeft || document.body.scrollLeft)); - }, - - pointerY: function(event) { - return event.pageY || (event.clientY + - (document.documentElement.scrollTop || document.body.scrollTop)); - }, - - stop: function(event) { - if (event.preventDefault) { - event.preventDefault(); - event.stopPropagation(); - } else { - event.returnValue = false; - event.cancelBubble = true; - } - }, - - // find the first node with the given tagName, starting from the - // node the event was triggered on; traverses the DOM upwards - findElement: function(event, tagName) { - var element = Event.element(event); - while (element.parentNode && (!element.tagName || - (element.tagName.toUpperCase() != tagName.toUpperCase()))) - element = element.parentNode; - return element; - }, - - observers: false, - - _observeAndCache: function(element, name, observer, useCapture) { - if (!this.observers) this.observers = []; - if (element.addEventListener) { - this.observers.push([element, name, observer, useCapture]); - element.addEventListener(name, observer, useCapture); - } else if (element.attachEvent) { - this.observers.push([element, name, observer, useCapture]); - element.attachEvent('on' + name, observer); - } - }, - - unloadCache: function() { - if (!Event.observers) return; - for (var i = 0; i < Event.observers.length; i++) { - Event.stopObserving.apply(this, Event.observers[i]); - Event.observers[i][0] = null; - } - Event.observers = false; - }, - - observe: function(element, name, observer, useCapture) { - var element = $(element); - useCapture = useCapture || false; - - if (name == 'keypress' && - (navigator.appVersion.match(/Konqueror|Safari|KHTML/) - || element.attachEvent)) - name = 'keydown'; - - this._observeAndCache(element, name, observer, useCapture); - }, - - stopObserving: function(element, name, observer, useCapture) { - var element = $(element); - useCapture = useCapture || false; - - if (name == 'keypress' && - (navigator.appVersion.match(/Konqueror|Safari|KHTML/) - || element.detachEvent)) - name = 'keydown'; - - if (element.removeEventListener) { - element.removeEventListener(name, observer, useCapture); - } else if (element.detachEvent) { - element.detachEvent('on' + name, observer); - } - } -}); - -/* prevent memory leaks in IE */ -Event.observe(window, 'unload', Event.unloadCache, false); -var Position = { - // set to true if needed, warning: firefox performance problems - // NOT neeeded for page scrolling, only if draggable contained in - // scrollable elements - includeScrollOffsets: false, - - // must be called before calling withinIncludingScrolloffset, every time the - // page is scrolled - prepare: function() { - this.deltaX = window.pageXOffset - || document.documentElement.scrollLeft - || document.body.scrollLeft - || 0; - this.deltaY = window.pageYOffset - || document.documentElement.scrollTop - || document.body.scrollTop - || 0; - }, - - realOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.scrollTop || 0; - valueL += element.scrollLeft || 0; - element = element.parentNode; - } while (element); - return [valueL, valueT]; - }, - - cumulativeOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - element = element.offsetParent; - } while (element); - return [valueL, valueT]; - }, - - positionedOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - element = element.offsetParent; - if (element) { - p = Element.getStyle(element, 'position'); - if (p == 'relative' || p == 'absolute') break; - } - } while (element); - return [valueL, valueT]; - }, - - offsetParent: function(element) { - if (element.offsetParent) return element.offsetParent; - if (element == document.body) return element; - - while ((element = element.parentNode) && element != document.body) - if (Element.getStyle(element, 'position') != 'static') - return element; - - return document.body; - }, - - // caches x/y coordinate pair to use with overlap - within: function(element, x, y) { - if (this.includeScrollOffsets) - return this.withinIncludingScrolloffsets(element, x, y); - this.xcomp = x; - this.ycomp = y; - this.offset = this.cumulativeOffset(element); - - return (y >= this.offset[1] && - y < this.offset[1] + element.offsetHeight && - x >= this.offset[0] && - x < this.offset[0] + element.offsetWidth); - }, - - withinIncludingScrolloffsets: function(element, x, y) { - var offsetcache = this.realOffset(element); - - this.xcomp = x + offsetcache[0] - this.deltaX; - this.ycomp = y + offsetcache[1] - this.deltaY; - this.offset = this.cumulativeOffset(element); - - return (this.ycomp >= this.offset[1] && - this.ycomp < this.offset[1] + element.offsetHeight && - this.xcomp >= this.offset[0] && - this.xcomp < this.offset[0] + element.offsetWidth); - }, - - // within must be called directly before - overlap: function(mode, element) { - if (!mode) return 0; - if (mode == 'vertical') - return ((this.offset[1] + element.offsetHeight) - this.ycomp) / - element.offsetHeight; - if (mode == 'horizontal') - return ((this.offset[0] + element.offsetWidth) - this.xcomp) / - element.offsetWidth; - }, - - clone: function(source, target) { - source = $(source); - target = $(target); - target.style.position = 'absolute'; - var offsets = this.cumulativeOffset(source); - target.style.top = offsets[1] + 'px'; - target.style.left = offsets[0] + 'px'; - target.style.width = source.offsetWidth + 'px'; - target.style.height = source.offsetHeight + 'px'; - }, - - page: function(forElement) { - var valueT = 0, valueL = 0; - - var element = forElement; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - - // Safari fix - if (element.offsetParent==document.body) - if (Element.getStyle(element,'position')=='absolute') break; - - } while (element = element.offsetParent); - - element = forElement; - do { - valueT -= element.scrollTop || 0; - valueL -= element.scrollLeft || 0; - } while (element = element.parentNode); - - return [valueL, valueT]; - }, - - clone: function(source, target) { - var options = Object.extend({ - setLeft: true, - setTop: true, - setWidth: true, - setHeight: true, - offsetTop: 0, - offsetLeft: 0 - }, arguments[2] || {}) - - // find page position of source - source = $(source); - var p = Position.page(source); - - // find coordinate system to use - target = $(target); - var delta = [0, 0]; - var parent = null; - // delta [0,0] will do fine with position: fixed elements, - // position:absolute needs offsetParent deltas - if (Element.getStyle(target,'position') == 'absolute') { - parent = Position.offsetParent(target); - delta = Position.page(parent); - } - - // correct by body offsets (fixes Safari) - if (parent == document.body) { - delta[0] -= document.body.offsetLeft; - delta[1] -= document.body.offsetTop; - } - - // set position - if(options.setLeft) target.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px'; - if(options.setTop) target.style.top = (p[1] - delta[1] + options.offsetTop) + 'px'; - if(options.setWidth) target.style.width = source.offsetWidth + 'px'; - if(options.setHeight) target.style.height = source.offsetHeight + 'px'; - }, - - absolutize: function(element) { - element = $(element); - if (element.style.position == 'absolute') return; - Position.prepare(); - - var offsets = Position.positionedOffset(element); - var top = offsets[1]; - var left = offsets[0]; - var width = element.clientWidth; - var height = element.clientHeight; - - element._originalLeft = left - parseFloat(element.style.left || 0); - element._originalTop = top - parseFloat(element.style.top || 0); - element._originalWidth = element.style.width; - element._originalHeight = element.style.height; - - element.style.position = 'absolute'; - element.style.top = top + 'px';; - element.style.left = left + 'px';; - element.style.width = width + 'px';; - element.style.height = height + 'px';; - }, - - relativize: function(element) { - element = $(element); - if (element.style.position == 'relative') return; - Position.prepare(); - - element.style.position = 'relative'; - var top = parseFloat(element.style.top || 0) - (element._originalTop || 0); - var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0); - - element.style.top = top + 'px'; - element.style.left = left + 'px'; - element.style.height = element._originalHeight; - element.style.width = element._originalWidth; - } -} - -// Safari returns margins on body which is incorrect if the child is absolutely -// positioned. For performance reasons, redefine Position.cumulativeOffset for -// KHTML/WebKit only. -if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) { - Position.cumulativeOffset = function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - if (element.offsetParent == document.body) - if (Element.getStyle(element, 'position') == 'absolute') break; - - element = element.offsetParent; - } while (element); - - return [valueL, valueT]; - } -}
\ No newline at end of file diff --git a/tests/test_tools/selenium/core/scripts/se2html.js b/tests/test_tools/selenium/core/scripts/se2html.js deleted file mode 100644 index 4894d4b1..00000000 --- a/tests/test_tools/selenium/core/scripts/se2html.js +++ /dev/null @@ -1,63 +0,0 @@ -/* - -This is an experiment in creating a "selenese" parser that drastically -cuts down on the line noise associated with writing tests in HTML. - -The 'parse' function will accept the follow sample commands. - -test-cases: - //comment - command "param" - command "param" // comment - command "param" "param2" - command "param" "param2" // this is a comment - -TODO: -1) Deal with multiline parameters -2) Escape quotes properly -3) Determine whether this should/will become the "preferred" syntax - for delivered Selenium self-test scripts -*/ - - -function separse(doc) { - // Get object - script = doc.getElementById('testcase') - // Split into lines - lines = script.text.split('\n'); - - - var command_pattern = / *(\w+) *"([^"]*)" *(?:"([^"]*)"){0,1}(?: *(\/\/ *.+))*/i; - var comment_pattern = /^ *(\/\/ *.+)/ - - // Regex each line into selenium command and convert into table row. - // eg. "<command> <quote> <quote> <comment>" - var new_test_source = ''; - var new_line = ''; - for (var x=0; x < lines.length; x++) { - result = lines[x].match(command_pattern); - if (result != null) { - new_line = "<tr><td>" + (result[1] || ' ') + "</td>" + - "<td>" + (result[2] || ' ') + "</td>" + - "<td>" + (result[3] || ' ') + "</td>" + - "<td>" + (result[4] || ' ') + "</td></tr>\n"; - new_test_source += new_line; - } - result = lines[x].match(comment_pattern); - if (result != null) { - new_line = '<tr><td rowspan="1" colspan="4">' + - (result[1] || ' ') + - '</td></tr>'; - new_test_source += new_line; - } - } - - // Create HTML Table - body = doc.body - body.innerHTML += "<table class='selenium' id='testtable'>"+ - new_test_source + - "</table>"; - -} - - diff --git a/tests/test_tools/selenium/core/scripts/selenium-api.js b/tests/test_tools/selenium/core/scripts/selenium-api.js deleted file mode 100644 index 1646236f..00000000 --- a/tests/test_tools/selenium/core/scripts/selenium-api.js +++ /dev/null @@ -1,2329 +0,0 @@ -/* - * Copyright 2004 ThoughtWorks, Inc - * - * 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. - * - */ - -// TODO: stop navigating this.browserbot.document() ... it breaks encapsulation - -var storedVars = new Object(); - -function Selenium(browserbot) { - /** - * Defines an object that runs Selenium commands. - * - * <h3><a name="locators"></a>Element Locators</h3> - * <p> - * Element Locators tell Selenium which HTML element a command refers to. - * The format of a locator is:</p> - * <blockquote> - * <em>locatorType</em><strong>=</strong><em>argument</em> - * </blockquote> - * - * <p> - * We support the following strategies for locating elements: - * </p> - * - * <ul> - * <li><strong>identifier</strong>=<em>id</em>: - * Select the element with the specified @id attribute. If no match is - * found, select the first element whose @name attribute is <em>id</em>. - * (This is normally the default; see below.)</li> - * <li><strong>id</strong>=<em>id</em>: - * Select the element with the specified @id attribute.</li> - * - * <li><strong>name</strong>=<em>name</em>: - * Select the first element with the specified @name attribute. - * <ul class="first last simple"> - * <li>username</li> - * <li>name=username</li> - * </ul> - * - * <p>The name may optionally be followed by one or more <em>element-filters</em>, separated from the name by whitespace. If the <em>filterType</em> is not specified, <strong>value</strong> is assumed.</p> - * - * <ul class="first last simple"> - * <li>name=flavour value=chocolate</li> - * </ul> - * </li> - * <li><strong>dom</strong>=<em>javascriptExpression</em>: - * - * Find an element by evaluating the specified string. This allows you to traverse the HTML Document Object - * Model using JavaScript. Note that you must not return a value in this string; simply make it the last expression in the block. - * <ul class="first last simple"> - * <li>dom=document.forms['myForm'].myDropdown</li> - * <li>dom=document.images[56]</li> - * <li>dom=function foo() { return document.links[1]; }; foo();</li> - * </ul> - * - * </li> - * - * <li><strong>xpath</strong>=<em>xpathExpression</em>: - * Locate an element using an XPath expression. - * <ul class="first last simple"> - * <li>xpath=//img[@alt='The image alt text']</li> - * <li>xpath=//table[@id='table1']//tr[4]/td[2]</li> - * <li>xpath=//a[contains(@href,'#id1')]</li> - * <li>xpath=//a[contains(@href,'#id1')]/@class</li> - * <li>xpath=(//table[@class='stylee'])//th[text()='theHeaderText']/../td</li> - * <li>xpath=//input[@name='name2' and @value='yes']</li> - * <li>xpath=//*[text()="right"]</li> - * - * </ul> - * </li> - * <li><strong>link</strong>=<em>textPattern</em>: - * Select the link (anchor) element which contains text matching the - * specified <em>pattern</em>. - * <ul class="first last simple"> - * <li>link=The link text</li> - * </ul> - * - * </li> - * - * <li><strong>css</strong>=<em>cssSelectorSyntax</em>: - * Select the element using css selectors. Please refer to <a href="http://www.w3.org/TR/REC-CSS2/selector.html">CSS2 selectors</a>, <a href="http://www.w3.org/TR/2001/CR-css3-selectors-20011113/">CSS3 selectors</a> for more information. You can also check the TestCssLocators test in the selenium test suite for an example of usage, which is included in the downloaded selenium core package. - * <ul class="first last simple"> - * <li>css=a[href="#id3"]</li> - * <li>css=span#firstChild + span</li> - * </ul> - * <p>Currently the css selector locator supports all css1, css2 and css3 selectors except namespace in css3, some pseudo classes(:nth-of-type, :nth-last-of-type, :first-of-type, :last-of-type, :only-of-type, :visited, :hover, :active, :focus, :indeterminate) and pseudo elements(::first-line, ::first-letter, ::selection, ::before, ::after). </p> - * </li> - * </ul> - * - * <p> - * Without an explicit locator prefix, Selenium uses the following default - * strategies: - * </p> - * - * <ul class="simple"> - * <li><strong>dom</strong>, for locators starting with "document."</li> - * <li><strong>xpath</strong>, for locators starting with "//"</li> - * <li><strong>identifier</strong>, otherwise</li> - * </ul> - * - * <h3><a name="element-filters">Element Filters</a></h3> - * <blockquote> - * <p>Element filters can be used with a locator to refine a list of candidate elements. They are currently used only in the 'name' element-locator.</p> - * <p>Filters look much like locators, ie.</p> - * <blockquote> - * <em>filterType</em><strong>=</strong><em>argument</em></blockquote> - * - * <p>Supported element-filters are:</p> - * <p><strong>value=</strong><em>valuePattern</em></p> - * <blockquote> - * Matches elements based on their values. This is particularly useful for refining a list of similarly-named toggle-buttons.</blockquote> - * <p><strong>index=</strong><em>index</em></p> - * <blockquote> - * Selects a single element based on its position in the list (offset from zero).</blockquote> - * </blockquote> - * - * <h3><a name="patterns"></a>String-match Patterns</h3> - * - * <p> - * Various Pattern syntaxes are available for matching string values: - * </p> - * <ul> - * <li><strong>glob:</strong><em>pattern</em>: - * Match a string against a "glob" (aka "wildmat") pattern. "Glob" is a - * kind of limited regular-expression syntax typically used in command-line - * shells. In a glob pattern, "*" represents any sequence of characters, and "?" - * represents any single character. Glob patterns match against the entire - * string.</li> - * <li><strong>regexp:</strong><em>regexp</em>: - * Match a string using a regular-expression. The full power of JavaScript - * regular-expressions is available.</li> - * <li><strong>exact:</strong><em>string</em>: - * - * Match a string exactly, verbatim, without any of that fancy wildcard - * stuff.</li> - * </ul> - * <p> - * If no pattern prefix is specified, Selenium assumes that it's a "glob" - * pattern. - * </p> - */ - this.browserbot = browserbot; - this.optionLocatorFactory = new OptionLocatorFactory(); - // DGF for backwards compatibility - this.page = function() { - return browserbot; - }; - this.defaultTimeout = Selenium.DEFAULT_TIMEOUT; - this.mouseSpeed = 10; -} - -Selenium.DEFAULT_TIMEOUT = 30 * 1000; -Selenium.DEFAULT_MOUSE_SPEED = 10; - -Selenium.decorateFunctionWithTimeout = function(f, timeout) { - if (f == null) { - return null; - } - var timeoutValue = parseInt(timeout); - if (isNaN(timeoutValue)) { - throw new SeleniumError("Timeout is not a number: '" + timeout + "'"); - } - var now = new Date().getTime(); - var timeoutTime = now + timeoutValue; - return function() { - if (new Date().getTime() > timeoutTime) { - throw new SeleniumError("Timed out after " + timeoutValue + "ms"); - } - return f(); - }; -} - -Selenium.createForWindow = function(window, proxyInjectionMode) { - if (!window.location) { - throw "error: not a window!"; - } - return new Selenium(BrowserBot.createForWindow(window, proxyInjectionMode)); -}; - -Selenium.prototype.reset = function() { - this.defaultTimeout = Selenium.DEFAULT_TIMEOUT; - // todo: this.browserbot.reset() - this.browserbot.selectWindow("null"); - this.browserbot.resetPopups(); -}; - -Selenium.prototype.doClick = function(locator) { - /** - * Clicks on a link, button, checkbox or radio button. If the click action - * causes a new page to load (like a link usually does), call - * waitForPageToLoad. - * - * @param locator an element locator - * - */ - var element = this.browserbot.findElement(locator); - this.browserbot.clickElement(element); -}; - -Selenium.prototype.doDoubleClick = function(locator) { - /** - * Double clicks on a link, button, checkbox or radio button. If the double click action - * causes a new page to load (like a link usually does), call - * waitForPageToLoad. - * - * @param locator an element locator - * - */ - var element = this.browserbot.findElement(locator); - this.browserbot.doubleClickElement(element); -}; - -Selenium.prototype.doClickAt = function(locator, coordString) { - /** - * Clicks on a link, button, checkbox or radio button. If the click action - * causes a new page to load (like a link usually does), call - * waitForPageToLoad. - * - * @param locator an element locator - * @param coordString specifies the x,y position (i.e. - 10,20) of the mouse - * event relative to the element returned by the locator. - * - */ - var element = this.browserbot.findElement(locator); - var clientXY = getClientXY(element, coordString) - this.browserbot.clickElement(element, clientXY[0], clientXY[1]); -}; - -Selenium.prototype.doDoubleClickAt = function(locator, coordString) { - /** - * Doubleclicks on a link, button, checkbox or radio button. If the action - * causes a new page to load (like a link usually does), call - * waitForPageToLoad. - * - * @param locator an element locator - * @param coordString specifies the x,y position (i.e. - 10,20) of the mouse - * event relative to the element returned by the locator. - * - */ - var element = this.browserbot.findElement(locator); - var clientXY = getClientXY(element, coordString) - this.browserbot.doubleClickElement(element, clientXY[0], clientXY[1]); -}; - -Selenium.prototype.doFireEvent = function(locator, eventName) { - /** - * Explicitly simulate an event, to trigger the corresponding "on<em>event</em>" - * handler. - * - * @param locator an <a href="#locators">element locator</a> - * @param eventName the event name, e.g. "focus" or "blur" - */ - var element = this.browserbot.findElement(locator); - triggerEvent(element, eventName, false); -}; - -Selenium.prototype.doKeyPress = function(locator, keySequence) { - /** - * Simulates a user pressing and releasing a key. - * - * @param locator an <a href="#locators">element locator</a> - * @param keySequence Either be a string("\" followed by the numeric keycode - * of the key to be pressed, normally the ASCII value of that key), or a single - * character. For example: "w", "\119". - */ - var element = this.browserbot.findElement(locator); - triggerKeyEvent(element, 'keypress', keySequence, true, - this.browserbot.controlKeyDown, - this.browserbot.altKeyDown, - this.browserbot.shiftKeyDown, - this.browserbot.metaKeyDown); -}; - -Selenium.prototype.doShiftKeyDown = function() { - /** - * Press the shift key and hold it down until doShiftUp() is called or a new page is loaded. - * - */ - this.browserbot.shiftKeyDown = true; -}; - -Selenium.prototype.doShiftKeyUp = function() { - /** - * Release the shift key. - * - */ - this.browserbot.shiftKeyDown = false; -}; - -Selenium.prototype.doMetaKeyDown = function() { - /** - * Press the meta key and hold it down until doMetaUp() is called or a new page is loaded. - * - */ - this.browserbot.metaKeyDown = true; -}; - -Selenium.prototype.doMetaKeyUp = function() { - /** - * Release the meta key. - * - */ - this.browserbot.metaKeyDown = false; -}; - -Selenium.prototype.doAltKeyDown = function() { - /** - * Press the alt key and hold it down until doAltUp() is called or a new page is loaded. - * - */ - this.browserbot.altKeyDown = true; -}; - -Selenium.prototype.doAltKeyUp = function() { - /** - * Release the alt key. - * - */ - this.browserbot.altKeyDown = false; -}; - -Selenium.prototype.doControlKeyDown = function() { - /** - * Press the control key and hold it down until doControlUp() is called or a new page is loaded. - * - */ - this.browserbot.controlKeyDown = true; -}; - -Selenium.prototype.doControlKeyUp = function() { - /** - * Release the control key. - * - */ - this.browserbot.controlKeyDown = false; -}; - -Selenium.prototype.doKeyDown = function(locator, keySequence) { - /** - * Simulates a user pressing a key (without releasing it yet). - * - * @param locator an <a href="#locators">element locator</a> - * @param keySequence Either be a string("\" followed by the numeric keycode - * of the key to be pressed, normally the ASCII value of that key), or a single - * character. For example: "w", "\119". - */ - var element = this.browserbot.findElement(locator); - triggerKeyEvent(element, 'keydown', keySequence, true, - this.browserbot.controlKeyDown, - this.browserbot.altKeyDown, - this.browserbot.shiftKeyDown, - this.browserbot.metaKeyDown); -}; - -Selenium.prototype.doKeyUp = function(locator, keySequence) { - /** - * Simulates a user releasing a key. - * - * @param locator an <a href="#locators">element locator</a> - * @param keySequence Either be a string("\" followed by the numeric keycode - * of the key to be pressed, normally the ASCII value of that key), or a single - * character. For example: "w", "\119". - */ - var element = this.browserbot.findElement(locator); - triggerKeyEvent(element, 'keyup', keySequence, true, - this.browserbot.controlKeyDown, - this.browserbot.altKeyDown, - this.browserbot.shiftKeyDown, - this.browserbot.metaKeyDown); -}; - -function getClientXY(element, coordString) { - // Parse coordString - var coords = null; - var x; - var y; - if (coordString) { - coords = coordString.split(/,/); - x = Number(coords[0]); - y = Number(coords[1]); - } - else { - x = y = 0; - } - - // Get position of element, - // Return 2 item array with clientX and clientY - return [Selenium.prototype.getElementPositionLeft(element) + x, Selenium.prototype.getElementPositionTop(element) + y]; -} - -Selenium.prototype.doMouseOver = function(locator) { - /** - * Simulates a user hovering a mouse over the specified element. - * - * @param locator an <a href="#locators">element locator</a> - */ - var element = this.browserbot.findElement(locator); - this.browserbot.triggerMouseEvent(element, 'mouseover', true); -}; - -Selenium.prototype.doMouseOut = function(locator) { - /** - * Simulates a user moving the mouse pointer away from the specified element. - * - * @param locator an <a href="#locators">element locator</a> - */ - var element = this.browserbot.findElement(locator); - this.browserbot.triggerMouseEvent(element, 'mouseout', true); -}; - -Selenium.prototype.doMouseDown = function(locator) { - /** - * Simulates a user pressing the mouse button (without releasing it yet) on - * the specified element. - * - * @param locator an <a href="#locators">element locator</a> - */ - var element = this.browserbot.findElement(locator); - this.browserbot.triggerMouseEvent(element, 'mousedown', true); -}; - -Selenium.prototype.doMouseDownAt = function(locator, coordString) { - /** - * Simulates a user pressing the mouse button (without releasing it yet) on - * the specified element. - * - * @param locator an <a href="#locators">element locator</a> - * @param coordString specifies the x,y position (i.e. - 10,20) of the mouse - * event relative to the element returned by the locator. - */ - var element = this.browserbot.findElement(locator); - var clientXY = getClientXY(element, coordString) - - this.browserbot.triggerMouseEvent(element, 'mousedown', true, clientXY[0], clientXY[1]); -}; - -Selenium.prototype.doMouseUp = function(locator) { - /** - * Simulates a user pressing the mouse button (without releasing it yet) on - * the specified element. - * - * @param locator an <a href="#locators">element locator</a> - */ - var element = this.browserbot.findElement(locator); - this.browserbot.triggerMouseEvent(element, 'mouseup', true); -}; - -Selenium.prototype.doMouseUpAt = function(locator, coordString) { - /** - * Simulates a user pressing the mouse button (without releasing it yet) on - * the specified element. - * - * @param locator an <a href="#locators">element locator</a> - * @param coordString specifies the x,y position (i.e. - 10,20) of the mouse - * event relative to the element returned by the locator. - */ - var element = this.browserbot.findElement(locator); - var clientXY = getClientXY(element, coordString) - - this.browserbot.triggerMouseEvent(element, 'mouseup', true, clientXY[0], clientXY[1]); -}; - -Selenium.prototype.doMouseMove = function(locator) { - /** - * Simulates a user pressing the mouse button (without releasing it yet) on - * the specified element. - * - * @param locator an <a href="#locators">element locator</a> - */ - var element = this.browserbot.findElement(locator); - this.browserbot.triggerMouseEvent(element, 'mousemove', true); -}; - -Selenium.prototype.doMouseMoveAt = function(locator, coordString) { - /** - * Simulates a user pressing the mouse button (without releasing it yet) on - * the specified element. - * - * @param locator an <a href="#locators">element locator</a> - * @param coordString specifies the x,y position (i.e. - 10,20) of the mouse - * event relative to the element returned by the locator. - */ - - var element = this.browserbot.findElement(locator); - var clientXY = getClientXY(element, coordString) - - this.browserbot.triggerMouseEvent(element, 'mousemove', true, clientXY[0], clientXY[1]); -}; - -Selenium.prototype.doType = function(locator, value) { - /** - * Sets the value of an input field, as though you typed it in. - * - * <p>Can also be used to set the value of combo boxes, check boxes, etc. In these cases, - * value should be the value of the option selected, not the visible text.</p> - * - * @param locator an <a href="#locators">element locator</a> - * @param value the value to type - */ - if (this.browserbot.controlKeyDown || this.browserbot.altKeyDown || this.browserbot.metaKeyDown) { - throw new SeleniumError("type not supported immediately after call to controlKeyDown() or altKeyDown() or metaKeyDown()"); - } - // TODO fail if it can't be typed into. - var element = this.browserbot.findElement(locator); - if (this.browserbot.shiftKeyDown) { - value = new String(value).toUpperCase(); - } - this.browserbot.replaceText(element, value); -}; - -Selenium.prototype.doTypeKeys = function(locator, value) { - /** - * Simulates keystroke events on the specified element, as though you typed the value key-by-key. - * - * <p>This is a convenience method for calling keyDown, keyUp, keyPress for every character in the specified string; - * this is useful for dynamic UI widgets (like auto-completing combo boxes) that require explicit key events.</p> - * - * <p>Unlike the simple "type" command, which forces the specified value into the page directly, this command - * may or may not have any visible effect, even in cases where typing keys would normally have a visible effect. - * For example, if you use "typeKeys" on a form element, you may or may not see the results of what you typed in - * the field.</p> - * <p>In some cases, you may need to use the simple "type" command to set the value of the field and then the "typeKeys" command to - * send the keystroke events corresponding to what you just typed.</p> - * - * @param locator an <a href="#locators">element locator</a> - * @param value the value to type - */ - var keys = new String(value).split(""); - for (var i = 0; i < keys.length; i++) { - var c = keys[i]; - this.doKeyDown(locator, c); - this.doKeyUp(locator, c); - this.doKeyPress(locator, c); - } -}; - -Selenium.prototype.doSetSpeed = function(value) { - /** - * Set execution speed (i.e., set the millisecond length of a delay which will follow each selenium operation). By default, there is no such delay, i.e., - * the delay is 0 milliseconds. - * - * @param value the number of milliseconds to pause after operation - */ - throw new SeleniumError("this operation is only implemented in selenium-rc, and should never result in a request making it across the wire"); -}; - -Selenium.prototype.doGetSpeed = function() { - /** - * Get execution speed (i.e., get the millisecond length of the delay following each selenium operation). By default, there is no such delay, i.e., - * the delay is 0 milliseconds. - * - * See also setSpeed. - */ - throw new SeleniumError("this operation is only implemented in selenium-rc, and should never result in a request making it across the wire"); -}; - -Selenium.prototype.findToggleButton = function(locator) { - var element = this.browserbot.findElement(locator); - if (element.checked == null) { - Assert.fail("Element " + locator + " is not a toggle-button."); - } - return element; -} - -Selenium.prototype.doCheck = function(locator) { - /** - * Check a toggle-button (checkbox/radio) - * - * @param locator an <a href="#locators">element locator</a> - */ - this.findToggleButton(locator).checked = true; -}; - -Selenium.prototype.doUncheck = function(locator) { - /** - * Uncheck a toggle-button (checkbox/radio) - * - * @param locator an <a href="#locators">element locator</a> - */ - this.findToggleButton(locator).checked = false; -}; - -Selenium.prototype.doSelect = function(selectLocator, optionLocator) { - /** - * Select an option from a drop-down using an option locator. - * - * <p> - * Option locators provide different ways of specifying options of an HTML - * Select element (e.g. for selecting a specific option, or for asserting - * that the selected option satisfies a specification). There are several - * forms of Select Option Locator. - * </p> - * <ul> - * <li><strong>label</strong>=<em>labelPattern</em>: - * matches options based on their labels, i.e. the visible text. (This - * is the default.) - * <ul class="first last simple"> - * <li>label=regexp:^[Oo]ther</li> - * </ul> - * </li> - * <li><strong>value</strong>=<em>valuePattern</em>: - * matches options based on their values. - * <ul class="first last simple"> - * <li>value=other</li> - * </ul> - * - * - * </li> - * <li><strong>id</strong>=<em>id</em>: - * - * matches options based on their ids. - * <ul class="first last simple"> - * <li>id=option1</li> - * </ul> - * </li> - * <li><strong>index</strong>=<em>index</em>: - * matches an option based on its index (offset from zero). - * <ul class="first last simple"> - * - * <li>index=2</li> - * </ul> - * </li> - * </ul> - * <p> - * If no option locator prefix is provided, the default behaviour is to match on <strong>label</strong>. - * </p> - * - * - * @param selectLocator an <a href="#locators">element locator</a> identifying a drop-down menu - * @param optionLocator an option locator (a label by default) - */ - var element = this.browserbot.findElement(selectLocator); - if (!("options" in element)) { - throw new SeleniumError("Specified element is not a Select (has no options)"); - } - var locator = this.optionLocatorFactory.fromLocatorString(optionLocator); - var option = locator.findOption(element); - this.browserbot.selectOption(element, option); -}; - - - -Selenium.prototype.doAddSelection = function(locator, optionLocator) { - /** - * Add a selection to the set of selected options in a multi-select element using an option locator. - * - * @see #doSelect for details of option locators - * - * @param locator an <a href="#locators">element locator</a> identifying a multi-select box - * @param optionLocator an option locator (a label by default) - */ - var element = this.browserbot.findElement(locator); - if (!("options" in element)) { - throw new SeleniumError("Specified element is not a Select (has no options)"); - } - var locator = this.optionLocatorFactory.fromLocatorString(optionLocator); - var option = locator.findOption(element); - this.browserbot.addSelection(element, option); -}; - -Selenium.prototype.doRemoveSelection = function(locator, optionLocator) { - /** - * Remove a selection from the set of selected options in a multi-select element using an option locator. - * - * @see #doSelect for details of option locators - * - * @param locator an <a href="#locators">element locator</a> identifying a multi-select box - * @param optionLocator an option locator (a label by default) - */ - - var element = this.browserbot.findElement(locator); - if (!("options" in element)) { - throw new SeleniumError("Specified element is not a Select (has no options)"); - } - var locator = this.optionLocatorFactory.fromLocatorString(optionLocator); - var option = locator.findOption(element); - this.browserbot.removeSelection(element, option); -}; - -Selenium.prototype.doRemoveAllSelections = function(locator) { - /** - * Unselects all of the selected options in a multi-select element. - * - * @param locator an <a href="#locators">element locator</a> identifying a multi-select box - */ - var element = this.browserbot.findElement(locator); - if (!("options" in element)) { - throw new SeleniumError("Specified element is not a Select (has no options)"); - } - for (var i = 0; i < element.options.length; i++) { - this.browserbot.removeSelection(element, element.options[i]); - } -} - -Selenium.prototype.doSubmit = function(formLocator) { - /** - * Submit the specified form. This is particularly useful for forms without - * submit buttons, e.g. single-input "Search" forms. - * - * @param formLocator an <a href="#locators">element locator</a> for the form you want to submit - */ - var form = this.browserbot.findElement(formLocator); - return this.browserbot.submit(form); - -}; - -Selenium.prototype.makePageLoadCondition = function(timeout) { - if (timeout == null) { - timeout = this.defaultTimeout; - } - return Selenium.decorateFunctionWithTimeout(fnBind(this._isNewPageLoaded, this), timeout); -}; - -Selenium.prototype.doOpen = function(url) { - /** - * Opens an URL in the test frame. This accepts both relative and absolute - * URLs. - * - * The "open" command waits for the page to load before proceeding, - * ie. the "AndWait" suffix is implicit. - * - * <em>Note</em>: The URL must be on the same domain as the runner HTML - * due to security restrictions in the browser (Same Origin Policy). If you - * need to open an URL on another domain, use the Selenium Server to start a - * new browser session on that domain. - * - * @param url the URL to open; may be relative or absolute - */ - this.browserbot.openLocation(url); - return this.makePageLoadCondition(); -}; - -Selenium.prototype.doOpenWindow = function(url, windowID) { - /** - * Opens a popup window (if a window with that ID isn't already open). - * After opening the window, you'll need to select it using the selectWindow - * command. - * - * <p>This command can also be a useful workaround for bug SEL-339. In some cases, Selenium will be unable to intercept a call to window.open (if the call occurs during or before the "onLoad" event, for example). - * In those cases, you can force Selenium to notice the open window's name by using the Selenium openWindow command, using - * an empty (blank) url, like this: openWindow("", "myFunnyWindow").</p> - * - * @param url the URL to open, which can be blank - * @param windowID the JavaScript window ID of the window to select - */ - this.browserbot.openWindow(url, windowID); -}; - -Selenium.prototype.doSelectWindow = function(windowID) { - /** - * Selects a popup window; once a popup window has been selected, all - * commands go to that window. To select the main window again, use null - * as the target. - * - * <p>Selenium has several strategies for finding the window object referred to by the "windowID" parameter.</p> - * - * <p>1.) if windowID is null, then it is assumed the user is referring to the original window instantiated by the browser).</p> - * <p>2.) if the value of the "windowID" parameter is a JavaScript variable name in the current application window, then it is assumed - * that this variable contains the return value from a call to the JavaScript window.open() method.</p> - * <p>3.) Otherwise, selenium looks in a hash it maintains that maps string names to window objects. Each of these string - * names matches the second parameter "windowName" past to the JavaScript method window.open(url, windowName, windowFeatures, replaceFlag) - * (which selenium intercepts).</p> - * - * <p>If you're having trouble figuring out what is the name of a window that you want to manipulate, look at the selenium log messages - * which identify the names of windows created via window.open (and therefore intercepted by selenium). You will see messages - * like the following for each window as it is opened:</p> - * - * <p><code>debug: window.open call intercepted; window ID (which you can use with selectWindow()) is "myNewWindow"</code></p> - * - * <p>In some cases, Selenium will be unable to intercept a call to window.open (if the call occurs during or before the "onLoad" event, for example). - * (This is bug SEL-339.) In those cases, you can force Selenium to notice the open window's name by using the Selenium openWindow command, using - * an empty (blank) url, like this: openWindow("", "myFunnyWindow").</p> - * - * @param windowID the JavaScript window ID of the window to select - */ - this.browserbot.selectWindow(windowID); -}; - -Selenium.prototype.doSelectFrame = function(locator) { - /** - * Selects a frame within the current window. (You may invoke this command - * multiple times to select nested frames.) To select the parent frame, use - * "relative=parent" as a locator; to select the top frame, use "relative=top". - * - * <p>You may also use a DOM expression to identify the frame you want directly, - * like this: <code>dom=frames["main"].frames["subframe"]</code></p> - * - * @param locator an <a href="#locators">element locator</a> identifying a frame or iframe - */ - this.browserbot.selectFrame(locator); -}; - -Selenium.prototype.getLogMessages = function() { - /** - * Return the contents of the log. - * - * <p>This is a placeholder intended to make the code generator make this API - * available to clients. The selenium server will intercept this call, however, - * and return its recordkeeping of log messages since the last call to this API. - * Thus this code in JavaScript will never be called.</p> - * - * <p>The reason I opted for a servercentric solution is to be able to support - * multiple frames served from different domains, which would break a - * centralized JavaScript logging mechanism under some conditions.</p> - * - * @return string all log messages seen since the last call to this API - */ - return "getLogMessages should be implemented in the selenium server"; -}; - - -Selenium.prototype.getWhetherThisFrameMatchFrameExpression = function(currentFrameString, target) { - /** - * Determine whether current/locator identify the frame containing this running code. - * - * <p>This is useful in proxy injection mode, where this code runs in every - * browser frame and window, and sometimes the selenium server needs to identify - * the "current" frame. In this case, when the test calls selectFrame, this - * routine is called for each frame to figure out which one has been selected. - * The selected frame will return true, while all others will return false.</p> - * - * @param currentFrameString starting frame - * @param target new frame (which might be relative to the current one) - * @return boolean true if the new frame is this code's window - */ - var isDom = false; - if (target.indexOf("dom=") == 0) { - target = target.substr(4); - isDom = true; - } - var t; - try { - eval("t=" + currentFrameString + "." + target); - } catch (e) { - } - var autWindow = this.browserbot.getCurrentWindow(); - if (t != null) { - if (t.window == autWindow) { - return true; - } - return false; - } - if (isDom) { - return false; - } - var currentFrame; - eval("currentFrame=" + currentFrameString); - if (target == "relative=up") { - if (currentFrame.window.parent == autWindow) { - return true; - } - return false; - } - if (target == "relative=top") { - if (currentFrame.window.top == autWindow) { - return true; - } - return false; - } - if (autWindow.name == target && currentFrame.window == autWindow.parent) { - return true; - } - return false; -}; - -Selenium.prototype.getWhetherThisWindowMatchWindowExpression = function(currentWindowString, target) { - /** - * Determine whether currentWindowString plus target identify the window containing this running code. - * - * <p>This is useful in proxy injection mode, where this code runs in every - * browser frame and window, and sometimes the selenium server needs to identify - * the "current" window. In this case, when the test calls selectWindow, this - * routine is called for each window to figure out which one has been selected. - * The selected window will return true, while all others will return false.</p> - * - * @param currentWindowString starting window - * @param target new window (which might be relative to the current one, e.g., "_parent") - * @return boolean true if the new window is this code's window - */ - if (window.opener!=null && window.opener[target]!=null && window.opener[target]==window) { - return true; - } - return false; -}; - -Selenium.prototype.doWaitForPopUp = function(windowID, timeout) { - /** - * Waits for a popup window to appear and load up. - * - * @param windowID the JavaScript window ID of the window that will appear - * @param timeout a timeout in milliseconds, after which the action will return with an error - */ - var popupLoadedPredicate = function () { - var targetWindow = selenium.browserbot.getWindowByName(windowID, true); - if (!targetWindow) return false; - if (!targetWindow.location) return false; - if ("about:blank" == targetWindow.location) return false; - if (browserVersion.isKonqueror) { - if ("/" == targetWindow.location.href) { - // apparently Konqueror uses this as the temporary location, instead of about:blank - return false; - } - } - if (browserVersion.isSafari) { - if(targetWindow.location.href == selenium.browserbot.buttonWindow.location.href) { - // Apparently Safari uses this as the temporary location, instead of about:blank - // what a world! - LOG.debug("DGF what a world!"); - return false; - } - } - if (!targetWindow.document) return false; - if (!selenium.browserbot.getCurrentWindow().document.readyState) { - // This is Firefox, with no readyState extension - return true; - } - if ('complete' != targetWindow.document.readyState) return false; - return true; - }; - - return Selenium.decorateFunctionWithTimeout(popupLoadedPredicate, timeout); -} - -Selenium.prototype.doWaitForPopUp.dontCheckAlertsAndConfirms = true; - -Selenium.prototype.doChooseCancelOnNextConfirmation = function() { - /** - * By default, Selenium's overridden window.confirm() function will - * return true, as if the user had manually clicked OK. After running - * this command, the next call to confirm() will return false, as if - * the user had clicked Cancel. - * - */ - this.browserbot.cancelNextConfirmation(); -}; - - -Selenium.prototype.doAnswerOnNextPrompt = function(answer) { - /** - * Instructs Selenium to return the specified answer string in response to - * the next JavaScript prompt [window.prompt()]. - * - * - * @param answer the answer to give in response to the prompt pop-up - */ - this.browserbot.setNextPromptResult(answer); -}; - -Selenium.prototype.doGoBack = function() { - /** - * Simulates the user clicking the "back" button on their browser. - * - */ - this.browserbot.goBack(); -}; - -Selenium.prototype.doRefresh = function() { - /** - * Simulates the user clicking the "Refresh" button on their browser. - * - */ - this.browserbot.refresh(); -}; - -Selenium.prototype.doClose = function() { - /** - * Simulates the user clicking the "close" button in the titlebar of a popup - * window or tab. - */ - this.browserbot.close(); -}; - -Selenium.prototype.ensureNoUnhandledPopups = function() { - if (this.browserbot.hasAlerts()) { - throw new SeleniumError("There was an unexpected Alert! [" + this.browserbot.getNextAlert() + "]"); - } - if ( this.browserbot.hasConfirmations() ) { - throw new SeleniumError("There was an unexpected Confirmation! [" + this.browserbot.getNextConfirmation() + "]"); - } -}; - -Selenium.prototype.isAlertPresent = function() { - /** - * Has an alert occurred? - * - * <p> - * This function never throws an exception - * </p> - * @return boolean true if there is an alert - */ - return this.browserbot.hasAlerts(); -}; - -Selenium.prototype.isPromptPresent = function() { - /** - * Has a prompt occurred? - * - * <p> - * This function never throws an exception - * </p> - * @return boolean true if there is a pending prompt - */ - return this.browserbot.hasPrompts(); -}; - -Selenium.prototype.isConfirmationPresent = function() { - /** - * Has confirm() been called? - * - * <p> - * This function never throws an exception - * </p> - * @return boolean true if there is a pending confirmation - */ - return this.browserbot.hasConfirmations(); -}; -Selenium.prototype.getAlert = function() { - /** - * Retrieves the message of a JavaScript alert generated during the previous action, or fail if there were no alerts. - * - * <p>Getting an alert has the same effect as manually clicking OK. If an - * alert is generated but you do not get/verify it, the next Selenium action - * will fail.</p> - * - * <p>NOTE: under Selenium, JavaScript alerts will NOT pop up a visible alert - * dialog.</p> - * - * <p>NOTE: Selenium does NOT support JavaScript alerts that are generated in a - * page's onload() event handler. In this case a visible dialog WILL be - * generated and Selenium will hang until someone manually clicks OK.</p> - * @return string The message of the most recent JavaScript alert - */ - if (!this.browserbot.hasAlerts()) { - Assert.fail("There were no alerts"); - } - return this.browserbot.getNextAlert(); -}; -Selenium.prototype.getAlert.dontCheckAlertsAndConfirms = true; - -Selenium.prototype.getConfirmation = function() { - /** - * Retrieves the message of a JavaScript confirmation dialog generated during - * the previous action. - * - * <p> - * By default, the confirm function will return true, having the same effect - * as manually clicking OK. This can be changed by prior execution of the - * chooseCancelOnNextConfirmation command. If an confirmation is generated - * but you do not get/verify it, the next Selenium action will fail. - * </p> - * - * <p> - * NOTE: under Selenium, JavaScript confirmations will NOT pop up a visible - * dialog. - * </p> - * - * <p> - * NOTE: Selenium does NOT support JavaScript confirmations that are - * generated in a page's onload() event handler. In this case a visible - * dialog WILL be generated and Selenium will hang until you manually click - * OK. - * </p> - * - * @return string the message of the most recent JavaScript confirmation dialog - */ - if (!this.browserbot.hasConfirmations()) { - Assert.fail("There were no confirmations"); - } - return this.browserbot.getNextConfirmation(); -}; -Selenium.prototype.getConfirmation.dontCheckAlertsAndConfirms = true; - -Selenium.prototype.getPrompt = function() { - /** - * Retrieves the message of a JavaScript question prompt dialog generated during - * the previous action. - * - * <p>Successful handling of the prompt requires prior execution of the - * answerOnNextPrompt command. If a prompt is generated but you - * do not get/verify it, the next Selenium action will fail.</p> - * - * <p>NOTE: under Selenium, JavaScript prompts will NOT pop up a visible - * dialog.</p> - * - * <p>NOTE: Selenium does NOT support JavaScript prompts that are generated in a - * page's onload() event handler. In this case a visible dialog WILL be - * generated and Selenium will hang until someone manually clicks OK.</p> - * @return string the message of the most recent JavaScript question prompt - */ - if (! this.browserbot.hasPrompts()) { - Assert.fail("There were no prompts"); - } - return this.browserbot.getNextPrompt(); -}; - -Selenium.prototype.getLocation = function() { - /** Gets the absolute URL of the current page. - * - * @return string the absolute URL of the current page - */ - return this.browserbot.getCurrentWindow().location; -}; - -Selenium.prototype.getTitle = function() { - /** Gets the title of the current page. - * - * @return string the title of the current page - */ - return this.browserbot.getTitle(); -}; - - -Selenium.prototype.getBodyText = function() { - /** - * Gets the entire text of the page. - * @return string the entire text of the page - */ - return this.browserbot.bodyText(); -}; - - -Selenium.prototype.getValue = function(locator) { - /** - * Gets the (whitespace-trimmed) value of an input field (or anything else with a value parameter). - * For checkbox/radio elements, the value will be "on" or "off" depending on - * whether the element is checked or not. - * - * @param locator an <a href="#locators">element locator</a> - * @return string the element value, or "on/off" for checkbox/radio elements - */ - var element = this.browserbot.findElement(locator) - return getInputValue(element).trim(); -} - -Selenium.prototype.getText = function(locator) { - /** - * Gets the text of an element. This works for any element that contains - * text. This command uses either the textContent (Mozilla-like browsers) or - * the innerText (IE-like browsers) of the element, which is the rendered - * text shown to the user. - * - * @param locator an <a href="#locators">element locator</a> - * @return string the text of the element - */ - var element = this.browserbot.findElement(locator); - return getText(element).trim(); -}; - -Selenium.prototype.doHighlight = function(locator) { - /** - * Briefly changes the backgroundColor of the specified element yellow. Useful for debugging. - * - * @param locator an <a href="#locators">element locator</a> - */ - var element = this.browserbot.findElement(locator); - this.browserbot.highlight(element, true); -}; - -Selenium.prototype.getEval = function(script) { - /** Gets the result of evaluating the specified JavaScript snippet. The snippet may - * have multiple lines, but only the result of the last line will be returned. - * - * <p>Note that, by default, the snippet will run in the context of the "selenium" - * object itself, so <code>this</code> will refer to the Selenium object, and <code>window</code> will - * refer to the top-level runner test window, not the window of your application.</p> - * - * <p>If you need a reference to the window of your application, you can refer - * to <code>this.browserbot.getCurrentWindow()</code> and if you need to use - * a locator to refer to a single element in your application page, you can - * use <code>this.browserbot.findElement("foo")</code> where "foo" is your locator.</p> - * - * @param script the JavaScript snippet to run - * @return string the results of evaluating the snippet - */ - try { - var result = eval(script); - // Selenium RC doesn't allow returning null - if (null == result) return "null"; - return result; - } catch (e) { - throw new SeleniumError("Threw an exception: " + e.message); - } -}; - -Selenium.prototype.isChecked = function(locator) { - /** - * Gets whether a toggle-button (checkbox/radio) is checked. Fails if the specified element doesn't exist or isn't a toggle-button. - * @param locator an <a href="#locators">element locator</a> pointing to a checkbox or radio button - * @return boolean true if the checkbox is checked, false otherwise - */ - var element = this.browserbot.findElement(locator); - if (element.checked == null) { - throw new SeleniumError("Element " + locator + " is not a toggle-button."); - } - return element.checked; -}; - -Selenium.prototype.getTable = function(tableCellAddress) { - /** - * Gets the text from a cell of a table. The cellAddress syntax - * tableLocator.row.column, where row and column start at 0. - * - * @param tableCellAddress a cell address, e.g. "foo.1.4" - * @return string the text from the specified cell - */ - // This regular expression matches "tableName.row.column" - // For example, "mytable.3.4" - pattern = /(.*)\.(\d+)\.(\d+)/; - - if(!pattern.test(tableCellAddress)) { - throw new SeleniumError("Invalid target format. Correct format is tableName.rowNum.columnNum"); - } - - pieces = tableCellAddress.match(pattern); - - tableName = pieces[1]; - row = pieces[2]; - col = pieces[3]; - - var table = this.browserbot.findElement(tableName); - if (row > table.rows.length) { - Assert.fail("Cannot access row " + row + " - table has " + table.rows.length + " rows"); - } - else if (col > table.rows[row].cells.length) { - Assert.fail("Cannot access column " + col + " - table row has " + table.rows[row].cells.length + " columns"); - } - else { - actualContent = getText(table.rows[row].cells[col]); - return actualContent.trim(); - } - return null; -}; - -Selenium.prototype.getSelectedLabels = function(selectLocator) { - /** Gets all option labels (visible text) for selected options in the specified select or multi-select element. - * - * @param selectLocator an <a href="#locators">element locator</a> identifying a drop-down menu - * @return string[] an array of all selected option labels in the specified select drop-down - */ - return this.findSelectedOptionProperties(selectLocator, "text").join(","); -} - -Selenium.prototype.getSelectedLabel = function(selectLocator) { - /** Gets option label (visible text) for selected option in the specified select element. - * - * @param selectLocator an <a href="#locators">element locator</a> identifying a drop-down menu - * @return string the selected option label in the specified select drop-down - */ - return this.findSelectedOptionProperty(selectLocator, "text"); -} - -Selenium.prototype.getSelectedValues = function(selectLocator) { - /** Gets all option values (value attributes) for selected options in the specified select or multi-select element. - * - * @param selectLocator an <a href="#locators">element locator</a> identifying a drop-down menu - * @return string[] an array of all selected option values in the specified select drop-down - */ - return this.findSelectedOptionProperties(selectLocator, "value").join(","); -} - -Selenium.prototype.getSelectedValue = function(selectLocator) { - /** Gets option value (value attribute) for selected option in the specified select element. - * - * @param selectLocator an <a href="#locators">element locator</a> identifying a drop-down menu - * @return string the selected option value in the specified select drop-down - */ - return this.findSelectedOptionProperty(selectLocator, "value"); -} - -Selenium.prototype.getSelectedIndexes = function(selectLocator) { - /** Gets all option indexes (option number, starting at 0) for selected options in the specified select or multi-select element. - * - * @param selectLocator an <a href="#locators">element locator</a> identifying a drop-down menu - * @return string[] an array of all selected option indexes in the specified select drop-down - */ - return this.findSelectedOptionProperties(selectLocator, "index").join(","); -} - -Selenium.prototype.getSelectedIndex = function(selectLocator) { - /** Gets option index (option number, starting at 0) for selected option in the specified select element. - * - * @param selectLocator an <a href="#locators">element locator</a> identifying a drop-down menu - * @return string the selected option index in the specified select drop-down - */ - return this.findSelectedOptionProperty(selectLocator, "index"); -} - -Selenium.prototype.getSelectedIds = function(selectLocator) { - /** Gets all option element IDs for selected options in the specified select or multi-select element. - * - * @param selectLocator an <a href="#locators">element locator</a> identifying a drop-down menu - * @return string[] an array of all selected option IDs in the specified select drop-down - */ - return this.findSelectedOptionProperties(selectLocator, "id").join(","); -} - -Selenium.prototype.getSelectedId = function(selectLocator) { - /** Gets option element ID for selected option in the specified select element. - * - * @param selectLocator an <a href="#locators">element locator</a> identifying a drop-down menu - * @return string the selected option ID in the specified select drop-down - */ - return this.findSelectedOptionProperty(selectLocator, "id"); -} - -Selenium.prototype.isSomethingSelected = function(selectLocator) { - /** Determines whether some option in a drop-down menu is selected. - * - * @param selectLocator an <a href="#locators">element locator</a> identifying a drop-down menu - * @return boolean true if some option has been selected, false otherwise - */ - var element = this.browserbot.findElement(selectLocator); - if (!("options" in element)) { - throw new SeleniumError("Specified element is not a Select (has no options)"); - } - - var selectedOptions = []; - - for (var i = 0; i < element.options.length; i++) { - if (element.options[i].selected) - { - return true; - } - } - return false; -} - -Selenium.prototype.findSelectedOptionProperties = function(locator, property) { - var element = this.browserbot.findElement(locator); - if (!("options" in element)) { - throw new SeleniumError("Specified element is not a Select (has no options)"); - } - - var selectedOptions = []; - - for (var i = 0; i < element.options.length; i++) { - if (element.options[i].selected) - { - var propVal = element.options[i][property]; - if (propVal.replace) { - propVal.replace(/,/g, "\\,"); - } - selectedOptions.push(propVal); - } - } - if (selectedOptions.length == 0) Assert.fail("No option selected"); - return selectedOptions; -} - -Selenium.prototype.findSelectedOptionProperty = function(locator, property) { - var selectedOptions = this.findSelectedOptionProperties(locator, property); - if (selectedOptions.length > 1) { - Assert.fail("More than one selected option!"); - } - return selectedOptions[0]; -} - -Selenium.prototype.getSelectOptions = function(selectLocator) { - /** Gets all option labels in the specified select drop-down. - * - * @param selectLocator an <a href="#locators">element locator</a> identifying a drop-down menu - * @return string[] an array of all option labels in the specified select drop-down - */ - var element = this.browserbot.findElement(selectLocator); - - var selectOptions = []; - - for (var i = 0; i < element.options.length; i++) { - var option = element.options[i].text.replace(/,/g, "\\,"); - selectOptions.push(option); - } - - return selectOptions.join(","); -}; - - -Selenium.prototype.getAttribute = function(attributeLocator) { - /** - * Gets the value of an element attribute. - * - * @param attributeLocator an element locator followed by an @ sign and then the name of the attribute, e.g. "foo@bar" - * @return string the value of the specified attribute - */ - var result = this.browserbot.findAttribute(attributeLocator); - if (result == null) { - throw new SeleniumError("Could not find element attribute: " + attributeLocator); - } - return result; -}; - -Selenium.prototype.isTextPresent = function(pattern) { - /** - * Verifies that the specified text pattern appears somewhere on the rendered page shown to the user. - * @param pattern a <a href="#patterns">pattern</a> to match with the text of the page - * @return boolean true if the pattern matches the text, false otherwise - */ - var allText = this.browserbot.bodyText(); - - var patternMatcher = new PatternMatcher(pattern); - if (patternMatcher.strategy == PatternMatcher.strategies.glob) { - if (pattern.indexOf("glob:")==0) { - pattern = pattern.substring("glob:".length); // strip off "glob:" - } - patternMatcher.matcher = new PatternMatcher.strategies.globContains(pattern); - } - else if (patternMatcher.strategy == PatternMatcher.strategies.exact) { - pattern = pattern.substring("exact:".length); // strip off "exact:" - return allText.indexOf(pattern) != -1; - } - return patternMatcher.matches(allText); -}; - -Selenium.prototype.isElementPresent = function(locator) { - /** - * Verifies that the specified element is somewhere on the page. - * @param locator an <a href="#locators">element locator</a> - * @return boolean true if the element is present, false otherwise - */ - try { - this.browserbot.findElement(locator); - } catch (e) { - return false; - } - return true; -}; - -Selenium.prototype.isVisible = function(locator) { - /** - * Determines if the specified element is visible. An - * element can be rendered invisible by setting the CSS "visibility" - * property to "hidden", or the "display" property to "none", either for the - * element itself or one if its ancestors. This method will fail if - * the element is not present. - * - * @param locator an <a href="#locators">element locator</a> - * @return boolean true if the specified element is visible, false otherwise - */ - var element; - element = this.browserbot.findElement(locator); - var visibility = this.findEffectiveStyleProperty(element, "visibility"); - var _isDisplayed = this._isDisplayed(element); - return (visibility != "hidden" && _isDisplayed); -}; - -Selenium.prototype.findEffectiveStyleProperty = function(element, property) { - var effectiveStyle = this.findEffectiveStyle(element); - var propertyValue = effectiveStyle[property]; - if (propertyValue == 'inherit' && element.parentNode.style) { - return this.findEffectiveStyleProperty(element.parentNode, property); - } - return propertyValue; -}; - -Selenium.prototype._isDisplayed = function(element) { - var display = this.findEffectiveStyleProperty(element, "display"); - if (display == "none") return false; - if (element.parentNode.style) { - return this._isDisplayed(element.parentNode); - } - return true; -}; - -Selenium.prototype.findEffectiveStyle = function(element) { - if (element.style == undefined) { - return undefined; // not a styled element - } - var window = this.browserbot.getCurrentWindow(); - if (window.getComputedStyle) { - // DOM-Level-2-CSS - return window.getComputedStyle(element, null); - } - if (element.currentStyle) { - // non-standard IE alternative - return element.currentStyle; - // TODO: this won't really work in a general sense, as - // currentStyle is not identical to getComputedStyle() - // ... but it's good enough for "visibility" - } - throw new SeleniumError("cannot determine effective stylesheet in this browser"); -}; - -Selenium.prototype.isEditable = function(locator) { - /** - * Determines whether the specified input element is editable, ie hasn't been disabled. - * This method will fail if the specified element isn't an input element. - * - * @param locator an <a href="#locators">element locator</a> - * @return boolean true if the input element is editable, false otherwise - */ - var element = this.browserbot.findElement(locator); - if (element.value == undefined) { - Assert.fail("Element " + locator + " is not an input."); - } - return !element.disabled; -}; - -Selenium.prototype.getAllButtons = function() { - /** Returns the IDs of all buttons on the page. - * - * <p>If a given button has no ID, it will appear as "" in this array.</p> - * - * @return string[] the IDs of all buttons on the page - */ - return this.browserbot.getAllButtons(); -}; - -Selenium.prototype.getAllLinks = function() { - /** Returns the IDs of all links on the page. - * - * <p>If a given link has no ID, it will appear as "" in this array.</p> - * - * @return string[] the IDs of all links on the page - */ - return this.browserbot.getAllLinks(); -}; - -Selenium.prototype.getAllFields = function() { - /** Returns the IDs of all input fields on the page. - * - * <p>If a given field has no ID, it will appear as "" in this array.</p> - * - * @return string[] the IDs of all field on the page - */ - return this.browserbot.getAllFields(); -}; - -Selenium.prototype.getAttributeFromAllWindows = function(attributeName) { - /** Returns every instance of some attribute from all known windows. - * - * @param attributeName name of an attribute on the windows - * @return string[] the set of values of this attribute from all known windows. - */ - var attributes = new Array(); - - var win = selenium.browserbot.topWindow; - - // DGF normally you should use []s instead of eval "win."+attributeName - // but in this case, attributeName may contain dots (e.g. document.title) - // in that case, we have no choice but to use eval... - attributes.push(eval("win."+attributeName)); - for (var windowName in this.browserbot.openedWindows) - { - try { - win = selenium.browserbot.openedWindows[windowName]; - attributes.push(eval("win."+attributeName)); - } catch (e) {} // DGF If we miss one... meh. It's probably closed or inaccessible anyway. - } - return attributes; -}; - -Selenium.prototype.findWindow = function(soughtAfterWindowPropertyValue) { - var targetPropertyName = "name"; - if (soughtAfterWindowPropertyValue.match("^title=")) { - targetPropertyName = "document.title"; - soughtAfterWindowPropertyValue = soughtAfterWindowPropertyValue.replace(/^title=/, ""); - } - else { - // matching "name": - // If we are not in proxy injection mode, then the top-level test window will be named myiframe. - // But as far as the interface goes, we are expected to match a blank string to this window, if - // we are searching with respect to the widow name. - // So make a special case so that this logic will work: - if (PatternMatcher.matches(soughtAfterWindowPropertyValue, "")) { - return this.browserbot.getCurrentWindow(); - } - } - - // DGF normally you should use []s instead of eval "win."+attributeName - // but in this case, attributeName may contain dots (e.g. document.title) - // in that case, we have no choice but to use eval... - if (PatternMatcher.matches(soughtAfterWindowPropertyValue, eval("this.browserbot.topWindow." + targetPropertyName))) { - return this.browserbot.topWindow; - } - for (windowName in selenium.browserbot.openedWindows) { - var openedWindow = selenium.browserbot.openedWindows[windowName]; - if (PatternMatcher.matches(soughtAfterWindowPropertyValue, eval("openedWindow." + targetPropertyName))) { - return openedWindow; - } - } - throw new SeleniumError("could not find window with property " + targetPropertyName + " matching " + soughtAfterWindowPropertyValue); -}; - -Selenium.prototype.doDragdrop = function(locator, movementsString) { -/** deprecated - use dragAndDrop instead - * - * @param locator an element locator - * @param movementsString offset in pixels from the current location to which the element should be moved, e.g., "+70,-300" - */ - this.doDragAndDrop(locator, movementsString); -}; - -Selenium.prototype.doSetMouseSpeed = function(pixels) { - /** Configure the number of pixels between "mousemove" events during dragAndDrop commands (default=10). - * <p>Setting this value to 0 means that we'll send a "mousemove" event to every single pixel - * in between the start location and the end location; that can be very slow, and may - * cause some browsers to force the JavaScript to timeout.</p> - * - * <p>If the mouse speed is greater than the distance between the two dragged objects, we'll - * just send one "mousemove" at the start location and then one final one at the end location.</p> - * @param pixels the number of pixels between "mousemove" events - */ - this.mouseSpeed = pixels; -} - -Selenium.prototype.getMouseSpeed = function() { - /** Returns the number of pixels between "mousemove" events during dragAndDrop commands (default=10). - * - * @return number the number of pixels between "mousemove" events during dragAndDrop commands (default=10) - */ - this.mouseSpeed = pixels; -} - - -Selenium.prototype.doDragAndDrop = function(locator, movementsString) { - /** Drags an element a certain distance and then drops it - * @param locator an element locator - * @param movementsString offset in pixels from the current location to which the element should be moved, e.g., "+70,-300" - */ - var element = this.browserbot.findElement(locator); - var clientStartXY = getClientXY(element) - var clientStartX = clientStartXY[0]; - var clientStartY = clientStartXY[1]; - - var movements = movementsString.split(/,/); - var movementX = Number(movements[0]); - var movementY = Number(movements[1]); - - var clientFinishX = ((clientStartX + movementX) < 0) ? 0 : (clientStartX + movementX); - var clientFinishY = ((clientStartY + movementY) < 0) ? 0 : (clientStartY + movementY); - - var mouseSpeed = this.mouseSpeed; - var move = function(current, dest) { - if (current == dest) return current; - if (Math.abs(current - dest) < mouseSpeed) return dest; - return (current < dest) ? current + mouseSpeed : current - mouseSpeed; - } - - this.browserbot.triggerMouseEvent(element, 'mousedown', true, clientStartX, clientStartY); - this.browserbot.triggerMouseEvent(element, 'mousemove', true, clientStartX, clientStartY); - var clientX = clientStartX; - var clientY = clientStartY; - - while ((clientX != clientFinishX) || (clientY != clientFinishY)) { - clientX = move(clientX, clientFinishX); - clientY = move(clientY, clientFinishY); - this.browserbot.triggerMouseEvent(element, 'mousemove', true, clientX, clientY); - } - - this.browserbot.triggerMouseEvent(element, 'mousemove', true, clientFinishX, clientFinishY); - this.browserbot.triggerMouseEvent(element, 'mouseup', true, clientFinishX, clientFinishY); -}; - -Selenium.prototype.doDragAndDropToObject = function(locatorOfObjectToBeDragged, locatorOfDragDestinationObject) { -/** Drags an element and drops it on another element - * - * @param locatorOfObjectToBeDragged an element to be dragged - * @param locatorOfDragDestinationObject an element whose location (i.e., whose center-most pixel) will be the point where locatorOfObjectToBeDragged is dropped - */ - var startX = this.getElementPositionLeft(locatorOfObjectToBeDragged); - var startY = this.getElementPositionTop(locatorOfObjectToBeDragged); - - var destinationLeftX = this.getElementPositionLeft(locatorOfDragDestinationObject); - var destinationTopY = this.getElementPositionTop(locatorOfDragDestinationObject); - var destinationWidth = this.getElementWidth(locatorOfDragDestinationObject); - var destinationHeight = this.getElementHeight(locatorOfDragDestinationObject); - - var endX = Math.round(destinationLeftX + (destinationWidth / 2)); - var endY = Math.round(destinationTopY + (destinationHeight / 2)); - - var deltaX = endX - startX; - var deltaY = endY - startY; - - var movementsString = "" + deltaX + "," + deltaY; - - this.doDragAndDrop(locatorOfObjectToBeDragged, movementsString); -}; - -Selenium.prototype.doWindowFocus = function(windowName) { -/** Gives focus to a window - * - * @param windowName name of the window to be given focus - */ - this.findWindow(windowName).focus(); -}; - - -Selenium.prototype.doWindowMaximize = function(windowName) { -/** Resize window to take up the entire screen - * - * @param windowName name of the window to be enlarged - */ - var window = this.findWindow(windowName); - if (window!=null && window.screen) { - window.moveTo(0,0); - window.outerHeight = screen.availHeight; - window.outerWidth = screen.availWidth; - } -}; - -Selenium.prototype.getAllWindowIds = function() { - /** Returns the IDs of all windows that the browser knows about. - * - * @return string[] the IDs of all windows that the browser knows about. - */ - return this.getAttributeFromAllWindows("id"); -}; - -Selenium.prototype.getAllWindowNames = function() { - /** Returns the names of all windows that the browser knows about. - * - * @return string[] the names of all windows that the browser knows about. - */ - return this.getAttributeFromAllWindows("name"); -}; - -Selenium.prototype.getAllWindowTitles = function() { - /** Returns the titles of all windows that the browser knows about. - * - * @return string[] the titles of all windows that the browser knows about. - */ - return this.getAttributeFromAllWindows("document.title"); -}; - -Selenium.prototype.getHtmlSource = function() { - /** Returns the entire HTML source between the opening and - * closing "html" tags. - * - * @return string the entire HTML source - */ - return this.browserbot.getDocument().getElementsByTagName("html")[0].innerHTML; -}; - -Selenium.prototype.doSetCursorPosition = function(locator, position) { - /** - * Moves the text cursor to the specified position in the given input element or textarea. - * This method will fail if the specified element isn't an input element or textarea. - * - * @param locator an <a href="#locators">element locator</a> pointing to an input element or textarea - * @param position the numerical position of the cursor in the field; position should be 0 to move the position to the beginning of the field. You can also set the cursor to -1 to move it to the end of the field. - */ - var element = this.browserbot.findElement(locator); - if (element.value == undefined) { - Assert.fail("Element " + locator + " is not an input."); - } - if (position == -1) { - position = element.value.length; - } - - if( element.setSelectionRange && !browserVersion.isOpera) { - element.focus(); - element.setSelectionRange(/*start*/position,/*end*/position); - } - else if( element.createTextRange ) { - triggerEvent(element, 'focus', false); - var range = element.createTextRange(); - range.collapse(true); - range.moveEnd('character',position); - range.moveStart('character',position); - range.select(); - } -} - -Selenium.prototype.getElementIndex = function(locator) { - /** - * Get the relative index of an element to its parent (starting from 0). The comment node and empty text node - * will be ignored. - * - * @param locator an <a href="#locators">element locator</a> pointing to an element - * @return number of relative index of the element to its parent (starting from 0) - */ - var element = this.browserbot.findElement(locator); - var previousSibling; - var index = 0; - while ((previousSibling = element.previousSibling) != null) { - if (!this._isCommentOrEmptyTextNode(previousSibling)) { - index++; - } - element = previousSibling; - } - return index; -} - -Selenium.prototype.isOrdered = function(locator1, locator2) { - /** - * Check if these two elements have same parent and are ordered. Two same elements will - * not be considered ordered. - * - * @param locator1 an <a href="#locators">element locator</a> pointing to the first element - * @param locator2 an <a href="#locators">element locator</a> pointing to the second element - * @return boolean true if two elements are ordered and have same parent, false otherwise - */ - var element1 = this.browserbot.findElement(locator1); - var element2 = this.browserbot.findElement(locator2); - if (element1 === element2) return false; - - var previousSibling; - while ((previousSibling = element2.previousSibling) != null) { - if (previousSibling === element1) { - return true; - } - element2 = previousSibling; - } - return false; -} - -Selenium.prototype._isCommentOrEmptyTextNode = function(node) { - return node.nodeType == 8 || ((node.nodeType == 3) && !(/[^\t\n\r ]/.test(node.data))); -} - -Selenium.prototype.getElementPositionLeft = function(locator) { - /** - * Retrieves the horizontal position of an element - * - * @param locator an <a href="#locators">element locator</a> pointing to an element OR an element itself - * @return number of pixels from the edge of the frame. - */ - var element; - if ("string"==typeof locator) { - element = this.browserbot.findElement(locator); - } - else { - element = locator; - } - var x = element.offsetLeft; - var elementParent = element.offsetParent; - - while (elementParent != null) - { - if(document.all) - { - if( (elementParent.tagName != "TABLE") && (elementParent.tagName != "BODY") ) - { - x += elementParent.clientLeft; - } - } - else // Netscape/DOM - { - if(elementParent.tagName == "TABLE") - { - var parentBorder = parseInt(elementParent.border); - if(isNaN(parentBorder)) - { - var parentFrame = elementParent.getAttribute('frame'); - if(parentFrame != null) - { - x += 1; - } - } - else if(parentBorder > 0) - { - x += parentBorder; - } - } - } - x += elementParent.offsetLeft; - elementParent = elementParent.offsetParent; - } - return x; -}; - -Selenium.prototype.getElementPositionTop = function(locator) { - /** - * Retrieves the vertical position of an element - * - * @param locator an <a href="#locators">element locator</a> pointing to an element OR an element itself - * @return number of pixels from the edge of the frame. - */ - var element; - if ("string"==typeof locator) { - element = this.browserbot.findElement(locator); - } - else { - element = locator; - } - - var y = 0; - - while (element != null) - { - if(document.all) - { - if( (element.tagName != "TABLE") && (element.tagName != "BODY") ) - { - y += element.clientTop; - } - } - else // Netscape/DOM - { - if(element.tagName == "TABLE") - { - var parentBorder = parseInt(element.border); - if(isNaN(parentBorder)) - { - var parentFrame = element.getAttribute('frame'); - if(parentFrame != null) - { - y += 1; - } - } - else if(parentBorder > 0) - { - y += parentBorder; - } - } - } - y += element.offsetTop; - - // Netscape can get confused in some cases, such that the height of the parent is smaller - // than that of the element (which it shouldn't really be). If this is the case, we need to - // exclude this element, since it will result in too large a 'top' return value. - if (element.offsetParent && element.offsetParent.offsetHeight && element.offsetParent.offsetHeight < element.offsetHeight) - { - // skip the parent that's too small - element = element.offsetParent.offsetParent; - } - else - { - // Next up... - element = element.offsetParent; - } - } - return y; -}; - -Selenium.prototype.getElementWidth = function(locator) { - /** - * Retrieves the width of an element - * - * @param locator an <a href="#locators">element locator</a> pointing to an element - * @return number width of an element in pixels - */ - var element = this.browserbot.findElement(locator); - return element.offsetWidth; -}; - -Selenium.prototype.getElementHeight = function(locator) { - /** - * Retrieves the height of an element - * - * @param locator an <a href="#locators">element locator</a> pointing to an element - * @return number height of an element in pixels - */ - var element = this.browserbot.findElement(locator); - return element.offsetHeight; -}; - -Selenium.prototype.getCursorPosition = function(locator) { - /** - * Retrieves the text cursor position in the given input element or textarea; beware, this may not work perfectly on all browsers. - * - * <p>Specifically, if the cursor/selection has been cleared by JavaScript, this command will tend to - * return the position of the last location of the cursor, even though the cursor is now gone from the page. This is filed as <a href="http://jira.openqa.org/browse/SEL-243">SEL-243</a>.</p> - * This method will fail if the specified element isn't an input element or textarea, or there is no cursor in the element. - * - * @param locator an <a href="#locators">element locator</a> pointing to an input element or textarea - * @return number the numerical position of the cursor in the field - */ - var element = this.browserbot.findElement(locator); - var doc = this.browserbot.getDocument(); - var win = this.browserbot.getCurrentWindow(); - if( doc.selection && !browserVersion.isOpera){ - try { - var selectRange = doc.selection.createRange().duplicate(); - var elementRange = element.createTextRange(); - selectRange.move("character",0); - elementRange.move("character",0); - var inRange1 = selectRange.inRange(elementRange); - var inRange2 = elementRange.inRange(selectRange); - elementRange.setEndPoint("EndToEnd", selectRange); - } catch (e) { - Assert.fail("There is no cursor on this page!"); - } - var answer = String(elementRange.text).replace(/\r/g,"").length; - return answer; - } else { - if (typeof(element.selectionStart) != "undefined") { - if (win.getSelection && typeof(win.getSelection().rangeCount) != undefined && win.getSelection().rangeCount == 0) { - Assert.fail("There is no cursor on this page!"); - } - return element.selectionStart; - } - } - throw new Error("Couldn't detect cursor position on this browser!"); -} - - -Selenium.prototype.doSetContext = function(context, logLevelThreshold) { - /** - * Writes a message to the status bar and adds a note to the browser-side - * log. - * - * <p>If logLevelThreshold is specified, set the threshold for logging - * to that level (debug, info, warn, error).</p> - * - * <p>(Note that the browser-side logs will <i>not</i> be sent back to the - * server, and are invisible to the Client Driver.)</p> - * - * @param context - * the message to be sent to the browser - * @param logLevelThreshold one of "debug", "info", "warn", "error", sets the threshold for browser-side logging - */ - if (logLevelThreshold==null || logLevelThreshold=="") { - return this.browserbot.setContext(context); - } - return this.browserbot.setContext(context, logLevelThreshold); -}; - -Selenium.prototype.getExpression = function(expression) { - /** - * Returns the specified expression. - * - * <p>This is useful because of JavaScript preprocessing. - * It is used to generate commands like assertExpression and waitForExpression.</p> - * - * @param expression the value to return - * @return string the value passed in - */ - return expression; -} - -Selenium.prototype.doWaitForCondition = function(script, timeout) { - /** - * Runs the specified JavaScript snippet repeatedly until it evaluates to "true". - * The snippet may have multiple lines, but only the result of the last line - * will be considered. - * - * <p>Note that, by default, the snippet will be run in the runner's test window, not in the window - * of your application. To get the window of your application, you can use - * the JavaScript snippet <code>selenium.browserbot.getCurrentWindow()</code>, and then - * run your JavaScript in there</p> - * @param script the JavaScript snippet to run - * @param timeout a timeout in milliseconds, after which this command will return with an error - */ - return Selenium.decorateFunctionWithTimeout(function () { - return eval(script); - }, timeout); -}; - -Selenium.prototype.doWaitForCondition.dontCheckAlertsAndConfirms = true; - -Selenium.prototype.doSetTimeout = function(timeout) { - /** - * Specifies the amount of time that Selenium will wait for actions to complete. - * - * <p>Actions that require waiting include "open" and the "waitFor*" actions.</p> - * The default timeout is 30 seconds. - * @param timeout a timeout in milliseconds, after which the action will return with an error - */ - if (!timeout) { - timeout = Selenium.DEFAULT_TIMEOUT; - } - this.defaultTimeout = timeout; -} - -Selenium.prototype.doWaitForPageToLoad = function(timeout) { - /** - * Waits for a new page to load. - * - * <p>You can use this command instead of the "AndWait" suffixes, "clickAndWait", "selectAndWait", "typeAndWait" etc. - * (which are only available in the JS API).</p> - * - * <p>Selenium constantly keeps track of new pages loading, and sets a "newPageLoaded" - * flag when it first notices a page load. Running any other Selenium command after - * turns the flag to false. Hence, if you want to wait for a page to load, you must - * wait immediately after a Selenium command that caused a page-load.</p> - * @param timeout a timeout in milliseconds, after which this command will return with an error - */ - // in pi-mode, the test and the harness share the window; thus if we are executing this code, then we have loaded - if (window["proxyInjectionMode"] == null || !window["proxyInjectionMode"]) { - return this.makePageLoadCondition(timeout); - } -}; - -Selenium.prototype._isNewPageLoaded = function() { - return this.browserbot.isNewPageLoaded(); -}; - -Selenium.prototype.doWaitForPageToLoad.dontCheckAlertsAndConfirms = true; - -/** - * Evaluate a parameter, performing JavaScript evaluation and variable substitution. - * If the string matches the pattern "javascript{ ... }", evaluate the string between the braces. - */ -Selenium.prototype.preprocessParameter = function(value) { - var match = value.match(/^javascript\{((.|\r?\n)+)\}$/); - if (match && match[1]) { - return eval(match[1]).toString(); - } - return this.replaceVariables(value); -}; - -/* - * Search through str and replace all variable references ${varName} with their - * value in storedVars. - */ -Selenium.prototype.replaceVariables = function(str) { - var stringResult = str; - - // Find all of the matching variable references - var match = stringResult.match(/\$\{\w+\}/g); - if (!match) { - return stringResult; - } - - // For each match, lookup the variable value, and replace if found - for (var i = 0; match && i < match.length; i++) { - var variable = match[i]; // The replacement variable, with ${} - var name = variable.substring(2, variable.length - 1); // The replacement variable without ${} - var replacement = storedVars[name]; - if (replacement != undefined) { - stringResult = stringResult.replace(variable, replacement); - } - } - return stringResult; -}; - -Selenium.prototype.getCookie = function() { - /** - * Return all cookies of the current page under test. - * - * @return string all cookies of the current page under test - */ - var doc = this.browserbot.getDocument(); - return doc.cookie; -}; - -Selenium.prototype.doCreateCookie = function(nameValuePair, optionsString) { - /** - * Create a new cookie whose path and domain are same with those of current page - * under test, unless you specified a path for this cookie explicitly. - * - * @param nameValuePair name and value of the cookie in a format "name=value" - * @param optionsString options for the cookie. Currently supported options include 'path' and 'max_age'. - * the optionsString's format is "path=/path/, max_age=60". The order of options are irrelevant, the unit - * of the value of 'max_age' is second. - */ - var results = /[^\s=\[\]\(\),"\/\?@:;]+=[^\s=\[\]\(\),"\/\?@:;]*/.test(nameValuePair); - if (!results) { - throw new SeleniumError("Invalid parameter."); - } - var cookie = nameValuePair.trim(); - results = /max_age=(\d+)/.exec(optionsString); - if (results) { - var expireDateInMilliseconds = (new Date()).getTime() + results[1] * 1000; - cookie += "; expires=" + new Date(expireDateInMilliseconds).toGMTString(); - } - results = /path=([^\s,]+)[,]?/.exec(optionsString); - if (results) { - var path = results[1]; - if (browserVersion.khtml) { - // Safari and conquerer don't like paths with / at the end - if ("/" != path) { - path = path.replace(/\/$/, ""); - } - } - cookie += "; path=" + path; - } - LOG.debug("Setting cookie to: " + cookie); - this.browserbot.getDocument().cookie = cookie; -} - -Selenium.prototype.doDeleteCookie = function(name,path) { - /** - * Delete a named cookie with specified path. - * - * @param name the name of the cookie to be deleted - * @param path the path property of the cookie to be deleted - */ - // set the expire time of the cookie to be deleted to one minute before now. - path = path.trim(); - if (browserVersion.khtml) { - // Safari and conquerer don't like paths with / at the end - if ("/" != path) { - path = path.replace(/\/$/, ""); - } - } - var expireDateInMilliseconds = (new Date()).getTime() + (-1 * 1000); - var cookie = name.trim() + "=deleted; path=" + path + "; expires=" + new Date(expireDateInMilliseconds).toGMTString(); - LOG.debug("Setting cookie to: " + cookie); - this.browserbot.getDocument().cookie = cookie; -} - - -/** - * Factory for creating "Option Locators". - * An OptionLocator is an object for dealing with Select options (e.g. for - * finding a specified option, or asserting that the selected option of - * Select element matches some condition. - * The type of locator returned by the factory depends on the locator string: - * label=<exp> (OptionLocatorByLabel) - * value=<exp> (OptionLocatorByValue) - * index=<exp> (OptionLocatorByIndex) - * id=<exp> (OptionLocatorById) - * <exp> (default is OptionLocatorByLabel). - */ -function OptionLocatorFactory() { -} - -OptionLocatorFactory.prototype.fromLocatorString = function(locatorString) { - var locatorType = 'label'; - var locatorValue = locatorString; - // If there is a locator prefix, use the specified strategy - var result = locatorString.match(/^([a-zA-Z]+)=(.*)/); - if (result) { - locatorType = result[1]; - locatorValue = result[2]; - } - if (this.optionLocators == undefined) { - this.registerOptionLocators(); - } - if (this.optionLocators[locatorType]) { - return new this.optionLocators[locatorType](locatorValue); - } - throw new SeleniumError("Unkown option locator type: " + locatorType); -}; - -/** - * To allow for easy extension, all of the option locators are found by - * searching for all methods of OptionLocatorFactory.prototype that start - * with "OptionLocatorBy". - * TODO: Consider using the term "Option Specifier" instead of "Option Locator". - */ -OptionLocatorFactory.prototype.registerOptionLocators = function() { - this.optionLocators={}; - for (var functionName in this) { - var result = /OptionLocatorBy([A-Z].+)$/.exec(functionName); - if (result != null) { - var locatorName = result[1].lcfirst(); - this.optionLocators[locatorName] = this[functionName]; - } - } -}; - -/** - * OptionLocator for options identified by their labels. - */ -OptionLocatorFactory.prototype.OptionLocatorByLabel = function(label) { - this.label = label; - this.labelMatcher = new PatternMatcher(this.label); - this.findOption = function(element) { - for (var i = 0; i < element.options.length; i++) { - if (this.labelMatcher.matches(element.options[i].text)) { - return element.options[i]; - } - } - throw new SeleniumError("Option with label '" + this.label + "' not found"); - }; - - this.assertSelected = function(element) { - var selectedLabel = element.options[element.selectedIndex].text; - Assert.matches(this.label, selectedLabel) - }; -}; - -/** - * OptionLocator for options identified by their values. - */ -OptionLocatorFactory.prototype.OptionLocatorByValue = function(value) { - this.value = value; - this.valueMatcher = new PatternMatcher(this.value); - this.findOption = function(element) { - for (var i = 0; i < element.options.length; i++) { - if (this.valueMatcher.matches(element.options[i].value)) { - return element.options[i]; - } - } - throw new SeleniumError("Option with value '" + this.value + "' not found"); - }; - - this.assertSelected = function(element) { - var selectedValue = element.options[element.selectedIndex].value; - Assert.matches(this.value, selectedValue) - }; -}; - -/** - * OptionLocator for options identified by their index. - */ -OptionLocatorFactory.prototype.OptionLocatorByIndex = function(index) { - this.index = Number(index); - if (isNaN(this.index) || this.index < 0) { - throw new SeleniumError("Illegal Index: " + index); - } - - this.findOption = function(element) { - if (element.options.length <= this.index) { - throw new SeleniumError("Index out of range. Only " + element.options.length + " options available"); - } - return element.options[this.index]; - }; - - this.assertSelected = function(element) { - Assert.equals(this.index, element.selectedIndex); - }; -}; - -/** - * OptionLocator for options identified by their id. - */ -OptionLocatorFactory.prototype.OptionLocatorById = function(id) { - this.id = id; - this.idMatcher = new PatternMatcher(this.id); - this.findOption = function(element) { - for (var i = 0; i < element.options.length; i++) { - if (this.idMatcher.matches(element.options[i].id)) { - return element.options[i]; - } - } - throw new SeleniumError("Option with id '" + this.id + "' not found"); - }; - - this.assertSelected = function(element) { - var selectedId = element.options[element.selectedIndex].id; - Assert.matches(this.id, selectedId) - }; -}; diff --git a/tests/test_tools/selenium/core/scripts/selenium-browserbot.js b/tests/test_tools/selenium/core/scripts/selenium-browserbot.js deleted file mode 100644 index 633289e2..00000000 --- a/tests/test_tools/selenium/core/scripts/selenium-browserbot.js +++ /dev/null @@ -1,1946 +0,0 @@ -/* -* Copyright 2004 ThoughtWorks, Inc -* -* 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. -* -*/ - -/* -* This script provides the Javascript API to drive the test application contained within -* a Browser Window. -* TODO: -* Add support for more events (keyboard and mouse) -* Allow to switch "user-entry" mode from mouse-based to keyboard-based, firing different -* events in different modes. -*/ - -// The window to which the commands will be sent. For example, to click on a -// popup window, first select that window, and then do a normal click command. -var BrowserBot = function(topLevelApplicationWindow) { - this.topWindow = topLevelApplicationWindow; - this.topFrame = this.topWindow; - this.baseUrl=window.location.href; - - // the buttonWindow is the Selenium window - // it contains the Run/Pause buttons... this should *not* be the AUT window - this.buttonWindow = window; - this.currentWindow = this.topWindow; - this.currentWindowName = null; - - // We need to know this in advance, in case the frame closes unexpectedly - this.isSubFrameSelected = false; - - this.altKeyDown = false; - this.controlKeyDown = false; - this.shiftKeyDown = false; - this.metaKeyDown = false; - - this.modalDialogTest = null; - this.recordedAlerts = new Array(); - this.recordedConfirmations = new Array(); - this.recordedPrompts = new Array(); - this.openedWindows = {}; - this.nextConfirmResult = true; - this.nextPromptResult = ''; - this.newPageLoaded = false; - this.pageLoadError = null; - - this.shouldHighlightLocatedElement = false; - - this.uniqueId = new Date().getTime(); - this.pollingForLoad = new Object(); - this.permDeniedCount = new Object(); - this.windowPollers = new Array(); - // DGF for backwards compatibility - this.browserbot = this; - - var self = this; - - objectExtend(this, PageBot.prototype); - this._registerAllLocatorFunctions(); - - this.recordPageLoad = function(elementOrWindow) { - LOG.debug("Page load detected"); - try { - if (elementOrWindow.location && elementOrWindow.location.href) { - LOG.debug("Page load location=" + elementOrWindow.location.href); - } else if (elementOrWindow.contentWindow && elementOrWindow.contentWindow.location && elementOrWindow.contentWindow.location.href) { - LOG.debug("Page load location=" + elementOrWindow.contentWindow.location.href); - } else { - LOG.debug("Page load location unknown, current window location=" + this.getCurrentWindow(true).location); - } - } catch (e) { - LOG.error("Caught an exception attempting to log location; this should get noticed soon!"); - LOG.exception(e); - self.pageLoadError = e; - return; - } - self.newPageLoaded = true; - }; - - this.isNewPageLoaded = function() { - if (this.pageLoadError) { - LOG.error("isNewPageLoaded found an old pageLoadError"); - var e = this.pageLoadError; - this.pageLoadError = null; - throw e; - } - return self.newPageLoaded; - }; - -}; - -// DGF PageBot exists for backwards compatibility with old user-extensions -var PageBot = function(){}; - -BrowserBot.createForWindow = function(window, proxyInjectionMode) { - var browserbot; - LOG.debug('createForWindow'); - LOG.debug("browserName: " + browserVersion.name); - LOG.debug("userAgent: " + navigator.userAgent); - if (browserVersion.isIE) { - browserbot = new IEBrowserBot(window); - } - else if (browserVersion.isKonqueror) { - browserbot = new KonquerorBrowserBot(window); - } - else if (browserVersion.isOpera) { - browserbot = new OperaBrowserBot(window); - } - else if (browserVersion.isSafari) { - browserbot = new SafariBrowserBot(window); - } - else { - // Use mozilla by default - browserbot = new MozillaBrowserBot(window); - } - // getCurrentWindow has the side effect of modifying it to handle page loads etc - browserbot.proxyInjectionMode = proxyInjectionMode; - browserbot.getCurrentWindow(); // for modifyWindow side effect. This is not a transparent style - return browserbot; -}; - -// todo: rename? This doesn't actually "do" anything. -BrowserBot.prototype.doModalDialogTest = function(test) { - this.modalDialogTest = test; -}; - -BrowserBot.prototype.cancelNextConfirmation = function() { - this.nextConfirmResult = false; -}; - -BrowserBot.prototype.setNextPromptResult = function(result) { - this.nextPromptResult = result; -}; - -BrowserBot.prototype.hasAlerts = function() { - return (this.recordedAlerts.length > 0); -}; - -BrowserBot.prototype.relayBotToRC = function() { -}; -// override in injection.html - -BrowserBot.prototype.resetPopups = function() { - this.recordedAlerts = []; - this.recordedConfirmations = []; - this.recordedPrompts = []; -} - -BrowserBot.prototype.getNextAlert = function() { - var t = this.recordedAlerts.shift(); - this.relayBotToRC("browserbot.recordedAlerts"); - return t; -}; - -BrowserBot.prototype.hasConfirmations = function() { - return (this.recordedConfirmations.length > 0); -}; - -BrowserBot.prototype.getNextConfirmation = function() { - var t = this.recordedConfirmations.shift(); - this.relayBotToRC("browserbot.recordedConfirmations"); - return t; -}; - -BrowserBot.prototype.hasPrompts = function() { - return (this.recordedPrompts.length > 0); -}; - -BrowserBot.prototype.getNextPrompt = function() { - var t = this.recordedPrompts.shift(); - this.relayBotToRC("browserbot.recordedPrompts"); - return t; -}; - -/* Fire a mouse event in a browser-compatible manner */ - -BrowserBot.prototype.triggerMouseEvent = function(element, eventType, canBubble, clientX, clientY) { - clientX = clientX ? clientX : 0; - clientY = clientY ? clientY : 0; - - LOG.warn("triggerMouseEvent assumes setting screenX and screenY to 0 is ok"); - var screenX = 0; - var screenY = 0; - - canBubble = (typeof(canBubble) == undefined) ? true : canBubble; - if (element.fireEvent) { - LOG.info("element has fireEvent"); - var evt = createEventObject(element, this.controlKeyDown, this.altKeyDown, this.shiftKeyDown, this.metaKeyDown); - evt.detail = 0; - evt.button = 1; - evt.relatedTarget = null; - if (!screenX && !screenY && !clientX && !clientY && !this.controlKeyDown && !this.altKeyDown && !this.shiftKeyDown && !this.metaKeyDown) { - element.fireEvent('on' + eventType); - } - else { - evt.screenX = screenX; - evt.screenY = screenY; - evt.clientX = clientX; - evt.clientY = clientY; - - // when we go this route, window.event is never set to contain the event we have just created. - // ideally we could just slide it in as follows in the try-block below, but this normally - // doesn't work. This is why I try to avoid this code path, which is only required if we need to - // set attributes on the event (e.g., clientX). - try { - window.event = evt; - } - catch(e) { - // getting an "Object does not support this action or property" error. Save the event away - // for future reference. - // TODO: is there a way to update window.event? - - // work around for http://jira.openqa.org/browse/SEL-280 -- make the event available somewhere: - selenium.browserbot.getCurrentWindow().selenium_event = evt; - } - element.fireEvent('on' + eventType, evt); - } - } - else { - LOG.info("element doesn't have fireEvent"); - var evt = document.createEvent('MouseEvents'); - if (evt.initMouseEvent) - { - LOG.info("element has initMouseEvent"); - //Safari - evt.initMouseEvent(eventType, canBubble, true, document.defaultView, 1, screenX, screenY, clientX, clientY, - this.controlKeyDown, this.altKeyDown, this.shiftKeyDown, this.metaKeyDown, 0, null); - } - else { - LOG.warn("element doesn't have initMouseEvent; firing an event which should -- but doesn't -- have other mouse-event related attributes here, as well as controlKeyDown, altKeyDown, shiftKeyDown, metaKeyDown"); - evt.initEvent(eventType, canBubble, true); - - evt.shiftKey = this.shiftKeyDown; - evt.metaKey = this.metaKeyDown; - evt.altKey = this.altKeyDown; - evt.ctrlKey = this.controlKeyDown; - - } - element.dispatchEvent(evt); - } -} - -BrowserBot.prototype._windowClosed = function(win) { - var c = win.closed; - if (c == null) return true; - return c; -}; - -BrowserBot.prototype._modifyWindow = function(win) { - // In proxyInjectionMode, have to suppress LOG calls in _modifyWindow to avoid an infinite loop - if (this._windowClosed(win)) { - if (!this.proxyInjectionMode) { - LOG.error("modifyWindow: Window was closed!"); - } - return null; - } - if (!this.proxyInjectionMode) { - LOG.debug('modifyWindow ' + this.uniqueId + ":" + win[this.uniqueId]); - } - if (!win[this.uniqueId]) { - win[this.uniqueId] = true; - this.modifyWindowToRecordPopUpDialogs(win, this); - } - // In proxyInjection mode, we have our own mechanism for detecting page loads - if (!this.proxyInjectionMode) { - this.modifySeparateTestWindowToDetectPageLoads(win); - } - if (win.frames && win.frames.length && win.frames.length > 0) { - for (var i = 0; i < win.frames.length; i++) { - try { - this._modifyWindow(win.frames[i]); - } catch (e) {} // we're just trying to be opportunistic; don't worry if this doesn't work out - } - } - return win; -}; - -BrowserBot.prototype.selectWindow = function(target) { - if (target && target != "null") { - this._selectWindowByName(target); - } else { - this._selectTopWindow(); - } -}; - -BrowserBot.prototype._selectTopWindow = function() { - this.currentWindowName = null; - this.currentWindow = this.topWindow; - this.topFrame = this.topWindow; - this.isSubFrameSelected = false; -} - -BrowserBot.prototype._selectWindowByName = function(target) { - this.currentWindow = this.getWindowByName(target, false); - this.topFrame = this.currentWindow; - this.currentWindowName = target; - this.isSubFrameSelected = false; -} - -BrowserBot.prototype.selectFrame = function(target) { - if (target == "relative=up") { - this.currentWindow = this.getCurrentWindow().parent; - this.isSubFrameSelected = (this._getFrameElement(this.currentWindow) != null); - } else if (target == "relative=top") { - this.currentWindow = this.topFrame; - this.isSubFrameSelected = false; - } else { - var frame = this.findElement(target); - if (frame == null) { - throw new SeleniumError("Not found: " + target); - } - // now, did they give us a frame or a frame ELEMENT? - var match = false; - if (frame.contentWindow) { - // this must be a frame element - if (browserVersion.isHTA) { - // stupid HTA bug; can't get in the front door - target = frame.contentWindow.name; - } else { - this.currentWindow = frame.contentWindow; - this.isSubFrameSelected = true; - match = true; - } - } else if (frame.document && frame.location) { - // must be an actual window frame - this.currentWindow = frame; - this.isSubFrameSelected = true; - match = true; - } - - if (!match) { - // neither, let's loop through the frame names - var win = this.getCurrentWindow(); - - if (win && win.frames && win.frames.length) { - for (var i = 0; i < win.frames.length; i++) { - if (win.frames[i].name == target) { - this.currentWindow = win.frames[i]; - this.isSubFrameSelected = true; - match = true; - break; - } - } - } - if (!match) { - throw new SeleniumError("Not a frame: " + target); - } - } - } - // modifies the window - this.getCurrentWindow(); -}; - -BrowserBot.prototype.openLocation = function(target) { - // We're moving to a new page - clear the current one - var win = this.getCurrentWindow(); - LOG.debug("openLocation newPageLoaded = false"); - this.newPageLoaded = false; - - this.setOpenLocation(win, target); -}; - -BrowserBot.prototype.openWindow = function(url, windowID) { - if (url != "") { - url = absolutify(url, this.baseUrl); - } - if (browserVersion.isHTA) { - // in HTA mode, calling .open on the window interprets the url relative to that window - // we need to absolute-ize the URL to make it consistent - var child = this.getCurrentWindow().open(url, windowID); - selenium.browserbot.openedWindows[windowID] = child; - } else { - this.getCurrentWindow().open(url, windowID); - } -}; - -BrowserBot.prototype.setIFrameLocation = function(iframe, location) { - iframe.src = location; -}; - -BrowserBot.prototype.setOpenLocation = function(win, loc) { - loc = absolutify(loc, this.baseUrl); - if (browserVersion.isHTA) { - var oldHref = win.location.href; - win.location.href = loc; - var marker = null; - try { - marker = this.isPollingForLoad(win); - if (marker && win.location[marker]) { - win.location[marker] = false; - } - } catch (e) {} // DGF don't know why, but this often fails - } else { - win.location.href = loc; - } -}; - -BrowserBot.prototype.getCurrentPage = function() { - return this; -}; - -BrowserBot.prototype.modifyWindowToRecordPopUpDialogs = function(windowToModify, browserBot) { - var self = this; - - windowToModify.alert = function(alert) { - browserBot.recordedAlerts.push(alert); - self.relayBotToRC("browserbot.recordedAlerts"); - }; - - windowToModify.confirm = function(message) { - browserBot.recordedConfirmations.push(message); - var result = browserBot.nextConfirmResult; - browserBot.nextConfirmResult = true; - self.relayBotToRC("browserbot.recordedConfirmations"); - return result; - }; - - windowToModify.prompt = function(message) { - browserBot.recordedPrompts.push(message); - var result = !browserBot.nextConfirmResult ? null : browserBot.nextPromptResult; - browserBot.nextConfirmResult = true; - browserBot.nextPromptResult = ''; - self.relayBotToRC("browserbot.recordedPrompts"); - return result; - }; - - // Keep a reference to all popup windows by name - // note that in IE the "windowName" argument must be a valid javascript identifier, it seems. - var originalOpen = windowToModify.open; - var originalOpenReference; - if (browserVersion.isHTA) { - originalOpenReference = 'selenium_originalOpen' + new Date().getTime(); - windowToModify[originalOpenReference] = windowToModify.open; - } - - var isHTA = browserVersion.isHTA; - - var newOpen = function(url, windowName, windowFeatures, replaceFlag) { - var myOriginalOpen = originalOpen; - if (isHTA) { - myOriginalOpen = this[originalOpenReference]; - } - var openedWindow = myOriginalOpen(url, windowName, windowFeatures, replaceFlag); - LOG.debug("window.open call intercepted; window ID (which you can use with selectWindow()) is \"" + windowName + "\""); - if (windowName!=null) { - openedWindow["seleniumWindowName"] = windowName; - } - selenium.browserbot.openedWindows[windowName] = openedWindow; - return openedWindow; - }; - - if (browserVersion.isHTA) { - originalOpenReference = 'selenium_originalOpen' + new Date().getTime(); - newOpenReference = 'selenium_newOpen' + new Date().getTime(); - var setOriginalRef = "this['" + originalOpenReference + "'] = this.open;"; - - if (windowToModify.eval) { - windowToModify.eval(setOriginalRef); - windowToModify.open = newOpen; - } else { - // DGF why can't I eval here? Seems like I'm querying the window at a bad time, maybe? - setOriginalRef += "this.open = this['" + newOpenReference + "'];"; - windowToModify[newOpenReference] = newOpen; - windowToModify.setTimeout(setOriginalRef, 0); - } - } else { - windowToModify.open = newOpen; - } -}; - -/** - * Call the supplied function when a the current page unloads and a new one loads. - * This is done by polling continuously until the document changes and is fully loaded. - */ -BrowserBot.prototype.modifySeparateTestWindowToDetectPageLoads = function(windowObject) { - // Since the unload event doesn't fire in Safari 1.3, we start polling immediately - if (!windowObject) { - LOG.warn("modifySeparateTestWindowToDetectPageLoads: no windowObject!"); - return; - } - if (this._windowClosed(windowObject)) { - LOG.info("modifySeparateTestWindowToDetectPageLoads: windowObject was closed"); - return; - } - var oldMarker = this.isPollingForLoad(windowObject); - if (oldMarker) { - LOG.debug("modifySeparateTestWindowToDetectPageLoads: already polling this window: " + oldMarker); - return; - } - - var marker = 'selenium' + new Date().getTime(); - LOG.debug("Starting pollForLoad (" + marker + "): " + windowObject.location); - this.pollingForLoad[marker] = true; - // if this is a frame, add a load listener, otherwise, attach a poller - var frameElement = this._getFrameElement(windowObject); - // DGF HTA mode can't attach load listeners to subframes (yuk!) - var htaSubFrame = this._isHTASubFrame(windowObject); - if (frameElement && !htaSubFrame) { - LOG.debug("modifySeparateTestWindowToDetectPageLoads: this window is a frame; attaching a load listener"); - addLoadListener(frameElement, this.recordPageLoad); - frameElement[marker] = true; - frameElement[this.uniqueId] = marker; - } else { - windowObject.location[marker] = true; - windowObject[this.uniqueId] = marker; - this.pollForLoad(this.recordPageLoad, windowObject, windowObject.document, windowObject.location, windowObject.location.href, marker); - } -}; - -BrowserBot.prototype._isHTASubFrame = function(win) { - if (!browserVersion.isHTA) return false; - // DGF this is wrong! what if "win" isn't the selected window? - return this.isSubFrameSelected; -} - -BrowserBot.prototype._getFrameElement = function(win) { - var frameElement = null; - var caught; - try { - frameElement = win.frameElement; - } catch (e) { - caught = true; - } - if (caught) { - // on IE, checking frameElement in a pop-up results in a "No such interface supported" exception - // but it might have a frame element anyway! - var parentContainsIdenticallyNamedFrame = false; - try { - parentContainsIdenticallyNamedFrame = win.parent.frames[win.name]; - } catch (e) {} // this may fail if access is denied to the parent; in that case, assume it's not a pop-up - - if (parentContainsIdenticallyNamedFrame) { - // it can't be a coincidence that the parent has a frame with the same name as myself! - return BrowserBot.prototype.locateElementByName(win.name, win.parent.document, win.parent); - } - } - return frameElement; -} - -/** - * Set up a polling timer that will keep checking the readyState of the document until it's complete. - * Since we might call this before the original page is unloaded, we first check to see that the current location - * or href is different from the original one. - */ -BrowserBot.prototype.pollForLoad = function(loadFunction, windowObject, originalDocument, originalLocation, originalHref, marker) { - LOG.debug("pollForLoad original (" + marker + "): " + originalHref); - try { - if (this._windowClosed(windowObject)) { - LOG.debug("pollForLoad WINDOW CLOSED (" + marker + ")"); - delete this.pollingForLoad[marker]; - return; - } - - var isSamePage = this._isSamePage(windowObject, originalDocument, originalLocation, originalHref, marker); - var rs = this.getReadyState(windowObject, windowObject.document); - - if (!isSamePage && rs == 'complete') { - var currentHref = windowObject.location.href; - LOG.debug("pollForLoad FINISHED (" + marker + "): " + rs + " (" + currentHref + ")"); - delete this.pollingForLoad[marker]; - this._modifyWindow(windowObject); - var newMarker = this.isPollingForLoad(windowObject); - if (!newMarker) { - LOG.debug("modifyWindow didn't start new poller: " + newMarker); - this.modifySeparateTestWindowToDetectPageLoads(windowObject); - } - newMarker = this.isPollingForLoad(windowObject); - var currentlySelectedWindow; - var currentlySelectedWindowMarker; - currentlySelectedWindow =this.getCurrentWindow(true); - currentlySelectedWindowMarker = currentlySelectedWindow[this.uniqueId]; - - LOG.debug("pollForLoad (" + marker + ") restarting " + newMarker); - if (/(TestRunner-splash|Blank)\.html\?start=true$/.test(currentHref)) { - LOG.debug("pollForLoad Oh, it's just the starting page. Never mind!"); - } else if (currentlySelectedWindowMarker == newMarker) { - loadFunction(currentlySelectedWindow); - } else { - LOG.debug("pollForLoad page load detected in non-current window; ignoring (currentlySelected="+currentlySelectedWindowMarker+", detection in "+newMarker+")"); - } - return; - } - LOG.debug("pollForLoad continue (" + marker + "): " + currentHref); - this.reschedulePoller(loadFunction, windowObject, originalDocument, originalLocation, originalHref, marker); - } catch (e) { - LOG.error("Exception during pollForLoad; this should get noticed soon (" + e.message + ")!"); - LOG.exception(e); - this.pageLoadError = e; - } -}; - -BrowserBot.prototype._isSamePage = function(windowObject, originalDocument, originalLocation, originalHref, marker) { - var currentDocument = windowObject.document; - var currentLocation = windowObject.location; - var currentHref = currentLocation.href - - var sameDoc = this._isSameDocument(originalDocument, currentDocument); - - var sameLoc = (originalLocation === currentLocation); - - // hash marks don't meant the page has loaded, so we need to strip them off if they exist... - var currentHash = currentHref.indexOf('#'); - if (currentHash > 0) { - currentHref = currentHref.substring(0, currentHash); - } - var originalHash = originalHref.indexOf('#'); - if (originalHash > 0) { - originalHref = originalHref.substring(0, originalHash); - } - LOG.debug("_isSamePage: currentHref: " + currentHref); - LOG.debug("_isSamePage: originalHref: " + originalHref); - - var sameHref = (originalHref === currentHref); - var markedLoc = currentLocation[marker]; - - if (browserVersion.isKonqueror || browserVersion.isSafari) { - // the mark disappears too early on these browsers - markedLoc = true; - } - - // since this is some _very_ important logic, especially for PI and multiWindow mode, we should log all these out - LOG.debug("_isSamePage: sameDoc: " + sameDoc); - LOG.debug("_isSamePage: sameLoc: " + sameLoc); - LOG.debug("_isSamePage: sameHref: " + sameHref); - LOG.debug("_isSamePage: markedLoc: " + markedLoc); - - return sameDoc && sameLoc && sameHref && markedLoc -}; - -BrowserBot.prototype._isSameDocument = function(originalDocument, currentDocument) { - return originalDocument === currentDocument; -}; - - -BrowserBot.prototype.getReadyState = function(windowObject, currentDocument) { - var rs = currentDocument.readyState; - if (rs == null) { - if ((this.buttonWindow!=null && this.buttonWindow.document.readyState == null) // not proxy injection mode (and therefore buttonWindow isn't null) - || (top.document.readyState == null)) { // proxy injection mode (and therefore everything's in the top window, but buttonWindow doesn't exist) - // uh oh! we're probably on Firefox with no readyState extension installed! - // We'll have to just take a guess as to when the document is loaded; this guess - // will never be perfect. :-( - if (typeof currentDocument.getElementsByTagName != 'undefined' - && typeof currentDocument.getElementById != 'undefined' - && ( currentDocument.getElementsByTagName('body')[0] != null - || currentDocument.body != null )) { - if (windowObject.frameElement && windowObject.location.href == "about:blank" && windowObject.frameElement.src != "about:blank") { - LOG.info("getReadyState not loaded, frame location was about:blank, but frame src = " + windowObject.frameElement.src); - return null; - } - LOG.debug("getReadyState = windowObject.frames.length = " + windowObject.frames.length); - for (var i = 0; i < windowObject.frames.length; i++) { - LOG.debug("i = " + i); - if (this.getReadyState(windowObject.frames[i], windowObject.frames[i].document) != 'complete') { - LOG.debug("getReadyState aha! the nested frame " + windowObject.frames[i].name + " wasn't ready!"); - return null; - } - } - - rs = 'complete'; - } else { - LOG.debug("pollForLoad readyState was null and DOM appeared to not be ready yet"); - } - } - } - else if (rs == "loading" && browserVersion.isIE) { - LOG.debug("pageUnloading = true!!!!"); - this.pageUnloading = true; - } - LOG.debug("getReadyState returning " + rs); - return rs; -}; - -/** This function isn't used normally, but was the way we used to schedule pollers: - asynchronously executed autonomous units. This is deprecated, but remains here - for future reference. - */ -BrowserBot.prototype.XXXreschedulePoller = function(loadFunction, windowObject, originalDocument, originalLocation, originalHref, marker) { - var self = this; - window.setTimeout(function() { - self.pollForLoad(loadFunction, windowObject, originalDocument, originalLocation, originalHref, marker); - }, 500); -}; - -/** This function isn't used normally, but is useful for debugging asynchronous pollers - * To enable it, rename it to "reschedulePoller", so it will override the - * existing reschedulePoller function - */ -BrowserBot.prototype.XXXreschedulePoller = function(loadFunction, windowObject, originalDocument, originalLocation, originalHref, marker) { - var doc = this.buttonWindow.document; - var button = doc.createElement("button"); - var buttonName = doc.createTextNode(marker + " - " + windowObject.name); - button.appendChild(buttonName); - var tools = doc.getElementById("tools"); - var self = this; - button.onclick = function() { - tools.removeChild(button); - self.pollForLoad(loadFunction, windowObject, originalDocument, originalLocation, originalHref, marker); - }; - tools.appendChild(button); - window.setTimeout(button.onclick, 500); -}; - -BrowserBot.prototype.reschedulePoller = function(loadFunction, windowObject, originalDocument, originalLocation, originalHref, marker) { - var self = this; - var pollerFunction = function() { - self.pollForLoad(loadFunction, windowObject, originalDocument, originalLocation, originalHref, marker); - }; - this.windowPollers.push(pollerFunction); -}; - -BrowserBot.prototype.runScheduledPollers = function() { - LOG.debug("runScheduledPollers"); - var oldPollers = this.windowPollers; - this.windowPollers = new Array(); - for (var i = 0; i < oldPollers.length; i++) { - oldPollers[i].call(); - } - LOG.debug("runScheduledPollers DONE"); -}; - -BrowserBot.prototype.isPollingForLoad = function(win) { - var marker; - var frameElement = this._getFrameElement(win); - var htaSubFrame = this._isHTASubFrame(win); - if (frameElement && !htaSubFrame) { - marker = frameElement[this.uniqueId]; - } else { - marker = win[this.uniqueId]; - } - if (!marker) { - LOG.debug("isPollingForLoad false, missing uniqueId " + this.uniqueId + ": " + marker); - return false; - } - if (!this.pollingForLoad[marker]) { - LOG.debug("isPollingForLoad false, this.pollingForLoad[" + marker + "]: " + this.pollingForLoad[marker]); - return false; - } - return marker; -}; - -BrowserBot.prototype.getWindowByName = function(windowName, doNotModify) { - LOG.debug("getWindowByName(" + windowName + ")"); - // First look in the map of opened windows - var targetWindow = this.openedWindows[windowName]; - if (!targetWindow) { - targetWindow = this.topWindow[windowName]; - } - if (!targetWindow && windowName == "_blank") { - for (var winName in this.openedWindows) { - // _blank can match selenium_blank*, if it looks like it's OK (valid href, not closed) - if (/^selenium_blank/.test(winName)) { - targetWindow = this.openedWindows[winName]; - var ok; - try { - if (!this._windowClosed(targetWindow)) { - ok = targetWindow.location.href; - } - } catch (e) {} - if (ok) break; - } - } - } - if (!targetWindow) { - throw new SeleniumError("Window does not exist"); - } - if (browserVersion.isHTA) { - try { - targetWindow.location.href; - } catch (e) { - targetWindow = window.open("", targetWindow.name); - this.openedWindows[targetWindow.name] = targetWindow; - } - } - if (!doNotModify) { - this._modifyWindow(targetWindow); - } - return targetWindow; -}; - -BrowserBot.prototype.getCurrentWindow = function(doNotModify) { - var testWindow = this.currentWindow; - if (!doNotModify) { - this._modifyWindow(testWindow); - if (!this.proxyInjectionMode) { - // In proxy injection mode, have to avoid logging during getCurrentWindow to avoid an infinite loop - LOG.debug("getCurrentWindow newPageLoaded = false"); - } - this.newPageLoaded = false; - } - testWindow = this._handleClosedSubFrame(testWindow, doNotModify); - return testWindow; -}; - -BrowserBot.prototype._handleClosedSubFrame = function(testWindow, doNotModify) { - if (this.proxyInjectionMode) { - return testWindow; - } - - if (this.isSubFrameSelected) { - var missing = true; - if (testWindow.parent && testWindow.parent.frames && testWindow.parent.frames.length) { - for (var i = 0; i < testWindow.parent.frames.length; i++) { - if (testWindow.parent.frames[i] == testWindow) { - missing = false; - break; - } - } - } - if (missing) { - LOG.warn("Current subframe appears to have closed; selecting top frame"); - this.selectFrame("relative=top"); - return this.getCurrentWindow(doNotModify); - } - } else if (this._windowClosed(testWindow)) { - var closedError = new SeleniumError("Current window or frame is closed!"); - closedError.windowClosed = true; - throw closedError; - } - return testWindow; -}; - -BrowserBot.prototype.highlight = function (element, force) { - if (force || this.shouldHighlightLocatedElement) { - try { - highlight(element); - } catch (e) {} // DGF element highlighting is low-priority and possibly dangerous - } - return element; -} - -BrowserBot.prototype.setShouldHighlightElement = function (shouldHighlight) { - this.shouldHighlightLocatedElement = shouldHighlight; -} - -/*****************************************************************/ -/* BROWSER-SPECIFIC FUNCTIONS ONLY AFTER THIS LINE */ - - -BrowserBot.prototype._registerAllLocatorFunctions = function() { - // TODO - don't do this in the constructor - only needed once ever - this.locationStrategies = {}; - for (var functionName in this) { - var result = /^locateElementBy([A-Z].+)$/.exec(functionName); - if (result != null) { - var locatorFunction = this[functionName]; - if (typeof(locatorFunction) != 'function') { - continue; - } - // Use a specified prefix in preference to one generated from - // the function name - var locatorPrefix = locatorFunction.prefix || result[1].toLowerCase(); - this.locationStrategies[locatorPrefix] = locatorFunction; - } - } - - /** - * Find a locator based on a prefix. - */ - this.findElementBy = function(locatorType, locator, inDocument, inWindow) { - var locatorFunction = this.locationStrategies[locatorType]; - if (! locatorFunction) { - throw new SeleniumError("Unrecognised locator type: '" + locatorType + "'"); - } - return locatorFunction.call(this, locator, inDocument, inWindow); - }; - - /** - * The implicit locator, that is used when no prefix is supplied. - */ - this.locationStrategies['implicit'] = function(locator, inDocument, inWindow) { - if (locator.startsWith('//')) { - return this.locateElementByXPath(locator, inDocument, inWindow); - } - if (locator.startsWith('document.')) { - return this.locateElementByDomTraversal(locator, inDocument, inWindow); - } - return this.locateElementByIdentifier(locator, inDocument, inWindow); - }; -} - -BrowserBot.prototype.getDocument = function() { - return this.getCurrentWindow().document; -} - -BrowserBot.prototype.getTitle = function() { - var t = this.getDocument().title; - if (typeof(t) == "string") { - t = t.trim(); - } - return t; -} - -/* - * Finds an element recursively in frames and nested frames - * in the specified document, using various lookup protocols - */ -BrowserBot.prototype.findElementRecursive = function(locatorType, locatorString, inDocument, inWindow) { - - var element = this.findElementBy(locatorType, locatorString, inDocument, inWindow); - if (element != null) { - return element; - } - - for (var i = 0; i < inWindow.frames.length; i++) { - element = this.findElementRecursive(locatorType, locatorString, inWindow.frames[i].document, inWindow.frames[i]); - - if (element != null) { - return element; - } - } -}; - -/* -* Finds an element on the current page, using various lookup protocols -*/ -BrowserBot.prototype.findElement = function(locator) { - var locatorType = 'implicit'; - var locatorString = locator; - - // If there is a locator prefix, use the specified strategy - var result = locator.match(/^([A-Za-z]+)=(.+)/); - if (result) { - locatorType = result[1].toLowerCase(); - locatorString = result[2]; - } - - var element = this.findElementRecursive(locatorType, locatorString, this.getDocument(), this.getCurrentWindow()) - - if (element != null) { - return this.browserbot.highlight(element); - } - - // Element was not found by any locator function. - throw new SeleniumError("Element " + locator + " not found"); -}; - -/** - * In non-IE browsers, getElementById() does not search by name. Instead, we - * we search separately by id and name. - */ -BrowserBot.prototype.locateElementByIdentifier = function(identifier, inDocument, inWindow) { - return BrowserBot.prototype.locateElementById(identifier, inDocument, inWindow) - || BrowserBot.prototype.locateElementByName(identifier, inDocument, inWindow) - || null; -}; - -/** - * Find the element with id - can't rely on getElementById, coz it returns by name as well in IE.. - */ -BrowserBot.prototype.locateElementById = function(identifier, inDocument, inWindow) { - var element = inDocument.getElementById(identifier); - if (element && element.id === identifier) { - return element; - } - else { - return null; - } -}; - -/** - * Find an element by name, refined by (optional) element-filter - * expressions. - */ -BrowserBot.prototype.locateElementByName = function(locator, document, inWindow) { - var elements = document.getElementsByTagName("*"); - - var filters = locator.split(' '); - filters[0] = 'name=' + filters[0]; - - while (filters.length) { - var filter = filters.shift(); - elements = this.selectElements(filter, elements, 'value'); - } - - if (elements.length > 0) { - return elements[0]; - } - return null; -}; - -/** - * Finds an element using by evaluating the specfied string. - */ -BrowserBot.prototype.locateElementByDomTraversal = function(domTraversal, document, window) { - - var browserbot = this.browserbot; - var element = null; - try { - element = eval(domTraversal); - } catch (e) { - e.isSeleniumError = true; - throw e; - } - - if (!element) { - return null; - } - - return element; -}; -BrowserBot.prototype.locateElementByDomTraversal.prefix = "dom"; - -/** - * Finds an element identified by the xpath expression. Expressions _must_ - * begin with "//". - */ -BrowserBot.prototype.locateElementByXPath = function(xpath, inDocument, inWindow) { - - // Trim any trailing "/": not valid xpath, and remains from attribute - // locator. - if (xpath.charAt(xpath.length - 1) == '/') { - xpath = xpath.slice(0, -1); - } - - // Handle //tag - var match = xpath.match(/^\/\/(\w+|\*)$/); - if (match) { - var elements = inDocument.getElementsByTagName(match[1].toUpperCase()); - if (elements == null) return null; - return elements[0]; - } - - // Handle //tag[@attr='value'] - var match = xpath.match(/^\/\/(\w+|\*)\[@(\w+)=('([^\']+)'|"([^\"]+)")\]$/); - if (match) { - // We don't return the value without checking if it is null first. - // This is beacuse in some rare cases, this shortcut actually WONT work - // but that the full XPath WILL. A known case, for example, is in IE - // when the attribute is onclick/onblur/onsubmit/etc. Due to a bug in IE - // this shortcut won't work because the actual function is returned - // by getAttribute() rather than the text of the attribute. - var val = this._findElementByTagNameAndAttributeValue( - inDocument, - match[1].toUpperCase(), - match[2].toLowerCase(), - match[3].slice(1, -1) - ); - if (val) { - return val; - } - } - - // Handle //tag[text()='value'] - var match = xpath.match(/^\/\/(\w+|\*)\[text\(\)=('([^\']+)'|"([^\"]+)")\]$/); - if (match) { - return this._findElementByTagNameAndText( - inDocument, - match[1].toUpperCase(), - match[2].slice(1, -1) - ); - } - - return this._findElementUsingFullXPath(xpath, inDocument); -}; - -BrowserBot.prototype._findElementByTagNameAndAttributeValue = function( - inDocument, tagName, attributeName, attributeValue - ) { - if (browserVersion.isIE && attributeName == "class") { - attributeName = "className"; - } - var elements = inDocument.getElementsByTagName(tagName); - for (var i = 0; i < elements.length; i++) { - var elementAttr = elements[i].getAttribute(attributeName); - if (elementAttr == attributeValue) { - return elements[i]; - } - } - return null; -}; - -BrowserBot.prototype._findElementByTagNameAndText = function( - inDocument, tagName, text - ) { - var elements = inDocument.getElementsByTagName(tagName); - for (var i = 0; i < elements.length; i++) { - if (getText(elements[i]) == text) { - return elements[i]; - } - } - return null; -}; - -BrowserBot.prototype._namespaceResolver = function(prefix) { - if (prefix == 'html' || prefix == 'xhtml' || prefix == 'x') { - return 'http://www.w3.org/1999/xhtml'; - } else if (prefix == 'mathml') { - return 'http://www.w3.org/1998/Math/MathML'; - } else { - throw new Error("Unknown namespace: " + prefix + "."); - } -} - -BrowserBot.prototype._findElementUsingFullXPath = function(xpath, inDocument, inWindow) { - // HUGE hack - remove namespace from xpath for IE - if (browserVersion.isIE) { - xpath = xpath.replace(/x:/g, '') - } - - // Use document.evaluate() if it's available - if (inDocument.evaluate) { - return inDocument.evaluate(xpath, inDocument, this._namespaceResolver, 0, null).iterateNext(); - } - - // If not, fall back to slower JavaScript implementation - var context = new ExprContext(inDocument); - var xpathObj = xpathParse(xpath); - var xpathResult = xpathObj.evaluate(context); - if (xpathResult && xpathResult.value) { - return xpathResult.value[0]; - } - return null; -}; - -/** - * Finds a link element with text matching the expression supplied. Expressions must - * begin with "link:". - */ -BrowserBot.prototype.locateElementByLinkText = function(linkText, inDocument, inWindow) { - var links = inDocument.getElementsByTagName('a'); - for (var i = 0; i < links.length; i++) { - var element = links[i]; - if (PatternMatcher.matches(linkText, getText(element))) { - return element; - } - } - return null; -}; -BrowserBot.prototype.locateElementByLinkText.prefix = "link"; - -/** - * Returns an attribute based on an attribute locator. This is made up of an element locator - * suffixed with @attribute-name. - */ -BrowserBot.prototype.findAttribute = function(locator) { - // Split into locator + attributeName - var attributePos = locator.lastIndexOf("@"); - var elementLocator = locator.slice(0, attributePos); - var attributeName = locator.slice(attributePos + 1); - - // Find the element. - var element = this.findElement(elementLocator); - - // Handle missing "class" attribute in IE. - if (browserVersion.isIE && attributeName == "class") { - attributeName = "className"; - } - - // Get the attribute value. - var attributeValue = element.getAttribute(attributeName); - - return attributeValue ? attributeValue.toString() : null; -}; - -/* -* Select the specified option and trigger the relevant events of the element. -*/ -BrowserBot.prototype.selectOption = function(element, optionToSelect) { - triggerEvent(element, 'focus', false); - var changed = false; - for (var i = 0; i < element.options.length; i++) { - var option = element.options[i]; - if (option.selected && option != optionToSelect) { - option.selected = false; - changed = true; - } - else if (!option.selected && option == optionToSelect) { - option.selected = true; - changed = true; - } - } - - if (changed) { - triggerEvent(element, 'change', true); - } -}; - -/* -* Select the specified option and trigger the relevant events of the element. -*/ -BrowserBot.prototype.addSelection = function(element, option) { - this.checkMultiselect(element); - triggerEvent(element, 'focus', false); - if (!option.selected) { - option.selected = true; - triggerEvent(element, 'change', true); - } -}; - -/* -* Select the specified option and trigger the relevant events of the element. -*/ -BrowserBot.prototype.removeSelection = function(element, option) { - this.checkMultiselect(element); - triggerEvent(element, 'focus', false); - if (option.selected) { - option.selected = false; - triggerEvent(element, 'change', true); - } -}; - -BrowserBot.prototype.checkMultiselect = function(element) { - if (!element.multiple) - { - throw new SeleniumError("Not a multi-select"); - } - -}; - -BrowserBot.prototype.replaceText = function(element, stringValue) { - triggerEvent(element, 'focus', false); - triggerEvent(element, 'select', true); - var maxLengthAttr = element.getAttribute("maxLength"); - var actualValue = stringValue; - if (maxLengthAttr != null) { - var maxLength = parseInt(maxLengthAttr); - if (stringValue.length > maxLength) { - LOG.warn("BEFORE") - actualValue = stringValue.substr(0, maxLength); - LOG.warn("AFTER") - } - } - - if (getTagName(element) == "body") { - if (element.ownerDocument && element.ownerDocument.designMode) { - var designMode = new String(element.ownerDocument.designMode).toLowerCase(); - if (designMode = "on") { - // this must be a rich text control! - element.innerHTML = actualValue; - } - } - } else { - element.value = actualValue; - } - // DGF this used to be skipped in chrome URLs, but no longer. Is xpcnativewrappers to blame? - try { - triggerEvent(element, 'change', true); - } catch (e) {} -}; - -BrowserBot.prototype.submit = function(formElement) { - var actuallySubmit = true; - this._modifyElementTarget(formElement); - if (formElement.onsubmit) { - if (browserVersion.isHTA) { - // run the code in the correct window so alerts are handled correctly even in HTA mode - var win = this.browserbot.getCurrentWindow(); - var now = new Date().getTime(); - var marker = 'marker' + now; - win[marker] = formElement; - win.setTimeout("var actuallySubmit = "+marker+".onsubmit();" + - "if (actuallySubmit) { " + - marker+".submit(); " + - "if ("+marker+".target && !/^_/.test("+marker+".target)) {"+ - "window.open('', "+marker+".target);"+ - "}"+ - "};"+ - marker+"=null", 0); - // pause for up to 2s while this command runs - var terminationCondition = function () { - return !win[marker]; - } - return Selenium.decorateFunctionWithTimeout(terminationCondition, 2000); - } else { - actuallySubmit = formElement.onsubmit(); - if (actuallySubmit) { - formElement.submit(); - if (formElement.target && !/^_/.test(formElement.target)) { - this.browserbot.openWindow('', formElement.target); - } - } - } - } else { - formElement.submit(); - } -} - -BrowserBot.prototype.clickElement = function(element, clientX, clientY) { - this._fireEventOnElement("click", element, clientX, clientY); -}; - -BrowserBot.prototype.doubleClickElement = function(element, clientX, clientY) { - this._fireEventOnElement("dblclick", element, clientX, clientY); -}; - -BrowserBot.prototype._modifyElementTarget = function(element) { - if (element.target) { - if (element.target == "_blank" || /^selenium_blank/.test(element.target) ) { - var tagName = getTagName(element); - if (tagName == "a" || tagName == "form") { - var newTarget = "selenium_blank" + Math.round(100000 * Math.random()); - LOG.warn("Link has target '_blank', which is not supported in Selenium! Randomizing target to be: " + newTarget); - this.browserbot.openWindow('', newTarget); - element.target = newTarget; - } - } - } -} - - -BrowserBot.prototype._handleClickingImagesInsideLinks = function(targetWindow, element) { - if (element.parentNode && element.parentNode.href) { - targetWindow.location.href = element.parentNode.href; - } -} - -BrowserBot.prototype._getTargetWindow = function(element) { - var targetWindow = element.ownerDocument.defaultView; - if (element.target) { - targetWindow = this._getFrameFromGlobal(element.target); - } - return targetWindow; -} - -BrowserBot.prototype._getFrameFromGlobal = function(target) { - - if (target == "_top") { - return this.topFrame; - } else if (target == "_parent") { - return this.getCurrentWindow().parent; - } else if (target == "_blank") { - // TODO should this set cleverer window defaults? - return this.getCurrentWindow().open('', '_blank'); - } - var frameElement = this.findElementBy("implicit", target, this.topFrame.document, this.topFrame); - if (frameElement) { - return frameElement.contentWindow; - } - var win = this.getWindowByName(target); - if (win) return win; - return this.getCurrentWindow().open('', target); -} - - -BrowserBot.prototype.bodyText = function() { - return getText(this.getDocument().body); -}; - -BrowserBot.prototype.getAllButtons = function() { - var elements = this.getDocument().getElementsByTagName('input'); - var result = ''; - - for (var i = 0; i < elements.length; i++) { - if (elements[i].type == 'button' || elements[i].type == 'submit' || elements[i].type == 'reset') { - result += elements[i].id; - - result += ','; - } - } - - return result; -}; - - -BrowserBot.prototype.getAllFields = function() { - var elements = this.getDocument().getElementsByTagName('input'); - var result = ''; - - for (var i = 0; i < elements.length; i++) { - if (elements[i].type == 'text') { - result += elements[i].id; - - result += ','; - } - } - - return result; -}; - -BrowserBot.prototype.getAllLinks = function() { - var elements = this.getDocument().getElementsByTagName('a'); - var result = ''; - - for (var i = 0; i < elements.length; i++) { - result += elements[i].id; - - result += ','; - } - - return result; -}; - -BrowserBot.prototype.setContext = function(strContext, logLevel) { - - //set the current test title - var ctx = document.getElementById("context"); - if (ctx != null) { - ctx.innerHTML = strContext; - } - if (logLevel != null) { - LOG.setLogLevelThreshold(logLevel); - } -}; - -function isDefined(value) { - return typeof(value) != undefined; -} - -BrowserBot.prototype.goBack = function() { - this.getCurrentWindow().history.back(); -}; - -BrowserBot.prototype.goForward = function() { - this.getCurrentWindow().history.forward(); -}; - -BrowserBot.prototype.close = function() { - if (browserVersion.isChrome || browserVersion.isSafari || browserVersion.isOpera) { - this.getCurrentWindow().close(); - } else { - this.getCurrentWindow().eval("window.close();"); - } -}; - -BrowserBot.prototype.refresh = function() { - this.getCurrentWindow().location.reload(true); -}; - -/** - * Refine a list of elements using a filter. - */ -BrowserBot.prototype.selectElementsBy = function(filterType, filter, elements) { - var filterFunction = BrowserBot.filterFunctions[filterType]; - if (! filterFunction) { - throw new SeleniumError("Unrecognised element-filter type: '" + filterType + "'"); - } - - return filterFunction(filter, elements); -}; - -BrowserBot.filterFunctions = {}; - -BrowserBot.filterFunctions.name = function(name, elements) { - var selectedElements = []; - for (var i = 0; i < elements.length; i++) { - if (elements[i].name === name) { - selectedElements.push(elements[i]); - } - } - return selectedElements; -}; - -BrowserBot.filterFunctions.value = function(value, elements) { - var selectedElements = []; - for (var i = 0; i < elements.length; i++) { - if (elements[i].value === value) { - selectedElements.push(elements[i]); - } - } - return selectedElements; -}; - -BrowserBot.filterFunctions.index = function(index, elements) { - index = Number(index); - if (isNaN(index) || index < 0) { - throw new SeleniumError("Illegal Index: " + index); - } - if (elements.length <= index) { - throw new SeleniumError("Index out of range: " + index); - } - return [elements[index]]; -}; - -BrowserBot.prototype.selectElements = function(filterExpr, elements, defaultFilterType) { - - var filterType = (defaultFilterType || 'value'); - - // If there is a filter prefix, use the specified strategy - var result = filterExpr.match(/^([A-Za-z]+)=(.+)/); - if (result) { - filterType = result[1].toLowerCase(); - filterExpr = result[2]; - } - - return this.selectElementsBy(filterType, filterExpr, elements); -}; - -/** - * Find an element by class - */ -BrowserBot.prototype.locateElementByClass = function(locator, document) { - return elementFindFirstMatchingChild(document, - function(element) { - return element.className == locator - } - ); -} - -/** - * Find an element by alt - */ -BrowserBot.prototype.locateElementByAlt = function(locator, document) { - return elementFindFirstMatchingChild(document, - function(element) { - return element.alt == locator - } - ); -} - -/** - * Find an element by css selector - */ -BrowserBot.prototype.locateElementByCss = function(locator, document) { - var elements = cssQuery(locator, document); - if (elements.length != 0) - return elements[0]; - return null; -} - - -/*****************************************************************/ -/* BROWSER-SPECIFIC FUNCTIONS ONLY AFTER THIS LINE */ - -function MozillaBrowserBot(frame) { - BrowserBot.call(this, frame); -} -objectExtend(MozillaBrowserBot.prototype, BrowserBot.prototype); - -function KonquerorBrowserBot(frame) { - BrowserBot.call(this, frame); -} -objectExtend(KonquerorBrowserBot.prototype, BrowserBot.prototype); - -KonquerorBrowserBot.prototype.setIFrameLocation = function(iframe, location) { - // Window doesn't fire onload event when setting src to the current value, - // so we set it to blank first. - iframe.src = "about:blank"; - iframe.src = location; -}; - -KonquerorBrowserBot.prototype.setOpenLocation = function(win, loc) { - // Window doesn't fire onload event when setting src to the current value, - // so we just refresh in that case instead. - loc = absolutify(loc, this.baseUrl); - loc = canonicalize(loc); - var startLoc = parseUrl(win.location.href); - startLoc.hash = null; - var startUrl = reassembleLocation(startLoc); - LOG.debug("startUrl="+startUrl); - LOG.debug("win.location.href="+win.location.href); - LOG.debug("loc="+loc); - if (startUrl == loc) { - LOG.debug("opening exact same location"); - this.refresh(); - } else { - LOG.debug("locations differ"); - win.location.href = loc; - } - // force the current polling thread to detect a page load - var marker = this.isPollingForLoad(win); - if (marker) { - delete win.location[marker]; - } -}; - -KonquerorBrowserBot.prototype._isSameDocument = function(originalDocument, currentDocument) { - // under Konqueror, there may be this case: - // originalDocument and currentDocument are different objects - // while their location are same. - if (originalDocument) { - return originalDocument.location == currentDocument.location - } else { - return originalDocument === currentDocument; - } -}; - -function SafariBrowserBot(frame) { - BrowserBot.call(this, frame); -} -objectExtend(SafariBrowserBot.prototype, BrowserBot.prototype); - -SafariBrowserBot.prototype.setIFrameLocation = KonquerorBrowserBot.prototype.setIFrameLocation; -SafariBrowserBot.prototype.setOpenLocation = KonquerorBrowserBot.prototype.setOpenLocation; - - -function OperaBrowserBot(frame) { - BrowserBot.call(this, frame); -} -objectExtend(OperaBrowserBot.prototype, BrowserBot.prototype); -OperaBrowserBot.prototype.setIFrameLocation = function(iframe, location) { - if (iframe.src == location) { - iframe.src = location + '?reload'; - } else { - iframe.src = location; - } -} - -function IEBrowserBot(frame) { - BrowserBot.call(this, frame); -} -objectExtend(IEBrowserBot.prototype, BrowserBot.prototype); - -IEBrowserBot.prototype._handleClosedSubFrame = function(testWindow, doNotModify) { - if (this.proxyInjectionMode) { - return testWindow; - } - - try { - testWindow.location.href; - this.permDenied = 0; - } catch (e) { - this.permDenied++; - } - if (this._windowClosed(testWindow) || this.permDenied > 4) { - if (this.isSubFrameSelected) { - LOG.warn("Current subframe appears to have closed; selecting top frame"); - this.selectFrame("relative=top"); - return this.getCurrentWindow(doNotModify); - } else { - var closedError = new SeleniumError("Current window or frame is closed!"); - closedError.windowClosed = true; - throw closedError; - } - } - return testWindow; -}; - -IEBrowserBot.prototype.modifyWindowToRecordPopUpDialogs = function(windowToModify, browserBot) { - BrowserBot.prototype.modifyWindowToRecordPopUpDialogs(windowToModify, browserBot); - - // we will call the previous version of this method from within our own interception - oldShowModalDialog = windowToModify.showModalDialog; - - windowToModify.showModalDialog = function(url, args, features) { - // Get relative directory to where TestRunner.html lives - // A risky assumption is that the user's TestRunner is named TestRunner.html - var doc_location = document.location.toString(); - var end_of_base_ref = doc_location.indexOf('TestRunner.html'); - var base_ref = doc_location.substring(0, end_of_base_ref); - - var fullURL = base_ref + "TestRunner.html?singletest=" + escape(browserBot.modalDialogTest) + "&autoURL=" + escape(url) + "&runInterval=" + runOptions.runInterval; - browserBot.modalDialogTest = null; - - var returnValue = oldShowModalDialog(fullURL, args, features); - return returnValue; - }; -}; - -IEBrowserBot.prototype.modifySeparateTestWindowToDetectPageLoads = function(windowObject) { - this.pageUnloading = false; - var self = this; - var pageUnloadDetector = function() { - self.pageUnloading = true; - }; - windowObject.attachEvent("onbeforeunload", pageUnloadDetector); - BrowserBot.prototype.modifySeparateTestWindowToDetectPageLoads.call(this, windowObject); -}; - -IEBrowserBot.prototype.pollForLoad = function(loadFunction, windowObject, originalDocument, originalLocation, originalHref, marker) { - LOG.debug("IEBrowserBot.pollForLoad: " + marker); - if (!this.permDeniedCount[marker]) this.permDeniedCount[marker] = 0; - BrowserBot.prototype.pollForLoad.call(this, loadFunction, windowObject, originalDocument, originalLocation, originalHref, marker); - if (this.pageLoadError) { - if (this.pageUnloading) { - var self = this; - LOG.warn("pollForLoad UNLOADING (" + marker + "): caught exception while firing events on unloading page: " + this.pageLoadError.message); - this.reschedulePoller(loadFunction, windowObject, originalDocument, originalLocation, originalHref, marker); - this.pageLoadError = null; - return; - } else if (((this.pageLoadError.message == "Permission denied") || (/^Access is denied/.test(this.pageLoadError.message))) - && this.permDeniedCount[marker]++ < 8) { - if (this.permDeniedCount[marker] > 4) { - var canAccessThisWindow; - var canAccessCurrentlySelectedWindow; - try { - windowObject.location.href; - canAccessThisWindow = true; - } catch (e) {} - try { - this.getCurrentWindow(true).location.href; - canAccessCurrentlySelectedWindow = true; - } catch (e) {} - if (canAccessCurrentlySelectedWindow & !canAccessThisWindow) { - LOG.warn("pollForLoad (" + marker + ") ABORTING: " + this.pageLoadError.message + " (" + this.permDeniedCount[marker] + "), but the currently selected window is fine"); - // returning without rescheduling - this.pageLoadError = null; - return; - } - } - - var self = this; - LOG.warn("pollForLoad (" + marker + "): " + this.pageLoadError.message + " (" + this.permDeniedCount[marker] + "), waiting to see if it goes away"); - this.reschedulePoller(loadFunction, windowObject, originalDocument, originalLocation, originalHref, marker); - this.pageLoadError = null; - return; - } - //handy for debugging! - //throw this.pageLoadError; - } -}; - -IEBrowserBot.prototype._windowClosed = function(win) { - try { - var c = win.closed; - // frame windows claim to be non-closed when their parents are closed - // but you can't access their document objects in that case - if (!c) { - try { - win.document; - } catch (de) { - if (de.message == "Permission denied") { - // the window is probably unloading, which means it's probably not closed yet - return false; - } - else if (/^Access is denied/.test(de.message)) { - // rare variation on "Permission denied"? - LOG.debug("IEBrowserBot.windowClosed: got " + de.message + " (this.pageUnloading=" + this.pageUnloading + "); assuming window is unloading, probably not closed yet"); - return false; - } else { - // this is probably one of those frame window situations - LOG.debug("IEBrowserBot.windowClosed: couldn't read win.document, assume closed: " + de.message + " (this.pageUnloading=" + this.pageUnloading + ")"); - return true; - } - } - } - if (c == null) { - LOG.debug("IEBrowserBot.windowClosed: win.closed was null, assuming closed"); - return true; - } - return c; - } catch (e) { - LOG.debug("IEBrowserBot._windowClosed: Got an exception trying to read win.closed; we'll have to take a guess!"); - - if (browserVersion.isHTA) { - if (e.message == "Permission denied") { - // the window is probably unloading, which means it's not closed yet - return false; - } else { - // there's a good chance that we've lost contact with the window object if it is closed - return true; - } - } else { - // the window is probably unloading, which means it's not closed yet - return false; - } - } -}; - -/** - * In IE, getElementById() also searches by name - this is an optimisation for IE. - */ -IEBrowserBot.prototype.locateElementByIdentifer = function(identifier, inDocument, inWindow) { - return inDocument.getElementById(identifier); -}; - -SafariBrowserBot.prototype.modifyWindowToRecordPopUpDialogs = function(windowToModify, browserBot) { - BrowserBot.prototype.modifyWindowToRecordPopUpDialogs(windowToModify, browserBot); - - var originalOpen = windowToModify.open; - /* - * Safari seems to be broken, so that when we manually trigger the onclick method - * of a button/href, any window.open calls aren't resolved relative to the app location. - * So here we replace the open() method with one that does resolve the url correctly. - */ - windowToModify.open = function(url, windowName, windowFeatures, replaceFlag) { - - if (url.startsWith("http://") || url.startsWith("https://") || url.startsWith("/")) { - return originalOpen(url, windowName, windowFeatures, replaceFlag); - } - - // Reduce the current path to the directory - var currentPath = windowToModify.location.pathname || "/"; - currentPath = currentPath.replace(/\/[^\/]*$/, "/"); - - // Remove any leading "./" from the new url. - url = url.replace(/^\.\//, ""); - - newUrl = currentPath + url; - - var openedWindow = originalOpen(newUrl, windowName, windowFeatures, replaceFlag); - LOG.debug("window.open call intercepted; window ID (which you can use with selectWindow()) is \"" + windowName + "\""); - if (windowName!=null) { - openedWindow["seleniumWindowName"] = windowName; - } - return openedWindow; - }; -}; - -MozillaBrowserBot.prototype._fireEventOnElement = function(eventType, element, clientX, clientY) { - var win = this.getCurrentWindow(); - triggerEvent(element, 'focus', false); - - // Add an event listener that detects if the default action has been prevented. - // (This is caused by a javascript onclick handler returning false) - // we capture the whole event, rather than the getPreventDefault() state at the time, - // because we need to let the entire event bubbling and capturing to go through - // before making a decision on whether we should force the href - var savedEvent = null; - - element.addEventListener(eventType, function(evt) { - savedEvent = evt; - }, false); - - this._modifyElementTarget(element); - - // Trigger the event. - this.browserbot.triggerMouseEvent(element, eventType, true, clientX, clientY); - - if (this._windowClosed(win)) { - return; - } - - // Perform the link action if preventDefault was set. - // In chrome URL, the link action is already executed by triggerMouseEvent. - if (!browserVersion.isChrome && savedEvent != null && !savedEvent.getPreventDefault()) { - var targetWindow = this.browserbot._getTargetWindow(element); - if (element.href) { - targetWindow.location.href = element.href; - } else { - this.browserbot._handleClickingImagesInsideLinks(targetWindow, element); - } - } - -}; - - -OperaBrowserBot.prototype._fireEventOnElement = function(eventType, element, clientX, clientY) { - var win = this.getCurrentWindow(); - triggerEvent(element, 'focus', false); - - this._modifyElementTarget(element); - - // Trigger the click event. - this.browserbot.triggerMouseEvent(element, eventType, true, clientX, clientY); - - if (this._windowClosed(win)) { - return; - } - -}; - - -KonquerorBrowserBot.prototype._fireEventOnElement = function(eventType, element, clientX, clientY) { - var win = this.getCurrentWindow(); - triggerEvent(element, 'focus', false); - - this._modifyElementTarget(element); - - if (element[eventType]) { - element[eventType](); - } - else { - this.browserbot.triggerMouseEvent(element, eventType, true, clientX, clientY); - } - - if (this._windowClosed(win)) { - return; - } - -}; - -SafariBrowserBot.prototype._fireEventOnElement = function(eventType, element, clientX, clientY) { - triggerEvent(element, 'focus', false); - var wasChecked = element.checked; - - this._modifyElementTarget(element); - - // For form element it is simple. - if (element[eventType]) { - element[eventType](); - } - // For links and other elements, event emulation is required. - else { - var targetWindow = this.browserbot._getTargetWindow(element); - // todo: deal with anchors? - this.browserbot.triggerMouseEvent(element, eventType, true, clientX, clientY); - - } - -}; - -SafariBrowserBot.prototype.refresh = function() { - var win = this.getCurrentWindow(); - if (win.location.hash) { - // DGF Safari refuses to refresh when there's a hash symbol in the URL - win.location.hash = ""; - var actuallyReload = function() { - win.location.reload(true); - } - window.setTimeout(actuallyReload, 1); - } else { - win.location.reload(true); - } -}; - -IEBrowserBot.prototype._fireEventOnElement = function(eventType, element, clientX, clientY) { - var win = this.getCurrentWindow(); - triggerEvent(element, 'focus', false); - - var wasChecked = element.checked; - - // Set a flag that records if the page will unload - this isn't always accurate, because - // <a href="javascript:alert('foo'):"> triggers the onbeforeunload event, even thought the page won't unload - var pageUnloading = false; - var pageUnloadDetector = function() { - pageUnloading = true; - }; - win.attachEvent("onbeforeunload", pageUnloadDetector); - this._modifyElementTarget(element); - if (element[eventType]) { - element[eventType](); - } - else { - this.browserbot.triggerMouseEvent(element, eventType, true, clientX, clientY); - } - - - // If the page is going to unload - still attempt to fire any subsequent events. - // However, we can't guarantee that the page won't unload half way through, so we need to handle exceptions. - try { - win.detachEvent("onbeforeunload", pageUnloadDetector); - - if (this._windowClosed(win)) { - return; - } - - // Onchange event is not triggered automatically in IE. - if (isDefined(element.checked) && wasChecked != element.checked) { - triggerEvent(element, 'change', true); - } - - } - catch (e) { - // If the page is unloading, we may get a "Permission denied" or "Unspecified error". - // Just ignore it, because the document may have unloaded. - if (pageUnloading) { - LOG.logHook = function() { - }; - LOG.warn("Caught exception when firing events on unloading page: " + e.message); - return; - } - throw e; - } -}; diff --git a/tests/test_tools/selenium/core/scripts/selenium-browserdetect.js b/tests/test_tools/selenium/core/scripts/selenium-browserdetect.js deleted file mode 100644 index a9607371..00000000 --- a/tests/test_tools/selenium/core/scripts/selenium-browserdetect.js +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright 2004 ThoughtWorks, Inc - * - * 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. - * - */ - -// Although it's generally better web development practice not to use -// browser-detection (feature detection is better), the subtle browser -// differences that Selenium has to work around seem to make it -// necessary. Maybe as we learn more about what we need, we can do this in -// a more "feature-centric" rather than "browser-centric" way. - -var BrowserVersion = function() { - this.name = navigator.appName; - - if (window.opera != null) { - this.browser = BrowserVersion.OPERA; - this.isOpera = true; - return; - } - - var _getQueryParameter = function(searchKey) { - var str = location.search.substr(1); - if (str == null) return null; - var clauses = str.split('&'); - for (var i = 0; i < clauses.length; i++) { - var keyValuePair = clauses[i].split('=', 2); - var key = unescape(keyValuePair[0]); - if (key == searchKey) { - return unescape(keyValuePair[1]); - } - } - return null; - }; - - var self = this; - - var checkChrome = function() { - var loc = window.document.location.href; - try { - loc = window.top.document.location.href; - if (/^chrome:\/\//.test(loc)) { - self.isChrome = true; - } else { - self.isChrome = false; - } - } catch (e) { - // can't see the top (that means we might be chrome, but it's impossible to be sure) - self.isChromeDetectable = "no, top location couldn't be read in this window"; - if (_getQueryParameter('thisIsChrome')) { - self.isChrome = true; - } else { - self.isChrome = false; - } - } - - - } - - - - if (this.name == "Microsoft Internet Explorer") { - this.browser = BrowserVersion.IE; - this.isIE = true; - try { - if (window.top.SeleniumHTARunner && window.top.document.location.pathname.match(/.hta$/i)) { - this.isHTA = true; - } - } catch (e) { - this.isHTADetectable = "no, top location couldn't be read in this window"; - if (_getQueryParameter('thisIsHTA')) { - self.isHTA = true; - } else { - self.isHTA = false; - } - } - if ("0" == navigator.appMinorVersion) { - this.preSV1 = true; - if (navigator.appVersion.match(/MSIE 6.0/)) { - this.appearsToBeBrokenInitialIE6 = true; - } - } - return; - } - - if (navigator.userAgent.indexOf('Safari') != -1) { - this.browser = BrowserVersion.SAFARI; - this.isSafari = true; - this.khtml = true; - return; - } - - if (navigator.userAgent.indexOf('Konqueror') != -1) { - this.browser = BrowserVersion.KONQUEROR; - this.isKonqueror = true; - this.khtml = true; - return; - } - - if (navigator.userAgent.indexOf('Firefox') != -1) { - this.browser = BrowserVersion.FIREFOX; - this.isFirefox = true; - this.isGecko = true; - var result = /.*Firefox\/([\d\.]+).*/.exec(navigator.userAgent); - if (result) { - this.firefoxVersion = result[1]; - } - checkChrome(); - return; - } - - if (navigator.userAgent.indexOf('Gecko') != -1) { - this.browser = BrowserVersion.MOZILLA; - this.isMozilla = true; - this.isGecko = true; - checkChrome(); - return; - } - - this.browser = BrowserVersion.UNKNOWN; -} - -BrowserVersion.OPERA = "Opera"; -BrowserVersion.IE = "IE"; -BrowserVersion.KONQUEROR = "Konqueror"; -BrowserVersion.SAFARI = "Safari"; -BrowserVersion.FIREFOX = "Firefox"; -BrowserVersion.MOZILLA = "Mozilla"; -BrowserVersion.UNKNOWN = "Unknown"; - -var browserVersion = new BrowserVersion(); diff --git a/tests/test_tools/selenium/core/scripts/selenium-commandhandlers.js b/tests/test_tools/selenium/core/scripts/selenium-commandhandlers.js deleted file mode 100644 index a23e9335..00000000 --- a/tests/test_tools/selenium/core/scripts/selenium-commandhandlers.js +++ /dev/null @@ -1,375 +0,0 @@ -/* -* Copyright 2004 ThoughtWorks, Inc -* -* 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. -*/ - -// A naming convention used in this file: -// -// -// - a "seleniumApi" is an instance of the Selenium object, defined in selenium-api.js. -// -// - a "Method" is an unbound function whose target must be supplied when it's called, ie. -// it should be invoked using Function.call() or Function.apply() -// -// - a "Block" is a function that has been bound to a target object, so can be called invoked directly -// (or with a null target) -// -// - "CommandHandler" is effectively an abstract base for -// various handlers including ActionHandler, AccessorHandler and AssertHandler. -// Subclasses need to implement an execute(seleniumApi, command) function, -// where seleniumApi is the Selenium object, and command a SeleniumCommand object. -// -// - Handlers will return a "result" object (ActionResult, AccessorResult, AssertResult). -// ActionResults may contain a .terminationCondition function which is run by -// -executionloop.js after the command is run; we'll run it over and over again -// until it returns true or the .terminationCondition throws an exception. -// AccessorResults will contain the results of running getter (e.g. getTitle returns -// the title as a string). - -var CommandHandlerFactory = classCreate(); -objectExtend(CommandHandlerFactory.prototype, { - - initialize: function() { - this.handlers = {}; - }, - - registerAction: function(name, actionBlock, wait, dontCheckAlertsAndConfirms) { - this.handlers[name] = new ActionHandler(actionBlock, wait, dontCheckAlertsAndConfirms); - }, - - registerAccessor: function(name, accessBlock) { - this.handlers[name] = new AccessorHandler(accessBlock); - }, - - registerAssert: function(name, assertBlock, haltOnFailure) { - this.handlers[name] = new AssertHandler(assertBlock, haltOnFailure); - }, - - getCommandHandler: function(name) { - return this.handlers[name]; - }, - - _registerAllAccessors: function(seleniumApi) { - // Methods of the form getFoo(target) result in commands: - // getFoo, assertFoo, verifyFoo, assertNotFoo, verifyNotFoo - // storeFoo, waitForFoo, and waitForNotFoo. - for (var functionName in seleniumApi) { - var match = /^(get|is)([A-Z].+)$/.exec(functionName); - if (match) { - var accessMethod = seleniumApi[functionName]; - var accessBlock = fnBind(accessMethod, seleniumApi); - var baseName = match[2]; - var isBoolean = (match[1] == "is"); - var requiresTarget = (accessMethod.length == 1); - - this.registerAccessor(functionName, accessBlock); - this._registerStoreCommandForAccessor(baseName, accessBlock, requiresTarget); - - var predicateBlock = this._predicateForAccessor(accessBlock, requiresTarget, isBoolean); - this._registerAssertionsForPredicate(baseName, predicateBlock); - this._registerWaitForCommandsForPredicate(seleniumApi, baseName, predicateBlock); - } - } - }, - - _registerAllActions: function(seleniumApi) { - for (var functionName in seleniumApi) { - var match = /^do([A-Z].+)$/.exec(functionName); - if (match) { - var actionName = match[1].lcfirst(); - var actionMethod = seleniumApi[functionName]; - var dontCheckPopups = actionMethod.dontCheckAlertsAndConfirms; - var actionBlock = fnBind(actionMethod, seleniumApi); - this.registerAction(actionName, actionBlock, false, dontCheckPopups); - this.registerAction(actionName + "AndWait", actionBlock, true, dontCheckPopups); - } - } - }, - - _registerAllAsserts: function(seleniumApi) { - for (var functionName in seleniumApi) { - var match = /^assert([A-Z].+)$/.exec(functionName); - if (match) { - var assertBlock = fnBind(seleniumApi[functionName], seleniumApi); - - // Register the assert with the "assert" prefix, and halt on failure. - var assertName = functionName; - this.registerAssert(assertName, assertBlock, true); - - // Register the assert with the "verify" prefix, and do not halt on failure. - var verifyName = "verify" + match[1]; - this.registerAssert(verifyName, assertBlock, false); - } - } - }, - - registerAll: function(seleniumApi) { - this._registerAllAccessors(seleniumApi); - this._registerAllActions(seleniumApi); - this._registerAllAsserts(seleniumApi); - }, - - _predicateForAccessor: function(accessBlock, requiresTarget, isBoolean) { - if (isBoolean) { - return this._predicateForBooleanAccessor(accessBlock); - } - if (requiresTarget) { - return this._predicateForSingleArgAccessor(accessBlock); - } - return this._predicateForNoArgAccessor(accessBlock); - }, - - _predicateForSingleArgAccessor: function(accessBlock) { - // Given an accessor function getBlah(target), - // return a "predicate" equivalient to isBlah(target, value) that - // is true when the value returned by the accessor matches the specified value. - return function(target, value) { - var accessorResult = accessBlock(target); - if (PatternMatcher.matches(value, accessorResult)) { - return new PredicateResult(true, "Actual value '" + accessorResult + "' did match '" + value + "'"); - } else { - return new PredicateResult(false, "Actual value '" + accessorResult + "' did not match '" + value + "'"); - } - }; - }, - - _predicateForNoArgAccessor: function(accessBlock) { - // Given a (no-arg) accessor function getBlah(), - // return a "predicate" equivalient to isBlah(value) that - // is true when the value returned by the accessor matches the specified value. - return function(value) { - var accessorResult = accessBlock(); - if (PatternMatcher.matches(value, accessorResult)) { - return new PredicateResult(true, "Actual value '" + accessorResult + "' did match '" + value + "'"); - } else { - return new PredicateResult(false, "Actual value '" + accessorResult + "' did not match '" + value + "'"); - } - }; - }, - - _predicateForBooleanAccessor: function(accessBlock) { - // Given a boolean accessor function isBlah(), - // return a "predicate" equivalient to isBlah() that - // returns an appropriate PredicateResult value. - return function() { - var accessorResult; - if (arguments.length > 2) throw new SeleniumError("Too many arguments! " + arguments.length); - if (arguments.length == 2) { - accessorResult = accessBlock(arguments[0], arguments[1]); - } else if (arguments.length == 1) { - accessorResult = accessBlock(arguments[0]); - } else { - accessorResult = accessBlock(); - } - if (accessorResult) { - return new PredicateResult(true, "true"); - } else { - return new PredicateResult(false, "false"); - } - }; - }, - - _invertPredicate: function(predicateBlock) { - // Given a predicate, return the negation of that predicate. - // Leaves the message unchanged. - // Used to create assertNot, verifyNot, and waitForNot commands. - return function(target, value) { - var result = predicateBlock(target, value); - result.isTrue = !result.isTrue; - return result; - }; - }, - - createAssertionFromPredicate: function(predicateBlock) { - // Convert an isBlahBlah(target, value) function into an assertBlahBlah(target, value) function. - return function(target, value) { - var result = predicateBlock(target, value); - if (!result.isTrue) { - Assert.fail(result.message); - } - }; - }, - - _invertPredicateName: function(baseName) { - var matchResult = /^(.*)Present$/.exec(baseName); - if (matchResult != null) { - return matchResult[1] + "NotPresent"; - } - return "Not" + baseName; - }, - - _registerAssertionsForPredicate: function(baseName, predicateBlock) { - // Register an assertion, a verification, a negative assertion, - // and a negative verification based on the specified accessor. - var assertBlock = this.createAssertionFromPredicate(predicateBlock); - this.registerAssert("assert" + baseName, assertBlock, true); - this.registerAssert("verify" + baseName, assertBlock, false); - - var invertedPredicateBlock = this._invertPredicate(predicateBlock); - var negativeassertBlock = this.createAssertionFromPredicate(invertedPredicateBlock); - this.registerAssert("assert" + this._invertPredicateName(baseName), negativeassertBlock, true); - this.registerAssert("verify" + this._invertPredicateName(baseName), negativeassertBlock, false); - }, - - _waitForActionForPredicate: function(predicateBlock) { - // Convert an isBlahBlah(target, value) function into a waitForBlahBlah(target, value) function. - return function(target, value) { - var terminationCondition = function () { - try { - return predicateBlock(target, value).isTrue; - } catch (e) { - // Treat exceptions as meaning the condition is not yet met. - // Useful, for example, for waitForValue when the element has - // not even been created yet. - // TODO: possibly should rethrow some types of exception. - return false; - } - }; - return Selenium.decorateFunctionWithTimeout(terminationCondition, this.defaultTimeout); - }; - }, - - _registerWaitForCommandsForPredicate: function(seleniumApi, baseName, predicateBlock) { - // Register a waitForBlahBlah and waitForNotBlahBlah based on the specified accessor. - var waitForActionMethod = this._waitForActionForPredicate(predicateBlock); - var waitForActionBlock = fnBind(waitForActionMethod, seleniumApi); - - var invertedPredicateBlock = this._invertPredicate(predicateBlock); - var waitForNotActionMethod = this._waitForActionForPredicate(invertedPredicateBlock); - var waitForNotActionBlock = fnBind(waitForNotActionMethod, seleniumApi); - - this.registerAction("waitFor" + baseName, waitForActionBlock, false, true); - this.registerAction("waitFor" + this._invertPredicateName(baseName), waitForNotActionBlock, false, true); - //TODO decide remove "waitForNot.*Present" action name or not - //for the back compatiblity issues we still make waitForNot.*Present availble - this.registerAction("waitForNot" + baseName, waitForNotActionBlock, false, true); - }, - - _registerStoreCommandForAccessor: function(baseName, accessBlock, requiresTarget) { - var action; - if (requiresTarget) { - action = function(target, varName) { - storedVars[varName] = accessBlock(target); - }; - } else { - action = function(varName) { - storedVars[varName] = accessBlock(); - }; - } - this.registerAction("store" + baseName, action, false, true); - } - -}); - -function PredicateResult(isTrue, message) { - this.isTrue = isTrue; - this.message = message; -} - -// NOTE: The CommandHandler is effectively an abstract base for -// various handlers including ActionHandler, AccessorHandler and AssertHandler. -// Subclasses need to implement an execute(seleniumApi, command) function, -// where seleniumApi is the Selenium object, and command a SeleniumCommand object. -function CommandHandler(type, haltOnFailure) { - this.type = type; - this.haltOnFailure = haltOnFailure; -} - -// An ActionHandler is a command handler that executes the sepcified action, -// possibly checking for alerts and confirmations (if checkAlerts is set), and -// possibly waiting for a page load if wait is set. -function ActionHandler(actionBlock, wait, dontCheckAlerts) { - this.actionBlock = actionBlock; - CommandHandler.call(this, "action", true); - if (wait) { - this.wait = true; - } - // note that dontCheckAlerts could be undefined!!! - this.checkAlerts = (dontCheckAlerts) ? false : true; -} -ActionHandler.prototype = new CommandHandler; -ActionHandler.prototype.execute = function(seleniumApi, command) { - if (this.checkAlerts && (null == /(Alert|Confirmation)(Not)?Present/.exec(command.command))) { - // todo: this conditional logic is ugly - seleniumApi.ensureNoUnhandledPopups(); - } - var terminationCondition = this.actionBlock(command.target, command.value); - // If the handler didn't return a wait flag, check to see if the - // handler was registered with the wait flag. - if (terminationCondition == undefined && this.wait) { - terminationCondition = seleniumApi.makePageLoadCondition(); - } - return new ActionResult(terminationCondition); -}; - -function ActionResult(terminationCondition) { - this.terminationCondition = terminationCondition; -} - -function AccessorHandler(accessBlock) { - this.accessBlock = accessBlock; - CommandHandler.call(this, "accessor", true); -} -AccessorHandler.prototype = new CommandHandler; -AccessorHandler.prototype.execute = function(seleniumApi, command) { - var returnValue = this.accessBlock(command.target, command.value); - return new AccessorResult(returnValue); -}; - -function AccessorResult(result) { - this.result = result; -} - -/** - * Handler for assertions and verifications. - */ -function AssertHandler(assertBlock, haltOnFailure) { - this.assertBlock = assertBlock; - CommandHandler.call(this, "assert", haltOnFailure || false); -} -AssertHandler.prototype = new CommandHandler; -AssertHandler.prototype.execute = function(seleniumApi, command) { - var result = new AssertResult(); - try { - this.assertBlock(command.target, command.value); - } catch (e) { - // If this is not a AssertionFailedError, or we should haltOnFailure, rethrow. - if (!e.isAssertionFailedError) { - throw e; - } - if (this.haltOnFailure) { - var error = new SeleniumError(e.failureMessage); - throw error; - } - result.setFailed(e.failureMessage); - } - return result; -}; - -function AssertResult() { - this.passed = true; -} -AssertResult.prototype.setFailed = function(message) { - this.passed = null; - this.failed = true; - this.failureMessage = message; -} - -function SeleniumCommand(command, target, value, isBreakpoint) { - this.command = command; - this.target = target; - this.value = value; - this.isBreakpoint = isBreakpoint; -} - diff --git a/tests/test_tools/selenium/core/scripts/selenium-executionloop.js b/tests/test_tools/selenium/core/scripts/selenium-executionloop.js deleted file mode 100644 index be54115e..00000000 --- a/tests/test_tools/selenium/core/scripts/selenium-executionloop.js +++ /dev/null @@ -1,177 +0,0 @@ -/* -* Copyright 2004 ThoughtWorks, Inc -* -* 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. -*/ - -function TestLoop(commandFactory) { - this.commandFactory = commandFactory; -} - -TestLoop.prototype = { - - start : function() { - selenium.reset(); - LOG.debug("currentTest.start()"); - this.continueTest(); - }, - - continueTest : function() { - /** - * Select the next command and continue the test. - */ - LOG.debug("currentTest.continueTest() - acquire the next command"); - if (! this.aborted) { - this.currentCommand = this.nextCommand(); - } - if (! this.requiresCallBack) { - this.continueTestAtCurrentCommand(); - } // otherwise, just finish and let the callback invoke continueTestAtCurrentCommand() - }, - - continueTestAtCurrentCommand : function() { - LOG.debug("currentTest.continueTestAtCurrentCommand()"); - if (this.currentCommand) { - // TODO: rename commandStarted to commandSelected, OR roll it into nextCommand - this.commandStarted(this.currentCommand); - this._resumeAfterDelay(); - } else { - this._testComplete(); - } - }, - - _resumeAfterDelay : function() { - /** - * Pause, then execute the current command. - */ - - // Get the command delay. If a pauseInterval is set, use it once - // and reset it. Otherwise, use the defined command-interval. - var delay = this.pauseInterval || this.getCommandInterval(); - this.pauseInterval = undefined; - - if (this.currentCommand.isBreakpoint || delay < 0) { - // Pause: enable the "next/continue" button - this.pause(); - } else { - window.setTimeout(fnBind(this.resume, this), delay); - } - }, - - resume: function() { - /** - * Select the next command and continue the test. - */ - LOG.debug("currentTest.resume() - actually execute"); - try { - selenium.browserbot.runScheduledPollers(); - this._executeCurrentCommand(); - this.continueTestWhenConditionIsTrue(); - } catch (e) { - if (!this._handleCommandError(e)) { - this._testComplete(); - } else { - this.continueTest(); - } - } - }, - - _testComplete : function() { - selenium.ensureNoUnhandledPopups(); - this.testComplete(); - }, - - _executeCurrentCommand : function() { - /** - * Execute the current command. - * - * @return a function which will be used to determine when - * execution can continue, or null if we can continue immediately - */ - var command = this.currentCommand; - LOG.info("Executing: |" + command.command + " | " + command.target + " | " + command.value + " |"); - - var handler = this.commandFactory.getCommandHandler(command.command); - if (handler == null) { - throw new SeleniumError("Unknown command: '" + command.command + "'"); - } - - command.target = selenium.preprocessParameter(command.target); - command.value = selenium.preprocessParameter(command.value); - LOG.debug("Command found, going to execute " + command.command); - this.result = handler.execute(selenium, command); - - - this.waitForCondition = this.result.terminationCondition; - - }, - - _handleCommandError : function(e) { - if (!e.isSeleniumError) { - LOG.exception(e); - var msg = "Selenium failure. Please report to selenium-dev@openqa.org, with error details from the log window."; - if (e.message) { - msg += " The error message is: " + e.message; - } - return this.commandError(msg); - } else { - LOG.error(e.message); - return this.commandError(e.message); - } - }, - - continueTestWhenConditionIsTrue: function () { - /** - * Busy wait for waitForCondition() to become true, and then carry - * on with test. Fail the current test if there's a timeout or an - * exception. - */ - //LOG.debug("currentTest.continueTestWhenConditionIsTrue()"); - selenium.browserbot.runScheduledPollers(); - try { - if (this.waitForCondition == null) { - LOG.debug("null condition; let's continueTest()"); - LOG.debug("Command complete"); - this.commandComplete(this.result); - this.continueTest(); - } else if (this.waitForCondition()) { - LOG.debug("condition satisfied; let's continueTest()"); - this.waitForCondition = null; - LOG.debug("Command complete"); - this.commandComplete(this.result); - this.continueTest(); - } else { - //LOG.debug("waitForCondition was false; keep waiting!"); - window.setTimeout(fnBind(this.continueTestWhenConditionIsTrue, this), 10); - } - } catch (e) { - this.result = {}; - this.result.failed = true; - this.result.failureMessage = extractExceptionMessage(e); - this.commandComplete(this.result); - this.continueTest(); - } - }, - - pause : function() {}, - nextCommand : function() {}, - commandStarted : function() {}, - commandComplete : function() {}, - commandError : function() {}, - testComplete : function() {}, - - getCommandInterval : function() { - return 0; - } - -} diff --git a/tests/test_tools/selenium/core/scripts/selenium-logging.js b/tests/test_tools/selenium/core/scripts/selenium-logging.js deleted file mode 100644 index 6dac9518..00000000 --- a/tests/test_tools/selenium/core/scripts/selenium-logging.js +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright 2004 ThoughtWorks, Inc - * - * 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. - */ - -var Logger = function() { - this.logWindow = null; -} -Logger.prototype = { - - pendingMessages: new Array(), - - setLogLevelThreshold: function(logLevel) { - this.pendingLogLevelThreshold = logLevel; - this.show(); - // NOTE: log messages will be discarded until the log window is - // fully loaded. - }, - - getLogWindow: function() { - if (this.logWindow && this.logWindow.closed) { - this.logWindow = null; - } - if (this.logWindow && this.pendingLogLevelThreshold && this.logWindow.setThresholdLevel) { - this.logWindow.setThresholdLevel(this.pendingLogLevelThreshold); - - // can't just directly log because that action would loop back - // to this code infinitely - var pendingMessage = new LogMessage("info", "Log level programmatically set to " + this.pendingLogLevelThreshold + " (presumably by driven-mode test code)"); - this.pendingMessages.push(pendingMessage); - - this.pendingLogLevelThreshold = null; // let's only go this way one time - } - - return this.logWindow; - }, - - openLogWindow: function() { - this.logWindow = window.open( - getDocumentBase(document) + "SeleniumLog.html", "SeleniumLog", - "width=600,height=1000,bottom=0,right=0,status,scrollbars,resizable" - ); - this.logWindow.moveTo(window.screenX + 1210, window.screenY + window.outerHeight - 1400); - if (browserVersion.appearsToBeBrokenInitialIE6) { - // I would really prefer for the message to immediately appear in the log window, the instant the user requests that the log window be - // visible. But when I initially coded it this way, thou message simply didn't appear unless I stepped through the code with a debugger. - // So obviously there is some timing issue here which I don't have the patience to figure out. - var pendingMessage = new LogMessage("warn", "You appear to be running an unpatched IE 6, which is not stable and can crash due to memory problems. We recommend you run Windows update to install a more stable version of IE."); - this.pendingMessages.push(pendingMessage); - } - return this.logWindow; - }, - - show: function() { - if (! this.getLogWindow()) { - this.openLogWindow(); - } - setTimeout(function(){LOG.info("Log window displayed");}, 500); - }, - - logHook: function(className, message) { - }, - - log: function(className, message) { - var logWindow = this.getLogWindow(); - this.logHook(className, message); - if (logWindow) { - if (logWindow.append) { - if (this.pendingMessages.length > 0) { - logWindow.append("info: Appending missed logging messages", "info"); - while (this.pendingMessages.length > 0) { - var msg = this.pendingMessages.shift(); - logWindow.append(msg.type + ": " + msg.msg, msg.type); - } - logWindow.append("info: Done appending missed logging messages", "info"); - } - logWindow.append(className + ": " + message, className); - } - } else { - // uncomment this to turn on background logging - /* these logging messages are never flushed, which creates - an enormous array of strings that never stops growing. Only - turn this on if you need it for debugging! */ - //this.pendingMessages.push(new LogMessage(className, message)); - } - }, - - close: function(message) { - if (this.logWindow != null) { - try { - this.logWindow.close(); - } catch (e) { - // swallow exception - // the window is probably closed if we get an exception here - } - this.logWindow = null; - } - }, - - debug: function(message) { - this.log("debug", message); - }, - - info: function(message) { - this.log("info", message); - }, - - warn: function(message) { - this.log("warn", message); - }, - - error: function(message) { - this.log("error", message); - }, - - exception: function(exception) { - this.error("Unexpected Exception: " + extractExceptionMessage(exception)); - this.error("Exception details: " + describe(exception, ', ')); - } - -}; - -var LOG = new Logger(); - -var LogMessage = function(type, msg) { - this.type = type; - this.msg = msg; -} diff --git a/tests/test_tools/selenium/core/scripts/selenium-seleneserunner.js b/tests/test_tools/selenium/core/scripts/selenium-seleneserunner.js deleted file mode 100644 index 99c7efbc..00000000 --- a/tests/test_tools/selenium/core/scripts/selenium-seleneserunner.js +++ /dev/null @@ -1,451 +0,0 @@ -/* -* Copyright 2005 ThoughtWorks, Inc -* -* 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. -* -*/ - -passColor = "#cfffcf"; -failColor = "#ffcfcf"; -errorColor = "#ffffff"; -workingColor = "#DEE7EC"; -doneColor = "#FFFFCC"; - -slowMode = false; - -var injectedSessionId; -var cmd1 = document.createElement("div"); -var cmd2 = document.createElement("div"); -var cmd3 = document.createElement("div"); -var cmd4 = document.createElement("div"); - -var postResult = "START"; -var debugMode = false; -var relayToRC = null; -var proxyInjectionMode = false; -var uniqueId = 'sel_' + Math.round(100000 * Math.random()); - -var SeleneseRunnerOptions = Class.create(); -Object.extend(SeleneseRunnerOptions.prototype, URLConfiguration.prototype); -Object.extend(SeleneseRunnerOptions.prototype, { - initialize: function() { - this._acquireQueryString(); - }, - getDebugMode: function() { - return this._getQueryParameter("debugMode"); - }, - - getContinue: function() { - return this._getQueryParameter("continue"); - }, - - getBaseUrl: function() { - return this._getQueryParameter("baseUrl"); - }, - - getDriverHost: function() { - return this._getQueryParameter("driverhost"); - }, - - getDriverPort: function() { - return this._getQueryParameter("driverport"); - }, - - getSessionId: function() { - return this._getQueryParameter("sessionId"); - }, - - _acquireQueryString: function () { - if (this.queryString) return; - if (browserVersion.isHTA) { - var args = this._extractArgs(); - if (args.length < 2) return null; - this.queryString = args[1]; - } else if (proxyInjectionMode) { - this.queryString = selenium.browserbot.getCurrentWindow().location.search.substr(1); - } else { - this.queryString = top.location.search.substr(1); - } - } - -}); -var runOptions; - -function runSeleniumTest() { - runOptions = new SeleneseRunnerOptions(); - var testAppWindow; - - if (runOptions.isMultiWindowMode()) { - testAppWindow = openSeparateApplicationWindow('Blank.html'); - } else if ($('myiframe') != null) { - testAppWindow = $('myiframe').contentWindow; - } - else { - proxyInjectionMode = true; - testAppWindow = window; - } - selenium = Selenium.createForWindow(testAppWindow); - if (!debugMode) { - debugMode = runOptions.getDebugMode(); - } - if (proxyInjectionMode) { - LOG.log = logToRc; - selenium.browserbot._modifyWindow(testAppWindow); - } - else if (debugMode) { - LOG.logHook = logToRc; - } - window.selenium = selenium; - - commandFactory = new CommandHandlerFactory(); - commandFactory.registerAll(selenium); - - currentTest = new SeleneseRunner(commandFactory); - - if (document.getElementById("commandList") != null) { - document.getElementById("commandList").appendChild(cmd4); - document.getElementById("commandList").appendChild(cmd3); - document.getElementById("commandList").appendChild(cmd2); - document.getElementById("commandList").appendChild(cmd1); - } - - var doContinue = runOptions.getContinue(); - if (doContinue != null) postResult = "OK"; - - currentTest.start(); -} - -function buildBaseUrl() { - var baseUrl = runOptions.getBaseUrl(); - if (baseUrl != null) { - return baseUrl; - } - var s = window.location.href - var slashPairOffset = s.indexOf("//") + "//".length - var pathSlashOffset = s.substring(slashPairOffset).indexOf("/") - return s.substring(0, slashPairOffset + pathSlashOffset) + "/selenium-server/core/"; -} - -function logToRc(message, logLevel) { - if (logLevel == null) { - logLevel = "debug"; - } - if (debugMode) { - sendToRC("logLevel=" + logLevel + ":" + message.replace(/[\n\r\015]/g, " ") + "\n"); - } -} - -function isArray(x) { - return ((typeof x) == "object") && (x["length"] != null); -} - -function serializeString(name, s) { - return name + "=unescape(\"" + escape(s) + "\");"; -} - -function serializeObject(name, x) -{ - var s = ''; - - if (isArray(x)) - { - s = name + "=new Array(); "; - var len = x["length"]; - for (var j = 0; j < len; j++) - { - s += serializeString(name + "[" + j + "]", x[j]); - } - } - else if (typeof x == "string") - { - s = serializeString(name, x); - } - else - { - throw "unrecognized object not encoded: " + name + "(" + x + ")"; - } - return s; -} - -function relayBotToRC(s) { -} - -function setSeleniumWindowName(seleniumWindowName) { - selenium.browserbot.getCurrentWindow()['seleniumWindowName'] = seleniumWindowName; -} - -function slowClicked() { - slowMode = !slowMode; -} - -SeleneseRunner = Class.create(); -Object.extend(SeleneseRunner.prototype, new TestLoop()); -Object.extend(SeleneseRunner.prototype, { - initialize : function(commandFactory) { - this.commandFactory = commandFactory; - this.requiresCallBack = true; - this.commandNode = null; - this.xmlHttpForCommandsAndResults = null; - }, - - nextCommand : function() { - var urlParms = ""; - if (postResult == "START") { - urlParms += "seleniumStart=true"; - } - this.xmlHttpForCommandsAndResults = XmlHttp.create(); - sendToRC(postResult, urlParms, this._HandleHttpResponse.bind(this), this.xmlHttpForCommandsAndResults); - }, - - commandStarted : function(command) { - this.commandNode = document.createElement("div"); - var innerHTML = command.command + '('; - if (command.target != null && command.target != "") { - innerHTML += command.target; - if (command.value != null && command.value != "") { - innerHTML += ', ' + command.value; - } - } - innerHTML += ")"; - this.commandNode.innerHTML = innerHTML; - this.commandNode.style.backgroundColor = workingColor; - if (document.getElementById("commandList") != null) { - document.getElementById("commandList").removeChild(cmd1); - document.getElementById("commandList").removeChild(cmd2); - document.getElementById("commandList").removeChild(cmd3); - document.getElementById("commandList").removeChild(cmd4); - cmd4 = cmd3; - cmd3 = cmd2; - cmd2 = cmd1; - cmd1 = this.commandNode; - document.getElementById("commandList").appendChild(cmd4); - document.getElementById("commandList").appendChild(cmd3); - document.getElementById("commandList").appendChild(cmd2); - document.getElementById("commandList").appendChild(cmd1); - } - }, - - commandComplete : function(result) { - - if (result.failed) { - if (postResult == "CONTINUATION") { - currentTest.aborted = true; - } - postResult = result.failureMessage; - this.commandNode.title = result.failureMessage; - this.commandNode.style.backgroundColor = failColor; - } else if (result.passed) { - postResult = "OK"; - this.commandNode.style.backgroundColor = passColor; - } else { - if (result.result == null) { - postResult = "OK"; - } else { - postResult = "OK," + result.result; - } - this.commandNode.style.backgroundColor = doneColor; - } - }, - - commandError : function(message) { - postResult = "ERROR: " + message; - this.commandNode.style.backgroundColor = errorColor; - this.commandNode.title = message; - }, - - testComplete : function() { - window.status = "Selenium Tests Complete, for this Test" - // Continue checking for new results - this.continueTest(); - postResult = "START"; - }, - - _HandleHttpResponse : function() { - if (this.xmlHttpForCommandsAndResults.readyState == 4) { - if (this.xmlHttpForCommandsAndResults.status == 200) { - var command = this._extractCommand(this.xmlHttpForCommandsAndResults); - this.currentCommand = command; - this.continueTestAtCurrentCommand(); - } else { - var s = 'xmlHttp returned: ' + this.xmlHttpForCommandsAndResults.status + ": " + this.xmlHttpForCommandsAndResults.statusText; - LOG.error(s); - this.currentCommand = null; - setTimeout(this.continueTestAtCurrentCommand.bind(this), 2000); - } - - } - }, - - _extractCommand : function(xmlHttp) { - if (slowMode) { - this._delay(2000); - } - - var command; - try { - var re = new RegExp("^(.*?)\n((.|[\r\n])*)"); - if (re.exec(xmlHttp.responseText)) { - command = RegExp.$1; - var rest = RegExp.$2; - rest = rest.trim(); - if (rest) { - eval(rest); - } - } - else { - command = xmlHttp.responseText; - } - } catch (e) { - alert('could not get responseText: ' + e.message); - } - if (command.substr(0, '|testComplete'.length) == '|testComplete') { - return null; - } - - return this._createCommandFromRequest(command); - }, - - - _delay : function(millis) { - var startMillis = new Date(); - while (true) { - milli = new Date(); - if (milli - startMillis > millis) { - break; - } - } - }, - -// Parses a URI query string into a SeleniumCommand object - _createCommandFromRequest : function(commandRequest) { - //decodeURIComponent doesn't strip plus signs - var processed = commandRequest.replace(/\+/g, "%20"); - // strip trailing spaces - var processed = processed.replace(/\s+$/, ""); - var vars = processed.split("&"); - var cmdArgs = new Object(); - for (var i = 0; i < vars.length; i++) { - var pair = vars[i].split("="); - cmdArgs[pair[0]] = pair[1]; - } - var cmd = cmdArgs['cmd']; - var arg1 = cmdArgs['1']; - if (null == arg1) arg1 = ""; - arg1 = decodeURIComponent(arg1); - var arg2 = cmdArgs['2']; - if (null == arg2) arg2 = ""; - arg2 = decodeURIComponent(arg2); - if (cmd == null) { - throw new Error("Bad command request: " + commandRequest); - } - return new SeleniumCommand(cmd, arg1, arg2); - } - -}) - - -function sendToRC(dataToBePosted, urlParms, callback, xmlHttpObject, async) { - if (async == null) { - async = true; - } - if (xmlHttpObject == null) { - xmlHttpObject = XmlHttp.create(); - } - var url = buildBaseUrl() + "driver/?" - if (urlParms) { - url += urlParms; - } - url += "&localFrameAddress=" + (proxyInjectionMode ? makeAddressToAUTFrame() : "top"); - url += "&seleniumWindowName=" + getSeleniumWindowName(); - url += "&uniqueId=" + uniqueId; - - if (callback == null) { - callback = function() { - }; - } - url += buildDriverParams() + preventBrowserCaching(); - xmlHttpObject.open("POST", url, async); - xmlHttpObject.onreadystatechange = callback; - xmlHttpObject.send(dataToBePosted); - return null; -} - -function buildDriverParams() { - var params = ""; - - var host = runOptions.getDriverHost(); - var port = runOptions.getDriverPort(); - if (host != undefined && port != undefined) { - params = params + "&driverhost=" + host + "&driverport=" + port; - } - - var sessionId = runOptions.getSessionId(); - if (sessionId == undefined) { - sessionId = injectedSessionId; - } - if (sessionId != undefined) { - params = params + "&sessionId=" + sessionId; - } - return params; -} - -function preventBrowserCaching() { - var t = (new Date()).getTime(); - return "&counterToMakeURsUniqueAndSoStopPageCachingInTheBrowser=" + t; -} - -// Return the name of the current window in the selenium recordkeeping. -// -// In selenium, the additional widow has no name. -// -// Additional pop-ups are associated with names given by the argument to the routine waitForPopUp. -// -// I try to arrange for widows which are opened in such manner to track their own names using the top-level property -// seleniumWindowName, but it is possible that this property will not be available (if the widow has just reloaded -// itself). In this case, return "?". -// -function getSeleniumWindowName() { - var w = (proxyInjectionMode ? selenium.browserbot.getCurrentWindow() : window); - if (w.opener == null) { - return ""; - } - if (w["seleniumWindowName"] == null) { - return "?"; - } - return w["seleniumWindowName"]; -} - -// construct a JavaScript expression which leads to my frame (i.e., the frame containing the window -// in which this code is operating) -function makeAddressToAUTFrame(w, frameNavigationalJSexpression) -{ - if (w == null) - { - w = top; - frameNavigationalJSexpression = "top"; - } - - if (w == selenium.browserbot.getCurrentWindow()) - { - return frameNavigationalJSexpression; - } - for (var j = 0; j < w.frames.length; j++) - { - var t = makeAddressToAUTFrame(w.frames[j], frameNavigationalJSexpression + ".frames[" + j + "]"); - if (t != null) - { - return t; - } - } - return null; -} diff --git a/tests/test_tools/selenium/core/scripts/selenium-testrunner.js b/tests/test_tools/selenium/core/scripts/selenium-testrunner.js deleted file mode 100644 index fd7f2076..00000000 --- a/tests/test_tools/selenium/core/scripts/selenium-testrunner.js +++ /dev/null @@ -1,1281 +0,0 @@ -/* -* Copyright 2004 ThoughtWorks, Inc -* -* 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. -* -*/ - -// An object representing the current test, used external -var currentTest = null; // TODO: get rid of this global, which mirrors the htmlTestRunner.currentTest -var selenium = null; - -var htmlTestRunner; -var HtmlTestRunner = classCreate(); -objectExtend(HtmlTestRunner.prototype, { - initialize: function() { - this.metrics = new Metrics(); - this.controlPanel = new HtmlTestRunnerControlPanel(); - this.testFailed = false; - this.currentTest = null; - this.runAllTests = false; - this.appWindow = null; - // we use a timeout here to make sure the LOG has loaded first, so we can see _every_ error - setTimeout(fnBind(function() { - this.loadSuiteFrame(); - }, this), 500); - }, - - getTestSuite: function() { - return suiteFrame.getCurrentTestSuite(); - }, - - markFailed: function() { - this.testFailed = true; - this.getTestSuite().markFailed(); - }, - - loadSuiteFrame: function() { - if (selenium == null) { - var appWindow = this._getApplicationWindow(); - try { appWindow.location; } - catch (e) { - // when reloading, we may be pointing at an old window (Perm Denied) - setTimeout(fnBind(function() { - this.loadSuiteFrame(); - }, this), 50); - return; - } - selenium = Selenium.createForWindow(appWindow); - this._registerCommandHandlers(); - } - this.controlPanel.setHighlightOption(); - var testSuiteName = this.controlPanel.getTestSuiteName(); - var self = this; - if (testSuiteName) { - suiteFrame.load(testSuiteName, function() {setTimeout(fnBind(self._onloadTestSuite, self), 50)} ); - selenium.browserbot.baseUrl = absolutify(testSuiteName, window.location.href); - } - // DGF or should we use the old default? - // selenium.browserbot.baseUrl = window.location.href; - if (this.controlPanel.getBaseUrl()) { - selenium.browserbot.baseUrl = this.controlPanel.getBaseUrl(); - } - }, - - _getApplicationWindow: function () { - if (this.controlPanel.isMultiWindowMode()) { - return this._getSeparateApplicationWindow(); - } - return $('myiframe').contentWindow; - }, - - _getSeparateApplicationWindow: function () { - if (this.appWindow == null) { - this.appWindow = openSeparateApplicationWindow('TestRunner-splash.html', this.controlPanel.isAutomatedRun()); - } - return this.appWindow; - }, - - _onloadTestSuite:function () { - if (! this.getTestSuite().isAvailable()) { - return; - } - if (this.controlPanel.isAutomatedRun()) { - this.startTestSuite(); - } else if (this.controlPanel.getAutoUrl()) { - //todo what is the autourl doing, left to check it out - addLoadListener(this._getApplicationWindow(), fnBind(this._startSingleTest, this)); - this._getApplicationWindow().src = this.controlPanel.getAutoUrl(); - } else { - this.getTestSuite().getSuiteRows()[0].loadTestCase(); - } - }, - - _startSingleTest:function () { - removeLoadListener(getApplicationWindow(), fnBind(this._startSingleTest, this)); - var singleTestName = this.controlPanel.getSingleTestName(); - testFrame.load(singleTestName, fnBind(this.startTest, this)); - }, - - _registerCommandHandlers: function () { - this.commandFactory = new CommandHandlerFactory(); - this.commandFactory.registerAll(selenium); - }, - - startTestSuite: function() { - this.controlPanel.reset(); - this.metrics.resetMetrics(); - this.getTestSuite().reset(); - this.runAllTests = true; - this.runNextTest(); - }, - - runNextTest: function () { - this.getTestSuite().updateSuiteWithResultOfPreviousTest(); - if (!this.runAllTests) { - return; - } - this.getTestSuite().runNextTestInSuite(); - }, - - startTest: function () { - this.controlPanel.reset(); - testFrame.scrollToTop(); - //todo: move testFailed and storedVars to TestCase - this.testFailed = false; - storedVars = new Object(); - this.currentTest = new HtmlRunnerTestLoop(testFrame.getCurrentTestCase(), this.metrics, this.commandFactory); - currentTest = this.currentTest; - this.currentTest.start(); - }, - - runSingleTest:function() { - this.runAllTests = false; - this.metrics.resetMetrics(); - this.startTest(); - } -}); - -var runInterval = 0; - -/** SeleniumFrame encapsulates an iframe element */ -var SeleniumFrame = classCreate(); -objectExtend(SeleniumFrame.prototype, { - - initialize : function(frame) { - this.frame = frame; - addLoadListener(this.frame, fnBind(this._handleLoad, this)); - }, - - getDocument : function() { - return this.frame.contentWindow.document; - }, - - _handleLoad: function() { - this._attachStylesheet(); - this._onLoad(); - if (this.loadCallback) { - this.loadCallback(); - this.loadCallback = null; - } - }, - - _attachStylesheet: function() { - var d = this.getDocument(); - var head = d.getElementsByTagName('head').item(0); - var styleLink = d.createElement("link"); - styleLink.rel = "stylesheet"; - styleLink.type = "text/css"; - if (browserVersion && browserVersion.isChrome) { - // DGF We have to play a clever trick to get the right absolute path. - // This trick works on most browsers, (not IE), but is only needed in - // chrome - var tempLink = window.document.createElement("link"); - tempLink.href = "selenium-test.css"; // this will become an absolute href - styleLink.href = tempLink.href; - } else { - // this works in every browser (except Firefox in chrome mode) - var styleSheetPath = window.location.pathname.replace(/[^\/\\]+$/, "selenium-test.css"); - if (browserVersion.isIE && window.location.protocol == "file:") { - styleSheetPath = "file://" + styleSheetPath; - } - styleLink.href = styleSheetPath; - } - head.appendChild(styleLink); - }, - - _onLoad: function() { - }, - - scrollToTop : function() { - this.frame.contentWindow.scrollTo(0, 0); - }, - - _setLocation: function(location) { - var isChrome = browserVersion.isChrome || false; - var isHTA = browserVersion.isHTA || false; - // DGF TODO multiWindow - location += "?thisIsChrome=" + isChrome + "&thisIsHTA=" + isHTA; - if (browserVersion.isSafari) { - // safari doesn't reload the page when the location equals to current location. - // hence, set the location to blank so that the page will reload automatically. - this.frame.src = "about:blank"; - this.frame.src = location; - } else { - this.frame.contentWindow.location.replace(location); - } - }, - - load: function(/* url, [callback] */) { - if (arguments.length > 1) { - this.loadCallback = arguments[1]; - - } - this._setLocation(arguments[0]); - } - -}); - -/** HtmlTestSuiteFrame - encapsulates the suite iframe element */ -var HtmlTestSuiteFrame = classCreate(); -objectExtend(HtmlTestSuiteFrame.prototype, SeleniumFrame.prototype); -objectExtend(HtmlTestSuiteFrame.prototype, { - - getCurrentTestSuite: function() { - if (!this.currentTestSuite) { - this.currentTestSuite = new HtmlTestSuite(this.getDocument()); - } - return this.currentTestSuite; - } - -}); - -/** HtmlTestFrame - encapsulates the test-case iframe element */ -var HtmlTestFrame = classCreate(); -objectExtend(HtmlTestFrame.prototype, SeleniumFrame.prototype); -objectExtend(HtmlTestFrame.prototype, { - - _onLoad: function() { - this.currentTestCase = new HtmlTestCase(this.getDocument(), htmlTestRunner.getTestSuite().getCurrentRow()); - }, - - getCurrentTestCase: function() { - return this.currentTestCase; - } - -}); - -function onSeleniumLoad() { - suiteFrame = new HtmlTestSuiteFrame(getSuiteFrame()); - testFrame = new HtmlTestFrame(getTestFrame()); - htmlTestRunner = new HtmlTestRunner(); -} - -var suiteFrame; -var testFrame; - -function getSuiteFrame() { - var f = $('testSuiteFrame'); - if (f == null) { - f = top; - // proxyInjection mode does not set myiframe - } - return f; -} - -function getTestFrame() { - var f = $('testFrame'); - if (f == null) { - f = top; - // proxyInjection mode does not set myiframe - } - return f; -} - -var HtmlTestRunnerControlPanel = classCreate(); -objectExtend(HtmlTestRunnerControlPanel.prototype, URLConfiguration.prototype); -objectExtend(HtmlTestRunnerControlPanel.prototype, { - initialize: function() { - this._acquireQueryString(); - - this.runInterval = 0; - - this.highlightOption = $('highlightOption'); - this.pauseButton = $('pauseTest'); - this.stepButton = $('stepTest'); - - this.highlightOption.onclick = fnBindAsEventListener((function() { - this.setHighlightOption(); - }), this); - this.pauseButton.onclick = fnBindAsEventListener(this.pauseCurrentTest, this); - this.stepButton.onclick = fnBindAsEventListener(this.stepCurrentTest, this); - - - this.speedController = new Control.Slider('speedHandle', 'speedTrack', { - range: $R(0, 1000), - onSlide: fnBindAsEventListener(this.setRunInterval, this), - onChange: fnBindAsEventListener(this.setRunInterval, this) - }); - - this._parseQueryParameter(); - }, - - setHighlightOption: function () { - var isHighlight = this.highlightOption.checked; - selenium.browserbot.setShouldHighlightElement(isHighlight); - }, - - _parseQueryParameter: function() { - var tempRunInterval = this._getQueryParameter("runInterval"); - if (tempRunInterval) { - this.setRunInterval(tempRunInterval); - } - this.highlightOption.checked = this._getQueryParameter("highlight"); - }, - - setRunInterval: function(runInterval) { - this.runInterval = runInterval; - }, - - setToPauseAtNextCommand: function() { - this.runInterval = -1; - }, - - pauseCurrentTest: function () { - this.setToPauseAtNextCommand(); - this._switchPauseButtonToContinue(); - }, - - continueCurrentTest: function () { - this.reset(); - currentTest.resume(); - }, - - reset: function() { - // this.runInterval = this.speedController.value; - this._switchContinueButtonToPause(); - }, - - _switchContinueButtonToPause: function() { - this.pauseButton.className = "cssPauseTest"; - this.pauseButton.onclick = fnBindAsEventListener(this.pauseCurrentTest, this); - }, - - _switchPauseButtonToContinue: function() { - $('stepTest').disabled = false; - this.pauseButton.className = "cssContinueTest"; - this.pauseButton.onclick = fnBindAsEventListener(this.continueCurrentTest, this); - }, - - stepCurrentTest: function () { - this.setToPauseAtNextCommand(); - currentTest.resume(); - }, - - isAutomatedRun: function() { - return this._isQueryParameterTrue("auto"); - }, - - shouldSaveResultsToFile: function() { - return this._isQueryParameterTrue("save"); - }, - - closeAfterTests: function() { - return this._isQueryParameterTrue("close"); - }, - - getTestSuiteName: function() { - return this._getQueryParameter("test"); - }, - - getSingleTestName: function() { - return this._getQueryParameter("singletest"); - }, - - getAutoUrl: function() { - return this._getQueryParameter("autoURL"); - }, - - getResultsUrl: function() { - return this._getQueryParameter("resultsUrl"); - }, - - _acquireQueryString: function() { - if (this.queryString) return; - if (browserVersion.isHTA) { - var args = this._extractArgs(); - if (args.length < 2) return null; - this.queryString = args[1]; - } else { - this.queryString = location.search.substr(1); - } - } - -}); - -var AbstractResultAwareRow = classCreate(); -objectExtend(AbstractResultAwareRow.prototype, { - - initialize: function(trElement) { - this.trElement = trElement; - }, - - setStatus: function(status) { - this.unselect(); - this.trElement.className = this.trElement.className.replace(/status_[a-z]+/, ""); - if (status) { - addClassName(this.trElement, "status_" + status); - } - }, - - select: function() { - addClassName(this.trElement, "selected"); - safeScrollIntoView(this.trElement); - }, - - unselect: function() { - removeClassName(this.trElement, "selected"); - }, - - markPassed: function() { - this.setStatus("passed"); - }, - - markDone: function() { - this.setStatus("done"); - }, - - markFailed: function() { - this.setStatus("failed"); - } - -}); - -var TitleRow = classCreate(); -objectExtend(TitleRow.prototype, AbstractResultAwareRow.prototype); -objectExtend(TitleRow.prototype, { - - initialize: function(trElement) { - this.trElement = trElement; - trElement.className = "title"; - } - -}); - -var HtmlTestCaseRow = classCreate(); -objectExtend(HtmlTestCaseRow.prototype, AbstractResultAwareRow.prototype); -objectExtend(HtmlTestCaseRow.prototype, { - - getCommand: function () { - return new SeleniumCommand(getText(this.trElement.cells[0]), - getText(this.trElement.cells[1]), - getText(this.trElement.cells[2]), - this.isBreakpoint()); - }, - - markFailed: function(errorMsg) { - AbstractResultAwareRow.prototype.markFailed.call(this, errorMsg); - this.setMessage(errorMsg); - }, - - setMessage: function(message) { - setText(this.trElement.cells[2], message); - }, - - reset: function() { - this.setStatus(null); - var thirdCell = this.trElement.cells[2]; - if (thirdCell) { - if (thirdCell.originalHTML) { - thirdCell.innerHTML = thirdCell.originalHTML; - } else { - thirdCell.originalHTML = thirdCell.innerHTML; - } - } - }, - - onClick: function() { - if (this.trElement.isBreakpoint == undefined) { - this.trElement.isBreakpoint = true; - addClassName(this.trElement, "breakpoint"); - } else { - this.trElement.isBreakpoint = undefined; - removeClassName(this.trElement, "breakpoint"); - } - }, - - addBreakpointSupport: function() { - elementSetStyle(this.trElement, {"cursor" : "pointer"}); - this.trElement.onclick = fnBindAsEventListener(function() { - this.onClick(); - }, this); - }, - - isBreakpoint: function() { - if (this.trElement.isBreakpoint == undefined || this.trElement.isBreakpoint == null) { - return false - } - return this.trElement.isBreakpoint; - } -}); - -var HtmlTestSuiteRow = classCreate(); -objectExtend(HtmlTestSuiteRow.prototype, AbstractResultAwareRow.prototype); -objectExtend(HtmlTestSuiteRow.prototype, { - - initialize: function(trElement, testFrame, htmlTestSuite) { - this.trElement = trElement; - this.testFrame = testFrame; - this.htmlTestSuite = htmlTestSuite; - this.link = trElement.getElementsByTagName("a")[0]; - this.link.onclick = fnBindAsEventListener(this._onClick, this); - }, - - reset: function() { - this.setStatus(null); - }, - - _onClick: function() { - this.loadTestCase(null); - return false; - }, - - loadTestCase: function(onloadFunction) { - this.htmlTestSuite.unselectCurrentRow(); - this.select(); - this.htmlTestSuite.currentRowInSuite = this.trElement.rowIndex - 1; - // If the row has a stored results table, use that - var resultsFromPreviousRun = this.trElement.cells[1]; - if (resultsFromPreviousRun) { - // todo: delegate to TestFrame, e.g. - // this.testFrame.restoreTestCase(resultsFromPreviousRun.innerHTML); - var testBody = this.testFrame.getDocument().body; - testBody.innerHTML = resultsFromPreviousRun.innerHTML; - this.testFrame._onLoad(); - if (onloadFunction) { - onloadFunction(); - } - } else { - this.testFrame.load(this.link.href, onloadFunction); - } - }, - - saveTestResults: function() { - // todo: GLOBAL ACCESS! - var resultHTML = this.testFrame.getDocument().body.innerHTML; - if (!resultHTML) return; - - // todo: why create this div? - var divElement = this.trElement.ownerDocument.createElement("div"); - divElement.innerHTML = resultHTML; - - var hiddenCell = this.trElement.ownerDocument.createElement("td"); - hiddenCell.appendChild(divElement); - hiddenCell.style.display = "none"; - - this.trElement.appendChild(hiddenCell); - } - -}); - -var HtmlTestSuite = classCreate(); -objectExtend(HtmlTestSuite.prototype, { - - initialize: function(suiteDocument) { - this.suiteDocument = suiteDocument; - this.suiteRows = this._collectSuiteRows(); - this.titleRow = new TitleRow(this.getTestTable().rows[0]); - this.reset(); - }, - - reset: function() { - this.failed = false; - this.currentRowInSuite = -1; - this.titleRow.setStatus(null); - for (var i = 0; i < this.suiteRows.length; i++) { - var row = this.suiteRows[i]; - row.reset(); - } - }, - - getSuiteRows: function() { - return this.suiteRows; - }, - - getTestTable: function() { - var tables = $A(this.suiteDocument.getElementsByTagName("table")); - return tables[0]; - }, - - isAvailable: function() { - return this.getTestTable() != null; - }, - - _collectSuiteRows: function () { - var result = []; - var tables = $A(this.suiteDocument.getElementsByTagName("table")); - var testTable = tables[0]; - for (rowNum = 1; rowNum < testTable.rows.length; rowNum++) { - var rowElement = testTable.rows[rowNum]; - result.push(new HtmlTestSuiteRow(rowElement, testFrame, this)); - } - - // process the unsuited rows as well - for (var tableNum = 1; tableNum < $A(this.suiteDocument.getElementsByTagName("table")).length; tableNum++) { - testTable = tables[tableNum]; - for (rowNum = 1; rowNum < testTable.rows.length; rowNum++) { - var rowElement = testTable.rows[rowNum]; - new HtmlTestSuiteRow(rowElement, testFrame, this); - } - } - return result; - }, - - getCurrentRow: function() { - if (this.currentRowInSuite == -1) { - return null; - } - return this.suiteRows[this.currentRowInSuite]; - }, - - unselectCurrentRow: function() { - var currentRow = this.getCurrentRow() - if (currentRow) { - currentRow.unselect(); - } - }, - - markFailed: function() { - this.failed = true; - this.titleRow.markFailed(); - }, - - markDone: function() { - if (!this.failed) { - this.titleRow.markPassed(); - } - }, - - _startCurrentTestCase: function() { - this.getCurrentRow().loadTestCase(fnBind(htmlTestRunner.startTest, htmlTestRunner)); - }, - - _onTestSuiteComplete: function() { - this.markDone(); - new TestResult(this.failed, this.getTestTable()).post(); - }, - - updateSuiteWithResultOfPreviousTest: function() { - if (this.currentRowInSuite >= 0) { - this.getCurrentRow().saveTestResults(); - } - }, - - runNextTestInSuite: function() { - this.currentRowInSuite++; - - // If we are done with all of the tests, set the title bar as pass or fail - if (this.currentRowInSuite >= this.suiteRows.length) { - this._onTestSuiteComplete(); - } else { - this._startCurrentTestCase(); - } - } - - - -}); - -var TestResult = classCreate(); -objectExtend(TestResult.prototype, { - -// Post the results to a servlet, CGI-script, etc. The URL of the -// results-handler defaults to "/postResults", but an alternative location -// can be specified by providing a "resultsUrl" query parameter. -// -// Parameters passed to the results-handler are: -// result: passed/failed depending on whether the suite passed or failed -// totalTime: the total running time in seconds for the suite. -// -// numTestPasses: the total number of tests which passed. -// numTestFailures: the total number of tests which failed. -// -// numCommandPasses: the total number of commands which passed. -// numCommandFailures: the total number of commands which failed. -// numCommandErrors: the total number of commands which errored. -// -// suite: the suite table, including the hidden column of test results -// testTable.1 to testTable.N: the individual test tables -// - initialize: function (suiteFailed, suiteTable) { - this.controlPanel = htmlTestRunner.controlPanel; - this.metrics = htmlTestRunner.metrics; - this.suiteFailed = suiteFailed; - this.suiteTable = suiteTable; - }, - - post: function () { - if (!this.controlPanel.isAutomatedRun()) { - return; - } - var form = document.createElement("form"); - document.body.appendChild(form); - - form.id = "resultsForm"; - form.method = "post"; - form.target = "myiframe"; - - var resultsUrl = this.controlPanel.getResultsUrl(); - if (!resultsUrl) { - resultsUrl = "./postResults"; - } - - var actionAndParameters = resultsUrl.split('?', 2); - form.action = actionAndParameters[0]; - var resultsUrlQueryString = actionAndParameters[1]; - - form.createHiddenField = function(name, value) { - input = document.createElement("input"); - input.type = "hidden"; - input.name = name; - input.value = value; - this.appendChild(input); - }; - - if (resultsUrlQueryString) { - var clauses = resultsUrlQueryString.split('&'); - for (var i = 0; i < clauses.length; i++) { - var keyValuePair = clauses[i].split('=', 2); - var key = unescape(keyValuePair[0]); - var value = unescape(keyValuePair[1]); - form.createHiddenField(key, value); - } - } - - form.createHiddenField("selenium.version", Selenium.version); - form.createHiddenField("selenium.revision", Selenium.revision); - - form.createHiddenField("result", this.suiteFailed ? "failed" : "passed"); - - form.createHiddenField("totalTime", Math.floor((this.metrics.currentTime - this.metrics.startTime) / 1000)); - form.createHiddenField("numTestPasses", this.metrics.numTestPasses); - form.createHiddenField("numTestFailures", this.metrics.numTestFailures); - form.createHiddenField("numCommandPasses", this.metrics.numCommandPasses); - form.createHiddenField("numCommandFailures", this.metrics.numCommandFailures); - form.createHiddenField("numCommandErrors", this.metrics.numCommandErrors); - - // Create an input for each test table. The inputs are named - // testTable.1, testTable.2, etc. - for (rowNum = 1; rowNum < this.suiteTable.rows.length; rowNum++) { - // If there is a second column, then add a new input - if (this.suiteTable.rows[rowNum].cells.length > 1) { - var resultCell = this.suiteTable.rows[rowNum].cells[1]; - form.createHiddenField("testTable." + rowNum, resultCell.innerHTML); - // remove the resultCell, so it's not included in the suite HTML - resultCell.parentNode.removeChild(resultCell); - } - } - - form.createHiddenField("numTestTotal", rowNum); - - // Add HTML for the suite itself - form.createHiddenField("suite", this.suiteTable.parentNode.innerHTML); - - if (this.controlPanel.shouldSaveResultsToFile()) { - this._saveToFile(resultsUrl, form); - } else { - form.submit(); - } - document.body.removeChild(form); - if (this.controlPanel.closeAfterTests()) { - window.top.close(); - } - }, - - _saveToFile: function (fileName, form) { - // This only works when run as an IE HTA - var inputs = new Object(); - for (var i = 0; i < form.elements.length; i++) { - inputs[form.elements[i].name] = form.elements[i].value; - } - var objFSO = new ActiveXObject("Scripting.FileSystemObject") - var scriptFile = objFSO.CreateTextFile(fileName); - scriptFile.WriteLine("<html><body>\n<h1>Test suite results </h1>" + - "\n\n<table>\n<tr>\n<td>result:</td>\n<td>" + inputs["result"] + "</td>\n" + - "</tr>\n<tr>\n<td>totalTime:</td>\n<td>" + inputs["totalTime"] + "</td>\n</tr>\n" + - "<tr>\n<td>numTestPasses:</td>\n<td>" + inputs["numTestPasses"] + "</td>\n</tr>\n" + - "<tr>\n<td>numTestFailures:</td>\n<td>" + inputs["numTestFailures"] + "</td>\n</tr>\n" + - "<tr>\n<td>numCommandPasses:</td>\n<td>" + inputs["numCommandPasses"] + "</td>\n</tr>\n" + - "<tr>\n<td>numCommandFailures:</td>\n<td>" + inputs["numCommandFailures"] + "</td>\n</tr>\n" + - "<tr>\n<td>numCommandErrors:</td>\n<td>" + inputs["numCommandErrors"] + "</td>\n</tr>\n" + - "<tr>\n<td>" + inputs["suite"] + "</td>\n<td> </td>\n</tr>"); - var testNum = inputs["numTestTotal"]; - for (var rowNum = 1; rowNum < testNum; rowNum++) { - scriptFile.WriteLine("<tr>\n<td>" + inputs["testTable." + rowNum] + "</td>\n<td> </td>\n</tr>"); - } - scriptFile.WriteLine("</table></body></html>"); - scriptFile.Close(); - } -}); - -/** HtmlTestCase encapsulates an HTML test document */ -var HtmlTestCase = classCreate(); -objectExtend(HtmlTestCase.prototype, { - - initialize: function(testDocument, htmlTestSuiteRow) { - if (testDocument == null) { - throw "testDocument should not be null"; - } - if (htmlTestSuiteRow == null) { - throw "htmlTestSuiteRow should not be null"; - } - this.testDocument = testDocument; - this.htmlTestSuiteRow = htmlTestSuiteRow; - this.headerRow = new TitleRow(this.testDocument.getElementsByTagName("tr")[0]); - this.commandRows = this._collectCommandRows(); - this.nextCommandRowIndex = 0; - this._addBreakpointSupport(); - }, - - _collectCommandRows: function () { - var commandRows = []; - var tables = $A(this.testDocument.getElementsByTagName("table")); - var self = this; - for (var i = 0; i < tables.length; i++) { - var table = tables[i]; - var tableRows = $A(table.rows); - for (var j = 0; j < tableRows.length; j++) { - var candidateRow = tableRows[j]; - if (self.isCommandRow(candidateRow)) { - commandRows.push(new HtmlTestCaseRow(candidateRow)); - } - } - } - return commandRows; - }, - - isCommandRow: function (row) { - return row.cells.length >= 3; - }, - - reset: function() { - /** - * reset the test to runnable state - */ - this.nextCommandRowIndex = 0; - - this.setStatus(''); - for (var i = 0; i < this.commandRows.length; i++) { - var row = this.commandRows[i]; - row.reset(); - } - - // remove any additional fake "error" row added to the end of the document - var errorElement = this.testDocument.getElementById('error'); - if (errorElement) { - errorElement.parentNode.removeChild(errorElement); - } - }, - - getCommandRows: function () { - return this.commandRows; - }, - - setStatus: function(status) { - this.headerRow.setStatus(status); - }, - - markFailed: function() { - this.setStatus("failed"); - this.htmlTestSuiteRow.markFailed(); - }, - - markPassed: function() { - this.setStatus("passed"); - this.htmlTestSuiteRow.markPassed(); - }, - - addErrorMessage: function(errorMsg, currentRow) { - errorMsg = errorMsg.replace(/ /g, String.fromCharCode(160)).replace("\n", '\\n'); - if (currentRow) { - currentRow.markFailed(errorMsg); - } else { - var errorElement = this.testDocument.createElement("p"); - errorElement.id = "error"; - setText(errorElement, errorMsg); - this.testDocument.body.appendChild(errorElement); - errorElement.className = "status_failed"; - } - }, - - _addBreakpointSupport: function() { - for (var i = 0; i < this.commandRows.length; i++) { - var row = this.commandRows[i]; - row.addBreakpointSupport(); - } - }, - - hasMoreCommandRows: function() { - return this.nextCommandRowIndex < this.commandRows.length; - }, - - getNextCommandRow: function() { - if (this.hasMoreCommandRows()) { - return this.commandRows[this.nextCommandRowIndex++]; - } - return null; - } - -}); - - -// TODO: split out an JavascriptTestCase class to handle the "sejs" stuff - -var get_new_rows = function() { - var row_array = new Array(); - for (var i = 0; i < new_block.length; i++) { - - var new_source = (new_block[i][0].tokenizer.source.slice(new_block[i][0].start, - new_block[i][0].end)); - - var row = '<td style="display:none;" class="js">getEval</td>' + - '<td style="display:none;">currentTest.doNextCommand()</td>' + - '<td style="white-space: pre;">' + new_source + '</td>' + - '<td></td>' - - row_array.push(row); - } - return row_array; -}; - - -var Metrics = classCreate(); -objectExtend(Metrics.prototype, { - initialize: function() { - // The number of tests run - this.numTestPasses = 0; - // The number of tests that have failed - this.numTestFailures = 0; - // The number of commands which have passed - this.numCommandPasses = 0; - // The number of commands which have failed - this.numCommandFailures = 0; - // The number of commands which have caused errors (element not found) - this.numCommandErrors = 0; - // The time that the test was started. - this.startTime = null; - // The current time. - this.currentTime = null; - }, - - printMetrics: function() { - setText($('commandPasses'), this.numCommandPasses); - setText($('commandFailures'), this.numCommandFailures); - setText($('commandErrors'), this.numCommandErrors); - setText($('testRuns'), this.numTestPasses + this.numTestFailures); - setText($('testFailures'), this.numTestFailures); - - this.currentTime = new Date().getTime(); - - var timeDiff = this.currentTime - this.startTime; - var totalSecs = Math.floor(timeDiff / 1000); - - var minutes = Math.floor(totalSecs / 60); - var seconds = totalSecs % 60; - - setText($('elapsedTime'), this._pad(minutes) + ":" + this._pad(seconds)); - }, - -// Puts a leading 0 on num if it is less than 10 - _pad: function(num) { - return (num > 9) ? num : "0" + num; - }, - - resetMetrics: function() { - this.numTestPasses = 0; - this.numTestFailures = 0; - this.numCommandPasses = 0; - this.numCommandFailures = 0; - this.numCommandErrors = 0; - this.startTime = new Date().getTime(); - } - -}); - -var HtmlRunnerCommandFactory = classCreate(); -objectExtend(HtmlRunnerCommandFactory.prototype, { - - initialize: function(seleniumCommandFactory, testLoop) { - this.seleniumCommandFactory = seleniumCommandFactory; - this.testLoop = testLoop; - this.handlers = {}; - //todo: register commands - }, - - getCommandHandler: function(command) { - if (this.handlers[command]) { - return this.handlers[command]; - } - return this.seleniumCommandFactory.getCommandHandler(command); - } - -}); - -var HtmlRunnerTestLoop = classCreate(); -objectExtend(HtmlRunnerTestLoop.prototype, new TestLoop()); -objectExtend(HtmlRunnerTestLoop.prototype, { - initialize: function(htmlTestCase, metrics, seleniumCommandFactory) { - - this.commandFactory = new HtmlRunnerCommandFactory(seleniumCommandFactory, this); - this.metrics = metrics; - - this.htmlTestCase = htmlTestCase; - - se = selenium; - global.se = selenium; - - this.currentRow = null; - this.currentRowIndex = 0; - - // used for selenium tests in javascript - this.currentItem = null; - this.commandAgenda = new Array(); - this.expectedFailure = null; - this.expectedFailureType = null; - - this.htmlTestCase.reset(); - - this.sejsElement = this.htmlTestCase.testDocument.getElementById('sejs'); - if (this.sejsElement) { - var fname = 'Selenium JavaScript'; - parse_result = parse(this.sejsElement.innerHTML, fname, 0); - - var x2 = new ExecutionContext(GLOBAL_CODE); - ExecutionContext.current = x2; - - execute(parse_result, x2) - } - }, - - _advanceToNextRow: function() { - if (this.htmlTestCase.hasMoreCommandRows()) { - this.currentRow = this.htmlTestCase.getNextCommandRow(); - if (this.sejsElement) { - this.currentItem = agenda.pop(); - this.currentRowIndex++; - } - } else { - this.currentRow = null; - this.currentItem = null; - } - }, - - nextCommand : function() { - this._advanceToNextRow(); - if (this.currentRow == null) { - return null; - } - return this.currentRow.getCommand(); - }, - - commandStarted : function() { - $('pauseTest').disabled = false; - this.currentRow.select(); - this.metrics.printMetrics(); - }, - - commandComplete : function(result) { - this._checkExpectedFailure(result); - if (result.failed) { - this.metrics.numCommandFailures += 1; - this._recordFailure(result.failureMessage); - } else if (result.passed) { - this.metrics.numCommandPasses += 1; - this.currentRow.markPassed(); - } else { - this.currentRow.markDone(); - } - }, - - _checkExpectedFailure : function(result) { - if (this.expectedFailure != null) { - if (this.expectedFailureJustSet) { - this.expectedFailureJustSet = false; - return; - } - if (!result.failed) { - result.passed = false; - result.failed = true; - result.failureMessage = "Expected " + this.expectedFailureType + " did not occur."; - } else { - if (PatternMatcher.matches(this.expectedFailure, result.failureMessage)) { - var failureType = result.error ? "error" : "failure"; - if (failureType == this.expectedFailureType) { - result.failed = false; - result.passed = true; - } else { - result.failed = true; - result.failureMessage = "Expected "+this.expectedFailureType+", but "+failureType+" occurred instead"; - } - } else { - result.failed = true; - result.failureMessage = "Expected " + this.expectedFailureType + " message '" + this.expectedFailure - + "' but was '" + result.failureMessage + "'"; - } - } - this.expectedFailure = null; - this.expectedFailureType = null; - } - }, - - commandError : function(errorMessage) { - var tempResult = {}; - tempResult.passed = false; - tempResult.failed = true; - tempResult.error = true; - tempResult.failureMessage = errorMessage; - this._checkExpectedFailure(tempResult); - if (tempResult.passed) { - this.currentRow.markDone(); - return true; - } - errorMessage = tempResult.failureMessage; - this.metrics.numCommandErrors += 1; - this._recordFailure(errorMessage); - }, - - _recordFailure : function(errorMsg) { - LOG.warn("currentTest.recordFailure: " + errorMsg); - htmlTestRunner.markFailed(); - this.htmlTestCase.addErrorMessage(errorMsg, this.currentRow); - }, - - testComplete : function() { - $('pauseTest').disabled = true; - $('stepTest').disabled = true; - if (htmlTestRunner.testFailed) { - this.htmlTestCase.markFailed(); - this.metrics.numTestFailures += 1; - } else { - this.htmlTestCase.markPassed(); - this.metrics.numTestPasses += 1; - } - - this.metrics.printMetrics(); - - window.setTimeout(function() { - htmlTestRunner.runNextTest(); - }, 1); - }, - - getCommandInterval : function() { - return htmlTestRunner.controlPanel.runInterval; - }, - - pause : function() { - htmlTestRunner.controlPanel.pauseCurrentTest(); - }, - - doNextCommand: function() { - var _n = this.currentItem[0]; - var _x = this.currentItem[1]; - - new_block = new Array() - execute(_n, _x); - if (new_block.length > 0) { - var the_table = this.htmlTestCase.testDocument.getElementById("se-js-table") - var loc = this.currentRowIndex - var new_rows = get_new_rows() - - // make the new statements visible on screen... - for (var i = 0; i < new_rows.length; i++) { - the_table.insertRow(loc + 1); - the_table.rows[loc + 1].innerHTML = new_rows[i]; - this.commandRows.unshift(the_table.rows[loc + 1]) - } - - } - } - -}); - -Selenium.prototype.doPause = function(waitTime) { - /** Wait for the specified amount of time (in milliseconds) - * @param waitTime the amount of time to sleep (in milliseconds) - */ - // todo: should not refer to currentTest directly - currentTest.pauseInterval = waitTime; -}; - -Selenium.prototype.doBreak = function() { - /** Halt the currently running test, and wait for the user to press the Continue button. - * This command is useful for debugging, but be careful when using it, because it will - * force automated tests to hang until a user intervenes manually. - */ - // todo: should not refer to controlPanel directly - htmlTestRunner.controlPanel.setToPauseAtNextCommand(); -}; - -Selenium.prototype.doStore = function(expression, variableName) { - /** This command is a synonym for storeExpression. - * @param expression the value to store - * @param variableName the name of a <a href="#storedVars">variable</a> in which the result is to be stored. - */ - storedVars[variableName] = expression; -} - -/* - * Click on the located element, and attach a callback to notify - * when the page is reloaded. - */ -// DGF TODO this code has been broken for some time... what is it trying to accomplish? -Selenium.prototype.XXXdoModalDialogTest = function(returnValue) { - this.browserbot.doModalDialogTest(returnValue); -}; - -Selenium.prototype.doEcho = function(message) { - /** Prints the specified message into the third table cell in your Selenese tables. - * Useful for debugging. - * @param message the message to print - */ - currentTest.currentRow.setMessage(message); -} - -Selenium.prototype.assertSelected = function(selectLocator, optionLocator) { - /** - * Verifies that the selected option of a drop-down satisfies the optionSpecifier. <i>Note that this command is deprecated; you should use assertSelectedLabel, assertSelectedValue, assertSelectedIndex, or assertSelectedId instead.</i> - * - * <p>See the select command for more information about option locators.</p> - * - * @param selectLocator an <a href="#locators">element locator</a> identifying a drop-down menu - * @param optionLocator an option locator, typically just an option label (e.g. "John Smith") - */ - var element = this.page().findElement(selectLocator); - var locator = this.optionLocatorFactory.fromLocatorString(optionLocator); - if (element.selectedIndex == -1) - { - Assert.fail("No option selected"); - } - locator.assertSelected(element); -}; - -Selenium.prototype.assertFailureOnNext = function(message) { - /** - * Tell Selenium to expect a failure on the next command execution. - * @param message The failure message we should expect. This command will fail if the wrong failure message appears. - */ - if (!message) { - throw new SeleniumError("Message must be provided"); - } - - currentTest.expectedFailure = message; - currentTest.expectedFailureType = "failure"; - currentTest.expectedFailureJustSet = true; -}; - -Selenium.prototype.assertErrorOnNext = function(message) { - /** - * Tell Selenium to expect an error on the next command execution. - * @param message The error message we should expect. This command will fail if the wrong error message appears. - */ - // This command temporarily installs a CommandFactory that generates - // CommandHandlers that expect an error. - if (!message) { - throw new SeleniumError("Message must be provided"); - } - - currentTest.expectedFailure = message; - currentTest.expectedFailureType = "error"; - currentTest.expectedFailureJustSet = true; -}; - diff --git a/tests/test_tools/selenium/core/scripts/selenium-version.js b/tests/test_tools/selenium/core/scripts/selenium-version.js deleted file mode 100644 index 4156723d..00000000 --- a/tests/test_tools/selenium/core/scripts/selenium-version.js +++ /dev/null @@ -1,5 +0,0 @@ -Selenium.version = "0.8.2"; -Selenium.revision = "1727"; - -window.top.document.title += " v" + Selenium.version + " [" + Selenium.revision + "]"; - diff --git a/tests/test_tools/selenium/core/scripts/user-extensions.js.sample b/tests/test_tools/selenium/core/scripts/user-extensions.js.sample deleted file mode 100644 index 0f0ca840..00000000 --- a/tests/test_tools/selenium/core/scripts/user-extensions.js.sample +++ /dev/null @@ -1,75 +0,0 @@ -/* - * By default, Selenium looks for a file called "user-extensions.js", and loads and javascript - * code found in that file. This file is a sample of what that file could look like. - * - * user-extensions.js provides a convenient location for adding extensions to Selenium, like - * new actions, checks and locator-strategies. - * By default, this file does not exist. Users can create this file and place their extension code - * in this common location, removing the need to modify the Selenium sources, and hopefully assisting - * with the upgrade process. - * - * You can find contributed extensions at http://wiki.openqa.org/display/SEL/Contributed%20User-Extensions - */ - -// The following examples try to give an indication of how Selenium can be extended with javascript. - -// All do* methods on the Selenium prototype are added as actions. -// Eg add a typeRepeated action to Selenium, which types the text twice into a text box. -// The typeTwiceAndWait command will be available automatically -Selenium.prototype.doTypeRepeated = function(locator, text) { - // All locator-strategies are automatically handled by "findElement" - var element = this.page().findElement(locator); - - // Create the text to type - var valueToType = text + text; - - // Replace the element text with the new text - this.page().replaceText(element, valueToType); -}; - -// All assert* methods on the Selenium prototype are added as checks. -// Eg add a assertValueRepeated check, that makes sure that the element value -// consists of the supplied text repeated. -// The verify version will be available automatically. -Selenium.prototype.assertValueRepeated = function(locator, text) { - // All locator-strategies are automatically handled by "findElement" - var element = this.page().findElement(locator); - - // Create the text to verify - var expectedValue = text + text; - - // Get the actual element value - var actualValue = element.value; - - // Make sure the actual value matches the expected - Assert.matches(expectedValue, actualValue); -}; - -// All get* methods on the Selenium prototype result in -// store, assert, assertNot, verify, verifyNot, waitFor, and waitForNot commands. -// E.g. add a getTextLength method that returns the length of the text -// of a specified element. -// Will result in support for storeTextLength, assertTextLength, etc. -Selenium.prototype.getTextLength = function(locator) { - return this.getText(locator).length; -}; - -// All locateElementBy* methods are added as locator-strategies. -// Eg add a "valuerepeated=" locator, that finds the first element with the supplied value, repeated. -// The "inDocument" is a the document you are searching. -PageBot.prototype.locateElementByValueRepeated = function(text, inDocument) { - // Create the text to search for - var expectedValue = text + text; - - // Loop through all elements, looking for ones that have a value === our expected value - var allElements = inDocument.getElementsByTagName("*"); - for (var i = 0; i < allElements.length; i++) { - var testElement = allElements[i]; - if (testElement.value && testElement.value === expectedValue) { - return testElement; - } - } - return null; -}; - - diff --git a/tests/test_tools/selenium/core/scripts/xmlextras.js b/tests/test_tools/selenium/core/scripts/xmlextras.js deleted file mode 100644 index 267aa058..00000000 --- a/tests/test_tools/selenium/core/scripts/xmlextras.js +++ /dev/null @@ -1,153 +0,0 @@ -// This is a third party JavaScript library from -// http://webfx.eae.net/dhtml/xmlextras/xmlextras.html -// i.e. This has not been written by ThoughtWorks. - -//<script> -////////////////// -// Helper Stuff // -////////////////// - -// used to find the Automation server name -function getDomDocumentPrefix() { - if (getDomDocumentPrefix.prefix) - return getDomDocumentPrefix.prefix; - - var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"]; - var o; - for (var i = 0; i < prefixes.length; i++) { - try { - // try to create the objects - o = new ActiveXObject(prefixes[i] + ".DomDocument"); - return getDomDocumentPrefix.prefix = prefixes[i]; - } - catch (ex) {}; - } - - throw new Error("Could not find an installed XML parser"); -} - -function getXmlHttpPrefix() { - if (getXmlHttpPrefix.prefix) - return getXmlHttpPrefix.prefix; - - var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"]; - var o; - for (var i = 0; i < prefixes.length; i++) { - try { - // try to create the objects - o = new ActiveXObject(prefixes[i] + ".XmlHttp"); - return getXmlHttpPrefix.prefix = prefixes[i]; - } - catch (ex) {}; - } - - throw new Error("Could not find an installed XML parser"); -} - -////////////////////////// -// Start the Real stuff // -////////////////////////// - - -// XmlHttp factory -function XmlHttp() {} - -XmlHttp.create = function () { - try { - if (window.XMLHttpRequest) { - var req = new XMLHttpRequest(); - - // some versions of Moz do not support the readyState property - // and the onreadystate event so we patch it! - if (req.readyState == null) { - req.readyState = 1; - req.addEventListener("load", function () { - req.readyState = 4; - if (typeof req.onreadystatechange == "function") - req.onreadystatechange(); - }, false); - } - - return req; - } - if (window.ActiveXObject) { - return new ActiveXObject(getXmlHttpPrefix() + ".XmlHttp"); - } - } - catch (ex) {} - // fell through - throw new Error("Your browser does not support XmlHttp objects"); -}; - -// XmlDocument factory -function XmlDocument() {} - -XmlDocument.create = function () { - try { - // DOM2 - if (document.implementation && document.implementation.createDocument) { - var doc = document.implementation.createDocument("", "", null); - - // some versions of Moz do not support the readyState property - // and the onreadystate event so we patch it! - if (doc.readyState == null) { - doc.readyState = 1; - doc.addEventListener("load", function () { - doc.readyState = 4; - if (typeof doc.onreadystatechange == "function") - doc.onreadystatechange(); - }, false); - } - - return doc; - } - if (window.ActiveXObject) - return new ActiveXObject(getDomDocumentPrefix() + ".DomDocument"); - } - catch (ex) {} - throw new Error("Your browser does not support XmlDocument objects"); -}; - -// Create the loadXML method and xml getter for Mozilla -if (window.DOMParser && - window.XMLSerializer && - window.Node && Node.prototype && Node.prototype.__defineGetter__) { - - // XMLDocument did not extend the Document interface in some versions - // of Mozilla. Extend both! - //XMLDocument.prototype.loadXML = - Document.prototype.loadXML = function (s) { - - // parse the string to a new doc - var doc2 = (new DOMParser()).parseFromString(s, "text/xml"); - - // remove all initial children - while (this.hasChildNodes()) - this.removeChild(this.lastChild); - - // insert and import nodes - for (var i = 0; i < doc2.childNodes.length; i++) { - this.appendChild(this.importNode(doc2.childNodes[i], true)); - } - }; - - - /* - * xml getter - * - * This serializes the DOM tree to an XML String - * - * Usage: var sXml = oNode.xml - * - */ - // XMLDocument did not extend the Document interface in some versions - // of Mozilla. Extend both! - /* - XMLDocument.prototype.__defineGetter__("xml", function () { - return (new XMLSerializer()).serializeToString(this); - }); - */ - Document.prototype.__defineGetter__("xml", function () { - return (new XMLSerializer()).serializeToString(this); - }); -}
\ No newline at end of file diff --git a/tests/test_tools/selenium/core/selenium-test.css b/tests/test_tools/selenium/core/selenium-test.css deleted file mode 100644 index c58e0c7d..00000000 --- a/tests/test_tools/selenium/core/selenium-test.css +++ /dev/null @@ -1,43 +0,0 @@ -body, table {
- font-family: Verdana, Arial, sans-serif;
- font-size: 12;
-}
-
-table {
- border-collapse: collapse;
- border: 1px solid #ccc;
-}
-
-th, td {
- padding-left: 0.3em;
- padding-right: 0.3em;
-}
-
-a {
- text-decoration: none;
-}
-
-.title {
- font-style: italic;
-}
-
-.selected {
- background-color: #ffffcc;
-}
-
-.status_done {
- background-color: #eeffee;
-}
-
-.status_passed {
- background-color: #ccffcc;
-}
-
-.status_failed {
- background-color: #ffcccc;
-}
-
-.breakpoint {
- background-color: #cccccc;
- border: 1px solid black;
-}
diff --git a/tests/test_tools/selenium/core/selenium.css b/tests/test_tools/selenium/core/selenium.css deleted file mode 100644 index f5240822..00000000 --- a/tests/test_tools/selenium/core/selenium.css +++ /dev/null @@ -1,251 +0,0 @@ -/* - * Copyright 2005 ThoughtWorks, Inc - * - * 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. - */ - -/*---( Layout )---*/ - -* { -} - -body { - overflow: auto; - margin: 0px; - padding: 0px; -} - -td { - position: static; -} - -tr { - vertical-align: top; -} - -.layout { - width: 100%; - height: 100%; - border-collapse: collapse; -} - -.layout td { - border: 0; -} - -iframe { - border: 0px; - width: 100%; - height: 100%; - background: white; - overflow: auto; -} - -/*---( Style )---*/ - -body, html { - font-family: Verdana, Arial, sans-serif; -} - -.selenium th, .selenium td { - border: 1px solid #999; -} - -.header { - background: #ccc; - padding: 0; - font-size: 90%; -} - -#controlPanel { - padding: 0.5ex; - background: #eee; - overflow: auto; - font-size: 75%; - text-align: center; -} - -#controlPanel fieldset { - margin: 0.3ex; - padding: 0.3ex; -} - -#controlPanel fieldset legend { - color: black; -} - - -#controlPanel table { - font-size: 100%; -} - -#controlPanel th, #controlPanel td { - border: 0; -} - -h1 { - margin: 0.2ex; - font-size: 130%; - font-weight: bold; -} - -h2 { - margin: 0.2ex; - font-size: 80%; - font-weight: normal; -} - -.selenium a { - color: black; - text-decoration: none; -} - -.selenium a:hover { - text-decoration: underline; -} - -button, label { - cursor: pointer; -} - -#stats { - margin: 0.5em auto 0.5em auto; -} - -#stats th, #stats td { - text-align: left; - padding-left: 2px; -} - -#stats th { - text-decoration: underline; -} - -#stats td.count { - font-weight: bold; - text-align: right; -} - -#testRuns { - color: green; -} - -#testFailures { - color: red; -} - -#commandPasses { - color: green; -} - -#commandFailures { - color: red; -} - -#commandErrors { - color: #f90; -} - - -/*---( Logging Console )---*/ - -#logging-console { - background: #fff; - font-size: 75%; -} - -#logging-console #banner { - display: block; - width: 100%; - position: fixed; - top: 0; - background: #ddd; - border-bottom: 1px solid #666; -} - -#logging-console #logLevelChooser { - float: right; - margin: 3px; -} - -#logging-console ul { - list-style-type: none; - margin: 0px; - margin-top: 3em; - padding-left: 5px; -} - -#logging-console li { - margin: 2px; - border-top: 1px solid #ccc; -} - -#logging-console li.error { - font-weight: bold; - color: red; -} - -#logging-console li.warn { - color: red; -} - -#logging-console li.debug { - color: green; -} - -div.executionOptions { - padding-left: 5em; -} - -div.executionOptions label, div.executionOptions input { - display: block; - float: left; -} - -div.executionOptions br { - clear: left; -} - -#speedSlider { - text-align: left; - margin: 0px auto; - width: 260px; - line-height: 0px; - font-size: 0px; - padding: 0px; -} - -#speedSlider #speedTrack { - background-color: #333; - width: 260px; - height: 2px; - line-height: 2px; - z-index: 1; - border: 1px solid; - border-color: #999 #ddd #ddd #999; - cursor: pointer; -} - -#speedSlider #speedHandle { - width: 12px; - top: -8px; - background-color: #666; - position: relative; - margin: 0px; - height: 8px; - line-height: 8px; - z-index: 1; - border: 1px solid; - border-color: #999 #333 #333 #999; - cursor: pointer; -} diff --git a/tests/test_tools/selenium/core/xpath/dom.js b/tests/test_tools/selenium/core/xpath/dom.js deleted file mode 100644 index 85e0ab08..00000000 --- a/tests/test_tools/selenium/core/xpath/dom.js +++ /dev/null @@ -1,428 +0,0 @@ -// Copyright 2005 Google Inc. -// All Rights Reserved -// -// An XML parse and a minimal DOM implementation that just supportes -// the subset of the W3C DOM that is used in the XSLT implementation. -// -// References: -// -// [DOM] W3C DOM Level 3 Core Specification -// <http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/>. -// -// -// Author: Steffen Meschkat <mesch@google.com> - -// NOTE: The split() method in IE omits empty result strings. This is -// utterly annoying. So we don't use it here. - -// Resolve entities in XML text fragments. According to the DOM -// specification, the DOM is supposed to resolve entity references at -// the API level. I.e. no entity references are passed through the -// API. See "Entities and the DOM core", p.12, DOM 2 Core -// Spec. However, different browsers actually pass very different -// values at the API. -// -function xmlResolveEntities(s) { - - var parts = stringSplit(s, '&'); - - var ret = parts[0]; - for (var i = 1; i < parts.length; ++i) { - var rp = stringSplit(parts[i], ';'); - if (rp.length == 1) { - // no entity reference: just a & but no ; - ret += parts[i]; - continue; - } - - var ch; - switch (rp[0]) { - case 'lt': - ch = '<'; - break; - case 'gt': - ch = '>'; - break; - case 'amp': - ch = '&'; - break; - case 'quot': - ch = '"'; - break; - case 'apos': - ch = '\''; - break; - case 'nbsp': - ch = String.fromCharCode(160); - break; - default: - // Cool trick: let the DOM do the entity decoding. We assign - // the entity text through non-W3C DOM properties and read it - // through the W3C DOM. W3C DOM access is specified to resolve - // entities. - var span = window.document.createElement('span'); - span.innerHTML = '&' + rp[0] + '; '; - ch = span.childNodes[0].nodeValue.charAt(0); - } - ret += ch + rp[1]; - } - - return ret; -} - - -// Parses the given XML string with our custom, JavaScript XML parser. Written -// by Steffen Meschkat (mesch@google.com). -function xmlParse(xml) { - Timer.start('xmlparse'); - var regex_empty = /\/$/; - - // See also <http://www.w3.org/TR/REC-xml/#sec-common-syn> for - // allowed chars in a tag and attribute name. TODO(mesch): the - // following is still not completely correct. - - var regex_tagname = /^([\w:-]*)/; - var regex_attribute = /([\w:-]+)\s?=\s?('([^\']*)'|"([^\"]*)")/g; - - var xmldoc = new XDocument(); - var root = xmldoc; - - // For the record: in Safari, we would create native DOM nodes, but - // in Opera that is not possible, because the DOM only allows HTML - // element nodes to be created, so we have to do our own DOM nodes. - - // xmldoc = document.implementation.createDocument('','',null); - // root = xmldoc; // .createDocumentFragment(); - // NOTE(mesch): using the DocumentFragment instead of the Document - // crashes my Safari 1.2.4 (v125.12). - var stack = []; - - var parent = root; - stack.push(parent); - - var x = stringSplit(xml, '<'); - for (var i = 1; i < x.length; ++i) { - var xx = stringSplit(x[i], '>'); - var tag = xx[0]; - var text = xmlResolveEntities(xx[1] || ''); - - if (tag.charAt(0) == '/') { - stack.pop(); - parent = stack[stack.length-1]; - - } else if (tag.charAt(0) == '?') { - // Ignore XML declaration and processing instructions - } else if (tag.charAt(0) == '!') { - // Ignore notation and comments - } else { - var empty = tag.match(regex_empty); - var tagname = regex_tagname.exec(tag)[1]; - var node = xmldoc.createElement(tagname); - - var att; - while (att = regex_attribute.exec(tag)) { - var val = xmlResolveEntities(att[3] || att[4] || ''); - node.setAttribute(att[1], val); - } - - if (empty) { - parent.appendChild(node); - } else { - parent.appendChild(node); - parent = node; - stack.push(node); - } - } - - if (text && parent != root) { - parent.appendChild(xmldoc.createTextNode(text)); - } - } - - Timer.end('xmlparse'); - return root; -} - - -// Our W3C DOM Node implementation. Note we call it XNode because we -// can't define the identifier Node. We do this mostly for Opera, -// where we can't reuse the HTML DOM for parsing our own XML, and for -// Safari, where it is too expensive to have the template processor -// operate on native DOM nodes. -function XNode(type, name, value, owner) { - this.attributes = []; - this.childNodes = []; - - XNode.init.call(this, type, name, value, owner); -} - -// Don't call as method, use apply() or call(). -XNode.init = function(type, name, value, owner) { - this.nodeType = type - 0; - this.nodeName = '' + name; - this.nodeValue = '' + value; - this.ownerDocument = owner; - - this.firstChild = null; - this.lastChild = null; - this.nextSibling = null; - this.previousSibling = null; - this.parentNode = null; -} - -XNode.unused_ = []; - -XNode.recycle = function(node) { - if (!node) { - return; - } - - if (node.constructor == XDocument) { - XNode.recycle(node.documentElement); - return; - } - - if (node.constructor != this) { - return; - } - - XNode.unused_.push(node); - for (var a = 0; a < node.attributes.length; ++a) { - XNode.recycle(node.attributes[a]); - } - for (var c = 0; c < node.childNodes.length; ++c) { - XNode.recycle(node.childNodes[c]); - } - node.attributes.length = 0; - node.childNodes.length = 0; - XNode.init.call(node, 0, '', '', null); -} - -XNode.create = function(type, name, value, owner) { - if (XNode.unused_.length > 0) { - var node = XNode.unused_.pop(); - XNode.init.call(node, type, name, value, owner); - return node; - } else { - return new XNode(type, name, value, owner); - } -} - -XNode.prototype.appendChild = function(node) { - // firstChild - if (this.childNodes.length == 0) { - this.firstChild = node; - } - - // previousSibling - node.previousSibling = this.lastChild; - - // nextSibling - node.nextSibling = null; - if (this.lastChild) { - this.lastChild.nextSibling = node; - } - - // parentNode - node.parentNode = this; - - // lastChild - this.lastChild = node; - - // childNodes - this.childNodes.push(node); -} - - -XNode.prototype.replaceChild = function(newNode, oldNode) { - if (oldNode == newNode) { - return; - } - - for (var i = 0; i < this.childNodes.length; ++i) { - if (this.childNodes[i] == oldNode) { - this.childNodes[i] = newNode; - - var p = oldNode.parentNode; - oldNode.parentNode = null; - newNode.parentNode = p; - - p = oldNode.previousSibling; - oldNode.previousSibling = null; - newNode.previousSibling = p; - if (newNode.previousSibling) { - newNode.previousSibling.nextSibling = newNode; - } - - p = oldNode.nextSibling; - oldNode.nextSibling = null; - newNode.nextSibling = p; - if (newNode.nextSibling) { - newNode.nextSibling.previousSibling = newNode; - } - - if (this.firstChild == oldNode) { - this.firstChild = newNode; - } - - if (this.lastChild == oldNode) { - this.lastChild = newNode; - } - - break; - } - } -} - -XNode.prototype.insertBefore = function(newNode, oldNode) { - if (oldNode == newNode) { - return; - } - - if (oldNode.parentNode != this) { - return; - } - - if (newNode.parentNode) { - newNode.parentNode.removeChild(newNode); - } - - var newChildren = []; - for (var i = 0; i < this.childNodes.length; ++i) { - var c = this.childNodes[i]; - if (c == oldNode) { - newChildren.push(newNode); - - newNode.parentNode = this; - - newNode.previousSibling = oldNode.previousSibling; - oldNode.previousSibling = newNode; - if (newNode.previousSibling) { - newNode.previousSibling.nextSibling = newNode; - } - - newNode.nextSibling = oldNode; - - if (this.firstChild == oldNode) { - this.firstChild = newNode; - } - } - newChildren.push(c); - } - this.childNodes = newChildren; -} - -XNode.prototype.removeChild = function(node) { - var newChildren = []; - for (var i = 0; i < this.childNodes.length; ++i) { - var c = this.childNodes[i]; - if (c != node) { - newChildren.push(c); - } else { - if (c.previousSibling) { - c.previousSibling.nextSibling = c.nextSibling; - } - if (c.nextSibling) { - c.nextSibling.previousSibling = c.previousSibling; - } - if (this.firstChild == c) { - this.firstChild = c.nextSibling; - } - if (this.lastChild == c) { - this.lastChild = c.previousSibling; - } - } - } - this.childNodes = newChildren; -} - - -XNode.prototype.hasAttributes = function() { - return this.attributes.length > 0; -} - - -XNode.prototype.setAttribute = function(name, value) { - for (var i = 0; i < this.attributes.length; ++i) { - if (this.attributes[i].nodeName == name) { - this.attributes[i].nodeValue = '' + value; - return; - } - } - this.attributes.push(new XNode(DOM_ATTRIBUTE_NODE, name, value)); -} - - -XNode.prototype.getAttribute = function(name) { - for (var i = 0; i < this.attributes.length; ++i) { - if (this.attributes[i].nodeName == name) { - return this.attributes[i].nodeValue; - } - } - return null; -} - -XNode.prototype.removeAttribute = function(name) { - var a = []; - for (var i = 0; i < this.attributes.length; ++i) { - if (this.attributes[i].nodeName != name) { - a.push(this.attributes[i]); - } - } - this.attributes = a; -} - - -function XDocument() { - XNode.call(this, DOM_DOCUMENT_NODE, '#document', null, this); - this.documentElement = null; -} - -XDocument.prototype = new XNode(DOM_DOCUMENT_NODE, '#document'); - -XDocument.prototype.clear = function() { - XNode.recycle(this.documentElement); - this.documentElement = null; -} - -XDocument.prototype.appendChild = function(node) { - XNode.prototype.appendChild.call(this, node); - this.documentElement = this.childNodes[0]; -} - -XDocument.prototype.createElement = function(name) { - return XNode.create(DOM_ELEMENT_NODE, name, null, this); -} - -XDocument.prototype.createDocumentFragment = function() { - return XNode.create(DOM_DOCUMENT_FRAGMENT_NODE, '#document-fragment', - null, this); -} - -XDocument.prototype.createTextNode = function(value) { - return XNode.create(DOM_TEXT_NODE, '#text', value, this); -} - -XDocument.prototype.createAttribute = function(name) { - return XNode.create(DOM_ATTRIBUTE_NODE, name, null, this); -} - -XDocument.prototype.createComment = function(data) { - return XNode.create(DOM_COMMENT_NODE, '#comment', data, this); -} - -XNode.prototype.getElementsByTagName = function(name, list) { - if (!list) { - list = []; - } - - if (this.nodeName == name) { - list.push(this); - } - - for (var i = 0; i < this.childNodes.length; ++i) { - this.childNodes[i].getElementsByTagName(name, list); - } - - return list; -} diff --git a/tests/test_tools/selenium/core/xpath/misc.js b/tests/test_tools/selenium/core/xpath/misc.js deleted file mode 100644 index b9573a22..00000000 --- a/tests/test_tools/selenium/core/xpath/misc.js +++ /dev/null @@ -1,255 +0,0 @@ -// Copyright 2005 Google Inc. -// All Rights Reserved -// -// Miscellania that support the ajaxslt implementation. -// -// Author: Steffen Meschkat <mesch@google.com> -// - -function el(i) { - return document.getElementById(i); -} - -function px(x) { - return x + 'px'; -} - -// Split a string s at all occurrences of character c. This is like -// the split() method of the string object, but IE omits empty -// strings, which violates the invariant (s.split(x).join(x) == s). -function stringSplit(s, c) { - var a = s.indexOf(c); - if (a == -1) { - return [ s ]; - } - - var parts = []; - parts.push(s.substr(0,a)); - while (a != -1) { - var a1 = s.indexOf(c, a + 1); - if (a1 != -1) { - parts.push(s.substr(a + 1, a1 - a - 1)); - } else { - parts.push(s.substr(a + 1)); - } - a = a1; - } - - return parts; -} - -// Returns the text value if a node; for nodes without children this -// is the nodeValue, for nodes with children this is the concatenation -// of the value of all children. -function xmlValue(node) { - if (!node) { - return ''; - } - - var ret = ''; - if (node.nodeType == DOM_TEXT_NODE || - node.nodeType == DOM_CDATA_SECTION_NODE || - node.nodeType == DOM_ATTRIBUTE_NODE) { - ret += node.nodeValue; - - } else if (node.nodeType == DOM_ELEMENT_NODE || - node.nodeType == DOM_DOCUMENT_NODE || - node.nodeType == DOM_DOCUMENT_FRAGMENT_NODE) { - for (var i = 0; i < node.childNodes.length; ++i) { - ret += arguments.callee(node.childNodes[i]); - } - } - return ret; -} - -// Returns the representation of a node as XML text. -function xmlText(node) { - var ret = ''; - if (node.nodeType == DOM_TEXT_NODE) { - ret += xmlEscapeText(node.nodeValue); - - } else if (node.nodeType == DOM_ELEMENT_NODE) { - ret += '<' + node.nodeName; - for (var i = 0; i < node.attributes.length; ++i) { - var a = node.attributes[i]; - if (a && a.nodeName && a.nodeValue) { - ret += ' ' + a.nodeName; - ret += '="' + xmlEscapeAttr(a.nodeValue) + '"'; - } - } - - if (node.childNodes.length == 0) { - ret += '/>'; - - } else { - ret += '>'; - for (var i = 0; i < node.childNodes.length; ++i) { - ret += arguments.callee(node.childNodes[i]); - } - ret += '</' + node.nodeName + '>'; - } - - } else if (node.nodeType == DOM_DOCUMENT_NODE || - node.nodeType == DOM_DOCUMENT_FRAGMENT_NODE) { - for (var i = 0; i < node.childNodes.length; ++i) { - ret += arguments.callee(node.childNodes[i]); - } - } - - return ret; -} - -// Applies the given function to each element of the array. -function mapExec(array, func) { - for (var i = 0; i < array.length; ++i) { - func(array[i]); - } -} - -// Returns an array that contains the return value of the given -// function applied to every element of the input array. -function mapExpr(array, func) { - var ret = []; - for (var i = 0; i < array.length; ++i) { - ret.push(func(array[i])); - } - return ret; -}; - -// Reverses the given array in place. -function reverseInplace(array) { - for (var i = 0; i < array.length / 2; ++i) { - var h = array[i]; - var ii = array.length - i - 1; - array[i] = array[ii]; - array[ii] = h; - } -} - -// Shallow-copies an array. -function copyArray(dst, src) { - for (var i = 0; i < src.length; ++i) { - dst.push(src[i]); - } -} - -function assert(b) { - if (!b) { - throw 'assertion failed'; - } -} - -// Based on -// <http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247> -var DOM_ELEMENT_NODE = 1; -var DOM_ATTRIBUTE_NODE = 2; -var DOM_TEXT_NODE = 3; -var DOM_CDATA_SECTION_NODE = 4; -var DOM_ENTITY_REFERENCE_NODE = 5; -var DOM_ENTITY_NODE = 6; -var DOM_PROCESSING_INSTRUCTION_NODE = 7; -var DOM_COMMENT_NODE = 8; -var DOM_DOCUMENT_NODE = 9; -var DOM_DOCUMENT_TYPE_NODE = 10; -var DOM_DOCUMENT_FRAGMENT_NODE = 11; -var DOM_NOTATION_NODE = 12; - - -var xpathdebug = false; // trace xpath parsing -var xsltdebug = false; // trace xslt processing - - -// Escape XML special markup chracters: tag delimiter < > and entity -// reference start delimiter &. The escaped string can be used in XML -// text portions (i.e. between tags). -function xmlEscapeText(s) { - return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>'); -} - -// Escape XML special markup characters: tag delimiter < > entity -// reference start delimiter & and quotes ". The escaped string can be -// used in double quoted XML attribute value portions (i.e. in -// attributes within start tags). -function xmlEscapeAttr(s) { - return xmlEscapeText(s).replace(/\"/g, '"'); -} - -// Escape markup in XML text, but don't touch entity references. The -// escaped string can be used as XML text (i.e. between tags). -function xmlEscapeTags(s) { - return s.replace(/</g, '<').replace(/>/g, '>'); -} - -// An implementation of the debug log. - -var logging__ = false; - -function Log() {}; - -Log.lines = []; - -Log.write = function(s) { - if (logging__) { - this.lines.push(xmlEscapeText(s)); - this.show(); - } -}; - -// Writes the given XML with every tag on a new line. -Log.writeXML = function(xml) { - if (logging__) { - var s0 = xml.replace(/</g, '\n<'); - var s1 = xmlEscapeText(s0); - var s2 = s1.replace(/\s*\n(\s|\n)*/g, '<br/>'); - this.lines.push(s2); - this.show(); - } -} - -// Writes without any escaping -Log.writeRaw = function(s) { - if (logging__) { - this.lines.push(s); - this.show(); - } -} - -Log.clear = function() { - if (logging__) { - var l = this.div(); - l.innerHTML = ''; - this.lines = []; - } -} - -Log.show = function() { - var l = this.div(); - l.innerHTML += this.lines.join('<br/>') + '<br/>'; - this.lines = []; - l.scrollTop = l.scrollHeight; -} - -Log.div = function() { - var l = document.getElementById('log'); - if (!l) { - l = document.createElement('div'); - l.id = 'log'; - l.style.position = 'absolute'; - l.style.right = '5px'; - l.style.top = '5px'; - l.style.width = '250px'; - l.style.height = '150px'; - l.style.overflow = 'auto'; - l.style.backgroundColor = '#f0f0f0'; - l.style.border = '1px solid gray'; - l.style.fontSize = '10px'; - l.style.padding = '5px'; - document.body.appendChild(l); - } - return l; -} - - -function Timer() {} -Timer.start = function() {} -Timer.end = function() {} diff --git a/tests/test_tools/selenium/core/xpath/xpath.js b/tests/test_tools/selenium/core/xpath/xpath.js deleted file mode 100644 index b93469f2..00000000 --- a/tests/test_tools/selenium/core/xpath/xpath.js +++ /dev/null @@ -1,2182 +0,0 @@ -// Copyright 2005 Google Inc. -// All Rights Reserved -// -// An XPath parser and evaluator written in JavaScript. The -// implementation is complete except for functions handling -// namespaces. -// -// Reference: [XPATH] XPath Specification -// <http://www.w3.org/TR/1999/REC-xpath-19991116>. -// -// -// The API of the parser has several parts: -// -// 1. The parser function xpathParse() that takes a string and returns -// an expession object. -// -// 2. The expression object that has an evaluate() method to evaluate the -// XPath expression it represents. (It is actually a hierarchy of -// objects that resembles the parse tree, but an application will call -// evaluate() only on the top node of this hierarchy.) -// -// 3. The context object that is passed as an argument to the evaluate() -// method, which represents the DOM context in which the expression is -// evaluated. -// -// 4. The value object that is returned from evaluate() and represents -// values of the different types that are defined by XPath (number, -// string, boolean, and node-set), and allows to convert between them. -// -// These parts are near the top of the file, the functions and data -// that are used internally follow after them. -// -// -// TODO(mesch): add jsdoc comments. Use more coherent naming. -// -// -// Author: Steffen Meschkat <mesch@google.com> - - -// The entry point for the parser. -// -// @param expr a string that contains an XPath expression. -// @return an expression object that can be evaluated with an -// expression context. - -function xpathParse(expr) { - if (xpathdebug) { - Log.write('XPath parse ' + expr); - } - xpathParseInit(); - - var cached = xpathCacheLookup(expr); - if (cached) { - if (xpathdebug) { - Log.write(' ... cached'); - } - return cached; - } - - // Optimize for a few common cases: simple attribute node tests - // (@id), simple element node tests (page), variable references - // ($address), numbers (4), multi-step path expressions where each - // step is a plain element node test - // (page/overlay/locations/location). - - if (expr.match(/^(\$|@)?\w+$/i)) { - var ret = makeSimpleExpr(expr); - xpathParseCache[expr] = ret; - if (xpathdebug) { - Log.write(' ... simple'); - } - return ret; - } - - if (expr.match(/^\w+(\/\w+)*$/i)) { - var ret = makeSimpleExpr2(expr); - xpathParseCache[expr] = ret; - if (xpathdebug) { - Log.write(' ... simple 2'); - } - return ret; - } - - var cachekey = expr; // expr is modified during parse - if (xpathdebug) { - Timer.start('XPath parse', cachekey); - } - - var stack = []; - var ahead = null; - var previous = null; - var done = false; - - var parse_count = 0; - var lexer_count = 0; - var reduce_count = 0; - - while (!done) { - parse_count++; - expr = expr.replace(/^\s*/, ''); - previous = ahead; - ahead = null; - - var rule = null; - var match = ''; - for (var i = 0; i < xpathTokenRules.length; ++i) { - var result = xpathTokenRules[i].re.exec(expr); - lexer_count++; - if (result && result.length > 0 && result[0].length > match.length) { - rule = xpathTokenRules[i]; - match = result[0]; - break; - } - } - - // Special case: allow operator keywords to be element and - // variable names. - - // NOTE(mesch): The parser resolves conflicts by looking ahead, - // and this is the only case where we look back to - // disambiguate. So this is indeed something different, and - // looking back is usually done in the lexer (via states in the - // general case, called "start conditions" in flex(1)). Also,the - // conflict resolution in the parser is not as robust as it could - // be, so I'd like to keep as much off the parser as possible (all - // these precedence values should be computed from the grammar - // rules and possibly associativity declarations, as in bison(1), - // and not explicitly set. - - if (rule && - (rule == TOK_DIV || - rule == TOK_MOD || - rule == TOK_AND || - rule == TOK_OR) && - (!previous || - previous.tag == TOK_AT || - previous.tag == TOK_DSLASH || - previous.tag == TOK_SLASH || - previous.tag == TOK_AXIS || - previous.tag == TOK_DOLLAR)) { - rule = TOK_QNAME; - } - - if (rule) { - expr = expr.substr(match.length); - if (xpathdebug) { - Log.write('token: ' + match + ' -- ' + rule.label); - } - ahead = { - tag: rule, - match: match, - prec: rule.prec ? rule.prec : 0, // || 0 is removed by the compiler - expr: makeTokenExpr(match) - }; - - } else { - if (xpathdebug) { - Log.write('DONE'); - } - done = true; - } - - while (xpathReduce(stack, ahead)) { - reduce_count++; - if (xpathdebug) { - Log.write('stack: ' + stackToString(stack)); - } - } - } - - if (xpathdebug) { - Log.write(stackToString(stack)); - } - - if (stack.length != 1) { - throw 'XPath parse error ' + cachekey + ':\n' + stackToString(stack); - } - - var result = stack[0].expr; - xpathParseCache[cachekey] = result; - - if (xpathdebug) { - Timer.end('XPath parse', cachekey); - } - - if (xpathdebug) { - Log.write('XPath parse: ' + parse_count + ' / ' + - lexer_count + ' / ' + reduce_count); - } - - return result; -} - -var xpathParseCache = {}; - -function xpathCacheLookup(expr) { - return xpathParseCache[expr]; -} - -function xpathReduce(stack, ahead) { - var cand = null; - - if (stack.length > 0) { - var top = stack[stack.length-1]; - var ruleset = xpathRules[top.tag.key]; - - if (ruleset) { - for (var i = 0; i < ruleset.length; ++i) { - var rule = ruleset[i]; - var match = xpathMatchStack(stack, rule[1]); - if (match.length) { - cand = { - tag: rule[0], - rule: rule, - match: match - }; - cand.prec = xpathGrammarPrecedence(cand); - break; - } - } - } - } - - var ret; - if (cand && (!ahead || cand.prec > ahead.prec || - (ahead.tag.left && cand.prec >= ahead.prec))) { - for (var i = 0; i < cand.match.matchlength; ++i) { - stack.pop(); - } - - if (xpathdebug) { - Log.write('reduce ' + cand.tag.label + ' ' + cand.prec + - ' ahead ' + (ahead ? ahead.tag.label + ' ' + ahead.prec + - (ahead.tag.left ? ' left' : '') - : ' none ')); - } - - var matchexpr = mapExpr(cand.match, function(m) { return m.expr; }); - cand.expr = cand.rule[3].apply(null, matchexpr); - - stack.push(cand); - ret = true; - - } else { - if (ahead) { - if (xpathdebug) { - Log.write('shift ' + ahead.tag.label + ' ' + ahead.prec + - (ahead.tag.left ? ' left' : '') + - ' over ' + (cand ? cand.tag.label + ' ' + - cand.prec : ' none')); - } - stack.push(ahead); - } - ret = false; - } - return ret; -} - -function xpathMatchStack(stack, pattern) { - - // NOTE(mesch): The stack matches for variable cardinality are - // greedy but don't do backtracking. This would be an issue only - // with rules of the form A* A, i.e. with an element with variable - // cardinality followed by the same element. Since that doesn't - // occur in the grammar at hand, all matches on the stack are - // unambiguous. - - var S = stack.length; - var P = pattern.length; - var p, s; - var match = []; - match.matchlength = 0; - var ds = 0; - for (p = P - 1, s = S - 1; p >= 0 && s >= 0; --p, s -= ds) { - ds = 0; - var qmatch = []; - if (pattern[p] == Q_MM) { - p -= 1; - match.push(qmatch); - while (s - ds >= 0 && stack[s - ds].tag == pattern[p]) { - qmatch.push(stack[s - ds]); - ds += 1; - match.matchlength += 1; - } - - } else if (pattern[p] == Q_01) { - p -= 1; - match.push(qmatch); - while (s - ds >= 0 && ds < 2 && stack[s - ds].tag == pattern[p]) { - qmatch.push(stack[s - ds]); - ds += 1; - match.matchlength += 1; - } - - } else if (pattern[p] == Q_1M) { - p -= 1; - match.push(qmatch); - if (stack[s].tag == pattern[p]) { - while (s - ds >= 0 && stack[s - ds].tag == pattern[p]) { - qmatch.push(stack[s - ds]); - ds += 1; - match.matchlength += 1; - } - } else { - return []; - } - - } else if (stack[s].tag == pattern[p]) { - match.push(stack[s]); - ds += 1; - match.matchlength += 1; - - } else { - return []; - } - - reverseInplace(qmatch); - qmatch.expr = mapExpr(qmatch, function(m) { return m.expr; }); - } - - reverseInplace(match); - - if (p == -1) { - return match; - - } else { - return []; - } -} - -function xpathTokenPrecedence(tag) { - return tag.prec || 2; -} - -function xpathGrammarPrecedence(frame) { - var ret = 0; - - if (frame.rule) { /* normal reduce */ - if (frame.rule.length >= 3 && frame.rule[2] >= 0) { - ret = frame.rule[2]; - - } else { - for (var i = 0; i < frame.rule[1].length; ++i) { - var p = xpathTokenPrecedence(frame.rule[1][i]); - ret = Math.max(ret, p); - } - } - } else if (frame.tag) { /* TOKEN match */ - ret = xpathTokenPrecedence(frame.tag); - - } else if (frame.length) { /* Q_ match */ - for (var j = 0; j < frame.length; ++j) { - var p = xpathGrammarPrecedence(frame[j]); - ret = Math.max(ret, p); - } - } - - return ret; -} - -function stackToString(stack) { - var ret = ''; - for (var i = 0; i < stack.length; ++i) { - if (ret) { - ret += '\n'; - } - ret += stack[i].tag.label; - } - return ret; -} - - -// XPath expression evaluation context. An XPath context consists of a -// DOM node, a list of DOM nodes that contains this node, a number -// that represents the position of the single node in the list, and a -// current set of variable bindings. (See XPath spec.) -// -// The interface of the expression context: -// -// Constructor -- gets the node, its position, the node set it -// belongs to, and a parent context as arguments. The parent context -// is used to implement scoping rules for variables: if a variable -// is not found in the current context, it is looked for in the -// parent context, recursively. Except for node, all arguments have -// default values: default position is 0, default node set is the -// set that contains only the node, and the default parent is null. -// -// Notice that position starts at 0 at the outside interface; -// inside XPath expressions this shows up as position()=1. -// -// clone() -- creates a new context with the current context as -// parent. If passed as argument to clone(), the new context has a -// different node, position, or node set. What is not passed is -// inherited from the cloned context. -// -// setVariable(name, expr) -- binds given XPath expression to the -// name. -// -// getVariable(name) -- what the name says. -// -// setNode(node, position) -- sets the context to the new node and -// its corresponding position. Needed to implement scoping rules for -// variables in XPath. (A variable is visible to all subsequent -// siblings, not only to its children.) - -function ExprContext(node, position, nodelist, parent) { - this.node = node; - this.position = position || 0; - this.nodelist = nodelist || [ node ]; - this.variables = {}; - this.parent = parent || null; - this.root = parent ? parent.root : node.ownerDocument; -} - -ExprContext.prototype.clone = function(node, position, nodelist) { - return new - ExprContext(node || this.node, - typeof position != 'undefined' ? position : this.position, - nodelist || this.nodelist, this); -}; - -ExprContext.prototype.setVariable = function(name, value) { - this.variables[name] = value; -}; - -ExprContext.prototype.getVariable = function(name) { - if (typeof this.variables[name] != 'undefined') { - return this.variables[name]; - - } else if (this.parent) { - return this.parent.getVariable(name); - - } else { - return null; - } -} - -ExprContext.prototype.setNode = function(node, position) { - this.node = node; - this.position = position; -} - - -// XPath expression values. They are what XPath expressions evaluate -// to. Strangely, the different value types are not specified in the -// XPath syntax, but only in the semantics, so they don't show up as -// nonterminals in the grammar. Yet, some expressions are required to -// evaluate to particular types, and not every type can be coerced -// into every other type. Although the types of XPath values are -// similar to the types present in JavaScript, the type coercion rules -// are a bit peculiar, so we explicitly model XPath types instead of -// mapping them onto JavaScript types. (See XPath spec.) -// -// The four types are: -// -// StringValue -// -// NumberValue -// -// BooleanValue -// -// NodeSetValue -// -// The common interface of the value classes consists of methods that -// implement the XPath type coercion rules: -// -// stringValue() -- returns the value as a JavaScript String, -// -// numberValue() -- returns the value as a JavaScript Number, -// -// booleanValue() -- returns the value as a JavaScript Boolean, -// -// nodeSetValue() -- returns the value as a JavaScript Array of DOM -// Node objects. -// - -function StringValue(value) { - this.value = value; - this.type = 'string'; -} - -StringValue.prototype.stringValue = function() { - return this.value; -} - -StringValue.prototype.booleanValue = function() { - return this.value.length > 0; -} - -StringValue.prototype.numberValue = function() { - return this.value - 0; -} - -StringValue.prototype.nodeSetValue = function() { - throw this + ' ' + Error().stack; -} - -function BooleanValue(value) { - this.value = value; - this.type = 'boolean'; -} - -BooleanValue.prototype.stringValue = function() { - return '' + this.value; -} - -BooleanValue.prototype.booleanValue = function() { - return this.value; -} - -BooleanValue.prototype.numberValue = function() { - return this.value ? 1 : 0; -} - -BooleanValue.prototype.nodeSetValue = function() { - throw this + ' ' + Error().stack; -} - -function NumberValue(value) { - this.value = value; - this.type = 'number'; -} - -NumberValue.prototype.stringValue = function() { - return '' + this.value; -} - -NumberValue.prototype.booleanValue = function() { - return !!this.value; -} - -NumberValue.prototype.numberValue = function() { - return this.value - 0; -} - -NumberValue.prototype.nodeSetValue = function() { - throw this + ' ' + Error().stack; -} - -function NodeSetValue(value) { - this.value = value; - this.type = 'node-set'; -} - -NodeSetValue.prototype.stringValue = function() { - if (this.value.length == 0) { - return ''; - } else { - return xmlValue(this.value[0]); - } -} - -NodeSetValue.prototype.booleanValue = function() { - return this.value.length > 0; -} - -NodeSetValue.prototype.numberValue = function() { - return this.stringValue() - 0; -} - -NodeSetValue.prototype.nodeSetValue = function() { - return this.value; -}; - -// XPath expressions. They are used as nodes in the parse tree and -// possess an evaluate() method to compute an XPath value given an XPath -// context. Expressions are returned from the parser. Teh set of -// expression classes closely mirrors the set of non terminal symbols -// in the grammar. Every non trivial nonterminal symbol has a -// corresponding expression class. -// -// The common expression interface consists of the following methods: -// -// evaluate(context) -- evaluates the expression, returns a value. -// -// toString() -- returns the XPath text representation of the -// expression (defined in xsltdebug.js). -// -// parseTree(indent) -- returns a parse tree representation of the -// expression (defined in xsltdebug.js). - -function TokenExpr(m) { - this.value = m; -} - -TokenExpr.prototype.evaluate = function() { - return new StringValue(this.value); -}; - -function LocationExpr() { - this.absolute = false; - this.steps = []; -} - -LocationExpr.prototype.appendStep = function(s) { - this.steps.push(s); -} - -LocationExpr.prototype.prependStep = function(s) { - var steps0 = this.steps; - this.steps = [ s ]; - for (var i = 0; i < steps0.length; ++i) { - this.steps.push(steps0[i]); - } -}; - -LocationExpr.prototype.evaluate = function(ctx) { - var start; - if (this.absolute) { - start = ctx.root; - - } else { - start = ctx.node; - } - - var nodes = []; - xPathStep(nodes, this.steps, 0, start, ctx); - return new NodeSetValue(nodes); -}; - -function xPathStep(nodes, steps, step, input, ctx) { - var s = steps[step]; - var ctx2 = ctx.clone(input); - var nodelist = s.evaluate(ctx2).nodeSetValue(); - - for (var i = 0; i < nodelist.length; ++i) { - if (step == steps.length - 1) { - nodes.push(nodelist[i]); - } else { - xPathStep(nodes, steps, step + 1, nodelist[i], ctx); - } - } -} - -function StepExpr(axis, nodetest, predicate) { - this.axis = axis; - this.nodetest = nodetest; - this.predicate = predicate || []; -} - -StepExpr.prototype.appendPredicate = function(p) { - this.predicate.push(p); -} - -StepExpr.prototype.evaluate = function(ctx) { - var input = ctx.node; - var nodelist = []; - - // NOTE(mesch): When this was a switch() statement, it didn't work - // in Safari/2.0. Not sure why though; it resulted in the JavaScript - // console output "undefined" (without any line number or so). - - if (this.axis == xpathAxis.ANCESTOR_OR_SELF) { - nodelist.push(input); - for (var n = input.parentNode; n; n = input.parentNode) { - nodelist.push(n); - } - - } else if (this.axis == xpathAxis.ANCESTOR) { - for (var n = input.parentNode; n; n = input.parentNode) { - nodelist.push(n); - } - - } else if (this.axis == xpathAxis.ATTRIBUTE) { - copyArray(nodelist, input.attributes); - - } else if (this.axis == xpathAxis.CHILD) { - copyArray(nodelist, input.childNodes); - - } else if (this.axis == xpathAxis.DESCENDANT_OR_SELF) { - nodelist.push(input); - xpathCollectDescendants(nodelist, input); - - } else if (this.axis == xpathAxis.DESCENDANT) { - xpathCollectDescendants(nodelist, input); - - } else if (this.axis == xpathAxis.FOLLOWING) { - for (var n = input.parentNode; n; n = n.parentNode) { - for (var nn = n.nextSibling; nn; nn = nn.nextSibling) { - nodelist.push(nn); - xpathCollectDescendants(nodelist, nn); - } - } - - } else if (this.axis == xpathAxis.FOLLOWING_SIBLING) { - for (var n = input.nextSibling; n; n = input.nextSibling) { - nodelist.push(n); - } - - } else if (this.axis == xpathAxis.NAMESPACE) { - alert('not implemented: axis namespace'); - - } else if (this.axis == xpathAxis.PARENT) { - if (input.parentNode) { - nodelist.push(input.parentNode); - } - - } else if (this.axis == xpathAxis.PRECEDING) { - for (var n = input.parentNode; n; n = n.parentNode) { - for (var nn = n.previousSibling; nn; nn = nn.previousSibling) { - nodelist.push(nn); - xpathCollectDescendantsReverse(nodelist, nn); - } - } - - } else if (this.axis == xpathAxis.PRECEDING_SIBLING) { - for (var n = input.previousSibling; n; n = input.previousSibling) { - nodelist.push(n); - } - - } else if (this.axis == xpathAxis.SELF) { - nodelist.push(input); - - } else { - throw 'ERROR -- NO SUCH AXIS: ' + this.axis; - } - - // process node test - var nodelist0 = nodelist; - nodelist = []; - for (var i = 0; i < nodelist0.length; ++i) { - var n = nodelist0[i]; - if (this.nodetest.evaluate(ctx.clone(n, i, nodelist0)).booleanValue()) { - nodelist.push(n); - } - } - - // process predicates - for (var i = 0; i < this.predicate.length; ++i) { - var nodelist0 = nodelist; - nodelist = []; - for (var ii = 0; ii < nodelist0.length; ++ii) { - var n = nodelist0[ii]; - if (this.predicate[i].evaluate(ctx.clone(n, ii, nodelist0)).booleanValue()) { - nodelist.push(n); - } - } - } - - return new NodeSetValue(nodelist); -}; - -function NodeTestAny() { - this.value = new BooleanValue(true); -} - -NodeTestAny.prototype.evaluate = function(ctx) { - return this.value; -}; - -function NodeTestElement() {} - -NodeTestElement.prototype.evaluate = function(ctx) { - return new BooleanValue(ctx.node.nodeType == DOM_ELEMENT_NODE); -} - -function NodeTestText() {} - -NodeTestText.prototype.evaluate = function(ctx) { - return new BooleanValue(ctx.node.nodeType == DOM_TEXT_NODE); -} - -function NodeTestComment() {} - -NodeTestComment.prototype.evaluate = function(ctx) { - return new BooleanValue(ctx.node.nodeType == DOM_COMMENT_NODE); -} - -function NodeTestPI(target) { - this.target = target; -} - -NodeTestPI.prototype.evaluate = function(ctx) { - return new - BooleanValue(ctx.node.nodeType == DOM_PROCESSING_INSTRUCTION_NODE && - (!this.target || ctx.node.nodeName == this.target)); -} - -function NodeTestNC(nsprefix) { - this.regex = new RegExp("^" + nsprefix + ":"); - this.nsprefix = nsprefix; -} - -NodeTestNC.prototype.evaluate = function(ctx) { - var n = ctx.node; - return new BooleanValue(this.regex.match(n.nodeName)); -} - -function NodeTestName(name) { - this.name = name; -} - -NodeTestName.prototype.evaluate = function(ctx) { - var n = ctx.node; - // NOTE (Patrick Lightbody): this change allows node selection to be case-insensitive - return new BooleanValue(n.nodeName.toUpperCase() == this.name.toUpperCase()); -} - -function PredicateExpr(expr) { - this.expr = expr; -} - -PredicateExpr.prototype.evaluate = function(ctx) { - var v = this.expr.evaluate(ctx); - if (v.type == 'number') { - // NOTE(mesch): Internally, position is represented starting with - // 0, however in XPath position starts with 1. See functions - // position() and last(). - return new BooleanValue(ctx.position == v.numberValue() - 1); - } else { - return new BooleanValue(v.booleanValue()); - } -}; - -function FunctionCallExpr(name) { - this.name = name; - this.args = []; -} - -FunctionCallExpr.prototype.appendArg = function(arg) { - this.args.push(arg); -}; - -FunctionCallExpr.prototype.evaluate = function(ctx) { - var fn = '' + this.name.value; - var f = this.xpathfunctions[fn]; - if (f) { - return f.call(this, ctx); - } else { - Log.write('XPath NO SUCH FUNCTION ' + fn); - return new BooleanValue(false); - } -}; - -FunctionCallExpr.prototype.xpathfunctions = { - 'last': function(ctx) { - assert(this.args.length == 0); - // NOTE(mesch): XPath position starts at 1. - return new NumberValue(ctx.nodelist.length); - }, - - 'position': function(ctx) { - assert(this.args.length == 0); - // NOTE(mesch): XPath position starts at 1. - return new NumberValue(ctx.position + 1); - }, - - 'count': function(ctx) { - assert(this.args.length == 1); - var v = this.args[0].evaluate(ctx); - return new NumberValue(v.nodeSetValue().length); - }, - - 'id': function(ctx) { - assert(this.args.length == 1); - var e = this.args.evaluate(ctx); - var ret = []; - var ids; - if (e.type == 'node-set') { - ids = []; - for (var i = 0; i < e.length; ++i) { - var v = xmlValue(e[i]).split(/\s+/); - for (var ii = 0; ii < v.length; ++ii) { - ids.push(v[ii]); - } - } - } else { - ids = e.split(/\s+/); - } - var d = ctx.node.ownerDocument; - for (var i = 0; i < ids.length; ++i) { - var n = d.getElementById(ids[i]); - if (n) { - ret.push(n); - } - } - return new NodeSetValue(ret); - }, - - 'local-name': function(ctx) { - alert('not implmented yet: XPath function local-name()'); - }, - - 'namespace-uri': function(ctx) { - alert('not implmented yet: XPath function namespace-uri()'); - }, - - 'name': function(ctx) { - assert(this.args.length == 1 || this.args.length == 0); - var n; - if (this.args.length == 0) { - n = [ ctx.node ]; - } else { - n = this.args[0].evaluate(ctx).nodeSetValue(); - } - - if (n.length == 0) { - return new StringValue(''); - } else { - return new StringValue(n[0].nodeName); - } - }, - - 'string': function(ctx) { - assert(this.args.length == 1 || this.args.length == 0); - if (this.args.length == 0) { - return new StringValue(new NodeSetValue([ ctx.node ]).stringValue()); - } else { - return new StringValue(this.args[0].evaluate(ctx).stringValue()); - } - }, - - 'concat': function(ctx) { - var ret = ''; - for (var i = 0; i < this.args.length; ++i) { - ret += this.args[i].evaluate(ctx).stringValue(); - } - return new StringValue(ret); - }, - - 'starts-with': function(ctx) { - assert(this.args.length == 2); - var s0 = this.args[0].evaluate(ctx).stringValue(); - var s1 = this.args[1].evaluate(ctx).stringValue(); - return new BooleanValue(s0.indexOf(s1) == 0); - }, - - 'contains': function(ctx) { - assert(this.args.length == 2); - var s0 = this.args[0].evaluate(ctx).stringValue(); - var s1 = this.args[1].evaluate(ctx).stringValue(); - return new BooleanValue(s0.indexOf(s1) != -1); - }, - - 'substring-before': function(ctx) { - assert(this.args.length == 2); - var s0 = this.args[0].evaluate(ctx).stringValue(); - var s1 = this.args[1].evaluate(ctx).stringValue(); - var i = s0.indexOf(s1); - var ret; - if (i == -1) { - ret = ''; - } else { - ret = s0.substr(0,i); - } - return new StringValue(ret); - }, - - 'substring-after': function(ctx) { - assert(this.args.length == 2); - var s0 = this.args[0].evaluate(ctx).stringValue(); - var s1 = this.args[1].evaluate(ctx).stringValue(); - var i = s0.indexOf(s1); - var ret; - if (i == -1) { - ret = ''; - } else { - ret = s0.substr(i + s1.length); - } - return new StringValue(ret); - }, - - 'substring': function(ctx) { - // NOTE: XPath defines the position of the first character in a - // string to be 1, in JavaScript this is 0 ([XPATH] Section 4.2). - assert(this.args.length == 2 || this.args.length == 3); - var s0 = this.args[0].evaluate(ctx).stringValue(); - var s1 = this.args[1].evaluate(ctx).numberValue(); - var ret; - if (this.args.length == 2) { - var i1 = Math.max(0, Math.round(s1) - 1); - ret = s0.substr(i1); - - } else { - var s2 = this.args[2].evaluate(ctx).numberValue(); - var i0 = Math.round(s1) - 1; - var i1 = Math.max(0, i0); - var i2 = Math.round(s2) - Math.max(0, -i0); - ret = s0.substr(i1, i2); - } - return new StringValue(ret); - }, - - 'string-length': function(ctx) { - var s; - if (this.args.length > 0) { - s = this.args[0].evaluate(ctx).stringValue(); - } else { - s = new NodeSetValue([ ctx.node ]).stringValue(); - } - return new NumberValue(s.length); - }, - - 'normalize-space': function(ctx) { - var s; - if (this.args.length > 0) { - s = this.args[0].evaluate(ctx).stringValue(); - } else { - s = new NodeSetValue([ ctx.node ]).stringValue(); - } - s = s.replace(/^\s*/,'').replace(/\s*$/,'').replace(/\s+/g, ' '); - return new StringValue(s); - }, - - 'translate': function(ctx) { - assert(this.args.length == 3); - var s0 = this.args[0].evaluate(ctx).stringValue(); - var s1 = this.args[1].evaluate(ctx).stringValue(); - var s2 = this.args[2].evaluate(ctx).stringValue(); - - for (var i = 0; i < s1.length; ++i) { - s0 = s0.replace(new RegExp(s1.charAt(i), 'g'), s2.charAt(i)); - } - return new StringValue(s0); - }, - - 'boolean': function(ctx) { - assert(this.args.length == 1); - return new BooleanValue(this.args[0].evaluate(ctx).booleanValue()); - }, - - 'not': function(ctx) { - assert(this.args.length == 1); - var ret = !this.args[0].evaluate(ctx).booleanValue(); - return new BooleanValue(ret); - }, - - 'true': function(ctx) { - assert(this.args.length == 0); - return new BooleanValue(true); - }, - - 'false': function(ctx) { - assert(this.args.length == 0); - return new BooleanValue(false); - }, - - 'lang': function(ctx) { - assert(this.args.length == 1); - var lang = this.args[0].evaluate(ctx).stringValue(); - var xmllang; - var n = ctx.node; - while (n && n != n.parentNode /* just in case ... */) { - xmllang = n.getAttribute('xml:lang'); - if (xmllang) { - break; - } - n = n.parentNode; - } - if (!xmllang) { - return new BooleanValue(false); - } else { - var re = new RegExp('^' + lang + '$', 'i'); - return new BooleanValue(xmllang.match(re) || - xmllang.replace(/_.*$/,'').match(re)); - } - }, - - 'number': function(ctx) { - assert(this.args.length == 1 || this.args.length == 0); - - if (this.args.length == 1) { - return new NumberValue(this.args[0].evaluate(ctx).numberValue()); - } else { - return new NumberValue(new NodeSetValue([ ctx.node ]).numberValue()); - } - }, - - 'sum': function(ctx) { - assert(this.args.length == 1); - var n = this.args[0].evaluate(ctx).nodeSetValue(); - var sum = 0; - for (var i = 0; i < n.length; ++i) { - sum += xmlValue(n[i]) - 0; - } - return new NumberValue(sum); - }, - - 'floor': function(ctx) { - assert(this.args.length == 1); - var num = this.args[0].evaluate(ctx).numberValue(); - return new NumberValue(Math.floor(num)); - }, - - 'ceiling': function(ctx) { - assert(this.args.length == 1); - var num = this.args[0].evaluate(ctx).numberValue(); - return new NumberValue(Math.ceil(num)); - }, - - 'round': function(ctx) { - assert(this.args.length == 1); - var num = this.args[0].evaluate(ctx).numberValue(); - return new NumberValue(Math.round(num)); - }, - - // TODO(mesch): The following functions are custom. There is a - // standard that defines how to add functions, which should be - // applied here. - - 'ext-join': function(ctx) { - assert(this.args.length == 2); - var nodes = this.args[0].evaluate(ctx).nodeSetValue(); - var delim = this.args[1].evaluate(ctx).stringValue(); - var ret = ''; - for (var i = 0; i < nodes.length; ++i) { - if (ret) { - ret += delim; - } - ret += xmlValue(nodes[i]); - } - return new StringValue(ret); - }, - - // ext-if() evaluates and returns its second argument, if the - // boolean value of its first argument is true, otherwise it - // evaluates and returns its third argument. - - 'ext-if': function(ctx) { - assert(this.args.length == 3); - if (this.args[0].evaluate(ctx).booleanValue()) { - return this.args[1].evaluate(ctx); - } else { - return this.args[2].evaluate(ctx); - } - }, - - 'ext-sprintf': function(ctx) { - assert(this.args.length >= 1); - var args = []; - for (var i = 0; i < this.args.length; ++i) { - args.push(this.args[i].evaluate(ctx).stringValue()); - } - return new StringValue(sprintf.apply(null, args)); - }, - - // ext-cardinal() evaluates its single argument as a number, and - // returns the current node that many times. It can be used in the - // select attribute to iterate over an integer range. - - 'ext-cardinal': function(ctx) { - assert(this.args.length >= 1); - var c = this.args[0].evaluate(ctx).numberValue(); - var ret = []; - for (var i = 0; i < c; ++i) { - ret.push(ctx.node); - } - return new NodeSetValue(ret); - } -}; - -function UnionExpr(expr1, expr2) { - this.expr1 = expr1; - this.expr2 = expr2; -} - -UnionExpr.prototype.evaluate = function(ctx) { - var nodes1 = this.expr1.evaluate(ctx).nodeSetValue(); - var nodes2 = this.expr2.evaluate(ctx).nodeSetValue(); - var I1 = nodes1.length; - for (var i2 = 0; i2 < nodes2.length; ++i2) { - for (var i1 = 0; i1 < I1; ++i1) { - if (nodes1[i1] == nodes2[i2]) { - // break inner loop and continue outer loop, labels confuse - // the js compiler, so we don't use them here. - i1 = I1; - } - } - nodes1.push(nodes2[i2]); - } - return new NodeSetValue(nodes2); -}; - -function PathExpr(filter, rel) { - this.filter = filter; - this.rel = rel; -} - -PathExpr.prototype.evaluate = function(ctx) { - var nodes = this.filter.evaluate(ctx).nodeSetValue(); - var nodes1 = []; - for (var i = 0; i < nodes.length; ++i) { - var nodes0 = this.rel.evaluate(ctx.clone(nodes[i], i, nodes)).nodeSetValue(); - for (var ii = 0; ii < nodes0.length; ++ii) { - nodes1.push(nodes0[ii]); - } - } - return new NodeSetValue(nodes1); -}; - -function FilterExpr(expr, predicate) { - this.expr = expr; - this.predicate = predicate; -} - -FilterExpr.prototype.evaluate = function(ctx) { - var nodes = this.expr.evaluate(ctx).nodeSetValue(); - for (var i = 0; i < this.predicate.length; ++i) { - var nodes0 = nodes; - nodes = []; - for (var j = 0; j < nodes0.length; ++j) { - var n = nodes0[j]; - if (this.predicate[i].evaluate(ctx.clone(n, j, nodes0)).booleanValue()) { - nodes.push(n); - } - } - } - - return new NodeSetValue(nodes); -} - -function UnaryMinusExpr(expr) { - this.expr = expr; -} - -UnaryMinusExpr.prototype.evaluate = function(ctx) { - return new NumberValue(-this.expr.evaluate(ctx).numberValue()); -}; - -function BinaryExpr(expr1, op, expr2) { - this.expr1 = expr1; - this.expr2 = expr2; - this.op = op; -} - -BinaryExpr.prototype.evaluate = function(ctx) { - var ret; - switch (this.op.value) { - case 'or': - ret = new BooleanValue(this.expr1.evaluate(ctx).booleanValue() || - this.expr2.evaluate(ctx).booleanValue()); - break; - - case 'and': - ret = new BooleanValue(this.expr1.evaluate(ctx).booleanValue() && - this.expr2.evaluate(ctx).booleanValue()); - break; - - case '+': - ret = new NumberValue(this.expr1.evaluate(ctx).numberValue() + - this.expr2.evaluate(ctx).numberValue()); - break; - - case '-': - ret = new NumberValue(this.expr1.evaluate(ctx).numberValue() - - this.expr2.evaluate(ctx).numberValue()); - break; - - case '*': - ret = new NumberValue(this.expr1.evaluate(ctx).numberValue() * - this.expr2.evaluate(ctx).numberValue()); - break; - - case 'mod': - ret = new NumberValue(this.expr1.evaluate(ctx).numberValue() % - this.expr2.evaluate(ctx).numberValue()); - break; - - case 'div': - ret = new NumberValue(this.expr1.evaluate(ctx).numberValue() / - this.expr2.evaluate(ctx).numberValue()); - break; - - case '=': - ret = this.compare(ctx, function(x1, x2) { return x1 == x2; }); - break; - - case '!=': - ret = this.compare(ctx, function(x1, x2) { return x1 != x2; }); - break; - - case '<': - ret = this.compare(ctx, function(x1, x2) { return x1 < x2; }); - break; - - case '<=': - ret = this.compare(ctx, function(x1, x2) { return x1 <= x2; }); - break; - - case '>': - ret = this.compare(ctx, function(x1, x2) { return x1 > x2; }); - break; - - case '>=': - ret = this.compare(ctx, function(x1, x2) { return x1 >= x2; }); - break; - - default: - alert('BinaryExpr.evaluate: ' + this.op.value); - } - return ret; -}; - -BinaryExpr.prototype.compare = function(ctx, cmp) { - var v1 = this.expr1.evaluate(ctx); - var v2 = this.expr2.evaluate(ctx); - - var ret; - if (v1.type == 'node-set' && v2.type == 'node-set') { - var n1 = v1.nodeSetValue(); - var n2 = v2.nodeSetValue(); - ret = false; - for (var i1 = 0; i1 < n1.length; ++i1) { - for (var i2 = 0; i2 < n2.length; ++i2) { - if (cmp(xmlValue(n1[i1]), xmlValue(n2[i2]))) { - ret = true; - // Break outer loop. Labels confuse the jscompiler and we - // don't use them. - i2 = n2.length; - i1 = n1.length; - } - } - } - - } else if (v1.type == 'node-set' || v2.type == 'node-set') { - - if (v1.type == 'number') { - var s = v1.numberValue(); - var n = v2.nodeSetValue(); - - ret = false; - for (var i = 0; i < n.length; ++i) { - var nn = xmlValue(n[i]) - 0; - if (cmp(s, nn)) { - ret = true; - break; - } - } - - } else if (v2.type == 'number') { - var n = v1.nodeSetValue(); - var s = v2.numberValue(); - - ret = false; - for (var i = 0; i < n.length; ++i) { - var nn = xmlValue(n[i]) - 0; - if (cmp(nn, s)) { - ret = true; - break; - } - } - - } else if (v1.type == 'string') { - var s = v1.stringValue(); - var n = v2.nodeSetValue(); - - ret = false; - for (var i = 0; i < n.length; ++i) { - var nn = xmlValue(n[i]); - if (cmp(s, nn)) { - ret = true; - break; - } - } - - } else if (v2.type == 'string') { - var n = v1.nodeSetValue(); - var s = v2.stringValue(); - - ret = false; - for (var i = 0; i < n.length; ++i) { - var nn = xmlValue(n[i]); - if (cmp(nn, s)) { - ret = true; - break; - } - } - - } else { - ret = cmp(v1.booleanValue(), v2.booleanValue()); - } - - } else if (v1.type == 'boolean' || v2.type == 'boolean') { - ret = cmp(v1.booleanValue(), v2.booleanValue()); - - } else if (v1.type == 'number' || v2.type == 'number') { - ret = cmp(v1.numberValue(), v2.numberValue()); - - } else { - ret = cmp(v1.stringValue(), v2.stringValue()); - } - - return new BooleanValue(ret); -} - -function LiteralExpr(value) { - this.value = value; -} - -LiteralExpr.prototype.evaluate = function(ctx) { - return new StringValue(this.value); -}; - -function NumberExpr(value) { - this.value = value; -} - -NumberExpr.prototype.evaluate = function(ctx) { - return new NumberValue(this.value); -}; - -function VariableExpr(name) { - this.name = name; -} - -VariableExpr.prototype.evaluate = function(ctx) { - return ctx.getVariable(this.name); -} - -// Factory functions for semantic values (i.e. Expressions) of the -// productions in the grammar. When a production is matched to reduce -// the current parse state stack, the function is called with the -// semantic values of the matched elements as arguments, and returns -// another semantic value. The semantic value is a node of the parse -// tree, an expression object with an evaluate() method that evaluates the -// expression in an actual context. These factory functions are used -// in the specification of the grammar rules, below. - -function makeTokenExpr(m) { - return new TokenExpr(m); -} - -function passExpr(e) { - return e; -} - -function makeLocationExpr1(slash, rel) { - rel.absolute = true; - return rel; -} - -function makeLocationExpr2(dslash, rel) { - rel.absolute = true; - rel.prependStep(makeAbbrevStep(dslash.value)); - return rel; -} - -function makeLocationExpr3(slash) { - var ret = new LocationExpr(); - ret.appendStep(makeAbbrevStep('.')); - ret.absolute = true; - return ret; -} - -function makeLocationExpr4(dslash) { - var ret = new LocationExpr(); - ret.absolute = true; - ret.appendStep(makeAbbrevStep(dslash.value)); - return ret; -} - -function makeLocationExpr5(step) { - var ret = new LocationExpr(); - ret.appendStep(step); - return ret; -} - -function makeLocationExpr6(rel, slash, step) { - rel.appendStep(step); - return rel; -} - -function makeLocationExpr7(rel, dslash, step) { - rel.appendStep(makeAbbrevStep(dslash.value)); - return rel; -} - -function makeStepExpr1(dot) { - return makeAbbrevStep(dot.value); -} - -function makeStepExpr2(ddot) { - return makeAbbrevStep(ddot.value); -} - -function makeStepExpr3(axisname, axis, nodetest) { - return new StepExpr(axisname.value, nodetest); -} - -function makeStepExpr4(at, nodetest) { - return new StepExpr('attribute', nodetest); -} - -function makeStepExpr5(nodetest) { - return new StepExpr('child', nodetest); -} - -function makeStepExpr6(step, predicate) { - step.appendPredicate(predicate); - return step; -} - -function makeAbbrevStep(abbrev) { - switch (abbrev) { - case '//': - return new StepExpr('descendant-or-self', new NodeTestAny); - - case '.': - return new StepExpr('self', new NodeTestAny); - - case '..': - return new StepExpr('parent', new NodeTestAny); - } -} - -function makeNodeTestExpr1(asterisk) { - return new NodeTestElement; -} - -function makeNodeTestExpr2(ncname, colon, asterisk) { - return new NodeTestNC(ncname.value); -} - -function makeNodeTestExpr3(qname) { - return new NodeTestName(qname.value); -} - -function makeNodeTestExpr4(typeo, parenc) { - var type = typeo.value.replace(/\s*\($/, ''); - switch(type) { - case 'node': - return new NodeTestAny; - - case 'text': - return new NodeTestText; - - case 'comment': - return new NodeTestComment; - - case 'processing-instruction': - return new NodeTestPI; - } -} - -function makeNodeTestExpr5(typeo, target, parenc) { - var type = typeo.replace(/\s*\($/, ''); - if (type != 'processing-instruction') { - throw type + ' ' + Error().stack; - } - return new NodeTestPI(target.value); -} - -function makePredicateExpr(pareno, expr, parenc) { - return new PredicateExpr(expr); -} - -function makePrimaryExpr(pareno, expr, parenc) { - return expr; -} - -function makeFunctionCallExpr1(name, pareno, parenc) { - return new FunctionCallExpr(name); -} - -function makeFunctionCallExpr2(name, pareno, arg1, args, parenc) { - var ret = new FunctionCallExpr(name); - ret.appendArg(arg1); - for (var i = 0; i < args.length; ++i) { - ret.appendArg(args[i]); - } - return ret; -} - -function makeArgumentExpr(comma, expr) { - return expr; -} - -function makeUnionExpr(expr1, pipe, expr2) { - return new UnionExpr(expr1, expr2); -} - -function makePathExpr1(filter, slash, rel) { - return new PathExpr(filter, rel); -} - -function makePathExpr2(filter, dslash, rel) { - rel.prependStep(makeAbbrevStep(dslash.value)); - return new PathExpr(filter, rel); -} - -function makeFilterExpr(expr, predicates) { - if (predicates.length > 0) { - return new FilterExpr(expr, predicates); - } else { - return expr; - } -} - -function makeUnaryMinusExpr(minus, expr) { - return new UnaryMinusExpr(expr); -} - -function makeBinaryExpr(expr1, op, expr2) { - return new BinaryExpr(expr1, op, expr2); -} - -function makeLiteralExpr(token) { - // remove quotes from the parsed value: - var value = token.value.substring(1, token.value.length - 1); - return new LiteralExpr(value); -} - -function makeNumberExpr(token) { - return new NumberExpr(token.value); -} - -function makeVariableReference(dollar, name) { - return new VariableExpr(name.value); -} - -// Used before parsing for optimization of common simple cases. See -// the begin of xpathParse() for which they are. -function makeSimpleExpr(expr) { - if (expr.charAt(0) == '$') { - return new VariableExpr(expr.substr(1)); - } else if (expr.charAt(0) == '@') { - var a = new NodeTestName(expr.substr(1)); - var b = new StepExpr('attribute', a); - var c = new LocationExpr(); - c.appendStep(b); - return c; - } else if (expr.match(/^[0-9]+$/)) { - return new NumberExpr(expr); - } else { - var a = new NodeTestName(expr); - var b = new StepExpr('child', a); - var c = new LocationExpr(); - c.appendStep(b); - return c; - } -} - -function makeSimpleExpr2(expr) { - var steps = expr.split('/'); - var c = new LocationExpr(); - for (var i in steps) { - var a = new NodeTestName(steps[i]); - var b = new StepExpr('child', a); - c.appendStep(b); - } - return c; -} - -// The axes of XPath expressions. - -var xpathAxis = { - ANCESTOR_OR_SELF: 'ancestor-or-self', - ANCESTOR: 'ancestor', - ATTRIBUTE: 'attribute', - CHILD: 'child', - DESCENDANT_OR_SELF: 'descendant-or-self', - DESCENDANT: 'descendant', - FOLLOWING_SIBLING: 'following-sibling', - FOLLOWING: 'following', - NAMESPACE: 'namespace', - PARENT: 'parent', - PRECEDING_SIBLING: 'preceding-sibling', - PRECEDING: 'preceding', - SELF: 'self' -}; - -var xpathAxesRe = [ - xpathAxis.ANCESTOR_OR_SELF, - xpathAxis.ANCESTOR, - xpathAxis.ATTRIBUTE, - xpathAxis.CHILD, - xpathAxis.DESCENDANT_OR_SELF, - xpathAxis.DESCENDANT, - xpathAxis.FOLLOWING_SIBLING, - xpathAxis.FOLLOWING, - xpathAxis.NAMESPACE, - xpathAxis.PARENT, - xpathAxis.PRECEDING_SIBLING, - xpathAxis.PRECEDING, - xpathAxis.SELF -].join('|'); - - -// The tokens of the language. The label property is just used for -// generating debug output. The prec property is the precedence used -// for shift/reduce resolution. Default precedence is 0 as a lookahead -// token and 2 on the stack. TODO(mesch): this is certainly not -// necessary and too complicated. Simplify this! - -// NOTE: tabular formatting is the big exception, but here it should -// be OK. - -var TOK_PIPE = { label: "|", prec: 17, re: new RegExp("^\\|") }; -var TOK_DSLASH = { label: "//", prec: 19, re: new RegExp("^//") }; -var TOK_SLASH = { label: "/", prec: 30, re: new RegExp("^/") }; -var TOK_AXIS = { label: "::", prec: 20, re: new RegExp("^::") }; -var TOK_COLON = { label: ":", prec: 1000, re: new RegExp("^:") }; -var TOK_AXISNAME = { label: "[axis]", re: new RegExp('^(' + xpathAxesRe + ')') }; -var TOK_PARENO = { label: "(", prec: 34, re: new RegExp("^\\(") }; -var TOK_PARENC = { label: ")", re: new RegExp("^\\)") }; -var TOK_DDOT = { label: "..", prec: 34, re: new RegExp("^\\.\\.") }; -var TOK_DOT = { label: ".", prec: 34, re: new RegExp("^\\.") }; -var TOK_AT = { label: "@", prec: 34, re: new RegExp("^@") }; - -var TOK_COMMA = { label: ",", re: new RegExp("^,") }; - -var TOK_OR = { label: "or", prec: 10, re: new RegExp("^or\\b") }; -var TOK_AND = { label: "and", prec: 11, re: new RegExp("^and\\b") }; -var TOK_EQ = { label: "=", prec: 12, re: new RegExp("^=") }; -var TOK_NEQ = { label: "!=", prec: 12, re: new RegExp("^!=") }; -var TOK_GE = { label: ">=", prec: 13, re: new RegExp("^>=") }; -var TOK_GT = { label: ">", prec: 13, re: new RegExp("^>") }; -var TOK_LE = { label: "<=", prec: 13, re: new RegExp("^<=") }; -var TOK_LT = { label: "<", prec: 13, re: new RegExp("^<") }; -var TOK_PLUS = { label: "+", prec: 14, re: new RegExp("^\\+"), left: true }; -var TOK_MINUS = { label: "-", prec: 14, re: new RegExp("^\\-"), left: true }; -var TOK_DIV = { label: "div", prec: 15, re: new RegExp("^div\\b"), left: true }; -var TOK_MOD = { label: "mod", prec: 15, re: new RegExp("^mod\\b"), left: true }; - -var TOK_BRACKO = { label: "[", prec: 32, re: new RegExp("^\\[") }; -var TOK_BRACKC = { label: "]", re: new RegExp("^\\]") }; -var TOK_DOLLAR = { label: "$", re: new RegExp("^\\$") }; - -var TOK_NCNAME = { label: "[ncname]", re: new RegExp('^[a-z][-\\w]*','i') }; - -var TOK_ASTERISK = { label: "*", prec: 15, re: new RegExp("^\\*"), left: true }; -var TOK_LITERALQ = { label: "[litq]", prec: 20, re: new RegExp("^'[^\\']*'") }; -var TOK_LITERALQQ = { - label: "[litqq]", - prec: 20, - re: new RegExp('^"[^\\"]*"') -}; - -var TOK_NUMBER = { - label: "[number]", - prec: 35, - re: new RegExp('^\\d+(\\.\\d*)?') }; - -var TOK_QNAME = { - label: "[qname]", - re: new RegExp('^([a-z][-\\w]*:)?[a-z][-\\w]*','i') -}; - -var TOK_NODEO = { - label: "[nodetest-start]", - re: new RegExp('^(processing-instruction|comment|text|node)\\(') -}; - -// The table of the tokens of our grammar, used by the lexer: first -// column the tag, second column a regexp to recognize it in the -// input, third column the precedence of the token, fourth column a -// factory function for the semantic value of the token. -// -// NOTE: order of this list is important, because the first match -// counts. Cf. DDOT and DOT, and AXIS and COLON. - -var xpathTokenRules = [ - TOK_DSLASH, - TOK_SLASH, - TOK_DDOT, - TOK_DOT, - TOK_AXIS, - TOK_COLON, - TOK_AXISNAME, - TOK_NODEO, - TOK_PARENO, - TOK_PARENC, - TOK_BRACKO, - TOK_BRACKC, - TOK_AT, - TOK_COMMA, - TOK_OR, - TOK_AND, - TOK_NEQ, - TOK_EQ, - TOK_GE, - TOK_GT, - TOK_LE, - TOK_LT, - TOK_PLUS, - TOK_MINUS, - TOK_ASTERISK, - TOK_PIPE, - TOK_MOD, - TOK_DIV, - TOK_LITERALQ, - TOK_LITERALQQ, - TOK_NUMBER, - TOK_QNAME, - TOK_NCNAME, - TOK_DOLLAR -]; - -// All the nonterminals of the grammar. The nonterminal objects are -// identified by object identity; the labels are used in the debug -// output only. -var XPathLocationPath = { label: "LocationPath" }; -var XPathRelativeLocationPath = { label: "RelativeLocationPath" }; -var XPathAbsoluteLocationPath = { label: "AbsoluteLocationPath" }; -var XPathStep = { label: "Step" }; -var XPathNodeTest = { label: "NodeTest" }; -var XPathPredicate = { label: "Predicate" }; -var XPathLiteral = { label: "Literal" }; -var XPathExpr = { label: "Expr" }; -var XPathPrimaryExpr = { label: "PrimaryExpr" }; -var XPathVariableReference = { label: "Variablereference" }; -var XPathNumber = { label: "Number" }; -var XPathFunctionCall = { label: "FunctionCall" }; -var XPathArgumentRemainder = { label: "ArgumentRemainder" }; -var XPathPathExpr = { label: "PathExpr" }; -var XPathUnionExpr = { label: "UnionExpr" }; -var XPathFilterExpr = { label: "FilterExpr" }; -var XPathDigits = { label: "Digits" }; - -var xpathNonTerminals = [ - XPathLocationPath, - XPathRelativeLocationPath, - XPathAbsoluteLocationPath, - XPathStep, - XPathNodeTest, - XPathPredicate, - XPathLiteral, - XPathExpr, - XPathPrimaryExpr, - XPathVariableReference, - XPathNumber, - XPathFunctionCall, - XPathArgumentRemainder, - XPathPathExpr, - XPathUnionExpr, - XPathFilterExpr, - XPathDigits -]; - -// Quantifiers that are used in the productions of the grammar. -var Q_01 = { label: "?" }; -var Q_MM = { label: "*" }; -var Q_1M = { label: "+" }; - -// Tag for left associativity (right assoc is implied by undefined). -var ASSOC_LEFT = true; - -// The productions of the grammar. Columns of the table: -// -// - target nonterminal, -// - pattern, -// - precedence, -// - semantic value factory -// -// The semantic value factory is a function that receives parse tree -// nodes from the stack frames of the matched symbols as arguments and -// returns an a node of the parse tree. The node is stored in the top -// stack frame along with the target object of the rule. The node in -// the parse tree is an expression object that has an evaluate() method -// and thus evaluates XPath expressions. -// -// The precedence is used to decide between reducing and shifting by -// comparing the precendence of the rule that is candidate for -// reducing with the precedence of the look ahead token. Precedence of -// -1 means that the precedence of the tokens in the pattern is used -// instead. TODO: It shouldn't be necessary to explicitly assign -// precedences to rules. - -var xpathGrammarRules = - [ - [ XPathLocationPath, [ XPathRelativeLocationPath ], 18, - passExpr ], - [ XPathLocationPath, [ XPathAbsoluteLocationPath ], 18, - passExpr ], - - [ XPathAbsoluteLocationPath, [ TOK_SLASH, XPathRelativeLocationPath ], 18, - makeLocationExpr1 ], - [ XPathAbsoluteLocationPath, [ TOK_DSLASH, XPathRelativeLocationPath ], 18, - makeLocationExpr2 ], - - [ XPathAbsoluteLocationPath, [ TOK_SLASH ], 0, - makeLocationExpr3 ], - [ XPathAbsoluteLocationPath, [ TOK_DSLASH ], 0, - makeLocationExpr4 ], - - [ XPathRelativeLocationPath, [ XPathStep ], 31, - makeLocationExpr5 ], - [ XPathRelativeLocationPath, - [ XPathRelativeLocationPath, TOK_SLASH, XPathStep ], 31, - makeLocationExpr6 ], - [ XPathRelativeLocationPath, - [ XPathRelativeLocationPath, TOK_DSLASH, XPathStep ], 31, - makeLocationExpr7 ], - - [ XPathStep, [ TOK_DOT ], 33, - makeStepExpr1 ], - [ XPathStep, [ TOK_DDOT ], 33, - makeStepExpr2 ], - [ XPathStep, - [ TOK_AXISNAME, TOK_AXIS, XPathNodeTest ], 33, - makeStepExpr3 ], - [ XPathStep, [ TOK_AT, XPathNodeTest ], 33, - makeStepExpr4 ], - [ XPathStep, [ XPathNodeTest ], 33, - makeStepExpr5 ], - [ XPathStep, [ XPathStep, XPathPredicate ], 33, - makeStepExpr6 ], - - [ XPathNodeTest, [ TOK_ASTERISK ], 33, - makeNodeTestExpr1 ], - [ XPathNodeTest, [ TOK_NCNAME, TOK_COLON, TOK_ASTERISK ], 33, - makeNodeTestExpr2 ], - [ XPathNodeTest, [ TOK_QNAME ], 33, - makeNodeTestExpr3 ], - [ XPathNodeTest, [ TOK_NODEO, TOK_PARENC ], 33, - makeNodeTestExpr4 ], - [ XPathNodeTest, [ TOK_NODEO, XPathLiteral, TOK_PARENC ], 33, - makeNodeTestExpr5 ], - - [ XPathPredicate, [ TOK_BRACKO, XPathExpr, TOK_BRACKC ], 33, - makePredicateExpr ], - - [ XPathPrimaryExpr, [ XPathVariableReference ], 33, - passExpr ], - [ XPathPrimaryExpr, [ TOK_PARENO, XPathExpr, TOK_PARENC ], 33, - makePrimaryExpr ], - [ XPathPrimaryExpr, [ XPathLiteral ], 30, - passExpr ], - [ XPathPrimaryExpr, [ XPathNumber ], 30, - passExpr ], - [ XPathPrimaryExpr, [ XPathFunctionCall ], 30, - passExpr ], - - [ XPathFunctionCall, [ TOK_QNAME, TOK_PARENO, TOK_PARENC ], -1, - makeFunctionCallExpr1 ], - [ XPathFunctionCall, - [ TOK_QNAME, TOK_PARENO, XPathExpr, XPathArgumentRemainder, Q_MM, - TOK_PARENC ], -1, - makeFunctionCallExpr2 ], - [ XPathArgumentRemainder, [ TOK_COMMA, XPathExpr ], -1, - makeArgumentExpr ], - - [ XPathUnionExpr, [ XPathPathExpr ], 20, - passExpr ], - [ XPathUnionExpr, [ XPathUnionExpr, TOK_PIPE, XPathPathExpr ], 20, - makeUnionExpr ], - - [ XPathPathExpr, [ XPathLocationPath ], 20, - passExpr ], - [ XPathPathExpr, [ XPathFilterExpr ], 19, - passExpr ], - [ XPathPathExpr, - [ XPathFilterExpr, TOK_SLASH, XPathRelativeLocationPath ], 20, - makePathExpr1 ], - [ XPathPathExpr, - [ XPathFilterExpr, TOK_DSLASH, XPathRelativeLocationPath ], 20, - makePathExpr2 ], - - [ XPathFilterExpr, [ XPathPrimaryExpr, XPathPredicate, Q_MM ], 20, - makeFilterExpr ], - - [ XPathExpr, [ XPathPrimaryExpr ], 16, - passExpr ], - [ XPathExpr, [ XPathUnionExpr ], 16, - passExpr ], - - [ XPathExpr, [ TOK_MINUS, XPathExpr ], -1, - makeUnaryMinusExpr ], - - [ XPathExpr, [ XPathExpr, TOK_OR, XPathExpr ], -1, - makeBinaryExpr ], - [ XPathExpr, [ XPathExpr, TOK_AND, XPathExpr ], -1, - makeBinaryExpr ], - - [ XPathExpr, [ XPathExpr, TOK_EQ, XPathExpr ], -1, - makeBinaryExpr ], - [ XPathExpr, [ XPathExpr, TOK_NEQ, XPathExpr ], -1, - makeBinaryExpr ], - - [ XPathExpr, [ XPathExpr, TOK_LT, XPathExpr ], -1, - makeBinaryExpr ], - [ XPathExpr, [ XPathExpr, TOK_LE, XPathExpr ], -1, - makeBinaryExpr ], - [ XPathExpr, [ XPathExpr, TOK_GT, XPathExpr ], -1, - makeBinaryExpr ], - [ XPathExpr, [ XPathExpr, TOK_GE, XPathExpr ], -1, - makeBinaryExpr ], - - [ XPathExpr, [ XPathExpr, TOK_PLUS, XPathExpr ], -1, - makeBinaryExpr, ASSOC_LEFT ], - [ XPathExpr, [ XPathExpr, TOK_MINUS, XPathExpr ], -1, - makeBinaryExpr, ASSOC_LEFT ], - - [ XPathExpr, [ XPathExpr, TOK_ASTERISK, XPathExpr ], -1, - makeBinaryExpr, ASSOC_LEFT ], - [ XPathExpr, [ XPathExpr, TOK_DIV, XPathExpr ], -1, - makeBinaryExpr, ASSOC_LEFT ], - [ XPathExpr, [ XPathExpr, TOK_MOD, XPathExpr ], -1, - makeBinaryExpr, ASSOC_LEFT ], - - [ XPathLiteral, [ TOK_LITERALQ ], -1, - makeLiteralExpr ], - [ XPathLiteral, [ TOK_LITERALQQ ], -1, - makeLiteralExpr ], - - [ XPathNumber, [ TOK_NUMBER ], -1, - makeNumberExpr ], - - [ XPathVariableReference, [ TOK_DOLLAR, TOK_QNAME ], 200, - makeVariableReference ] - ]; - -// That function computes some optimizations of the above data -// structures and will be called right here. It merely takes the -// counter variables out of the global scope. - -var xpathRules = []; - -function xpathParseInit() { - if (xpathRules.length) { - return; - } - - // Some simple optimizations for the xpath expression parser: sort - // grammar rules descending by length, so that the longest match is - // first found. - - xpathGrammarRules.sort(function(a,b) { - var la = a[1].length; - var lb = b[1].length; - if (la < lb) { - return 1; - } else if (la > lb) { - return -1; - } else { - return 0; - } - }); - - var k = 1; - for (var i = 0; i < xpathNonTerminals.length; ++i) { - xpathNonTerminals[i].key = k++; - } - - for (i = 0; i < xpathTokenRules.length; ++i) { - xpathTokenRules[i].key = k++; - } - - Log.write('XPath parse INIT: ' + k + ' rules'); - - // Another slight optimization: sort the rules into bins according - // to the last element (observing quantifiers), so we can restrict - // the match against the stack to the subest of rules that match the - // top of the stack. - // - // TODO(mesch): What we actually want is to compute states as in - // bison, so that we don't have to do any explicit and iterated - // match against the stack. - - function push_(array, position, element) { - if (!array[position]) { - array[position] = []; - } - array[position].push(element); - } - - for (i = 0; i < xpathGrammarRules.length; ++i) { - var rule = xpathGrammarRules[i]; - var pattern = rule[1]; - - for (var j = pattern.length - 1; j >= 0; --j) { - if (pattern[j] == Q_1M) { - push_(xpathRules, pattern[j-1].key, rule); - break; - - } else if (pattern[j] == Q_MM || pattern[j] == Q_01) { - push_(xpathRules, pattern[j-1].key, rule); - --j; - - } else { - push_(xpathRules, pattern[j].key, rule); - break; - } - } - } - - Log.write('XPath parse INIT: ' + xpathRules.length + ' rule bins'); - - var sum = 0; - mapExec(xpathRules, function(i) { - if (i) { - sum += i.length; - } - }); - - Log.write('XPath parse INIT: ' + (sum / xpathRules.length) + ' average bin size'); -} - -// Local utility functions that are used by the lexer or parser. - -function xpathCollectDescendants(nodelist, node) { - for (var n = node.firstChild; n; n = n.nextSibling) { - nodelist.push(n); - arguments.callee(nodelist, n); - } -} - -function xpathCollectDescendantsReverse(nodelist, node) { - for (var n = node.lastChild; n; n = n.previousSibling) { - nodelist.push(n); - arguments.callee(nodelist, n); - } -} - - -// The entry point for the library: match an expression against a DOM -// node. Returns an XPath value. -function xpathDomEval(expr, node) { - var expr1 = xpathParse(expr); - var ret = expr1.evaluate(new ExprContext(node)); - return ret; -} - -// Utility function to sort a list of nodes. Used by xsltSort() and -// nxslSelect(). -function xpathSort(input, sort) { - if (sort.length == 0) { - return; - } - - var sortlist = []; - - for (var i = 0; i < input.nodelist.length; ++i) { - var node = input.nodelist[i]; - var sortitem = { node: node, key: [] }; - var context = input.clone(node, 0, [ node ]); - - for (var j = 0; j < sort.length; ++j) { - var s = sort[j]; - var value = s.expr.evaluate(context); - - var evalue; - if (s.type == 'text') { - evalue = value.stringValue(); - } else if (s.type == 'number') { - evalue = value.numberValue(); - } - sortitem.key.push({ value: evalue, order: s.order }); - } - - // Make the sort stable by adding a lowest priority sort by - // id. This is very convenient and furthermore required by the - // spec ([XSLT] - Section 10 Sorting). - sortitem.key.push({ value: i, order: 'ascending' }); - - sortlist.push(sortitem); - } - - sortlist.sort(xpathSortByKey); - - var nodes = []; - for (var i = 0; i < sortlist.length; ++i) { - nodes.push(sortlist[i].node); - } - input.nodelist = nodes; - input.setNode(nodes[0], 0); -} - - -// Sorts by all order criteria defined. According to the JavaScript -// spec ([ECMA] Section 11.8.5), the compare operators compare strings -// as strings and numbers as numbers. -// -// NOTE: In browsers which do not follow the spec, this breaks only in -// the case that numbers should be sorted as strings, which is very -// uncommon. - -function xpathSortByKey(v1, v2) { - // NOTE: Sort key vectors of different length never occur in - // xsltSort. - - for (var i = 0; i < v1.key.length; ++i) { - var o = v1.key[i].order == 'descending' ? -1 : 1; - if (v1.key[i].value > v2.key[i].value) { - return +1 * o; - } else if (v1.key[i].value < v2.key[i].value) { - return -1 * o; - } - } - - return 0; -} diff --git a/tests/test_tools/selenium/php/TestRunner.php b/tests/test_tools/selenium/php/TestRunner.php deleted file mode 100644 index ec2e32d3..00000000 --- a/tests/test_tools/selenium/php/TestRunner.php +++ /dev/null @@ -1,162 +0,0 @@ -<html> - -<head> - <HTA:APPLICATION ID="SeleniumHTARunner" APPLICATIONNAME="Selenium"> - <!-- the previous line is only relevant if you rename this - file to "TestRunner.hta" --> - - <!-- The copyright notice and other comments have been moved to after the HTA declaration, -to work-around a bug in IE on Win2K whereby the HTA application doesn't function correctly --> - <!-- - Copyright 2004 ThoughtWorks, Inc - - 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. - --> - <meta content="text/html; charset=ISO-8859-1" http-equiv="content-type"/> - - <title>Selenium Functional Test Runner</title> - <link rel="stylesheet" type="text/css" href="<?php echo $base_dir; ?>core/selenium.css"/> - <script type="text/javascript" src="<?php echo $base_dir; ?>core/scripts/narcissus-defs.js"></script> - <script type="text/javascript" src="<?php echo $base_dir; ?>core/scripts/narcissus-parse.js"></script> - <script type="text/javascript" src="<?php echo $base_dir; ?>core/scripts/narcissus-exec.js"></script> - <script language="JavaScript" type="text/javascript" src="<?php echo $base_dir; ?>core/scripts/htmlutils.js"></script> - <script language="JavaScript" type="text/javascript" src="<?php echo $base_dir; ?>core/lib/prototype.js"></script> - <script language="JavaScript" type="text/javascript" src="<?php echo $base_dir; ?>core/lib/scriptaculous/scriptaculous.js"></script> - <script language="JavaScript" type="text/javascript" src="<?php echo $base_dir; ?>core/lib/cssQuery/cssQuery-p.js"></script> - <script language="JavaScript" type="text/javascript" src="<?php echo $base_dir; ?>core/scripts/selenium-browserdetect.js"></script> - <script language="JavaScript" type="text/javascript" src="<?php echo $base_dir; ?>core/scripts/selenium-browserbot.js"></script> - <script language="JavaScript" type="text/javascript" src="<?php echo $base_dir; ?>core/scripts/find_matching_child.js"></script> - <script language="JavaScript" type="text/javascript" src="<?php echo $base_dir; ?>core/scripts/selenium-api.js"></script> - <script language="JavaScript" type="text/javascript" src="<?php echo $base_dir; ?>core/scripts/selenium-commandhandlers.js"></script> - <script language="JavaScript" type="text/javascript" src="<?php echo $base_dir; ?>core/scripts/selenium-executionloop.js"></script> - <script language="JavaScript" type="text/javascript" src="<?php echo $base_dir; ?>core/scripts/selenium-testrunner.js"></script> - <script language="JavaScript" type="text/javascript" src="<?php echo $base_dir; ?>core/scripts/selenium-logging.js"></script> - <script language="JavaScript" type="text/javascript" src="<?php echo $base_dir; ?>core/scripts/selenium-version.js"></script> - <script language="JavaScript" type="text/javascript" src="<?php echo $base_dir; ?>core/xpath/misc.js"></script> - <script language="JavaScript" type="text/javascript" src="<?php echo $base_dir; ?>core/xpath/dom.js"></script> - <script language="JavaScript" type="text/javascript" src="<?php echo $base_dir; ?>core/xpath/xpath.js"></script> - <script language="JavaScript" type="text/javascript" src="<?php echo $base_dir; ?>prado-functional-test.js"></script> - - <script language="JavaScript" type="text/javascript"> - var post_results_to = "<?php echo $driver; ?>"; - var script_base_url = "<?php echo $base_dir; ?>"; - </script> -</head> - -<body onLoad="onSeleniumLoad();"> -<table class="layout"> -<form action="" name="controlPanel"> - -<!-- Suite, Test, Control Panel --> - -<tr class="selenium"> -<td width="25%" height="15%"> - <iframe name="testSuiteFrame" id="testSuiteFrame" src="<?php echo $driver; ?>?testSuites" application="yes"></iframe> -</td> -<td width="50%" height="15%"> - <iframe name="testFrame" id="testFrame" application="yes"></iframe> -</td> - -<td width="25%"> - <table class="layout"> - <tr class="selenium"> - <th width="25%" height="1" class="header"> - <h1><a href="http://selenium.thoughtworks.com" title="The Selenium Project">Selenium</a> TestRunner - </h1> - </th> - </tr> - <tr> - <td width="25%" height="15%" id="controlPanel"> - <fieldset> - <legend>Execute Tests</legend> - - <div style="float:left">Fast</div> - <div style="float:right">Slow</div> - <br> - <div id="speedSlider"> - <div id="speedTrack"> </div> - <div id="speedHandle"> </div> - </div> - - <div> - <button type="button" id="runSuite" onClick="htmlTestRunner.startTestSuite();" - title="Run the entire Test-Suite"> - <strong>All</strong> - </button> - <button type="button" id="runSeleniumTest" onClick="htmlTestRunner.runSingleTest();" - title="Run the current Test"> - <em>Selected</em> - </button> - <button type="button" id="pauseTest" disabled="disabled" - title="Pause the current Test"> - Pause - </button> - <button type="button" id="stepTest" disabled="disabled" - title="Step the Test"> - Step - </button> - </div> - - <div class="executionOptions"> - <input id="highlightOption" type="checkbox" name="highlightOption" value="0" checked="checked"/> - <label for="highlightOption">Highlight elements</label> - </div> - - </fieldset> - - <table id="stats" align="center"> - <tr> - <td colspan="2" align="right">Elapsed:</td> - <td id="elapsedTime" colspan="2">00.00</td> - </tr> - <tr> - <th colspan="2">Tests</th> - <th colspan="2">Commands</th> - </tr> - <tr> - <td class="count" id="testRuns">0</td> - <td>run</td> - <td class="count" id="commandPasses">0</td> - <td>passed</td> - </tr> - <tr> - <td class="count" id="testFailures">0</td> - <td>failed</td> - <td class="count" id="commandFailures">0</td> - <td>failed</td> - </tr> - <tr> - <td colspan="2"></td> - <td class="count" id="commandErrors">0</td> - <td>incomplete</td> - </tr> - </table> - </td> - </tr> - </table> -</td> -</tr> - -<!-- AUT --> - -<tr> - <td colspan="3" height="70%"> - <iframe name="myiframe" id="myiframe" src="<?php echo $base_dir; ?>core/TestRunner-splash.html"></iframe> - </td> -</tr> - - </form> - </table> - -</body> -</html> diff --git a/tests/test_tools/selenium/php/TestSuiteHeader.php b/tests/test_tools/selenium/php/TestSuiteHeader.php deleted file mode 100644 index d253740c..00000000 --- a/tests/test_tools/selenium/php/TestSuiteHeader.php +++ /dev/null @@ -1,54 +0,0 @@ -<!-- -Copyright 2004 ThoughtWorks, Inc - - 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. ---> -<html> -<head> -<meta content="text/html; charset=ISO-8859-1" -http-equiv="content-type"> -<title>Test Suite</title> -<link rel="stylesheet" type="text/css" href="<?php echo $base_dir; ?>core/selenium.css" /> -<script language="JavaScript" type="text/javascript" src="<?php echo $base_dir; ?>core/scripts/selenium-browserdetect.js"></script> -<script language="JavaScript" type="text/javascript"> - var DISABLED = true; // used to flag failing tests - - function filterTestsForBrowser() { - var suiteTable = document.getElementById("suiteTable"); - var skippedTests = document.getElementById("skippedTests"); - - for(rowNum = suiteTable.rows.length - 1; rowNum >= 0; rowNum--) - { - var row = suiteTable.rows[rowNum]; - var filterString = row.getAttribute("unless"); - if (filterString && eval(filterString)) - { - var cellHTML = row.cells[0].innerHTML; - suiteTable.deleteRow(rowNum); - - var newRow = skippedTests.insertRow(1); - var newCell = newRow.insertCell(0) - newCell.innerHTML = cellHTML; - } - } - } -</script> -</head> - -<body onload="filterTestsForBrowser()"> - - <table id="suiteTable" cellpadding="1" - cellspacing="1" - border="1" - class="selenium"> - <tbody> diff --git a/tests/test_tools/selenium/php/results.php b/tests/test_tools/selenium/php/results.php deleted file mode 100644 index 77dab43b..00000000 --- a/tests/test_tools/selenium/php/results.php +++ /dev/null @@ -1,160 +0,0 @@ -<?php - -class SeleniumTestCaseResult -{ - public $name; - public $commands = array(); - public $result = 'passed'; - public $failures = array(); -} - -class SeleniumTestResult -{ - public $result = 'passed'; - public $totalTime = 0; - public $numTestPasses = 0; - public $numTestFailures = 0; - public $numCommandPasses = 0; - public $numCommandFailures = 0; - public $numCommandErrors = 0; - public $suites = array(); - public $browser = ''; - public $date; - - public function __construct() - { - $this->parse_data(); - $this->browser = $_SERVER['HTTP_USER_AGENT']; - $this->date = time(); - } - - protected function parse_data() - { - $this->result = $_POST['result']; // failed || passed - $this->totalTime = $_POST['totalTime']; - $this->numTestPasses = $_POST['numTestPasses']; - $this->numTestFailures = $_POST['numTestFailures']; - $this->numCommandPasses = $_POST['numCommandPasses']; - $this->numCommandFailures = $_POST['numCommandFailures']; - $this->numCommandErrors = $_POST['numCommandErrors']; - - foreach($_POST['tests'] as $test) - { - $case = new SeleniumTestCaseResult(); - $case->name = $test['testcase']; - $case->commands = $test['commands']; - for($i = 0; $i < count($case->commands); $i++) - { - //$trace = $case->commands[$i]['trace']; - //$trace = html_entity_decode($trace); - //$case->commands[$i]['trace'] = @unserialize($trace); - if($case->commands[$i]['result'] == 'failed') - { - $case->result = 'failed'; - array_push($case->failures, $case->commands[$i]); - } - } - - $this->suites[$case->name] = $case; - } - - } -} - -class SeleniumHtmlReporter -{ - protected $test; - - public function __construct($result) - { - $this->test = $result; - } - - protected function renderHeader() - { - $contents = <<<EOD -<html> -<head> -<title>Functional Test Results</title> -<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> -<style type="text/css"> -body {font-family:"Verdana";font-weight:normal;color:black;background-color:white;} -.failed { background-color: red; } .error0 { background-color: lightgray; } -.info { padding: 0.5em; margin-top: 1em; color: white; } -.passed { background-color: green; } -.error_case div { padding: 0.3em 0.2em; margin: 0.5em 0; } -.error_msg { padding: 0.5em; border-bottom:1px solid #ccc; } -.msg { color:#c00; } -.function { font-family:"Lucida Console";color: gray;} -.file { border-bottom: 1px dashed gray; } -.env { color: gray; font-size:10pt; padding: 0.5em; } -.odd { background-color: #fee; } -</style> -</head> -<body> -EOD; - return $contents; - } - - public function render() - { - echo $this->renderHeader(); - echo $this->renderBody(); - echo $this->renderFooter(); - } - - protected function renderBody() - { - /* SeleniumTestResult */ - $test = $this->test; - $total = count($test->suites); - $date = @strftime('%Y-%m-%d %H:%M',$test->date); -$contents = <<<EOD -<h1 class="suite">Functional Test Results</h1> -<div class="info {$test->result}"> - <strong>{$total}</strong> test cases completed, - <strong>{$test->numTestPasses}</strong> passes - ({$test->numCommandPasses} commands), and - <strong>{$test->numTestFailures}</strong> fails - ({$test->numCommandErrors} commands). -</div> -<div class="env"> - {$date}, {$test->browser} -</div> -EOD; - $count = 1; - foreach($test->suites as $suite) - { - foreach($suite->failures as $error) - $contents .= $this->getErrorMsg($suite, $error, $count++); - } - - return $contents; - } - - - protected function getErrorMsg($suite, $info, $count) - { - $parity = $count%2==0 ? 'even' : 'odd'; - $command = explode("|",$info['command']); -$msg = <<<EOD - <div class="error_msg {$parity}"> - <strong>#{$count}.</strong> - "<span class="msg">{$info['msg']}</span>" in - <span class="function"> - {$suite->name}::{$command[1]}('{$command[2]}'); - </span> - </div> -EOD; - - return $msg; - } - - protected function renderFooter() - { - return "</body></html>"; - } -} - - -?>
\ No newline at end of file diff --git a/tests/test_tools/selenium/php/selenium.php b/tests/test_tools/selenium/php/selenium.php deleted file mode 100644 index 8eddd6cb..00000000 --- a/tests/test_tools/selenium/php/selenium.php +++ /dev/null @@ -1,555 +0,0 @@ -<?php -/** - * Selenium PHP driver. Saves the test command in a "out" queue (in session), - * and for each selenese request, remove the first comand from the "out" queue - * and push the results into the "in" queque (also in session). When "out" queque - * is empty, write the results to disk. - * - * Usage: See ../../example.php - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the BSD License. - * - * Copyright(c) 2004 by Wei Zhuo. All rights reserved. - * - * To contact the author write to {@link mailto:weizhuo[at]gmail[dot]com Wei Zhuo} - * The latest version of PRADO can be obtained from: - * {@link http://prado.sourceforge.net/} - * - * @author Wei Zhuo <weizhuo[at]gmail[dot]com> - * @version $Id: selenium.php 1771 2007-03-26 00:27:59Z xue $ - * @package Prado.tests - */ - -/** - * Selenium automatic client runner, - * - * @author Wei Zhuo<weizhuo[at]gmail[dot]com> - * @version $Id: selenium.php 1771 2007-03-26 00:27:59Z xue $ - * @package Prado.tests - */ - -require_once(dirname(__FILE__).'/results.php'); - -class SeleniumTestRunner -{ - protected $driver; - protected $base_dir = ''; - - public function __construct($driver=null, $base_dir='../javascript/') - { - if(is_null($driver) && !(php_sapi_name() == 'cli')) - $driver = $_SERVER['SCRIPT_NAME']; - $this->driver = $driver; - $this->base_dir = $base_dir; - } - - public function render() - { - if((php_sapi_name() == 'cli')) return; - $file = dirname(__FILE__).'/TestRunner.php'; - $driver = $this->driver; - - //$base_dir = $this->base_dir; - $base_dir = $driver.'?sr='; - include($file); - } - - public function getDriver() - { - return $this->driver; - } -} - -class SeleniumTestStorage -{ - protected $outputs = array(); - protected $tests = array(); - protected $options=array(); - - public function getTests() - { - return $this->tests; - } - - public function getOptions() - { - return $this->options; - } - - public function addOption($test_name, $option) - { - $this->options[$test_name] = $option; - } - - public function addCommand($test_case_id, $command) - { - $data = array($test_case_id, $command); - array_push($this->outputs, $data); - } - - public function getCommand() - { - return array_shift($this->outputs); - } - - public function addTestCase($command, $trace_details, $test_name, $test_suite) - { - $data = array(0, 0, $command, "", $trace_details, $test_name, $test_suite); - array_push($this->tests, $data); - } -} - -class SeleneseInterpreter -{ - protected $storage; - protected $tracer; - - public function __construct($storage, $tracer) - { - $this->storage = $storage; - $this->tracer = $tracer; - } - - public function getTests() - { - return $this->storage->getTests(); - } - - public function getOptions() - { - return $this->storage->getOptions(); - } - - public function getCommand() - { - $command = $this->storage->getCommand(); - return empty($command) ? "|testComplete|||" : "{$command[1]}<{$command[0]}>"; - } - - public function __call($func, $args) - { - if($func{0} == '_') return; - - $trace = debug_backtrace(); - if($this->isTestOptionFunction($func,$args,$trace)) - return; - - $ID = isset($args[0]) ? $args[0] : ""; - $value = isset($args[1]) ? $args[1] : ""; - if(strpos(strtolower($func),'htmlpresent') || strpos(strtolower($func),'htmlnotpresent')) - $ID = htmlspecialchars($ID); - $command = array($func, $ID, $value); - - if(is_int(strpos(strtolower($func), 'visible'))) - $this->addCommand(array('pause','250',''),$trace); - - return $this->addCommand($command, $trace); - } - - protected function isTestOptionFunction($func,$args,$trace) - { - if(strtolower($func)==='skipcondition') - { - list($trace, $test, $suite) = $this->tracer->getTrace($trace); - $this->storage->addOption($test,$args[0]); - return true; - } - return false; - } - - protected function addCommand($command, $trace) - { - list($trace, $test, $suite) = $this->tracer->getTrace($trace); - $test_id = $this->storage->addTestCase($command, $trace, $test, $suite); - $this->storage->addCommand($test_id, $command); - } -} - -class SeleniumTestTrace -{ - protected $root; - - public function __construct($root) - { - $this->root = $root; - } - - public function getTrace($trace) - { - $group = array_pop($trace); - $info = $trace[3]; - $test = $group['args'][0]->getTestList(); - $i = count($test); - $name = $test[$i-2].'::'.$test[$i-1]; - $suite = $test[0]; - unset($info['object']); - /* - for($i = 0; $i < count($info['args']); $i++) - { - if($info['args'][$i] instanceof TControl) - $info['args'][$i] = $info['args'][$i]->ClientID; - }*/ - $file = str_replace($this->root, '', $info['file']); - $info['file'] = substr($file, 1); - return array($info, $name, $suite); - } -} - -class SimpleSeleniumProxyServer -{ - protected $runner; - protected $int; - protected $result_file; - - public function __construct($runner, $int, $result_file) - { - $this->int = $int; - $this->runner = $runner; - $this->result_file = $result_file; - } - - public function proxy() - { - return $this->int; - } - - - public static function getInstance($root='/', $result_file='results.dat', $base_dir='selenium/') - { - static $instance; - if(!isset($instance)) - { - $storage = new SeleniumTestStorage(); - $tracer = new SeleniumTestTrace($root); - $interpreter = new SeleneseInterpreter($storage, $tracer); - $runner = new SeleniumTestRunner(null, $base_dir); - $instance = new SimpleSeleniumProxyServer($runner, $interpreter, $result_file); - } - $instance->serveResults(); - return $instance; - } - - public function handleRequest() - { - $client = new SeleniumTestRunnerServer($this->int, $this->runner); - $client->serve(); - return true; - } - - public function serveResults() - { - if(isset($_POST['result'])) - { - $result = new SeleniumTestResult(); - $reporter = new SeleniumHtmlReporter($result); - $reporter->render(); - exit(); - } - } - -} - -class SeleniumTestSuiteWriter -{ - protected $suites; - protected $name; - protected $runner; - - function __construct($suites, $name, $runner) - { - $this->suites = $suites; - $this->name = $name; - $this->runner = $runner; - - } - - protected function renderHeader() - { - $base_dir = $this->runner->getDriver().'?sr='; - - include(dirname(__FILE__).'/TestSuiteHeader.php'); - - $contents = <<<EOD - <tr><td><b>{$this->name}</b></td></tr> -EOD; - echo $contents; - } - - public function render() - { - $this->renderHeader(); - foreach($this->suites as $name => $suite) - { - $file = $suite[0]['trace']['file']; - $file = strtr($file,'\\','/'); - $option = $suite[0]['option']===null?'':' unless="'.$suite[0]['option'].'" '; - $url = $this->runner->getDriver()."?case={$name}&file={$file}"; - echo "<tr{$option}>\n"; - echo "<td><a href=\"{$url}\">{$name}</a></td>\n"; - echo "</tr>\n"; - } - echo $this->renderFooter(); - } - - protected function getJsTraceInfo() - { - $contents = "var prado_trace = {};\n"; - foreach($this->suites as $name => $suite) - { - $name = $name; - $contents .= "prado_trace['{$name}'] = ["; - $cases = array(); - foreach($suite as $testcase) - $cases[] = "'".addslashes(htmlspecialchars(serialize($testcase['trace'])))."'"; - $contents .= implode(",\n", $cases)."];\n\n"; - } - return $contents; - } - - protected function renderFooter() - { - $trace = '';//$this->getJsTraceInfo(); - $contents = <<<EOD - </tbody> - </table> - - <br /> - <em>Not supported in this browser</em> - <table id="skippedTests" cellpadding="1" - cellspacing="1" - border="1" - class="selenium"> - <tbody> - <tr><td><b>Skipped Tests</b></td></tr> - </tbody> - </table> - <script type="text/javascript"> - /*<![CDATA[*/ - $trace - /*]]>*/ - </script> -</body> -</html> -EOD; - return $contents; - } -} - -class SeleniumTestCaseWriter -{ - protected $case; - protected $tests; - - function __construct($case, $tests) - { - $this->case = $case; - $this->tests = $tests; - } - - protected function renderHeader() - { - $contents = <<<EOD -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html> -<head> -<title>{$this->case}</title> - <meta content="text/html; charset=UTF-8" http-equiv="content-type"> -</head> -<body> -<table cellpadding="1" cellspacing="1" border="1" id=TABLE1> - <tbody> - <tr> - <td rowspan="1" colspan="3"><strong>{$this->case}</strong></td> - </tr> -EOD; - return $contents; - } - - public function render() - { - echo $this->renderHeader(); - foreach($this->tests as $test) - { - $t = $test['test']; - if($t[0] == "open") - $t[1] = "<a href=\"{$t[1]}\" target=\"_blank\">{$t[1]}</a>"; - echo "<tr>\n"; - echo "<td>{$t[0]}</td>\n"; - echo "<td>{$t[1]}</td>\n"; - echo "<td>{$t[2]}</td>\n"; - echo "</tr>\n"; - } - echo $this->renderFooter(); - } - - protected function renderFooter() - { - $contents = <<<EOD - </tbody> -</table> -</body> -</html> -EOD; - return $contents; - } -} - -class SeleniumTestRunnerServer -{ - protected $cases = array(); - protected $trace = array(); - protected $name; - protected $runner; - - public function __construct($int, $runner) - { - $this->runner = $runner; - $this->initialize($int); - } - - protected function initialize($int) - { - $options = $int->getOptions(); - foreach($int->getTests() as $command) - { - $case = $command[5]; - $option=isset($options[$case])?$options[$case]:null; - $this->cases[$case][] = - array('test' => $command[2], - 'trace' => $command[4], 'option'=>$option); - if(is_null($this->name)) - $this->name = $command[6]; - } - } - - function serve() - { - if($this->isTestSuiteRequest()) - { - $testSuite = new SeleniumTestSuiteWriter($this->cases, - $this->name, $this->runner); - $testSuite->render(); - } - else if($this->isTestCaseRequest()) - { - if(($case = $this->getTestCaseRequest()) !== false) - { - - $testCase = new SeleniumTestCaseWriter($case, $this->getTestCase()); - $testCase->render(); - } - } - else - { - $this->runner->render(); - } - } - - protected function isTestSuiteRequest() - { - return isset($_GET['testSuites']); - } - - protected function isTestCaseRequest() - { - return isset($_GET['case']); - } - - public function isClientRequest() - { - return !$this->isTestSuiteRequest() && !$this->isTestCaseRequest(); - } - - protected function getTestCaseRequest() - { - $case = $_GET['case']; - if(isset($this->cases[$case])) - return $case; - else return false; - } - - protected function getTestCase() - { - $case = $_GET['case']; - if(isset($this->cases[$case])) - return $this->cases[$case]; - else - return array(); - } -} - - -class SeleniumTestCase extends UnitTestCase -{ - protected $selenium; - protected $Page; - - const KONQUEROR='browserVersion.isKonqueror'; - const OPERA='browserVersion.isOpera'; - const CHROME='browserVersion.isChrome'; - const INTERNET_EXPLORER='browserVersion.isIE'; - const SAFARI='browserVersion.isSafari'; - const KHTML='browserVersion.khtml'; - const FIREFOX='browserVersion.isFirefox'; - const MOZILLA='browserVersion.isMozilla'; - const GECKO='browserVersion.isGecko'; - - protected $options=array(); - - function __construct() - { - $server = SimpleSeleniumProxyServer::getInstance(); - if(!is_null($server)) - $this->selenium = $server->proxy(); - parent::__construct(); - } - - function getPage($class) - { - $info = new ReflectionClass($class); - return Prado::getApplication()->getTestPage($info->getFileName()); - } - - function __call($func, $args) - { - if(count($args) == 0) - return $this->selenium->{$func}(); - else if (count($args) == 1) - return $this->selenium->{$func}($args[0]); - else if (count($args) == 2) - return $this->selenium->{$func}($args[0], $args[1]); - } - - function disabled() - { - $this->selenium->skipCondition('DISABLED'); - } - - function skipBrowsers() - { - $conditions = $this->getBrowserOptions(func_get_args()); - $this->selenium->skipCondition($conditions); - } - - protected function getBrowserOptions($arg_list) - { - $browsers=array(); - foreach($arg_list as $arg) - { - if(is_array($arg)) - $browsers[] = '('.implode(' && ', $arg).')'; - else - $browsers[] = $arg; - } - return implode(' || ', $browsers); - } - - function targetBrowsers() - { - $conditions = $this->getBrowserOptions(func_get_args()); - $this->selenium->skipCondition("!(".$conditions.")"); - } -} - -?>
\ No newline at end of file diff --git a/tests/test_tools/selenium/prado-functional-test.js b/tests/test_tools/selenium/prado-functional-test.js deleted file mode 100644 index 9d4446f0..00000000 --- a/tests/test_tools/selenium/prado-functional-test.js +++ /dev/null @@ -1,259 +0,0 @@ - -objectExtend(HtmlTestRunnerControlPanel.prototype, { - getTestSuiteName: function() { - return document.location+'?testSuites'; //this._getQueryParameter("test"); - } -}); - -SeleniumFrame.prototype._setLocation = function(location) { - /* var isChrome = browserVersion.isChrome || false; - var isHTA = browserVersion.isHTA || false; - // DGF TODO multiWindow - location += "?thisIsChrome=" + isChrome + "&thisIsHTA=" + isHTA;*/ - if (browserVersion.isSafari) { - // safari doesn't reload the page when the location equals to current location. - // hence, set the location to blank so that the page will reload automatically. - this.frame.src = "about:blank"; - this.frame.src = location; - } else { - this.frame.contentWindow.location.replace(location); - } - }; - -SeleniumFrame.prototype._attachStylesheet = function() -{ - var base_url = script_base_url; - var d = this.getDocument(); - var head = d.getElementsByTagName('head').item(0); - var styleLink = d.createElement("link"); - styleLink.rel = "stylesheet"; - styleLink.type = "text/css"; - styleLink.href = base_url + "core/selenium-test.css"; - head.appendChild(styleLink); -}; - -HtmlTestFrame.prototype._setLocation = SeleniumFrame.prototype._setLocation; -HtmlTestSuiteFrame.prototype._setLocation = SeleniumFrame.prototype._setLocation; - -HtmlTestFrame.prototype._attachStylesheet = SeleniumFrame.prototype._attachStylesheet; -HtmlTestSuiteFrame.prototype._attachStylesheet = SeleniumFrame.prototype._attachStylesheet; - - -objectExtend(HtmlTestRunnerControlPanel.prototype, { - _parseQueryParameter: function() { - var tempRunInterval = this._getQueryParameter("runInterval"); - if (tempRunInterval) { - this.setRunInterval(tempRunInterval); - } - } -}); - - - -/** - * Override selenium implementation. - */ -Selenium.prototype.getAttribute = function(target) { - return this.page().findAttribute(target); -}; - - -/** - * Override selenium implementation. - */ -Selenium.prototype.isVisible = function(locator) { - var element; - element = this.page().findElement(locator); - - if(/Konqueror|Safari|KHTML/.test(navigator.userAgent)) - var visibility = element.style["visibility"]; - else - var visibility = this.findEffectiveStyleProperty(element, "visibility"); - - var _isDisplayed = this._isDisplayed(element); - return (visibility != "hidden" && _isDisplayed); -}; - - -/** - * Override selenium implementation. - */ -Selenium.prototype._isDisplayed = function(element) { - if(/Konqueror|Safari|KHTML/.test(navigator.userAgent)) - var display = element.style["display"]; - else - var display = this.findEffectiveStyleProperty(element, "display"); - if (display == "none") return false; - if (element.parentNode.style) { - return this._isDisplayed(element.parentNode); - } - return true; -}; - -Selenium.prototype.assertEmptySelection = function(selectLocator, optionLocator) -{ - /** - * Verifies that the selected option of a drop-down satisfies the optionSpecifier. - * - * <p>See the select command for more information about option locators.</p> - * - * @param selectLocator an <a href="#locators">element locator</a> identifying a drop-down menu - * @param optionLocator an option locator, typically just an option label (e.g. "John Smith") - */ - var element = this.page().findElement(selectLocator); - var locator = this.optionLocatorFactory.fromLocatorString(optionLocator); - return element.selectedIndex == -1; -} - - -objectExtend(HtmlTestSuite.prototype, { - _onTestSuiteComplete: function() { - this.markDone(); - var result = new TestResult(this.failed, this.getTestTable()); - postTestResults(this.failed, this.getTestTable(), result); - } -}); - - - - -// Post the results to a servlet, CGI-script, etc. The URL of the -// results-handler defaults to "/postResults", but an alternative location -// can be specified by providing a "resultsUrl" query parameter. -// -// Parameters passed to the results-handler are: -// result: passed/failed depending on whether the suite passed or failed -// totalTime: the total running time in seconds for the suite. -// -// numTestPasses: the total number of tests which passed. -// numTestFailures: the total number of tests which failed. -// -// numCommandPasses: the total number of commands which passed. -// numCommandFailures: the total number of commands which failed. -// numCommandErrors: the total number of commands which errored. -// -// suite: the suite table, including the hidden column of test results -// testTable.1 to testTable.N: the individual test tables -// -function postTestResults(suiteFailed, suiteTable, result) { - - form = document.createElement("form"); - document.body.appendChild(form); - - form.id = "resultsForm"; - form.method="post"; - form.target="myiframe"; - - var resultsUrl = post_results_to; - if (!resultsUrl) { - resultsUrl = "./results.php"; - } - - var actionAndParameters = resultsUrl.split('?',2); - form.action = actionAndParameters[0]; - LOG.warn(form.action) - var resultsUrlQueryString = actionAndParameters[1]; - - form.createHiddenField = function(name, value) { - input = document.createElement("input"); - input.type = "hidden"; - input.name = name; - input.value = value; - this.appendChild(input); - }; - - if (resultsUrlQueryString) { - var clauses = resultsUrlQueryString.split('&'); - for (var i = 0; i < clauses.length; i++) { - var keyValuePair = clauses[i].split('=',2); - var key = unescape(keyValuePair[0]); - var value = unescape(keyValuePair[1]); - form.createHiddenField(key, value); - } - } - - form.createHiddenField("result", suiteFailed == true ? "failed" : "passed"); - form.createHiddenField("totalTime", Math.floor((result.metrics.currentTime - result.metrics.startTime) / 1000)); - form.createHiddenField("numTestPasses", result.metrics.numTestPasses); - form.createHiddenField("numTestFailures", result.metrics.numTestFailures); - form.createHiddenField("numCommandPasses", result.metrics.numCommandPasses); - form.createHiddenField("numCommandFailures", result.metrics.numCommandFailures); - form.createHiddenField("numCommandErrors", result.metrics.numCommandErrors); - - // Create an input for each test table. The inputs are named - // testTable.1, testTable.2, etc. - for (rowNum = 1; rowNum < suiteTable.rows.length;rowNum++) { - // If there is a second column, then add a new input - if (suiteTable.rows[rowNum].cells.length > 1) { - var resultCell = suiteTable.rows[rowNum].cells[1]; - parse_resultCell(resultCell,rowNum,form); - //form.createHiddenField("tests[]", resultCell.innerHTML); - // remove the resultCell, so it's not included in the suite HTML - //resultCell.parentNode.removeChild(resultCell); - } - } - - // Add HTML for the suite itself - //form.createHiddenField("suite", suiteTable.parentNode.innerHTML); - - form.submit(); - document.body.removeChild(form); -} - -function parse_resultCell(resultCell,rowNum,form) -{ - var div = resultCell.childNodes[0]; - var table; - for(var i = 0; i<div.childNodes.length; i++) - { - if(div.childNodes[i].nodeName.toLowerCase() == 'table') - table = div.childNodes[i]; - } - //LOG.info(div.innerHTML); - var testname = table.rows[0].cells[0].firstChild.innerHTML; - var resultColor = get_color_status(table.rows[0]); - - form.createHiddenField("tests["+rowNum+"][testcase]",testname); - - //var trace = window.testSuiteFrame.prado_trace[testname]; - - for(var i = 1; i<table.rows.length; i++) - { - var msg = table.rows[i].getAttribute("title"); - var result = get_color_status(table.rows[i]); - var action = table.rows[i].cells[0].innerHTML; - var target = table.rows[i].cells[1].innerHTML; - var param = table.rows[i].cells[2].innerHTML; - var id = "tests["+rowNum+"][commands]["+(i-1)+"]"; - form.createHiddenField(id+"[command]", "|"+action+"|"+target+"|"+param+"|"); - form.createHiddenField(id+"[result]", result); - form.createHiddenField(id+"[msg]", msg); - //form.createHiddenField(id+"[trace]", trace[i-1]); - } -} - -function get_color_status(element) -{ - var color = element.className - if(color == 'status_passed') return "passed"; - if(color == 'status_failed') return "failed"; - if(color == 'status_done') return "done"; - return ""; -} - - - - -Selenium.prototype.assertHTMLPresent = function(expectedValue) { - var actualValue = this.page().currentDocument.body.innerHTML; - if(actualValue.indexOf(expectedValue) >= 0) - return; - Assert.fail("Unable to find '"+(expectedValue.replace(/</g, "<").replace(/>/g, ">").replace(/"/g, "\""))+"' in document.body"); -}; - -Selenium.prototype.assertHTMLNotPresent = function(expectedValue) { - var actualValue = this.page().currentDocument.body.innerHTML; - if(actualValue.indexOf(expectedValue) < 0) - return; - Assert.fail("'"+(expectedValue.replace(/</g, "<").replace(/>/g, ">").replace(/"/g, "\""))+"' was found in document.body"); -};
\ No newline at end of file diff --git a/tests/test_tools/selenium/reference.html b/tests/test_tools/selenium/reference.html deleted file mode 100644 index 5533764a..00000000 --- a/tests/test_tools/selenium/reference.html +++ /dev/null @@ -1,3858 +0,0 @@ -<html> -<head> -<META http-equiv="Content-Type" content="text/html; charset=UTF-8"> -<title>Selenium Reference</title> -</head> -<body> -<h1>Selenium Reference</h1> -<h2>Concepts</h2> -<p>A <strong>command</strong> is what tells Selenium what to do. Selenium commands come in three 'flavors': <strong>Actions</strong>, <strong>Accessors</strong> and <strong>Assertions</strong>. - Each command call is one line in the test table of the form:</p> -<blockquote> -<table border="1" class="table"> -<colgroup> -<col width="39%"> -<col width="33%"> -<col width="28%"> -</colgroup> -<tbody valign="top"> -<tr> -<td>command</td><td>target</td><td>value</td> -</tr> -</tbody> -</table> -</blockquote> -<p> -<strong>Actions</strong> are commands that generally manipulate the state of the application. They do things like "click this link" and "select that option". If an Action fails, or has an error, the execution of the current test is stopped.</p> -<p>Many Actions can be called with the "AndWait" suffix, e.g. "clickAndWait". - This suffix tells Selenium that the action will cause the browser to make a call to the server, - and that Selenium should wait for a new page to load.</p> -<p> -<strong>Accessors</strong> examine the state of the application and store the results in variables, e.g. "storeTitle". They are also used to automatically generate Assertions.</p> -<p> -<strong>Assertions</strong> are like Accessors, but they verify that the state of the application conforms to what is expected. Examples include "make sure the page title is X" and "verify that this checkbox is checked".</p> -<p>All Selenium Assertions can be used in 3 modes: "assert", "verify", and "waitFor". For example, you can "assertText", "verifyText" and "waitForText". When an "assert" fails, the test is aborted. When a "verify" fails, the test will continue execution, logging the failure. This allows a single "assert" to ensure that the application is on the correct page, followed by a bunch of "verify" assertions to test form field values, labels, etc.</p> -<p>"waitFor" commands wait for some condition to become true (which can be useful for testing Ajax applications). - They will succeed immediately if the condition is already true. - However, they will fail and halt the test if the condition does not become true within the current timeout setting - (see the <strong>setTimeout</strong> action below). - </p> -<p> -<strong>Element Locators</strong> tell Selenium which HTML element a command refers to. Many commands require an Element Locator as the "target" attribute. Examples of Element Locators include "elementId" and "document.forms[0].element". These are described more clearly in the next section.</p> -<p> -<strong>Patterns</strong> are used for various reasons, e.g. to specify the expected value of an input field, or identify a select option. Selenium supports various types of pattern, including regular-expressions, all of which are described in more detail below.</p>Defines an object that runs Selenium commands. - -<h3> -<a name="locators"></a>Element Locators</h3> -<p> -Element Locators tell Selenium which HTML element a command refers to. -The format of a locator is:</p> -<blockquote> -<em>locatorType</em><strong>=</strong><em>argument</em> -</blockquote> -<p> -We support the following strategies for locating elements: -</p> -<blockquote> -<dl> -<dt> -<strong>identifier</strong>=<em>id</em> -</dt> -<dd>Select the element with the specified @id attribute. If no match is -found, select the first element whose @name attribute is <em>id</em>. -(This is normally the default; see below.)</dd> -<dt> -<strong>id</strong>=<em>id</em> -</dt> -<dd>Select the element with the specified @id attribute.</dd> -<dt> -<strong>name</strong>=<em>name</em> -</dt> -<dd>Select the first element with the specified @name attribute.</dd> -<dd> -<ul class="first last simple"> -<li>username</li> -<li>name=username</li> -</ul> -</dd> -<dd>The name may optionally be followed by one or more <em>element-filters</em>, separated from the name by whitespace. If the <em>filterType</em> is not specified, <strong>value</strong> is assumed.</dd> -<dd> -<ul class="first last simple"> -<li>name=flavour value=chocolate</li> -</ul> -</dd> -<dt> -<strong>dom</strong>=<em>javascriptExpression</em> -</dt> -<dd> -<dd>Find an element using JavaScript traversal of the HTML Document Object -Model. DOM locators <em>must</em> begin with "document.". -<ul class="first last simple"> -<li>dom=document.forms['myForm'].myDropdown</li> -<li>dom=document.images[56]</li> -</ul> -</dd> -</dd> -<dt> -<strong>xpath</strong>=<em>xpathExpression</em> -</dt> -<dd>Locate an element using an XPath expression. -<ul class="first last simple"> -<li>xpath=//img[@alt='The image alt text']</li> -<li>xpath=//table[@id='table1']//tr[4]/td[2]</li> -</ul> -</dd> -<dt> -<strong>link</strong>=<em>textPattern</em> -</dt> -<dd>Select the link (anchor) element which contains text matching the -specified <em>pattern</em>. -<ul class="first last simple"> -<li>link=The link text</li> -</ul> -</dd> -<dt> -<strong>css</strong>=<em>cssSelectorSyntax</em> -</dt> -<dd>Select the element using css selectors. Please refer to <a href="http://www.w3.org/TR/REC-CSS2/selector.html">CSS2 selectors</a>, <a href="http://www.w3.org/TR/2001/CR-css3-selectors-20011113/">CSS3 selectors</a> for more information. You can also check the TestCssLocators test in the selenium test suite for an example of usage, which is included in the downloaded selenium core package. -<ul class="first last simple"> -<li>css=a[href="#id3"]</li> -<li>css=span#firstChild + span</li> -</ul> -</dd> -<dd>Currently the css selector locator supports all css1, css2 and css3 selectors except namespace in css3, some pseudo classes(:nth-of-type, :nth-last-of-type, :first-of-type, :last-of-type, :only-of-type, :visited, :hover, :active, :focus, :indeterminate) and pseudo elements(::first-line, ::first-letter, ::selection, ::before, ::after). </dd> -</dl> -</blockquote> -<p> -Without an explicit locator prefix, Selenium uses the following default -strategies: -</p> -<ul class="simple"> -<li> -<strong>dom</strong>, for locators starting with "document."</li> -<li> -<strong>xpath</strong>, for locators starting with "//"</li> -<li> -<strong>identifier</strong>, otherwise</li> -</ul> -<h3> -<a name="element-filters">Element Filters</a> -</h3> -<blockquote> -<p>Element filters can be used with a locator to refine a list of candidate elements. They are currently used only in the 'name' element-locator.</p> -<p>Filters look much like locators, ie.</p> -<blockquote> -<em>filterType</em><strong>=</strong><em>argument</em> -</blockquote> -<p>Supported element-filters are:</p> -<p> -<strong>value=</strong><em>valuePattern</em> -</p> -<blockquote> -Matches elements based on their values. This is particularly useful for refining a list of similarly-named toggle-buttons.</blockquote> -<p> -<strong>index=</strong><em>index</em> -</p> -<blockquote> -Selects a single element based on its position in the list (offset from zero).</blockquote> -</blockquote> -<h3> -<a name="patterns"></a>String-match Patterns</h3> -<p> -Various Pattern syntaxes are available for matching string values: -</p> -<blockquote> -<dl> -<dt> -<strong>glob:</strong><em>pattern</em> -</dt> -<dd>Match a string against a "glob" (aka "wildmat") pattern. "Glob" is a -kind of limited regular-expression syntax typically used in command-line -shells. In a glob pattern, "*" represents any sequence of characters, and "?" -represents any single character. Glob patterns match against the entire -string.</dd> -<dt> -<strong>regexp:</strong><em>regexp</em> -</dt> -<dd>Match a string using a regular-expression. The full power of JavaScript -regular-expressions is available.</dd> -<dt> -<strong>exact:</strong><em>string</em> -</dt> -<dd>Match a string exactly, verbatim, without any of that fancy wildcard -stuff.</dd> -</dl> -</blockquote> -<p> -If no pattern prefix is specified, Selenium assumes that it's a "glob" -pattern. -</p> -<h2>Selenium Actions</h2> -<dl> -<dt> -<strong><a name="addSelection"></a>addSelection - ( - locator,optionLocator - ) - </strong> -</dt> -<dd>Add a selection to the set of selected options in a multi-select element using an option locator. - -@see #doSelect for details of option locators<p>Arguments:</p> -<ul> -<li>locator - an <a href="#locators">element locator</a> identifying a multi-select box</li> -<li>optionLocator - an option locator (a label by default)</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="answerOnNextPrompt"></a>answerOnNextPrompt - ( - answer - ) - </strong> -</dt> -<dd>Instructs Selenium to return the specified answer string in response to -the next JavaScript prompt [window.prompt()].<p>Arguments:</p> -<ul> -<li>answer - the answer to give in response to the prompt pop-up</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="check"></a>check - ( - locator - ) - </strong> -</dt> -<dd>Check a toggle-button (checkbox/radio)<p>Arguments:</p> -<ul> -<li>locator - an <a href="#locators">element locator</a> -</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="chooseCancelOnNextConfirmation"></a>chooseCancelOnNextConfirmation - ( - - ) - </strong> -</dt> -<dd>By default, Selenium's overridden window.confirm() function will -return true, as if the user had manually clicked OK. After running -this command, the next call to confirm() will return false, as if -the user had clicked Cancel.</dd> -<br> -<dt> -<strong><a name="click"></a>click - ( - locator - ) - </strong> -</dt> -<dd>Clicks on a link, button, checkbox or radio button. If the click action -causes a new page to load (like a link usually does), call -waitForPageToLoad.<p>Arguments:</p> -<ul> -<li>locator - an element locator</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="clickAt"></a>clickAt - ( - locator,coordString - ) - </strong> -</dt> -<dd>Clicks on a link, button, checkbox or radio button. If the click action -causes a new page to load (like a link usually does), call -waitForPageToLoad. - -Beware of http://jira.openqa.org/browse/SEL-280, which will lead some event handlers to -get null event arguments. Read the bug for more details, including a workaround.<p>Arguments:</p> -<ul> -<li>locator - an element locator</li> -<li>coordString - specifies the x,y position (i.e. - 10,20) of the mouse event relative to the element returned by the locator.</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="close"></a>close - ( - - ) - </strong> -</dt> -<dd>Simulates the user clicking the "close" button in the titlebar of a popup -window or tab.</dd> -<br> -<dt> -<strong><a name="createCookie"></a>createCookie - ( - nameValuePair,optionsString - ) - </strong> -</dt> -<dd>Create a new cookie whose path and domain are same with those of current page -under test, unless you specified a path for this cookie explicitly.<p>Arguments:</p> -<ul> -<li>nameValuePair - name and value of the cookie in a format "name=value"</li> -<li>optionsString - options for the cookie. Currently supported options include 'path' and 'max_age'. the optionsString's format is "path=/path/, max_age=60". The order of options are irrelevant, the unit of the value of 'max_age' is second.</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="deleteCookie"></a>deleteCookie - ( - name,path - ) - </strong> -</dt> -<dd>Delete a named cookie with specified path.<p>Arguments:</p> -<ul> -<li>name - the name of the cookie to be deleted</li> -<li>path - the path property of the cookie to be deleted</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="dragdrop"></a>dragdrop - ( - locator,movementsString - ) - </strong> -</dt> -<dd>Drags an element a certain distance and then drops it -Beware of http://jira.openqa.org/browse/SEL-280, which will lead some event handlers to -get null event arguments. Read the bug for more details, including a workaround.<p>Arguments:</p> -<ul> -<li>locator - an element locator</li> -<li>movementsString - offset in pixels from the current location to which the element should be moved, e.g., "+70,-300"</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="fireEvent"></a>fireEvent - ( - locator,eventName - ) - </strong> -</dt> -<dd>Explicitly simulate an event, to trigger the corresponding "on<em>event</em>" -handler.<p>Arguments:</p> -<ul> -<li>locator - an <a href="#locators">element locator</a> -</li> -<li>eventName - the event name, e.g. "focus" or "blur"</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="goBack"></a>goBack - ( - - ) - </strong> -</dt> -<dd>Simulates the user clicking the "back" button on their browser.</dd> -<br> -<dt> -<strong><a name="keyDown"></a>keyDown - ( - locator,keySequence - ) - </strong> -</dt> -<dd>Simulates a user pressing a key (without releasing it yet).<p>Arguments:</p> -<ul> -<li>locator - an <a href="#locators">element locator</a> -</li> -<li>keySequence - Either be a string("\" followed by the numeric keycode of the key to be pressed, normally the ASCII value of that key), or a single character. For example: "w", "\119".</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="keyPress"></a>keyPress - ( - locator,keySequence - ) - </strong> -</dt> -<dd>Simulates a user pressing and releasing a key.<p>Arguments:</p> -<ul> -<li>locator - an <a href="#locators">element locator</a> -</li> -<li>keySequence - Either be a string("\" followed by the numeric keycode of the key to be pressed, normally the ASCII value of that key), or a single character. For example: "w", "\119".</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="keyUp"></a>keyUp - ( - locator,keySequence - ) - </strong> -</dt> -<dd>Simulates a user releasing a key.<p>Arguments:</p> -<ul> -<li>locator - an <a href="#locators">element locator</a> -</li> -<li>keySequence - Either be a string("\" followed by the numeric keycode of the key to be pressed, normally the ASCII value of that key), or a single character. For example: "w", "\119".</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="mouseDown"></a>mouseDown - ( - locator - ) - </strong> -</dt> -<dd>Simulates a user pressing the mouse button (without releasing it yet) on -the specified element.<p>Arguments:</p> -<ul> -<li>locator - an <a href="#locators">element locator</a> -</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="mouseDownAt"></a>mouseDownAt - ( - locator,coordString - ) - </strong> -</dt> -<dd>Simulates a user pressing the mouse button (without releasing it yet) on -the specified element. - -Beware of http://jira.openqa.org/browse/SEL-280, which will lead some event handlers to -get null event arguments. Read the bug for more details, including a workaround.<p>Arguments:</p> -<ul> -<li>locator - an <a href="#locators">element locator</a> -</li> -<li>coordString - specifies the x,y position (i.e. - 10,20) of the mouse event relative to the element returned by the locator.</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="mouseMove"></a>mouseMove - ( - locator - ) - </strong> -</dt> -<dd>Simulates a user pressing the mouse button (without releasing it yet) on -the specified element.<p>Arguments:</p> -<ul> -<li>locator - an <a href="#locators">element locator</a> -</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="mouseMoveAt"></a>mouseMoveAt - ( - locator,coordString - ) - </strong> -</dt> -<dd>Simulates a user pressing the mouse button (without releasing it yet) on -the specified element. - -Beware of http://jira.openqa.org/browse/SEL-280, which will lead some event handlers to -get null event arguments. Read the bug for more details, including a workaround.<p>Arguments:</p> -<ul> -<li>locator - an <a href="#locators">element locator</a> -</li> -<li>coordString - specifies the x,y position (i.e. - 10,20) of the mouse event relative to the element returned by the locator.</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="mouseOut"></a>mouseOut - ( - locator - ) - </strong> -</dt> -<dd>Simulates a user moving the mouse pointer away from the specified element.<p>Arguments:</p> -<ul> -<li>locator - an <a href="#locators">element locator</a> -</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="mouseOver"></a>mouseOver - ( - locator - ) - </strong> -</dt> -<dd>Simulates a user hovering a mouse over the specified element.<p>Arguments:</p> -<ul> -<li>locator - an <a href="#locators">element locator</a> -</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="mouseUp"></a>mouseUp - ( - locator - ) - </strong> -</dt> -<dd>Simulates a user pressing the mouse button (without releasing it yet) on -the specified element.<p>Arguments:</p> -<ul> -<li>locator - an <a href="#locators">element locator</a> -</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="mouseUpAt"></a>mouseUpAt - ( - locator,coordString - ) - </strong> -</dt> -<dd>Simulates a user pressing the mouse button (without releasing it yet) on -the specified element. - -Beware of http://jira.openqa.org/browse/SEL-280, which will lead some event handlers to -get null event arguments. Read the bug for more details, including a workaround.<p>Arguments:</p> -<ul> -<li>locator - an <a href="#locators">element locator</a> -</li> -<li>coordString - specifies the x,y position (i.e. - 10,20) of the mouse event relative to the element returned by the locator.</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="open"></a>open - ( - url - ) - </strong> -</dt> -<dd>Opens an URL in the test frame. This accepts both relative and absolute -URLs. - -The "open" command waits for the page to load before proceeding, -ie. the "AndWait" suffix is implicit. - -<em>Note</em>: The URL must be on the same domain as the runner HTML -due to security restrictions in the browser (Same Origin Policy). If you -need to open an URL on another domain, use the Selenium Server to start a -new browser session on that domain.<p>Arguments:</p> -<ul> -<li>url - the URL to open; may be relative or absolute</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="refresh"></a>refresh - ( - - ) - </strong> -</dt> -<dd>Simulates the user clicking the "Refresh" button on their browser.</dd> -<br> -<dt> -<strong><a name="removeSelection"></a>removeSelection - ( - locator,optionLocator - ) - </strong> -</dt> -<dd>Remove a selection from the set of selected options in a multi-select element using an option locator. - -@see #doSelect for details of option locators<p>Arguments:</p> -<ul> -<li>locator - an <a href="#locators">element locator</a> identifying a multi-select box</li> -<li>optionLocator - an option locator (a label by default)</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="select"></a>select - ( - selectLocator,optionLocator - ) - </strong> -</dt> -<dd>Select an option from a drop-down using an option locator. - -<p> -Option locators provide different ways of specifying options of an HTML -Select element (e.g. for selecting a specific option, or for asserting -that the selected option satisfies a specification). There are several -forms of Select Option Locator. -</p> -<dl> -<dt> -<strong>label</strong>=<em>labelPattern</em> -</dt> -<dd>matches options based on their labels, i.e. the visible text. (This -is the default.) -<ul class="first last simple"> -<li>label=regexp:^[Oo]ther</li> -</ul> -</dd> -<dt> -<strong>value</strong>=<em>valuePattern</em> -</dt> -<dd>matches options based on their values. -<ul class="first last simple"> -<li>value=other</li> -</ul> -</dd> -<dt> -<strong>id</strong>=<em>id</em> -</dt> -<dd>matches options based on their ids. -<ul class="first last simple"> -<li>id=option1</li> -</ul> -</dd> -<dt> -<strong>index</strong>=<em>index</em> -</dt> -<dd>matches an option based on its index (offset from zero). -<ul class="first last simple"> -<li>index=2</li> -</ul> -</dd> -</dl> -<p> -If no option locator prefix is provided, the default behaviour is to match on <strong>label</strong>. -</p> -<p>Arguments:</p> -<ul> -<li>selectLocator - an <a href="#locators">element locator</a> identifying a drop-down menu</li> -<li>optionLocator - an option locator (a label by default)</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="selectFrame"></a>selectFrame - ( - locator - ) - </strong> -</dt> -<dd>Selects a frame within the current window. (You may invoke this command -multiple times to select nested frames.) To select the parent frame, use -"relative=parent" as a locator; to select the top frame, use "relative=top". - -<p>You may also use a DOM expression to identify the frame you want directly, -like this: <code>dom=frames["main"].frames["subframe"]</code> -</p> -<p>Arguments:</p> -<ul> -<li>locator - an <a href="#locators">element locator</a> identifying a frame or iframe</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="selectWindow"></a>selectWindow - ( - windowID - ) - </strong> -</dt> -<dd>Selects a popup window; once a popup window has been selected, all -commands go to that window. To select the main window again, use "null" -as the target.<p>Arguments:</p> -<ul> -<li>windowID - the JavaScript window ID of the window to select</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="setContext"></a>setContext - ( - context,logLevelThreshold - ) - </strong> -</dt> -<dd>Writes a message to the status bar and adds a note to the browser-side -log. - -<p>If logLevelThreshold is specified, set the threshold for logging -to that level (debug, info, warn, error).</p> -<p>(Note that the browser-side logs will <i>not</i> be sent back to the -server, and are invisible to the Client Driver.)</p> -<p>Arguments:</p> -<ul> -<li>context - the message to be sent to the browser</li> -<li>logLevelThreshold - one of "debug", "info", "warn", "error", sets the threshold for browser-side logging</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="setCursorPosition"></a>setCursorPosition - ( - locator,position - ) - </strong> -</dt> -<dd>Moves the text cursor to the specified position in the given input element or textarea. -This method will fail if the specified element isn't an input element or textarea.<p>Arguments:</p> -<ul> -<li>locator - an <a href="#locators">element locator</a> pointing to an input element or textarea</li> -<li>position - the numerical position of the cursor in the field; position should be 0 to move the position to the beginning of the field. You can also set the cursor to -1 to move it to the end of the field.</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="setTimeout"></a>setTimeout - ( - timeout - ) - </strong> -</dt> -<dd>Specifies the amount of time that Selenium will wait for actions to complete. - -<p>Actions that require waiting include "open" and the "waitFor*" actions.</p> -The default timeout is 30 seconds.<p>Arguments:</p> -<ul> -<li>timeout - a timeout in milliseconds, after which the action will return with an error</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="submit"></a>submit - ( - formLocator - ) - </strong> -</dt> -<dd>Submit the specified form. This is particularly useful for forms without -submit buttons, e.g. single-input "Search" forms.<p>Arguments:</p> -<ul> -<li>formLocator - an <a href="#locators">element locator</a> for the form you want to submit</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="type"></a>type - ( - locator,value - ) - </strong> -</dt> -<dd>Sets the value of an input field, as though you typed it in. - -<p>Can also be used to set the value of combo boxes, check boxes, etc. In these cases, -value should be the value of the option selected, not the visible text.</p> -<p>Arguments:</p> -<ul> -<li>locator - an <a href="#locators">element locator</a> -</li> -<li>value - the value to type</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="uncheck"></a>uncheck - ( - locator - ) - </strong> -</dt> -<dd>Uncheck a toggle-button (checkbox/radio)<p>Arguments:</p> -<ul> -<li>locator - an <a href="#locators">element locator</a> -</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="waitForCondition"></a>waitForCondition - ( - script,timeout - ) - </strong> -</dt> -<dd>Runs the specified JavaScript snippet repeatedly until it evaluates to "true". -The snippet may have multiple lines, but only the result of the last line -will be considered. - -<p>Note that, by default, the snippet will be run in the runner's test window, not in the window -of your application. To get the window of your application, you can use -the JavaScript snippet <code>selenium.browserbot.getCurrentWindow()</code>, and then -run your JavaScript in there</p> -<p>Arguments:</p> -<ul> -<li>script - the JavaScript snippet to run</li> -<li>timeout - a timeout in milliseconds, after which this command will return with an error</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="waitForPageToLoad"></a>waitForPageToLoad - ( - timeout - ) - </strong> -</dt> -<dd>Waits for a new page to load. - -<p>You can use this command instead of the "AndWait" suffixes, "clickAndWait", "selectAndWait", "typeAndWait" etc. -(which are only available in the JS API).</p> -<p>Selenium constantly keeps track of new pages loading, and sets a "newPageLoaded" -flag when it first notices a page load. Running any other Selenium command after -turns the flag to false. Hence, if you want to wait for a page to load, you must -wait immediately after a Selenium command that caused a page-load.</p> -<p>Arguments:</p> -<ul> -<li>timeout - a timeout in milliseconds, after which this command will return with an error</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="waitForPopUp"></a>waitForPopUp - ( - windowID,timeout - ) - </strong> -</dt> -<dd>Waits for a popup window to appear and load up.<p>Arguments:</p> -<ul> -<li>windowID - the JavaScript window ID of the window that will appear</li> -<li>timeout - a timeout in milliseconds, after which the action will return with an error</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="windowFocus"></a>windowFocus - ( - windowName - ) - </strong> -</dt> -<dd>Gives focus to a window<p>Arguments:</p> -<ul> -<li>windowName - name of the window to be given focus</li> -</ul> -</dd> -<br> -<dt> -<strong><a name="windowMaximize"></a>windowMaximize - ( - windowName - ) - </strong> -</dt> -<dd>Resize window to take up the entire screen<p>Arguments:</p> -<ul> -<li>windowName - name of the window to be enlarged</li> -</ul> -</dd> -<br> -</dl> -<h2>Selenium Accessors</h2> -<dl> -<dt> -<strong><a name="storeAlert"></a>storeAlert - - ( - - variableName - ) - - </strong> -</dt> -<dd>Retrieves the message of a JavaScript alert generated during the previous action, or fail if there were no alerts. - -<p>Getting an alert has the same effect as manually clicking OK. If an -alert is generated but you do not get/verify it, the next Selenium action -will fail.</p> -<p>NOTE: under Selenium, JavaScript alerts will NOT pop up a visible alert -dialog.</p> -<p>NOTE: Selenium does NOT support JavaScript alerts that are generated in a -page's onload() event handler. In this case a visible dialog WILL be -generated and Selenium will hang until someone manually clicks OK.</p> -<p> -<dl> -<dt>Returns: </dt> -<dd>The message of the most recent JavaScript alert</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertAlert - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotAlert - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>verifyAlert - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotAlert - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>waitForAlert - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotAlert - ( - <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeAllButtons"></a>storeAllButtons - - ( - - variableName - ) - - </strong> -</dt> -<dd>Returns the IDs of all buttons on the page. - -<p>If a given button has no ID, it will appear as "" in this array.</p> -<p> -<dl> -<dt>Returns: </dt> -<dd>the IDs of all buttons on the page</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertAllButtons - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotAllButtons - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>verifyAllButtons - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotAllButtons - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>waitForAllButtons - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotAllButtons - ( - <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeAllFields"></a>storeAllFields - - ( - - variableName - ) - - </strong> -</dt> -<dd>Returns the IDs of all input fields on the page. - -<p>If a given field has no ID, it will appear as "" in this array.</p> -<p> -<dl> -<dt>Returns: </dt> -<dd>the IDs of all field on the page</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertAllFields - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotAllFields - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>verifyAllFields - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotAllFields - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>waitForAllFields - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotAllFields - ( - <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeAllLinks"></a>storeAllLinks - - ( - - variableName - ) - - </strong> -</dt> -<dd>Returns the IDs of all links on the page. - -<p>If a given link has no ID, it will appear as "" in this array.</p> -<p> -<dl> -<dt>Returns: </dt> -<dd>the IDs of all links on the page</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertAllLinks - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotAllLinks - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>verifyAllLinks - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotAllLinks - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>waitForAllLinks - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotAllLinks - ( - <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeAllWindowIds"></a>storeAllWindowIds - - ( - - variableName - ) - - </strong> -</dt> -<dd>Returns the IDs of all windows that the browser knows about.<p> -<dl> -<dt>Returns: </dt> -<dd>the IDs of all windows that the browser knows about.</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertAllWindowIds - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotAllWindowIds - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>verifyAllWindowIds - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotAllWindowIds - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>waitForAllWindowIds - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotAllWindowIds - ( - <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeAllWindowNames"></a>storeAllWindowNames - - ( - - variableName - ) - - </strong> -</dt> -<dd>Returns the names of all windows that the browser knows about.<p> -<dl> -<dt>Returns: </dt> -<dd>the names of all windows that the browser knows about.</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertAllWindowNames - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotAllWindowNames - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>verifyAllWindowNames - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotAllWindowNames - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>waitForAllWindowNames - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotAllWindowNames - ( - <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeAllWindowTitles"></a>storeAllWindowTitles - - ( - - variableName - ) - - </strong> -</dt> -<dd>Returns the titles of all windows that the browser knows about.<p> -<dl> -<dt>Returns: </dt> -<dd>the titles of all windows that the browser knows about.</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertAllWindowTitles - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotAllWindowTitles - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>verifyAllWindowTitles - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotAllWindowTitles - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>waitForAllWindowTitles - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotAllWindowTitles - ( - <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeAttribute"></a>storeAttribute - - ( - attributeLocator, - - variableName - ) - - </strong> -</dt> -<dd>Gets the value of an element attribute. - -Beware of http://jira.openqa.org/browse/SEL-280, which will lead some event handlers to -get null event arguments. Read the bug for more details, including a workaround.<p>Arguments:</p> -<ul> -<li>attributeLocator - an element locator followed by an</li> -<li>variableName - - the name of a <a href="#storedVars">variable</a> in which the result is to be stored. - </li> -</ul> -<p> -<dl> -<dt>Returns: </dt> -<dd>the value of the specified attribute</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertAttribute - ( - attributeLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotAttribute - ( - attributeLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyAttribute - ( - attributeLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotAttribute - ( - attributeLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForAttribute - ( - attributeLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotAttribute - ( - attributeLocator, <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeAttributeFromAllWindows"></a>storeAttributeFromAllWindows - - ( - attributeName, - - variableName - ) - - </strong> -</dt> -<dd>Returns every instance of some attribute from all known windows.<p>Arguments:</p> -<ul> -<li>attributeName - name of an attribute on the windows</li> -<li>variableName - - the name of a <a href="#storedVars">variable</a> in which the result is to be stored. - </li> -</ul> -<p> -<dl> -<dt>Returns: </dt> -<dd>the set of values of this attribute from all known windows.</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertAttributeFromAllWindows - ( - attributeName, <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotAttributeFromAllWindows - ( - attributeName, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyAttributeFromAllWindows - ( - attributeName, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotAttributeFromAllWindows - ( - attributeName, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForAttributeFromAllWindows - ( - attributeName, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotAttributeFromAllWindows - ( - attributeName, <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeBodyText"></a>storeBodyText - - ( - - variableName - ) - - </strong> -</dt> -<dd>Gets the entire text of the page.<p> -<dl> -<dt>Returns: </dt> -<dd>the entire text of the page</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertBodyText - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotBodyText - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>verifyBodyText - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotBodyText - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>waitForBodyText - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotBodyText - ( - <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeConfirmation"></a>storeConfirmation - - ( - - variableName - ) - - </strong> -</dt> -<dd>Retrieves the message of a JavaScript confirmation dialog generated during -the previous action. - -<p> -By default, the confirm function will return true, having the same effect -as manually clicking OK. This can be changed by prior execution of the -chooseCancelOnNextConfirmation command. If an confirmation is generated -but you do not get/verify it, the next Selenium action will fail. -</p> -<p> -NOTE: under Selenium, JavaScript confirmations will NOT pop up a visible -dialog. -</p> -<p> -NOTE: Selenium does NOT support JavaScript confirmations that are -generated in a page's onload() event handler. In this case a visible -dialog WILL be generated and Selenium will hang until you manually click -OK. -</p> -<p> -<dl> -<dt>Returns: </dt> -<dd>the message of the most recent JavaScript confirmation dialog</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertConfirmation - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotConfirmation - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>verifyConfirmation - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotConfirmation - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>waitForConfirmation - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotConfirmation - ( - <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeCookie"></a>storeCookie - - ( - - variableName - ) - - </strong> -</dt> -<dd>Return all cookies of the current page under test.<p> -<dl> -<dt>Returns: </dt> -<dd>all cookies of the current page under test</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertCookie - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotCookie - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>verifyCookie - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotCookie - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>waitForCookie - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotCookie - ( - <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeCursorPosition"></a>storeCursorPosition - - ( - locator, - - variableName - ) - - </strong> -</dt> -<dd>Retrieves the text cursor position in the given input element or textarea; beware, this may not work perfectly on all browsers. - -<p>Specifically, if the cursor/selection has been cleared by JavaScript, this command will tend to -return the position of the last location of the cursor, even though the cursor is now gone from the page. This is filed as <a href="http://jira.openqa.org/browse/SEL-243">SEL-243</a>.</p> -This method will fail if the specified element isn't an input element or textarea, or there is no cursor in the element.<p>Arguments:</p> -<ul> -<li>locator - an <a href="#locators">element locator</a> pointing to an input element or textarea</li> -<li>variableName - - the name of a <a href="#storedVars">variable</a> in which the result is to be stored. - </li> -</ul> -<p> -<dl> -<dt>Returns: </dt> -<dd>the numerical position of the cursor in the field</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertCursorPosition - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotCursorPosition - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyCursorPosition - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotCursorPosition - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForCursorPosition - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotCursorPosition - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeElementHeight"></a>storeElementHeight - - ( - locator, - - variableName - ) - - </strong> -</dt> -<dd>Retrieves the height of an element<p>Arguments:</p> -<ul> -<li>locator - an <a href="#locators">element locator</a> pointing to an element</li> -<li>variableName - - the name of a <a href="#storedVars">variable</a> in which the result is to be stored. - </li> -</ul> -<p> -<dl> -<dt>Returns: </dt> -<dd>height of an element in pixels</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertElementHeight - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotElementHeight - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyElementHeight - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotElementHeight - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForElementHeight - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotElementHeight - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeElementIndex"></a>storeElementIndex - - ( - locator, - - variableName - ) - - </strong> -</dt> -<dd>Get the relative index of an element to its parent (starting from 0). The comment node and empty text node -will be ignored.<p>Arguments:</p> -<ul> -<li>locator - an <a href="#locators">element locator</a> pointing to an element</li> -<li>variableName - - the name of a <a href="#storedVars">variable</a> in which the result is to be stored. - </li> -</ul> -<p> -<dl> -<dt>Returns: </dt> -<dd>of relative index of the element to its parent (starting from 0)</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertElementIndex - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotElementIndex - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyElementIndex - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotElementIndex - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForElementIndex - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotElementIndex - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeElementPositionLeft"></a>storeElementPositionLeft - - ( - locator, - - variableName - ) - - </strong> -</dt> -<dd>Retrieves the horizontal position of an element<p>Arguments:</p> -<ul> -<li>locator - an <a href="#locators">element locator</a> pointing to an element OR an element itself</li> -<li>variableName - - the name of a <a href="#storedVars">variable</a> in which the result is to be stored. - </li> -</ul> -<p> -<dl> -<dt>Returns: </dt> -<dd>of pixels from the edge of the frame.</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertElementPositionLeft - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotElementPositionLeft - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyElementPositionLeft - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotElementPositionLeft - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForElementPositionLeft - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotElementPositionLeft - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeElementPositionTop"></a>storeElementPositionTop - - ( - locator, - - variableName - ) - - </strong> -</dt> -<dd>Retrieves the vertical position of an element<p>Arguments:</p> -<ul> -<li>locator - an <a href="#locators">element locator</a> pointing to an element OR an element itself</li> -<li>variableName - - the name of a <a href="#storedVars">variable</a> in which the result is to be stored. - </li> -</ul> -<p> -<dl> -<dt>Returns: </dt> -<dd>of pixels from the edge of the frame.</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertElementPositionTop - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotElementPositionTop - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyElementPositionTop - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotElementPositionTop - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForElementPositionTop - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotElementPositionTop - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeElementWidth"></a>storeElementWidth - - ( - locator, - - variableName - ) - - </strong> -</dt> -<dd>Retrieves the width of an element<p>Arguments:</p> -<ul> -<li>locator - an <a href="#locators">element locator</a> pointing to an element</li> -<li>variableName - - the name of a <a href="#storedVars">variable</a> in which the result is to be stored. - </li> -</ul> -<p> -<dl> -<dt>Returns: </dt> -<dd>width of an element in pixels</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertElementWidth - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotElementWidth - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyElementWidth - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotElementWidth - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForElementWidth - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotElementWidth - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeEval"></a>storeEval - - ( - script, - - variableName - ) - - </strong> -</dt> -<dd>Gets the result of evaluating the specified JavaScript snippet. The snippet may -have multiple lines, but only the result of the last line will be returned. - -<p>Note that, by default, the snippet will run in the context of the "selenium" -object itself, so <code>this</code> will refer to the Selenium object, and <code>window</code> will -refer to the top-level runner test window, not the window of your application.</p> -<p>If you need a reference to the window of your application, you can refer -to <code>this.browserbot.getCurrentWindow()</code> and if you need to use -a locator to refer to a single element in your application page, you can -use <code>this.page().findElement("foo")</code> where "foo" is your locator.</p> -<p>Arguments:</p> -<ul> -<li>script - the JavaScript snippet to run</li> -<li>variableName - - the name of a <a href="#storedVars">variable</a> in which the result is to be stored. - </li> -</ul> -<p> -<dl> -<dt>Returns: </dt> -<dd>the results of evaluating the snippet</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertEval - ( - script, <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotEval - ( - script, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyEval - ( - script, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotEval - ( - script, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForEval - ( - script, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotEval - ( - script, <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeExpression"></a>storeExpression - - ( - expression, - - variableName - ) - - </strong> -</dt> -<dd>Returns the specified expression. - -<p>This is useful because of JavaScript preprocessing. -It is used to generate commands like assertExpression and waitForExpression.</p> -<p>Arguments:</p> -<ul> -<li>expression - the value to return</li> -<li>variableName - - the name of a <a href="#storedVars">variable</a> in which the result is to be stored. - </li> -</ul> -<p> -<dl> -<dt>Returns: </dt> -<dd>the value passed in</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertExpression - ( - expression, <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotExpression - ( - expression, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyExpression - ( - expression, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotExpression - ( - expression, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForExpression - ( - expression, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotExpression - ( - expression, <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeHtmlSource"></a>storeHtmlSource - - ( - - variableName - ) - - </strong> -</dt> -<dd>Returns the entire HTML source between the opening and -closing "html" tags.<p> -<dl> -<dt>Returns: </dt> -<dd>the entire HTML source</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertHtmlSource - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotHtmlSource - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>verifyHtmlSource - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotHtmlSource - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>waitForHtmlSource - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotHtmlSource - ( - <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeLocation"></a>storeLocation - - ( - - variableName - ) - - </strong> -</dt> -<dd>Gets the absolute URL of the current page.<p> -<dl> -<dt>Returns: </dt> -<dd>the absolute URL of the current page</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertLocation - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotLocation - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>verifyLocation - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotLocation - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>waitForLocation - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotLocation - ( - <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeLogMessages"></a>storeLogMessages - - ( - - variableName - ) - - </strong> -</dt> -<dd>Return the contents of the log. - -<p>This is a placeholder intended to make the code generator make this API -available to clients. The selenium server will intercept this call, however, -and return its recordkeeping of log messages since the last call to this API. -Thus this code in JavaScript will never be called.</p> -<p>The reason I opted for a servercentric solution is to be able to support -multiple frames served from different domains, which would break a -centralized JavaScript logging mechanism under some conditions.</p> -<p> -<dl> -<dt>Returns: </dt> -<dd>all log messages seen since the last call to this API</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertLogMessages - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotLogMessages - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>verifyLogMessages - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotLogMessages - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>waitForLogMessages - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotLogMessages - ( - <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storePrompt"></a>storePrompt - - ( - - variableName - ) - - </strong> -</dt> -<dd>Retrieves the message of a JavaScript question prompt dialog generated during -the previous action. - -<p>Successful handling of the prompt requires prior execution of the -answerOnNextPrompt command. If a prompt is generated but you -do not get/verify it, the next Selenium action will fail.</p> -<p>NOTE: under Selenium, JavaScript prompts will NOT pop up a visible -dialog.</p> -<p>NOTE: Selenium does NOT support JavaScript prompts that are generated in a -page's onload() event handler. In this case a visible dialog WILL be -generated and Selenium will hang until someone manually clicks OK.</p> -<p> -<dl> -<dt>Returns: </dt> -<dd>the message of the most recent JavaScript question prompt</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertPrompt - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotPrompt - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>verifyPrompt - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotPrompt - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>waitForPrompt - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotPrompt - ( - <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeSelectedId"></a>storeSelectedId - - ( - selectLocator, - - variableName - ) - - </strong> -</dt> -<dd>Gets option element ID for selected option in the specified select element.<p>Arguments:</p> -<ul> -<li>selectLocator - an <a href="#locators">element locator</a> identifying a drop-down menu</li> -<li>variableName - - the name of a <a href="#storedVars">variable</a> in which the result is to be stored. - </li> -</ul> -<p> -<dl> -<dt>Returns: </dt> -<dd>the selected option ID in the specified select drop-down</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertSelectedId - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotSelectedId - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifySelectedId - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotSelectedId - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForSelectedId - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotSelectedId - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeSelectedIds"></a>storeSelectedIds - - ( - selectLocator, - - variableName - ) - - </strong> -</dt> -<dd>Gets all option element IDs for selected options in the specified select or multi-select element.<p>Arguments:</p> -<ul> -<li>selectLocator - an <a href="#locators">element locator</a> identifying a drop-down menu</li> -<li>variableName - - the name of a <a href="#storedVars">variable</a> in which the result is to be stored. - </li> -</ul> -<p> -<dl> -<dt>Returns: </dt> -<dd>an array of all selected option IDs in the specified select drop-down</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertSelectedIds - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotSelectedIds - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifySelectedIds - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotSelectedIds - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForSelectedIds - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotSelectedIds - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeSelectedIndex"></a>storeSelectedIndex - - ( - selectLocator, - - variableName - ) - - </strong> -</dt> -<dd>Gets option index (option number, starting at 0) for selected option in the specified select element.<p>Arguments:</p> -<ul> -<li>selectLocator - an <a href="#locators">element locator</a> identifying a drop-down menu</li> -<li>variableName - - the name of a <a href="#storedVars">variable</a> in which the result is to be stored. - </li> -</ul> -<p> -<dl> -<dt>Returns: </dt> -<dd>the selected option index in the specified select drop-down</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertSelectedIndex - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotSelectedIndex - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifySelectedIndex - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotSelectedIndex - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForSelectedIndex - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotSelectedIndex - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeSelectedIndexes"></a>storeSelectedIndexes - - ( - selectLocator, - - variableName - ) - - </strong> -</dt> -<dd>Gets all option indexes (option number, starting at 0) for selected options in the specified select or multi-select element.<p>Arguments:</p> -<ul> -<li>selectLocator - an <a href="#locators">element locator</a> identifying a drop-down menu</li> -<li>variableName - - the name of a <a href="#storedVars">variable</a> in which the result is to be stored. - </li> -</ul> -<p> -<dl> -<dt>Returns: </dt> -<dd>an array of all selected option indexes in the specified select drop-down</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertSelectedIndexes - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotSelectedIndexes - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifySelectedIndexes - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotSelectedIndexes - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForSelectedIndexes - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotSelectedIndexes - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeSelectedLabel"></a>storeSelectedLabel - - ( - selectLocator, - - variableName - ) - - </strong> -</dt> -<dd>Gets option label (visible text) for selected option in the specified select element.<p>Arguments:</p> -<ul> -<li>selectLocator - an <a href="#locators">element locator</a> identifying a drop-down menu</li> -<li>variableName - - the name of a <a href="#storedVars">variable</a> in which the result is to be stored. - </li> -</ul> -<p> -<dl> -<dt>Returns: </dt> -<dd>the selected option label in the specified select drop-down</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertSelectedLabel - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotSelectedLabel - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifySelectedLabel - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotSelectedLabel - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForSelectedLabel - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotSelectedLabel - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeSelectedLabels"></a>storeSelectedLabels - - ( - selectLocator, - - variableName - ) - - </strong> -</dt> -<dd>Gets all option labels (visible text) for selected options in the specified select or multi-select element.<p>Arguments:</p> -<ul> -<li>selectLocator - an <a href="#locators">element locator</a> identifying a drop-down menu</li> -<li>variableName - - the name of a <a href="#storedVars">variable</a> in which the result is to be stored. - </li> -</ul> -<p> -<dl> -<dt>Returns: </dt> -<dd>an array of all selected option labels in the specified select drop-down</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertSelectedLabels - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotSelectedLabels - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifySelectedLabels - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotSelectedLabels - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForSelectedLabels - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotSelectedLabels - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeSelectedValue"></a>storeSelectedValue - - ( - selectLocator, - - variableName - ) - - </strong> -</dt> -<dd>Gets option value (value attribute) for selected option in the specified select element.<p>Arguments:</p> -<ul> -<li>selectLocator - an <a href="#locators">element locator</a> identifying a drop-down menu</li> -<li>variableName - - the name of a <a href="#storedVars">variable</a> in which the result is to be stored. - </li> -</ul> -<p> -<dl> -<dt>Returns: </dt> -<dd>the selected option value in the specified select drop-down</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertSelectedValue - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotSelectedValue - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifySelectedValue - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotSelectedValue - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForSelectedValue - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotSelectedValue - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeSelectedValues"></a>storeSelectedValues - - ( - selectLocator, - - variableName - ) - - </strong> -</dt> -<dd>Gets all option values (value attributes) for selected options in the specified select or multi-select element.<p>Arguments:</p> -<ul> -<li>selectLocator - an <a href="#locators">element locator</a> identifying a drop-down menu</li> -<li>variableName - - the name of a <a href="#storedVars">variable</a> in which the result is to be stored. - </li> -</ul> -<p> -<dl> -<dt>Returns: </dt> -<dd>an array of all selected option values in the specified select drop-down</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertSelectedValues - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotSelectedValues - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifySelectedValues - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotSelectedValues - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForSelectedValues - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotSelectedValues - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeSelectOptions"></a>storeSelectOptions - - ( - selectLocator, - - variableName - ) - - </strong> -</dt> -<dd>Gets all option labels in the specified select drop-down.<p>Arguments:</p> -<ul> -<li>selectLocator - an <a href="#locators">element locator</a> identifying a drop-down menu</li> -<li>variableName - - the name of a <a href="#storedVars">variable</a> in which the result is to be stored. - </li> -</ul> -<p> -<dl> -<dt>Returns: </dt> -<dd>an array of all option labels in the specified select drop-down</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertSelectOptions - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotSelectOptions - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifySelectOptions - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotSelectOptions - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForSelectOptions - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotSelectOptions - ( - selectLocator, <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeTable"></a>storeTable - - ( - tableCellAddress, - - variableName - ) - - </strong> -</dt> -<dd>Gets the text from a cell of a table. The cellAddress syntax -tableLocator.row.column, where row and column start at 0.<p>Arguments:</p> -<ul> -<li>tableCellAddress - a cell address, e.g. "foo.1.4"</li> -<li>variableName - - the name of a <a href="#storedVars">variable</a> in which the result is to be stored. - </li> -</ul> -<p> -<dl> -<dt>Returns: </dt> -<dd>the text from the specified cell</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertTable - ( - tableCellAddress, <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotTable - ( - tableCellAddress, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyTable - ( - tableCellAddress, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotTable - ( - tableCellAddress, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForTable - ( - tableCellAddress, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotTable - ( - tableCellAddress, <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeText"></a>storeText - - ( - locator, - - variableName - ) - - </strong> -</dt> -<dd>Gets the text of an element. This works for any element that contains -text. This command uses either the textContent (Mozilla-like browsers) or -the innerText (IE-like browsers) of the element, which is the rendered -text shown to the user.<p>Arguments:</p> -<ul> -<li>locator - an <a href="#locators">element locator</a> -</li> -<li>variableName - - the name of a <a href="#storedVars">variable</a> in which the result is to be stored. - </li> -</ul> -<p> -<dl> -<dt>Returns: </dt> -<dd>the text of the element</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertText - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotText - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyText - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotText - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForText - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotText - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeTitle"></a>storeTitle - - ( - - variableName - ) - - </strong> -</dt> -<dd>Gets the title of the current page.<p> -<dl> -<dt>Returns: </dt> -<dd>the title of the current page</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertTitle - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotTitle - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>verifyTitle - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotTitle - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>waitForTitle - ( - <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotTitle - ( - <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeValue"></a>storeValue - - ( - locator, - - variableName - ) - - </strong> -</dt> -<dd>Gets the (whitespace-trimmed) value of an input field (or anything else with a value parameter). -For checkbox/radio elements, the value will be "on" or "off" depending on -whether the element is checked or not.<p>Arguments:</p> -<ul> -<li>locator - an <a href="#locators">element locator</a> -</li> -<li>variableName - - the name of a <a href="#storedVars">variable</a> in which the result is to be stored. - </li> -</ul> -<p> -<dl> -<dt>Returns: </dt> -<dd>the element value, or "on/off" for checkbox/radio elements</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertValue - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>assertNotValue - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyValue - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>verifyNotValue - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForValue - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -<li>waitForNotValue - ( - locator, <a href="#patterns">pattern</a> - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeWhetherThisFrameMatchFrameExpression"></a>storeWhetherThisFrameMatchFrameExpression - - ( - currentFrameString, -target, - - variableName - ) - - </strong> -</dt> -<dd>Determine whether current/locator identify the frame containing this running code. - -<p>This is useful in proxy injection mode, where this code runs in every -browser frame and window, and sometimes the selenium server needs to identify -the "current" frame. In this case, when the test calls selectFrame, this -routine is called for each frame to figure out which one has been selected. -The selected frame will return true, while all others will return false.</p> -<p>Arguments:</p> -<ul> -<li>currentFrameString - starting frame</li> -<li>target - new frame (which might be relative to the current one)</li> -<li>variableName - - the name of a <a href="#storedVars">variable</a> in which the result is to be stored. - </li> -</ul> -<p> -<dl> -<dt>Returns: </dt> -<dd>true if the new frame is this code's window</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertWhetherThisFrameMatchFrameExpression - ( - currentFrameString, target - ) - </li> -<li>assertNotWhetherThisFrameMatchFrameExpression - ( - currentFrameString, target - ) - </li> -<li>verifyWhetherThisFrameMatchFrameExpression - ( - currentFrameString, target - ) - </li> -<li>verifyNotWhetherThisFrameMatchFrameExpression - ( - currentFrameString, target - ) - </li> -<li>waitForWhetherThisFrameMatchFrameExpression - ( - currentFrameString, target - ) - </li> -<li>waitForNotWhetherThisFrameMatchFrameExpression - ( - currentFrameString, target - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeAlertPresent"></a>storeAlertPresent - - ( - - variableName - ) - - </strong> -</dt> -<dd>Has an alert occurred? - -<p> -This function never throws an exception -</p> -<p> -<dl> -<dt>Returns: </dt> -<dd>true if there is an alert</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertAlertPresent - ( - - ) - </li> -<li>assertAlertNotPresent - ( - - ) - </li> -<li>verifyAlertPresent - ( - - ) - </li> -<li>verifyAlertNotPresent - ( - - ) - </li> -<li>waitForAlertPresent - ( - - ) - </li> -<li>waitForAlertNotPresent - ( - - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeChecked"></a>storeChecked - - ( - locator, - - variableName - ) - - </strong> -</dt> -<dd>Gets whether a toggle-button (checkbox/radio) is checked. Fails if the specified element doesn't exist or isn't a toggle-button.<p>Arguments:</p> -<ul> -<li>locator - an <a href="#locators">element locator</a> pointing to a checkbox or radio button</li> -<li>variableName - - the name of a <a href="#storedVars">variable</a> in which the result is to be stored. - </li> -</ul> -<p> -<dl> -<dt>Returns: </dt> -<dd>true if the checkbox is checked, false otherwise</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertChecked - ( - locator - ) - </li> -<li>assertNotChecked - ( - locator - ) - </li> -<li>verifyChecked - ( - locator - ) - </li> -<li>verifyNotChecked - ( - locator - ) - </li> -<li>waitForChecked - ( - locator - ) - </li> -<li>waitForNotChecked - ( - locator - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeConfirmationPresent"></a>storeConfirmationPresent - - ( - - variableName - ) - - </strong> -</dt> -<dd>Has confirm() been called? - -<p> -This function never throws an exception -</p> -<p> -<dl> -<dt>Returns: </dt> -<dd>true if there is a pending confirmation</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertConfirmationPresent - ( - - ) - </li> -<li>assertConfirmationNotPresent - ( - - ) - </li> -<li>verifyConfirmationPresent - ( - - ) - </li> -<li>verifyConfirmationNotPresent - ( - - ) - </li> -<li>waitForConfirmationPresent - ( - - ) - </li> -<li>waitForConfirmationNotPresent - ( - - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeEditable"></a>storeEditable - - ( - locator, - - variableName - ) - - </strong> -</dt> -<dd>Determines whether the specified input element is editable, ie hasn't been disabled. -This method will fail if the specified element isn't an input element.<p>Arguments:</p> -<ul> -<li>locator - an <a href="#locators">element locator</a> -</li> -<li>variableName - - the name of a <a href="#storedVars">variable</a> in which the result is to be stored. - </li> -</ul> -<p> -<dl> -<dt>Returns: </dt> -<dd>true if the input element is editable, false otherwise</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertEditable - ( - locator - ) - </li> -<li>assertNotEditable - ( - locator - ) - </li> -<li>verifyEditable - ( - locator - ) - </li> -<li>verifyNotEditable - ( - locator - ) - </li> -<li>waitForEditable - ( - locator - ) - </li> -<li>waitForNotEditable - ( - locator - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeElementPresent"></a>storeElementPresent - - ( - locator, - - variableName - ) - - </strong> -</dt> -<dd>Verifies that the specified element is somewhere on the page.<p>Arguments:</p> -<ul> -<li>locator - an <a href="#locators">element locator</a> -</li> -<li>variableName - - the name of a <a href="#storedVars">variable</a> in which the result is to be stored. - </li> -</ul> -<p> -<dl> -<dt>Returns: </dt> -<dd>true if the element is present, false otherwise</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertElementPresent - ( - locator - ) - </li> -<li>assertElementNotPresent - ( - locator - ) - </li> -<li>verifyElementPresent - ( - locator - ) - </li> -<li>verifyElementNotPresent - ( - locator - ) - </li> -<li>waitForElementPresent - ( - locator - ) - </li> -<li>waitForElementNotPresent - ( - locator - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeOrdered"></a>storeOrdered - - ( - locator1, -locator2, - - variableName - ) - - </strong> -</dt> -<dd>Check if these two elements have same parent and are ordered. Two same elements will -not be considered ordered.<p>Arguments:</p> -<ul> -<li>locator1 - an <a href="#locators">element locator</a> pointing to the first element</li> -<li>locator2 - an <a href="#locators">element locator</a> pointing to the second element</li> -<li>variableName - - the name of a <a href="#storedVars">variable</a> in which the result is to be stored. - </li> -</ul> -<p> -<dl> -<dt>Returns: </dt> -<dd>true if two elements are ordered and have same parent, false otherwise</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertOrdered - ( - locator1, locator2 - ) - </li> -<li>assertNotOrdered - ( - locator1, locator2 - ) - </li> -<li>verifyOrdered - ( - locator1, locator2 - ) - </li> -<li>verifyNotOrdered - ( - locator1, locator2 - ) - </li> -<li>waitForOrdered - ( - locator1, locator2 - ) - </li> -<li>waitForNotOrdered - ( - locator1, locator2 - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storePromptPresent"></a>storePromptPresent - - ( - - variableName - ) - - </strong> -</dt> -<dd>Has a prompt occurred? - -<p> -This function never throws an exception -</p> -<p> -<dl> -<dt>Returns: </dt> -<dd>true if there is a pending prompt</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertPromptPresent - ( - - ) - </li> -<li>assertPromptNotPresent - ( - - ) - </li> -<li>verifyPromptPresent - ( - - ) - </li> -<li>verifyPromptNotPresent - ( - - ) - </li> -<li>waitForPromptPresent - ( - - ) - </li> -<li>waitForPromptNotPresent - ( - - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeSomethingSelected"></a>storeSomethingSelected - - ( - selectLocator, - - variableName - ) - - </strong> -</dt> -<dd>Determines whether some option in a drop-down menu is selected.<p>Arguments:</p> -<ul> -<li>selectLocator - an <a href="#locators">element locator</a> identifying a drop-down menu</li> -<li>variableName - - the name of a <a href="#storedVars">variable</a> in which the result is to be stored. - </li> -</ul> -<p> -<dl> -<dt>Returns: </dt> -<dd>true if some option has been selected, false otherwise</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertSomethingSelected - ( - selectLocator - ) - </li> -<li>assertNotSomethingSelected - ( - selectLocator - ) - </li> -<li>verifySomethingSelected - ( - selectLocator - ) - </li> -<li>verifyNotSomethingSelected - ( - selectLocator - ) - </li> -<li>waitForSomethingSelected - ( - selectLocator - ) - </li> -<li>waitForNotSomethingSelected - ( - selectLocator - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeTextPresent"></a>storeTextPresent - - ( - pattern, - - variableName - ) - - </strong> -</dt> -<dd>Verifies that the specified text pattern appears somewhere on the rendered page shown to the user.<p>Arguments:</p> -<ul> -<li>pattern - a <a href="#patterns">pattern</a> to match with the text of the page</li> -<li>variableName - - the name of a <a href="#storedVars">variable</a> in which the result is to be stored. - </li> -</ul> -<p> -<dl> -<dt>Returns: </dt> -<dd>true if the pattern matches the text, false otherwise</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertTextPresent - ( - pattern - ) - </li> -<li>assertTextNotPresent - ( - pattern - ) - </li> -<li>verifyTextPresent - ( - pattern - ) - </li> -<li>verifyTextNotPresent - ( - pattern - ) - </li> -<li>waitForTextPresent - ( - pattern - ) - </li> -<li>waitForTextNotPresent - ( - pattern - ) - </li> -</ul> -</dd> -<br> -<dt> -<strong><a name="storeVisible"></a>storeVisible - - ( - locator, - - variableName - ) - - </strong> -</dt> -<dd>Determines if the specified element is visible. An -element can be rendered invisible by setting the CSS "visibility" -property to "hidden", or the "display" property to "none", either for the -element itself or one if its ancestors. This method will fail if -the element is not present.<p>Arguments:</p> -<ul> -<li>locator - an <a href="#locators">element locator</a> -</li> -<li>variableName - - the name of a <a href="#storedVars">variable</a> in which the result is to be stored. - </li> -</ul> -<p> -<dl> -<dt>Returns: </dt> -<dd>true if the specified element is visible, false otherwise</dd> -</dl> -</p> -<p>Related Assertions, automatically generated:</p> -<ul> -<li>assertVisible - ( - locator - ) - </li> -<li>assertNotVisible - ( - locator - ) - </li> -<li>verifyVisible - ( - locator - ) - </li> -<li>verifyNotVisible - ( - locator - ) - </li> -<li>waitForVisible - ( - locator - ) - </li> -<li>waitForNotVisible - ( - locator - ) - </li> -</ul> -</dd> -<br> -</dl> -<h2> -<a name="parameter-construction-and-variables">Parameter construction and Variables</a> -</h2> -<blockquote> -<p>All Selenium command parameters can be constructed using both simple - variable substitution as well as full javascript. Both of these - mechanisms can access previously stored variables, but do so using - different syntax.</p> -<p> -<a name="storedVars"></a><strong>Stored Variables</strong> -</p> -<p>The commands <em>store</em>, <em>storeValue</em> and <em>storeText</em> can be used to store a variable - value for later access. Internally, these variables are stored in a map called "storedVars", - with values keyed by the variable name. These commands are documented in the command reference.</p> -<p> -<strong>Variable substitution</strong> -</p> -<p>Variable substitution provides a simple way to include a previously stored variable in a - command parameter. This is a simple mechanism, by which the variable to substitute is indicated - by ${variableName}. Multiple variables can be substituted, and intermixed with static text.</p> -<p>Example:</p> -<blockquote> -<table border="1" class="table"> -<colgroup> -<col width="18%"> -<col width="36%"> -<col width="45%"> -</colgroup> -<tbody valign="top"> -<tr> -<td>store</td><td>Mr</td><td>title</td> -</tr> -<tr> -<td>storeValue</td><td>nameField</td><td>surname</td> -</tr> -<tr> -<td>store</td><td>${title} ${surname}</td><td>fullname</td> -</tr> -<tr> -<td>type</td><td>textElement</td><td>Full name is: ${fullname}</td> -</tr> -</tbody> -</table> -</blockquote> -<p> -<strong>Javascript evaluation</strong> -</p> -<p>Javascript evaluation provides the full power of javascript in constructing a command parameter. - To use this mechanism, the <em>entire</em> parameter value must be prefixed by - 'javascript{' with a trailing '}'. The text inside the braces is evaluated as a javascript expression, - and can access previously stored variables using the <em>storedVars</em> map detailed above. - Note that variable substitution cannot be combined with javascript evaluation.</p> -<p>Example:</p> -<blockquote> -<table border="1" class="table"> -<colgroup> -<col width="9%"> -<col width="44%"> -<col width="46%"> -</colgroup> -<tbody valign="top"> -<tr> -<td>store</td><td>javascript{'merchant' + (new Date()).getTime()}</td><td>merchantId</td> -</tr> -<tr> -<td>type</td><td>textElement</td><td>javascript{storedVars['merchantId'].toUpperCase()}</td> -</tr> -</tbody> -</table> -</blockquote> -</blockquote> -<div class="section" id="extending-selenium"> -<h2> -<a name="extending-selenium">Extending Selenium</a> -</h2> -<blockquote> -<p>It can be quite simple to extend Selenium, adding your own actions, assertions and locator-strategies. - This is done with javascript by adding methods to the Selenium object prototype, and the PageBot - object prototype. On startup, Selenium will automatically look through methods on these prototypes, - using name patterns to recognise which ones are actions, assertions and locators.</p> -<p>The following examples try to give an indication of how Selenium can be extended with javascript.</p> -</blockquote> -<p> -<strong>Actions</strong> -</p> -<blockquote> -<p>All <em>doFoo</em> methods on the Selenium prototype are added as actions. For each action <em>foo</em> there - is also an action <em>fooAndWait</em> registered. An action method can take up to 2 parameters, which - will be passed the second and third column values in the test.</p> -<p>Example: Add a "typeRepeated" action to Selenium, which types the text twice into a text box.</p> -<pre class="literal-block"> - Selenium.prototype.doTypeRepeated = function(locator, text) { - // All locator-strategies are automatically handled by "findElement" - var element = this.page().findElement(locator); - - // Create the text to type - var valueToType = text + text; - - // Replace the element text with the new text - this.page().replaceText(element, valueToType); - }; - </pre> -</blockquote> -<p> -<strong>Accessors/Assertions</strong> -</p> -<blockquote> -<p>All <em>getFoo</em> and <em>isFoo</em> methods on the Selenium prototype are added as accessors (storeFoo). For each accessor there - is an <em>assertFoo</em>, <em>verifyFoo</em> and <em>waitForFoo</em> registered. An assert method can take up to 2 parameters, which - will be passed the second and third column values in the test. You can also define your own assertions literally - as simple "assert" methods, which will also auto-generate "verify" and "waitFor" commands.</p> -<p>Example: Add a <em>valueRepeated</em> assertion, that makes sure that the element value - consists of the supplied text repeated. The 2 commands that would be available in tests would be - <em>assertValueRepeated</em> and <em>verifyValueRepeated</em>.</p> -<pre class="literal-block"> - Selenium.prototype.assertValueRepeated = function(locator, text) { - // All locator-strategies are automatically handled by "findElement" - var element = this.page().findElement(locator); - - // Create the text to verify - var expectedValue = text + text; - - // Get the actual element value - var actualValue = element.value; - - // Make sure the actual value matches the expected - Assert.matches(expectedValue, actualValue); - }; - </pre> -</blockquote> -<p> -<strong>Automatic availability of storeFoo, assertFoo, assertNotFoo, waitForFoo and waitForNotFoo for every getFoo</strong> -</p> -<blockquote> -<p>All <em>getFoo</em> and <em>isFoo</em> methods on the Selenium prototype automatically result in the availability - of storeFoo, assertFoo, assertNotFoo, verifyFoo, verifyNotFoo, waitForFoo, and waitForNotFoo commands.</p> -<p>Example, if you add a getTextLength() method, the following commands will automatically be available: - storeTextLength, assertTextLength, assertNotTextLength, verifyTextLength, verifyNotTextLength, waitForTextLength, and waitForNotTextLength commands.</p> -<pre class="literal-block"> - Selenium.prototype.getTextLength = function(locator, text) { - return this.getText(locator).length; - }; - </pre> -<p>Also note that the <em>assertValueRepeated</em> method described above could have been implemented using - isValueRepeated, with the added benefit of also automatically getting assertNotValueRepeated, storeValueRepeated, - waitForValueRepeated and waitForNotValueRepeated.</p> -</blockquote> -<p> -<strong>Locator Strategies</strong> -</p> -<blockquote> -<p>All <em>locateElementByFoo</em> methods on the PageBot prototype are added as locator-strategies. A locator strategy takes 2 parameters, the first being the locator string (minus the prefix), and the second being the document in which to search.</p> -<p>Example: Add a "valuerepeated=" locator, that finds the first element a value attribute equal to the the supplied value repeated.</p> -<pre class="literal-block"> - // The "inDocument" is a the document you are searching. - PageBot.prototype.locateElementByValueRepeated = function(text, inDocument) { - // Create the text to search for - var expectedValue = text + text; - - // Loop through all elements, looking for ones that have - // a value === our expected value - var allElements = inDocument.getElementsByTagName("*"); - for (var i = 0; i < allElements.length; i++) { - var testElement = allElements[i]; - if (testElement.value && testElement.value === expectedValue) { - return testElement; - } - } - return null; - }; - </pre> -</blockquote> -<p> -<strong>user-extensions.js</strong> -</p> -<blockquote> -<p>By default, Selenium looks for a file called "user-extensions.js", and loads the javascript code found in that file. This file provides a convenient location for adding features to Selenium, without needing to modify the core Selenium sources.</p> -<p>In the standard distibution, this file does not exist. Users can create this file and place their extension code in this common location, removing the need to modify the Selenium sources, and hopefully assisting with the upgrade process.</p> -</blockquote> -</div> -</body> -</html> diff --git a/tests/test_tools/unit_tests.php b/tests/test_tools/unit_tests.php deleted file mode 100644 index 42faf37a..00000000 --- a/tests/test_tools/unit_tests.php +++ /dev/null @@ -1,128 +0,0 @@ -<?php - -if(!defined('PRADO_FRAMEWORK')) - define('PRADO_FRAMEWORK',realpath(dirname(__FILE__).'/../../framework')); - -$TEST_TOOLS = dirname(__FILE__); - -require_once($TEST_TOOLS.'/simpletest/unit_tester.php'); -require_once($TEST_TOOLS.'/simpletest/web_tester.php'); -require_once($TEST_TOOLS.'/simpletest/mock_objects.php'); -require_once($TEST_TOOLS.'/simpletest/reporter.php'); - -require_once(PRADO_FRAMEWORK.'/prado.php'); - -class TestFolder -{ - public $name=''; - public $url=''; - public $subFolders=array(); - public $testFiles=array(); - - public function __construct($path,$rootPath,$rootUri) - { - $script = basename($_SERVER['SCRIPT_NAME']); - $this->url="$rootUri/$script?target=".strtr(substr($path,strlen($rootPath)+1),"\\",'/'); - $this->name=basename($path); - $dir=opendir($path); - while(($entry=readdir($dir))!==false) - { - $fullpath="$path/$entry"; - if($entry!=='.' && $entry!=='..' && $entry!=='.svn' && is_dir($fullpath)) - { - $folder=new TestFolder($fullpath,$rootPath,$rootUri); - if(!empty($folder->subFolders) || !empty($folder->testFiles)) - $this->subFolders[]=$folder; - } - else if(is_file($fullpath) && (strncmp($entry,'ut',2)===0 - || preg_match('/test.*\.php$/i', $entry))) - { - $this->testFiles[$entry]="$rootUri/$script?target=".strtr(substr($fullpath,strlen($rootPath)+1),"\\",'/'); - } - } - closedir($dir); - } - - public function getHtml($level=0) - { - $str=str_repeat(' ',$level*4)."[ <a href=\"{$this->url}\">{$this->name}</a> ]<br/>\n"; - foreach($this->subFolders as $folder) - $str.=$folder->getHtml($level+1); - foreach($this->testFiles as $name=>$url) - $str.=str_repeat(' ',($level+1)*4)."<a href=\"$url\">$name</a><br/>\n"; - return $str; - } -} - -class PradoUnitTester -{ - private $_root; - - function __construct($root, $app_dir='.') - { - $this->_root = $root; - Prado::setPathOfAlias('Tests', $root); - if($app_dir===null) $app_dir='.'; - $app = new TShellApplication($app_dir); - $app->run(); - } - - function addTests($test,$path,$recursive) - { - $dir=opendir($path); - while(($entry=readdir($dir))!==false) - { - if(is_file($path.'/'.$entry) && (strncmp($entry,'ut',2)===0||preg_match('/test.*\.php$/i', $entry))) - $test->addTestFile($path.'/'.$entry); - else if($entry!=='.' && $entry!=='..' && $entry!=='.svn' && is_dir($path.'/'.$entry) && $recursive) - $this->addTests($test,$path.'/'.$entry,$recursive); - } - closedir($dir); - } - - function run($reporter) - { - $rootPath=realpath($this->_root); - $rootUri=dirname($_SERVER['PHP_SELF']); - if(isset($_GET['target'])) - { - $target=$_GET['target']; - $recursive=true; - $fullpath=realpath("$rootPath/$target"); - if($fullpath===false || strpos($fullpath,$rootPath)!==0) - die('invalid test target'); - - if(is_dir($fullpath)) - { - - $test=new GroupTest(basename($rootPath)."/$target"); - $this->addTests($test,$fullpath,$recursive); - $test->run($reporter); - //$test->run(new HtmlReporterWithCoverage('index.php',$rootPath)); - } - else - { - $testClass=basename($fullpath,'.php'); - include_once($fullpath); - $test=new $testClass(basename($rootPath)."/$target"); - $test->run($reporter); - } - } - else - { - echo "<html> - <head> - <title>Prado Unit Tests</title> - <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"> - </head> - <body> - <h1>Prado Unit Tests</h1> - "; - $root=new TestFolder($rootPath,$rootPath,$rootUri); - echo $root->getHtml(); - echo "</body>\n</html>"; - } - } -} - -?>
\ No newline at end of file |