diff --git a/e2e/pages/adf/viewerPage.js b/e2e/pages/adf/viewerPage.js
index 31ccae04de..9e86ae775b 100644
--- a/e2e/pages/adf/viewerPage.js
+++ b/e2e/pages/adf/viewerPage.js
@@ -15,20 +15,21 @@
* limitations under the License.
*/
-var Util = require('../../util/util');
+var Util = require("../../util/util");
+var CardViewPage = require("./cardViewPage");
var ViewerToolbarPage = function () {
var closeButton = element(by.css("button[data-automation-id='adf-toolbar-back']"));
- var fileName = element(by.id('adf-viewer-display-name'));
+ var fileName = element(by.id("adf-viewer-display-name"));
var downloadButton = element(by.css("button[data-automation-id='adf-toolbar-download'] > span > mat-icon"));
var infoButton = element(by.css("button[data-automation-id='adf-toolbar-sidebar']"));
- var previousPageButton = element(by.id('viewer-previous-page-button'));
- var nextPageButton = element(by.id('viewer-next-page-button'));
- var zoomInButton = element(by.id('viewer-zoom-in-button'));
- var zoomOutButton = element(by.id('viewer-zoom-out-button'));
- var scalePageButton = element(by.id('viewer-scale-page-button'));
- var pdfContainer = element(by.id('viewer-pdf-container'));
+ var previousPageButton = element(by.id("viewer-previous-page-button"));
+ var nextPageButton = element(by.id("viewer-next-page-button"));
+ var zoomInButton = element(by.id("viewer-zoom-in-button"));
+ var zoomOutButton = element(by.id("viewer-zoom-out-button"));
+ var scalePageButton = element(by.id("viewer-scale-page-button"));
+ var pdfContainer = element(by.id("viewer-pdf-container"));
var fullScreenButton = element(by.css("button[data-automation-id='adf-toolbar-fullscreen']"));
var rotateLeft = element(by.css("button[id='viewer-rotate-left-button']"));
var rotateRight = element(by.css("button[id='viewer-rotate-right-button']"));
@@ -40,6 +41,37 @@ var ViewerToolbarPage = function () {
var mediaContainer = element(by.css("adf-media-player[class='adf-media-player ng-star-inserted']"));
var allPages = element.all(by.css("div[class='canvasWrapper'] > canvas")).first();
var percentage = element(by.css("div[data-automation-id='adf-page-scale'"));
+ var thumbnailsBtn = element(by.css("button[data-automation-id='adf-thumbnails-button']"));
+ var thumbnailsContent = element(by.css("div[data-automation-id='adf-thumbnails-content']"));
+ var thumbnailsClose = element(by.css("button[data-automation-id='adf-thumbnails-close']"));
+ var secondThumbnail = element(by.css("adf-pdf-thumb > img[title='Page 2'"));
+ var lastThumbnailDisplayed = element.all(by.css("adf-pdf-thumb")).last();
+ var passwordDialog = element(by.css("adf-pdf-viewer-password-dialog"));
+ var passwordSubmit = element(by.css("button[data-automation-id='adf-password-dialog-submit']"));
+ var passwordSubmitDisabled = element(by.css("button[data-automation-id='adf-password-dialog-submit'][disabled]"));
+ var passwordInput = element(by.css("input[data-automation-id='adf-password-dialog-input']"));
+ var passwordError = element(by.css("mat-error[data-automation-id='adf-password-dialog-error']"));
+ var infoSideBar = element(by.css("div[class='adf-info-drawer-layout-header']"));
+ var unsupportedFileContainer = element(by.cssContainingText(".label","Document preview could not be loaded"));
+ var pageCanvas = element.all(by.css("div[class='canvasWrapper']")).first();
+
+ this.canvasHeight = function () {
+ var deferred = protractor.promise.defer();
+ pageCanvas.getAttribute("style").then(function (value) {
+ var canvasHeight = value.split("height: ")[1].split("px")[0];
+ deferred.fulfill(canvasHeight);
+ });
+ return deferred.promise;
+ };
+
+ this.canvasWidth = function () {
+ var deferred = protractor.promise.defer();
+ pageCanvas.getAttribute("style").then(function (value) {
+ var canvasWidth = value.split("width: ")[1].split("px")[0];
+ deferred.fulfill(canvasWidth);
+ });
+ return deferred.promise;
+ };
this.viewFile = function (fileName) {
var fileView = element(by.xpath("//div[@class='document-list-container']//span[@title='" + fileName +"']"));
@@ -65,6 +97,63 @@ var ViewerToolbarPage = function () {
browser.executeScript(jsCode);
};
+ this.enterPassword = function (password)
+ {
+ Util.waitUntilElementIsVisible(passwordInput);
+ passwordInput.clear();
+ passwordInput.sendKeys(password);
+ };
+
+ this.checkPasswordErrorIsDisplayed = function ()
+ {
+ Util.waitUntilElementIsVisible(passwordError);
+ };
+
+ this.checkPasswordInputIsDisplayed = function ()
+ {
+ Util.waitUntilElementIsVisible(passwordInput);
+ };
+
+ this.checkPasswordSubmitDisabledIsDisplayed = function ()
+ {
+ Util.waitUntilElementIsVisible(passwordSubmitDisabled);
+ };
+
+ this.checkPasswordDialogIsDisplayed = function ()
+ {
+ Util.waitUntilElementIsVisible(passwordDialog);
+ };
+
+ this.checkAllThumbnailsDisplayed = function (nbPages)
+ {
+ var defaultThumbnailHeight = 143;
+ expect(thumbnailsContent.getAttribute("style")).toEqual("height: " + nbPages*defaultThumbnailHeight + "px; transform: translate(-50%, 0px);");
+ };
+
+ this.checkCurrentThumbnailIsSelected = function ()
+ {
+ var selectedThumbnail = element(by.css("adf-pdf-thumb[class='pdf-thumbnails__thumb ng-star-inserted pdf-thumbnails__thumb--selected'] > img"));
+ pageSelectorInput.getAttribute("value").then(function (pageNumber) {
+ expect("Page " + pageNumber).toEqual(selectedThumbnail.getAttribute("title"));
+ });
+ };
+
+ this.checkThumbnailsCloseIsDisplayed = function () {
+ Util.waitUntilElementIsVisible(thumbnailsClose);
+ };
+
+ this.checkThumbnailsBtnIsDisplayed = function () {
+ Util.waitUntilElementIsVisible(thumbnailsBtn);
+ };
+
+ this.checkThumbnailsContentIsDisplayed = function () {
+ Util.waitUntilElementIsVisible(thumbnailsContent);
+ };
+
+ this.checkThumbnailsContentIsNotDisplayed = function () {
+ Util.waitUntilElementIsNotVisible(thumbnailsContent);
+ };
+
this.checkCloseButtonIsDisplayed = function () {
Util.waitUntilElementIsVisible(closeButton);
};
@@ -112,9 +201,9 @@ var ViewerToolbarPage = function () {
this.checkPageSelectorInputIsDisplayed = function (number) {
Util.waitUntilElementIsVisible(pageSelectorInput);
- pageSelectorInput.getAttribute('value').then(function (pageNumber) {
+ pageSelectorInput.getAttribute("value").then(function (pageNumber) {
expect(pageNumber).toEqual(number);
- })
+ });
};
this.checkImgContainerIsDisplayed = function () {
@@ -154,13 +243,11 @@ var ViewerToolbarPage = function () {
this.checkZoomedIn = function (zoom)
{
expect(percentage.getText()).toBeGreaterThan(zoom);
-
};
this.checkZoomedOut = function (zoom)
{
expect(percentage.getText()).toBeLessThan(zoom);
-
};
this.checkRotateLeftButtonIsDisplayed = function () {
@@ -182,7 +269,7 @@ var ViewerToolbarPage = function () {
this.checkRotation = function (text)
{
- rotation = imgContainer.getAttribute('style');
+ var rotation = imgContainer.getAttribute("style");
expect(rotation).toEqual(text);
};
@@ -191,6 +278,61 @@ var ViewerToolbarPage = function () {
Util.waitUntilElementIsVisible(customBtn);
};
+ this.checkUnsupportedFileContainerIsDisplayed = function ()
+ {
+ Util.waitUntilElementIsVisible(unsupportedFileContainer);
+ };
+
+ this.checkInfoSideBarIsNotDisplayed = function ()
+ {
+ Util.waitUntilElementIsNotVisible(infoSideBar);
+ };
+
+ this.checkInfoSideBarIsDisplayed = function ()
+ {
+ Util.waitUntilElementIsVisible(infoSideBar);
+ };
+
+ this.checkInfoSideBarIsNotDisplayed = function ()
+ {
+ Util.waitUntilElementIsNotOnPage(infoSideBar);
+ };
+
+ this.clickInfoButton = function ()
+ {
+ Util.waitUntilElementIsVisible(infoButton);
+ infoButton.click();
+ return new CardViewPage();
+ };
+
+ this.clickPasswordSubmit = function ()
+ {
+ Util.waitUntilElementIsVisible(passwordSubmit);
+ passwordSubmit.click();
+ };
+
+ this.clickSecondThumbnail = function ()
+ {
+ Util.waitUntilElementIsClickable(secondThumbnail);
+ secondThumbnail.click();
+ };
+
+ this.clickLastThumbnailDisplayed = function ()
+ {
+ Util.waitUntilElementIsClickable(lastThumbnailDisplayed);
+ lastThumbnailDisplayed.click();
+ };
+
+ this.clickThumbnailsClose = function () {
+ Util.waitUntilElementIsClickable(thumbnailsClose);
+ thumbnailsClose.click();
+ };
+
+ this.clickThumbnailsBtn = function () {
+ Util.waitUntilElementIsClickable(thumbnailsBtn);
+ thumbnailsBtn.click();
+ };
+
this.clickScaleImgButton = function ()
{
Util.waitUntilElementIsClickable(scaleImg);
diff --git a/e2e/resources/adf/allFileTypes/a_file_protected.pdf b/e2e/resources/adf/allFileTypes/a_file_protected.pdf
new file mode 100644
index 0000000000..1051ea6ee0
Binary files /dev/null and b/e2e/resources/adf/allFileTypes/a_file_protected.pdf differ
diff --git a/e2e/resources/adf/allFileTypes/file_unsupported.3DS b/e2e/resources/adf/allFileTypes/file_unsupported.3DS
new file mode 100755
index 0000000000..be21d11425
--- /dev/null
+++ b/e2e/resources/adf/allFileTypes/file_unsupported.3DS
@@ -0,0 +1 @@
+™™
\ No newline at end of file
diff --git a/e2e/util/resources.js b/e2e/util/resources.js
index a34318dca5..d07564d740 100644
--- a/e2e/util/resources.js
+++ b/e2e/util/resources.js
@@ -62,7 +62,7 @@ exports.Files = {
id: -19,
taskName: "User Task",
form_fields: {
- text_field: "activiti-textfield",
+ text_field: "activiti-textfield",
form_fieldId: "textfield",
text_field_value: "Hi tester, from Rest call"
}
@@ -121,6 +121,15 @@ exports.Files = {
file_location: "/resources/adf/allFileTypes/pdf_all_properties.pdf",
file_name: "pdf_all_properties.pdf"
},
+ PDF_PROTECTED: {
+ file_location: "/resources/adf/allFileTypes/a_file_protected.pdf",
+ file_name: "a_file_protected.pdf",
+ first_page_text: "A Journey into Test Frameworks",
+ second_page_text: "After looking into Spock’s GitHub",
+ last_page_text: "and provide feedback. The main advantages being the readability of the te",
+ last_page_number: "8",
+ password: "1q2w3e4r"
+ },
LARGE_FILE:{
file_location: "/resources/adf/BigFile.zip",
file_name: "BigFile.zip"
@@ -202,6 +211,10 @@ exports.Files = {
file_location: "/resources/adf/allFileTypes/file_unsupported.pages",
file_name: "file_unsupported.pages"
},
+ UNSUPPORTED:{
+ file_location: "/resources/adf/allFileTypes/file_unsupported.3DS",
+ file_name: "file_unsupported.3DS"
+ },
INI:{
file_location: "/resources/adf/allFileTypes/desktop.ini",
file_name: "desktop.ini"
diff --git a/e2e/viewer_content_services_component.e2e.ts b/e2e/viewer_content_services_component.e2e.ts
index f65f1db829..09c881caa2 100644
--- a/e2e/viewer_content_services_component.e2e.ts
+++ b/e2e/viewer_content_services_component.e2e.ts
@@ -37,7 +37,20 @@ describe('Content Services Viewer', () => {
let loginPage = new LoginPage();
let zoom;
- let pdfFile = new FileModel({ 'name': resources.Files.ADF_DOCUMENTS.PDF.file_name });
+ let pdfFile = new FileModel({
+ 'name': resources.Files.ADF_DOCUMENTS.PDF.file_name,
+ 'firstPageText': resources.Files.ADF_DOCUMENTS.PDF.first_page_text,
+ 'secondPageText': resources.Files.ADF_DOCUMENTS.PDF.second_page_text,
+ 'lastPageNumber': resources.Files.ADF_DOCUMENTS.PDF.last_page_number
+ });
+ let protectedFile = new FileModel({
+ 'name': resources.Files.ADF_DOCUMENTS.PDF_PROTECTED.file_name,
+ 'firstPageText': resources.Files.ADF_DOCUMENTS.PDF_PROTECTED.first_page_text,
+ 'secondPageText': resources.Files.ADF_DOCUMENTS.PDF_PROTECTED.second_page_text,
+ 'lastPageNumber': resources.Files.ADF_DOCUMENTS.PDF_PROTECTED.last_page_number,
+ 'password': resources.Files.ADF_DOCUMENTS.PDF_PROTECTED.password,
+ 'location': resources.Files.ADF_DOCUMENTS.PDF_PROTECTED.file_location
+ });
let docxFile = new FileModel({
'location': resources.Files.ADF_DOCUMENTS.DOCX_SUPPORTED.file_location,
'name': resources.Files.ADF_DOCUMENTS.DOCX_SUPPORTED.file_name,
@@ -51,9 +64,9 @@ describe('Content Services Viewer', () => {
'location': resources.Files.ADF_DOCUMENTS.MP4.file_location,
'name': resources.Files.ADF_DOCUMENTS.MP4.file_name
});
- let pagesFile = new FileModel({
- 'location': resources.Files.ADF_DOCUMENTS.PAGES.file_location,
- 'name': resources.Files.ADF_DOCUMENTS.PAGES.file_name
+ let unsupportedFile = new FileModel({
+ 'location': resources.Files.ADF_DOCUMENTS.UNSUPPORTED.file_location,
+ 'name': resources.Files.ADF_DOCUMENTS.UNSUPPORTED.file_name
});
let pptFile = new FileModel({
'location': resources.Files.ADF_DOCUMENTS.PPT.file_location,
@@ -78,6 +91,9 @@ describe('Content Services Viewer', () => {
let pdfFileUploaded = await uploadActions.uploadFile(this.alfrescoJsApi, pdfFile.location, pdfFile.name, '-my-');
Object.assign(pdfFile, pdfFileUploaded.entry);
+ let protectedFileUploaded = await uploadActions.uploadFile(this.alfrescoJsApi, protectedFile.location, protectedFile.name, '-my-');
+ Object.assign(protectedFile, protectedFileUploaded.entry);
+
let docxFileUploaded = await uploadActions.uploadFile(this.alfrescoJsApi, docxFile.location, docxFile.name, '-my-');
Object.assign(docxFile, docxFileUploaded.entry);
@@ -90,8 +106,8 @@ describe('Content Services Viewer', () => {
let pptFileUploaded = await uploadActions.uploadFile(this.alfrescoJsApi, pptFile.location, pptFile.name, '-my-');
Object.assign(pptFile, pptFileUploaded.entry);
- let pagesFileUploaded = await uploadActions.uploadFile(this.alfrescoJsApi, pagesFile.location, pagesFile.name, '-my-');
- Object.assign(pagesFile, pagesFileUploaded.entry);
+ let unsupportedFileUploaded = await uploadActions.uploadFile(this.alfrescoJsApi, unsupportedFile.location, unsupportedFile.name, '-my-');
+ Object.assign(unsupportedFile, unsupportedFileUploaded.entry);
loginPage.loginToContentServicesUsingUserModel(acsUser);
@@ -104,19 +120,15 @@ describe('Content Services Viewer', () => {
NodesAPI.deleteContent(acsUser, pdfFile.getId(), () => {
done();
});
-
NodesAPI.deleteContent(acsUser, jpgFile.getId(), () => {
done();
});
-
NodesAPI.deleteContent(acsUser, mp4File.getId(), () => {
done();
});
-
NodesAPI.deleteContent(acsUser, pagesFile.getId(), () => {
done();
});
-
NodesAPI.deleteContent(acsUser, pptFile.getId(), () => {
done();
});
@@ -155,14 +167,16 @@ describe('Content Services Viewer', () => {
viewerPage.clearPageNumber();
viewerPage.checkPageSelectorInputIsDisplayed('');
- zoom = viewerPage.getZoom();
- viewerPage.clickZoomInButton();
- viewerPage.checkZoomedIn(zoom);
+ viewerPage.clickZoomOutButton();
zoom = viewerPage.getZoom();
viewerPage.clickZoomOutButton();
viewerPage.checkZoomedOut(zoom);
+ zoom = viewerPage.getZoom();
+ viewerPage.clickZoomInButton();
+ viewerPage.checkZoomedIn(zoom);
+
viewerPage.clickCloseButton();
});
@@ -238,8 +252,6 @@ describe('Content Services Viewer', () => {
});
it('[C260053] Should display first page, toolbar and pagination when opening a .docx file', () => {
- contentServicesPage.checkAcsContainer();
-
viewerPage.viewFile(docxFile.name);
viewerPage.checkFileContent('1', docxFile.firstPageText);
@@ -258,10 +270,10 @@ describe('Content Services Viewer', () => {
});
it('[C260054] Should display "Preview couldn\'t be loaded" and viewer toolbar when opening an unsupported file', () => {
- viewerPage.viewFile(pagesFile.name);
+ viewerPage.viewFile(unsupportedFile.name);
viewerPage.checkCloseButtonIsDisplayed();
- viewerPage.checkFileNameIsDisplayed(pagesFile.name);
+ viewerPage.checkFileNameIsDisplayed(unsupportedFile.name);
viewerPage.checkFileThumbnailIsDisplayed();
viewerPage.checkDownloadButtonIsDisplayed();
viewerPage.checkInfoButtonIsDisplayed();
@@ -286,4 +298,68 @@ describe('Content Services Viewer', () => {
viewerPage.clickCloseButton();
});
+
+ it('[C261123] Should be able to preview all pages and navigate to a page when using thumbnails', () => {
+ viewerPage.viewFile(pdfFile.name);
+
+ viewerPage.checkFileContent('1', pdfFile.firstPageText);
+ viewerPage.checkThumbnailsBtnIsDisplayed();
+ viewerPage.clickThumbnailsBtn();
+
+ viewerPage.checkThumbnailsContentIsDisplayed();
+ viewerPage.checkThumbnailsCloseIsDisplayed();
+ viewerPage.checkAllThumbnailsDisplayed(pdfFile.lastPageNumber);
+
+ viewerPage.clickSecondThumbnail();
+ viewerPage.checkFileContent('2', pdfFile.secondPageText);
+ viewerPage.checkCurrentThumbnailIsSelected();
+
+ viewerPage.checkPreviousPageButtonIsDisplayed();
+ viewerPage.clickPreviousPageButton();
+ viewerPage.checkFileContent('1', pdfFile.firstPageText);
+ viewerPage.checkCurrentThumbnailIsSelected();
+
+ viewerPage.clickThumbnailsBtn();
+ viewerPage.checkThumbnailsContentIsNotDisplayed();
+ viewerPage.clickThumbnailsBtn();
+ viewerPage.checkThumbnailsCloseIsDisplayed();
+ viewerPage.clickThumbnailsClose();
+ });
+
+ it('[C268105] Should display current thumbnail when getting to the page following the last visible thumbnail', () => {
+ viewerPage.checkThumbnailsBtnIsDisplayed();
+ viewerPage.clickThumbnailsBtn();
+ viewerPage.clickLastThumbnailDisplayed();
+ viewerPage.checkCurrentThumbnailIsSelected();
+
+ viewerPage.checkNextPageButtonIsDisplayed();
+ viewerPage.clickNextPageButton();
+ viewerPage.checkCurrentThumbnailIsSelected();
+
+ viewerPage.clickCloseButton();
+ });
+
+ it('[C269109] Should not be able to open thumbnail pane before the pdf is loaded', () => {
+ viewerPage.viewFile(pdfFile.name);
+ viewerPage.clickThumbnailsBtn();
+ viewerPage.checkThumbnailsContentIsNotDisplayed();
+
+ viewerPage.clickCloseButton();
+ });
+
+ it('[C268901] Should need a password when opening a protected file', () => {
+ viewerPage.viewFile(protectedFile.name);
+
+ viewerPage.checkPasswordDialogIsDisplayed();
+ viewerPage.checkPasswordSubmitDisabledIsDisplayed();
+
+ viewerPage.enterPassword('random password');
+ viewerPage.clickPasswordSubmit();
+ viewerPage.checkPasswordErrorIsDisplayed();
+ viewerPage.checkPasswordInputIsDisplayed();
+
+ viewerPage.enterPassword(protectedFile.password);
+ viewerPage.clickPasswordSubmit();
+ viewerPage.checkFileContent('1', protectedFile.firstPageText);
+ });
});
diff --git a/lib/core/viewer/components/pdfViewer-password-dialog.html b/lib/core/viewer/components/pdfViewer-password-dialog.html
index 684d4521dc..c7328e855a 100644
--- a/lib/core/viewer/components/pdfViewer-password-dialog.html
+++ b/lib/core/viewer/components/pdfViewer-password-dialog.html
@@ -5,13 +5,14 @@