/*
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.xwiki.annotation.test.po;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebElement;
import org.xwiki.test.ui.po.BaseElement;
import org.xwiki.test.ui.po.ViewPage;
/**
* @since 4.2M1
* @version $Id: 0fb26b9ba5137a8c443784cc87e47380996bfe7e $
*/
public class AnnotatableViewPage extends BaseElement
{
private static final String XWIKI_ANNOTATION_ADD_SUCCESS = "Annotation has been successfully added";
private static final String XWIKI_ANNOTATION_DELETE_SUCCESS = "Annotation deleted";
private static final String XWIKI_SYNTAX_1_WARNING =
"Annotations are not available for pages in XWiki/1.0 syntax.";
private AnnotationsPane annotationsPane;
private AnnotationsWindow annotationsWindow;
private AnnotationsLabel annotationsLabel;
private StringBuilder script;
private ViewPage viewPage;
public AnnotatableViewPage(ViewPage viewPage)
{
this.viewPage = viewPage;
/**
* Injection of this javascript function is used because the Selenium 2 API does not yet fully support advanced
* interactions with the mouse. This can't be yet achieved via Selenium 2 API. This function selects the text
* from the page (drag-over with mouse simulation)
*/
script = new StringBuilder();
script.append("function findString (str) {\n");
script.append(" var strFound;\n");
script.append(" if (window.find) {\n");
script.append(" if (parseInt(navigator.appVersion)<4) return;\n");
script.append(" // CODE FOR BROWSERS THAT SUPPORT window.find\n");
script.append(" strFound = self.find(str);\n");
script.append(" if (strFound && self.getSelection && !self.getSelection().anchorNode) {\n");
script.append(" strFound = self.find(str);\n");
script.append(" }\n");
script.append(" if (!strFound) {\n");
script.append(" strFound = self.find(str,0,1);\n");
script.append(" while (self.find(str,0,1)) continue;\n");
script.append(" }\n");
script.append(" } else if (navigator.appName.indexOf(\"Microsoft\")!=-1) {\n");
script.append(" // EXPLORER-SPECIFIC CODE\n");
script.append(" if (TRange != null) {\n");
script.append(" TRange.collapse(false);\n");
script.append(" strFound = TRange.findText(str);\n");
script.append(" if (strFound) TRange.select();\n");
script.append(" }\n");
script.append(" if (TRange == null || strFound == 0) {\n");
script.append(" TRange = self.document.body.createTextRange();\n");
script.append(" strFound = TRange.findText(str);\n");
script.append(" if (strFound) TRange.select();\n");
script.append(" }\n");
script.append(" } else if (navigator.appName == \"Opera\") {\n");
script.append(" alert ('Opera browsers not supported, sorry...');\n");
script.append(" return;\n");
script.append(" }\n");
script.append(" if (!strFound) \n");
script.append(" return;\n");
script.append("}\n");
((JavascriptExecutor) getDriver()).executeScript(script.toString());
annotationsPane = new AnnotationsPane();
annotationsWindow = new AnnotationsWindow();
annotationsLabel = new AnnotationsLabel();
}
public ViewPage getWrappedViewPage()
{
return this.viewPage;
}
public void addAnnotation(String annotatedText, String annotationText)
{
selectText(annotatedText);
simulateCTRL_M();
annotationsWindow.addAnnotation(annotationText);
// check is the saved successfully message is displayed
waitForNotificationSuccessMessage(XWIKI_ANNOTATION_ADD_SUCCESS);
}
public void deleteAnnotationByID(String id)
{
annotationsLabel.deleteAnnotationById(id);
waitForNotificationSuccessMessage(XWIKI_ANNOTATION_DELETE_SUCCESS);
}
public void deleteAnnotationByText(String annotatedText)
{
deleteAnnotationByID(this.annotationsLabel.getAnnotationIdByText(annotatedText));
}
public String getAnnotationContentByText(String searchText)
{
return annotationsLabel.getAnnotationContentByText(searchText);
}
// Shows the annotations pane from the top of the page
public void showAnnotationsPane()
{
annotationsPane.showAnnotationsPane();
}
// Hides the annotations pane from the top of the page
public void hideAnnotationsPane()
{
annotationsPane.hideAnnotationsPane();
}
// Checks the "Show Annotations" check box.
public void clickShowAnnotations()
{
annotationsPane.clickShowAnnotations();
}
// Un-checks the "Show Annotations" check box.
public void clickHideAnnotations()
{
annotationsPane.clickHideAnnotations();
}
// Checks if the checkBox within AnnotationsPane is visible
public boolean checkIfClickbuttonExists()
{
return annotationsPane.checkIfShowAnnotationsCheckboxExists();
}
public void simulateCTRL_M()
{
WebElement body = getDriver().findElement(By.id("body"));
body.sendKeys(Keys.chord(Keys.CONTROL, "m"));
}
/**
* @param annotationWord string that will be selected on the screen
*/
public void selectText(String annotationWord)
{
((JavascriptExecutor) getDriver()).executeScript(script + "findString('" + annotationWord + "');");
}
public boolean checkIfAnnotationsAreDisabled()
{
if (getDriver().findElementsWithoutWaiting(By.id("annotationsdisplay")).size() > 0)
return false;
else
return true;
}
// Check if the bottom notifications warning appears that you are not allowed to annotate 1.0 syntax pages
public void waitforAnnotationWarningNotification()
{
waitForNotificationWarningMessage(XWIKI_SYNTAX_1_WARNING);
}
}