use CGI::Compile;
use utf8;
use Encode;
+use FileHandle; # this is for compat back to 5.10
use Bugzilla ();
use Bugzilla::BugMail ();
push @{ $self->commands->namespaces }, 'Bugzilla::App::Command';
+ $self->sessions->cookie_name('bugzilla');
+
$self->hook(
before_routes => sub {
my ($c) = @_;
$r->any('/')->to('CGI#index_cgi');
$r->any('/bug/<id:num>')->to('CGI#show_bug_cgi');
$r->any('/<id:num>')->to('CGI#show_bug_cgi');
- $r->get(
- '/testagent.cgi' => sub {
- my $c = shift;
- $c->render(text => "OK Mojolicious");
- }
- );
+ $r->get('/testagent.cgi')->to('CGI#testagent');
+ $r->add_type('hex32' => qr/[[:xdigit:]]{32}/);
+ $r->post('/announcement/hide/<checksum:hex32>')->to('CGI#announcement_hide');
$r->any('/rest')->to('CGI#rest_cgi');
$r->any('/rest.cgi/*PATH_INFO')->to('CGI#rest_cgi' => {PATH_INFO => ''});
our $C;
my %SEEN;
+sub testagent {
+ my ($self) = @_;
+ $self->render(text => "OK Mojolicious");
+}
+
+sub announcement_hide {
+ my ($self) = @_;
+ my $checksum = $self->param('checksum');
+ if ($checksum && $checksum =~ /^[[:xdigit:]]{32}$/) {
+ $self->session->{announcement_checksum} = $checksum;
+ }
+ $self->render(json => {});
+}
+
sub setup_routes {
my ($class, $r) = @_;
return 1;
}
-
sub _ENV {
my ($c, $script_name) = @_;
my $tx = $c->tx;
our $is_processing = 0;
sub process {
- my $self = shift;
+ my ($self, $input, $vars, $output) = @_;
+ $vars //= {};
+ if (($ENV{SERVER_SOFTWARE} // '') eq 'Bugzilla::App::CGI') {
+ $vars->{self} = $vars->{c} = $Bugzilla::App::CGI::C;
+ }
# All of this current_langs stuff allows template_inner to correctly
# determine what-language Template object it should instantiate.
local $SIG{__DIE__};
delete $SIG{__DIE__};
warn "WARNING: CGI::Carp makes templates slow" if $INC{"CGI/Carp.pm"};
- my $retval = $self->SUPER::process(@_);
+ my $retval = $self->SUPER::process($input, $vars, $output);
shift @$current_langs;
return $retval;
}
return decode('UTF-8', encode_json($_[0]), Encode::FB_DEFAULT);
},
+ md5 => sub {
+ return md5_hex($_[0]);
+ },
+
# Function to create date strings
'time2str' => \&Date::Format::time2str,
window.addEventListener('load', detect_blocked_gravatars, { once: true });
window.addEventListener('load', adjust_scroll_onload, { once: true });
window.addEventListener('hashchange', adjust_scroll_onload);
+
+window.addEventListener('DOMContentLoaded', () => {
+ const announcement = document.getElementById('new_announcement');
+ if (announcement) {
+ const hide_announcement = () => {
+ const checksum = announcement.dataset.checksum;
+ const url = `${BUGZILLA.config.basepath}announcement/hide/${checksum}`;
+ fetch(url, { method: "POST" }).then(
+ response => announcement.style.display = "none"
+ );
+ localStorage.setItem("announcement_checksum", checksum);
+ }
+ announcement.addEventListener('click', hide_announcement);
+ window.addEventListener('visibilitychange', () => {
+ if (!window.hidden) {
+ const hidden_checksum = localStorage.getItem("announcement_checksum");
+ if (hidden_checksum && hidden_checksum == announcement.dataset.checksum) {
+ announcement.style.display = "none";
+ }
+ }
+ });
+ }
+}, { once: true });
background-color: #C00;
}
- #message-container .announcement {
+ #message-container .new_announcement {
border-bottom: 1px solid rgba(0, 0, 0, 0.2);
color: #555;
background-color: lightyellow;
}
- #message-container .announcement p.warning {
+ #message-container .new_announcement p.warning {
color: red;
}
/* Reset legacy style */
- #message-container .announcement #message {
+ #message-container .new_announcement #message {
margin: 0;
border: 0;
padding: 0;
use Bugzilla::Test::MockDB;
# This redirects reads and writes from the config file (data/params)
-use Bugzilla::Test::MockParams (
- phabricator_enabled => 1,
- announcehtml => '<div id="announcement">Mojo::Test is awesome</div>',
-);
+use Bugzilla::Test::MockParams (phabricator_enabled => 1,
+ announcehtml => 'Mojo::Test is awesome',);
# Util provides a few functions more making mock data in the DB.
use Bugzilla::Test::Util qw(create_user issue_api_key);
# for web requests, you use text_like (or text_is) with CSS selectors.
$t->get_ok('/')->status_is(200)
- ->text_like('#announcement' => qr/Mojo::Test is awesome/);
+ ->text_like('#new_announcement div' => qr/Mojo::Test is awesome/);
# Chaining is not magical, you can break up longer lines
# by calling methods on $t, as below.
</div>
</div>
[% END %]
- [% IF Param('announcehtml') %]
- <div class="announcement">
+ [% announcehtml = Param('announcehtml') %]
+ [% checksum = md5(announcehtml) %]
+ [% IF announcehtml AND c.session.announcement_checksum != checksum %]
+ <div id="new_announcement" class="new_announcement" data-checksum="[% checksum FILTER html %]">
<div class="inner">
- [% Param('announcehtml') FILTER none %]
+ [% announcehtml FILTER none %]
</div>
</div>
[% END %]