blob: 34e96455d79b7326954c749dab93126b627a7f2d [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Constants.
/** @const */ var FEEDBACK_LANDING_PAGE =
'https://www.google.com/support/chrome/go/feedback_confirmation';
/** @const */ var MAX_ATTACH_FILE_SIZE = 3 * 1024 * 1024;
var selectedThumbnailDivId = '';
var selectedThumbnailId = '';
var selectedImageUrl;
var savedThumbnailIds = [];
savedThumbnailIds['current-screenshots'] = '';
savedThumbnailIds['saved-screenshots'] = '';
var categoryTag = '';
var filePath = '';
var forceDisableScreenshots = false;
var traceId = 0;
// Globals to manage reading data from the attach a file option.
var attachFileBinaryData = '';
var lastReader = null;
/**
* Returns the base filename for a given path. Handles only Unix style paths.
* @param {string} path The path to return the basename for.
* @return {string} Basename for the path.
*/
function getBaseName(path) {
lastSeparator = path.lastIndexOf('/');
if (lastSeparator == -1)
return '';
else
return path.substr(lastSeparator + 1);
}
/**
* Selects an image thumbnail in the specified div.
* @param {string} divId The id of the div to search in.
* @param {string} thumbnailId The id of the thumbnail to search for.
*/
function selectImage(divId, thumbnailId) {
var thumbnailDivs = $(divId).children;
selectedThumbnailDivId = divId;
if (thumbnailDivs.length == 0) {
$(divId).hidden = true;
return;
}
for (var i = 0; i < thumbnailDivs.length; i++) {
thumbnailDivs[i].className = 'image-thumbnail-container';
// If the the current div matches the thumbnail id provided,
// or there is no thumbnail id given, and we're at the first thumbnail.
if (thumbnailDivs[i].id == thumbnailId || (!thumbnailId && !i)) {
thumbnailDivs[i].classList.add('image-thumbnail-container-selected');
selectedThumbnailId = thumbnailDivs[i].id;
savedThumbnailIds[divId] = thumbnailId;
}
}
}
/**
* Adds an image thumbnail to the specified div.
* @param {string} divId The id of the div to add a screenshot to.
* @param {string} screenshot The URL of the screenshot being added.
*/
function addScreenshot(divId, screenshot) {
var thumbnailDiv = document.createElement('div');
thumbnailDiv.className = 'image-thumbnail-container';
thumbnailDiv.id = divId + '-thumbnailDiv-' + $(divId).children.length;
thumbnailDiv.onclick = function() {
selectImage(divId, thumbnailDiv.id);
};
var innerDiv = document.createElement('div');
innerDiv.className = 'image-thumbnail';
var thumbnail = document.createElement('img');
thumbnail.id = thumbnailDiv.id + '-image';
// We add the ?+timestamp to make sure the image URLs are unique
// and Chrome does not load the image from cache.
thumbnail.src = screenshot + '?' + Date.now();
innerDiv.appendChild(thumbnail);
thumbnailDiv.appendChild(innerDiv);
$(divId).appendChild(thumbnailDiv);
if (!selectedThumbnailId)
selectImage(divId, thumbnailDiv.id);
}
/**
* Enables screenshots.
*/
function enableScreenshots() {
if (forceDisableScreenshots)
return;
$('screenshot-row').hidden = false;
}
/**
* Reads the selected file when the user selects a file.
* @param {event} evtFileSelected The on changed event for the file input box.
*/
function onFileSelected(evtFileSelected) {
var file = evtFileSelected.target.files[0];
if (!file) {
// User canceled file selection.
$('attach-file-checkbox').checked = false;
attachFileBinaryData = null;
return;
}
if (file.size > MAX_ATTACH_FILE_SIZE) {
$('attach-error').hidden = false;
// Clear our selected file.
$('attach-file').value = '';
attachFileBinaryData = null;
$('attach-file-checkbox').checked = false;
return;
}
$('attach-error').hidden = true;
// Abort an existing file read operation if one exists.
if (lastReader) {
lastReader.abort();
lastReader = null;
}
var reader = new FileReader();
reader.onloadend = function(evtLoadEnd) {
if (evtLoadEnd.target.readyState == FileReader.DONE) {
attachFileBinaryData = evtLoadEnd.target.result;
lastReader = null;
// Check the checkbox so we do send this file. Users can uncheck the
// box if they don't want to send the file.
$('attach-file-checkbox').checked = true;
$('reading-file').hidden = true;
$('send-report-button').disabled = false;
}
};
lastReader = reader;
reader.readAsBinaryString(file);
$('reading-file').hidden = false;
$('send-report-button').disabled = true;
}
/**
* Sends the report; after the report is sent, we need to be redirected to
* the landing page, but we shouldn't be able to navigate back, hence
* we open the landing page in a new tab and sendReport closes this tab.
* @return {boolean} True if the report was sent.
*/
function sendReport() {
if ($('description-text').value.length == 0) {
alert(loadTimeData.getString('no-description'));
return false;
}
var imagePath = '';
if ($('screenshot-checkbox').checked && selectedThumbnailId)
imagePath = $(selectedThumbnailId + '-image').src;
var pageUrl = $('page-url-text').value;
if (!$('page-url-checkbox').checked)
pageUrl = '';
var userEmail = $('user-email-text').value;
if (!$('user-email-checkbox').checked)
userEmail = '';
var reportArray = [pageUrl,
categoryTag,
$('description-text').value,
userEmail,
imagePath];
// Add chromeos data if it exists.
if ($('sys-info-checkbox')) {
reportArray = reportArray.concat([String($('sys-info-checkbox').checked)]);
if (!$('performance-info-checkbox').checked) {
traceId = 0;
}
reportArray = reportArray.concat([String(traceId)]);
}
if ($('attach-file-checkbox') &&
$('attach-file-checkbox').checked) {
if (attachFileBinaryData) {
reportArray = reportArray.concat(
[$('attach-file').files[0].name, btoa(attachFileBinaryData)]);
}
} else if ($('attach-file-custom-checkbox') &&
$('attach-file-custom-checkbox').checked) {
if (filePath)
reportArray = reportArray.concat([filePath, '']);
}
// open the landing page in a new tab, sendReport will close this one.
window.open(FEEDBACK_LANDING_PAGE, '_blank');
chrome.send('sendReport', reportArray);
return true;
}
/**
* Click listener for the cancel button.
* @param {Event} e The click event being handled.
*/
function cancel(e) {
chrome.send('cancel');
e.preventDefault();
}
/**
* Select the current screenshots div, restoring the image that was
* selected when we had this div open previously.
*/
function currentSelected() {
// TODO(rkc): Change this to use a class instead.
$('current-screenshots').hidden = false;
if ($('saved-screenshots'))
$('saved-screenshots').hidden = true;
if (selectedThumbnailDivId != 'current-screenshots')
selectImage('current-screenshots',
savedThumbnailIds['current-screenshots']);
}
/**
* Select the saved screenshots div, restoring the image that was
* selected when we had this div open previously.
*/
function savedSelected() {
if ($('saved-screenshots').childElementCount == 0) {
// setupSavedScreenshots will take care of changing visibility
chrome.send('refreshSavedScreenshots');
} else {
$('current-screenshots').hidden = true;
$('saved-screenshots').hidden = false;
if (selectedThumbnailDivId != 'saved-screenshots')
selectImage('saved-screenshots', savedThumbnailIds['saved-screenshots']);
}
}
/**
* Change the type of screenshot we're showing to the user from
* the current screenshot to saved screenshots
*/
function changeToSaved() {
$('screenshot-label-current').hidden = true;
$('screenshot-label-saved').hidden = false;
// Change the link to say "go to original"
$('screenshot-link-tosaved').hidden = true;
$('screenshot-link-tocurrent').hidden = false;
savedSelected();
}
/**
* Change the type of screenshot we're showing to the user from
* the saved screenshots to the current screenshots
*/
function changeToCurrent() {
$('screenshot-label-current').hidden = false;
$('screenshot-label-saved').hidden = true;
// Change the link to say "go to saved"
$('screenshot-link-tosaved').hidden = false;
$('screenshot-link-tocurrent').hidden = true;
currentSelected();
}
<if expr="pp_ifdef('chromeos')">
/**
* Update the page when performance feedback state is changed.
*/
function performanceFeedbackChanged() {
if ($('performance-info-checkbox').checked) {
$('attach-file-checkbox').disabled = true;
$('attach-file-checkbox').checked = false;
$('screenshot-checkbox').disabled = true;
$('screenshot-checkbox').checked = false;
} else {
$('attach-file-checkbox').disabled = false;
$('screenshot-checkbox').disabled = false;
}
}
</if>
///////////////////////////////////////////////////////////////////////////////
// Document Functions:
/**
* Window onload handler, sets up the page.
*/
function load() {
cr.ui.FocusOutlineManager.forDocument(document);
if ($('attach-file'))
$('attach-file').addEventListener('change', onFileSelected);
if ($('sysinfo-url')) {
$('sysinfo-url').onclick = function(event) {
chrome.send('openSystemTab');
};
}
<if expr="pp_ifdef('chromeos')">
$('screenshot-link-tosaved').onclick = changeToSaved;
$('screenshot-link-tocurrent').onclick = changeToCurrent;
$('performance-info-checkbox').addEventListener(
'change', performanceFeedbackChanged);
</if>
$('send-report-button').onclick = sendReport;
$('cancel-button').onclick = cancel;
// Set default values for the possible parameters, and then parse the actual
// values from the URL href.
var parameters = {
'description': '',
'categoryTag': '',
'customPageUrl': '',
'filePath': '',
'traceId': 0,
};
var loc = window.location;
// Split the query string into an array of parameters.
var query = loc.search.substr(1).split('&');
// If we have a query in the hash.
if (loc.hash.indexOf('?') >= 0) {
// Remove the hash and split this query into parameters too.
query = query.concat(loc.hash.substr(loc.hash.indexOf('?') + 1).split('&'));
}
for (var i = 0; i < query.length; i++) {
// Decode and store each parameter value.
parameter = query[i].split('=');
parameters[parameter[0]] = decodeURIComponent(parameter[1]);
}
// Set the initial description text.
$('description-text').textContent = parameters['description'];
// If a page url is spcified in the parameters, override the default page url.
if (parameters['customPageUrl'] != '') {
$('page-url-text').value = parameters['customPageUrl'];
// and disable the page image, since it doesn't make sense on a custom url.
$('screenshot-checkbox').checked = false;
forceDisableScreenshots = true;
}
// Pick up the category tag (for most cases this will be an empty string)
categoryTag = parameters['categoryTag'];
// Pick up the file path for the attached file (only user for this at the
// moment is the quick office extension).
filePath = parameters['filePath'];
if (filePath != '') {
var baseName = getBaseName(filePath);
if (baseName) {
// Don't let the user choose another file, we were invoked by an
// extension already providing us the file, this report should only
// attach that file, or no file at all.
$('attach-file-container').hidden = true;
// Set our filename and unhide the "Attach this file" span.
$('attach-file-custom-name').textContent = baseName;
$('attach-file-custom-container').hidden = false;
// No screenshots if we're being invoked by an extension - screenshot was
// never taken.
$('screenshot-checkbox').checked = false;
forceDisableScreenshots = true;
} else {
filePath = '';
}
}
traceId = parameters['traceId'];
if (traceId != 0 && ($('performance-info-area'))) {
$('performance-info-area').hidden = false;
$('performance-info-checkbox').checked = true;
performanceFeedbackChanged();
}
chrome.send('getDialogDefaults');
chrome.send('refreshCurrentScreenshot');
}
function setupCurrentScreenshot(screenshot) {
addScreenshot('current-screenshots', screenshot);
}
function setupSavedScreenshots(screenshots) {
if (screenshots.length == 0) {
$('saved-screenshots').textContent =
loadTimeData.getString('no-saved-screenshots');
// Make sure we make the display the message.
$('current-screenshots').hidden = true;
$('saved-screenshots').hidden = false;
// In case the user tries to send now; fail safe, do not send a screenshot
// at all versus sending the current screenshot.
selectedThumbnailDivId = '';
selectedThumbnailId = '';
} else {
$('saved-screenshots').textContent = '';
for (i = 0; i < screenshots.length; ++i)
addScreenshot('saved-screenshots', screenshots[i]);
// Now that we have our screenshots, try selecting the saved screenshots
// again.
savedSelected();
}
}
function setupDialogDefaults(defaults) {
// Current url.
if ($('page-url-text').value == '')
$('page-url-text').value = defaults.currentUrl;
if (defaults.currentUrl == '')
$('page-url-checkbox').checked = false;
// User e-mail.
$('user-email-text').value = defaults.userEmail;
$('user-email-checkbox').checked = defaults.emailCheckboxDefault;
document.documentElement.classList.toggle('launcher-layout',
defaults.launcherFeedback);
if (!defaults.disableScreenshots)
enableScreenshots();
if (defaults.useSaved) {
$('screenshot-link-tosaved').hidden = false;
}
}
window.addEventListener('DOMContentLoaded', load);