1
0
mirror of https://github.com/ansible/awx.git synced 2024-11-02 01:21:21 +03:00

Job stdout - Safari support

Safari's DOMParser object does not support parsing HTML. When the app initializes we now detect the browser type and define $rootScope.browser accordingly. If the browser is Safari, then we do some ugly looping and regex'ing to separate out the html and style sheet from the stdout API response.
This commit is contained in:
Chris Houseknecht 2014-06-17 11:53:33 -04:00
parent 1c57d7f949
commit 58b40422c3
2 changed files with 72 additions and 10 deletions

View File

@ -426,7 +426,32 @@ angular.module('Tower', [
$rootScope.crumbCache = []; $rootScope.crumbCache = [];
$rootScope.sessionTimer = Timer.init(); $rootScope.sessionTimer = Timer.init();
function detectBrowser() {
var ua = window.navigator.userAgent,
browser;
if (ua.search("MSIE") >= 0) {
browser = "MSIE";
}
else if (navigator.userAgent.search("Chrome") >= 0) {
browser = "CHROME";
}
else if (navigator.userAgent.search("Firefox") >= 0) {
browser = "FF";
}
else if (navigator.userAgent.search("Safari") >= 0 && navigator.userAgent.search("Chrome") < 0) {
browser = "SAFARI";
}
else if (navigator.userAgent.search("Opera") >= 0) {
browser = "OPERA";
}
return browser;
}
$rootScope.browser = detectBrowser();
$rootScope.$on("$routeChangeStart", function (event, next) { $rootScope.$on("$routeChangeStart", function (event, next) {
var base;
// Before navigating away from current tab, make sure the primary view is visible // Before navigating away from current tab, make sure the primary view is visible
if ($('#stream-container').is(':visible')) { if ($('#stream-container').is(':visible')) {
HideStream(); HideStream();
@ -456,7 +481,7 @@ angular.module('Tower', [
} }
// Make the correct tab active // Make the correct tab active
var base = $location.path().replace(/^\//, '').split('/')[0]; base = $location.path().replace(/^\//, '').split('/')[0];
if (base === '') { if (base === '') {
base = 'home'; base = 'home';
} else { } else {
@ -464,6 +489,7 @@ angular.module('Tower', [
base = (base === 'job_events' || base === 'job_host_summaries') ? 'jobs' : base; base = (base === 'job_events' || base === 'job_host_summaries') ? 'jobs' : base;
} }
$('.nav-tabs a[href="#' + base + '"]').tab('show'); $('.nav-tabs a[href="#' + base + '"]').tab('show');
}); });
if (!Authorization.getToken()) { if (!Authorization.getToken()) {
@ -515,7 +541,6 @@ angular.module('Tower', [
setTimeout(function() { setTimeout(function() {
$rootScope.$apply(function() { $rootScope.$apply(function() {
sock.checkStatus(); sock.checkStatus();
//$rootScope.$emit('SocketErrorEncountered');
$log.debug('socket status: ' + $rootScope.socketStatus); $log.debug('socket status: ' + $rootScope.socketStatus);
}); });
},2000); },2000);

View File

@ -7,7 +7,7 @@
'use strict'; 'use strict';
function JobStdoutController ($scope, $compile, $routeParams, ClearScope, GetBasePath, Wait, Rest, ProcessErrors, Socket) { function JobStdoutController ($rootScope, $scope, $compile, $routeParams, ClearScope, GetBasePath, Wait, Rest, ProcessErrors, Socket) {
ClearScope(); ClearScope();
@ -36,14 +36,50 @@ function JobStdoutController ($scope, $compile, $routeParams, ClearScope, GetBas
Rest.setUrl(stdout_url + '?format=html'); Rest.setUrl(stdout_url + '?format=html');
Rest.get() Rest.get()
.success(function(data) { .success(function(data) {
var lines, styles=[], html=[], found=false, doc, style, pre, parser;
api_complete = true; api_complete = true;
Wait('stop'); Wait('stop');
var doc, style, pre, parser = new DOMParser(); if ($rootScope.browser === "SAFARI") {
doc = parser.parseFromString(data, "text/html"); // Safari's DOMParser will not parse HTML, so we have to do our best to extract the
pre = doc.getElementsByTagName('pre'); // parts we want.
style = doc.getElementsByTagName('style');
$('#style-sheet-container').empty().html(style[0]); lines = data.split("\n");
$('#pre-container-content').empty().html($(pre[0]).html()); // Get the style sheet
lines.forEach(function(line) {
if (/<style.*/.test(line)) {
found = true;
}
if (found) {
styles.push(line);
}
if (/<\/style>/.test(line)) {
found = false;
}
});
found = false;
// Get all the bits between <pre> and </pre>
lines.forEach(function(line) {
if (/<pre>/.test(line)) {
found = true;
}
else if (/<\/pre>/.test(line)) {
found = false;
}
else if (found) {
html.push(line);
}
});
$('#style-sheet-container').empty().html(styles.join("\n"));
$('#pre-container-content').empty().html(html.join("\n"));
}
else {
parser = new DOMParser();
doc = parser.parseFromString(data, "text/html");
pre = doc.getElementsByTagName('pre');
style = doc.getElementsByTagName('style');
$('#style-sheet-container').empty().html(style[0]);
$('#pre-container-content').empty().html($(pre[0]).html());
}
setTimeout(function() { $('#pre-container').mCustomScrollbar("scrollTo", 'bottom'); }, 1000); setTimeout(function() { $('#pre-container').mCustomScrollbar("scrollTo", 'bottom'); }, 1000);
}) })
.error(function(data, status) { .error(function(data, status) {
@ -83,4 +119,5 @@ function JobStdoutController ($scope, $compile, $routeParams, ClearScope, GetBas
}); });
} }
JobStdoutController.$inject = [ '$scope', '$compile', '$routeParams', 'ClearScope', 'GetBasePath', 'Wait', 'Rest', 'ProcessErrors', 'Socket' ]; JobStdoutController.$inject = [ '$rootScope', '$scope', '$compile', '$routeParams', 'ClearScope', 'GetBasePath', 'Wait', 'Rest', 'ProcessErrors', 'Socket' ];