]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 1352913 - Extensions must register for template_before_process()
authorDylan William Hardison <dylan@hardison.net>
Sat, 1 Apr 2017 14:45:25 +0000 (10:45 -0400)
committerDylan William Hardison <dylan@hardison.net>
Mon, 10 Apr 2017 15:40:13 +0000 (11:40 -0400)
We can skip a lot of method calls if extensions must declare what
templates they act on.

16 files changed:
Bugzilla/Hook.pm
Bugzilla/Template/Context.pm
extensions/BMO/Extension.pm
extensions/BugModal/Extension.pm
extensions/BzAPI/Extension.pm
extensions/ComponentWatching/Extension.pm
extensions/FlagDefaultRequestee/Extension.pm
extensions/FlagTypeComment/Extension.pm
extensions/InlineHistory/Extension.pm
extensions/MozReview/Extension.pm
extensions/OrangeFactor/Extension.pm
extensions/SecureMail/Extension.pm
extensions/ShadowBugs/Extension.pm
extensions/SiteMapIndex/Extension.pm
extensions/TrackingFlags/Extension.pm
extensions/Voting/Extension.pm

index 00bd316ab78c0b4d4d14deb708f20b3598f3ad75..e28c01a40c99a5aad4f273e19020682004a9902a 100644 (file)
@@ -11,18 +11,42 @@ use 5.10.1;
 use strict;
 use warnings;
 
+use Scalar::Util qw(blessed);
+
 sub process {
-    my ($name, $args) = @_;
+    my ($name, $args, $extensions) = @_;
+
+    $extensions //= Bugzilla->extensions;
+
+    my $hook_stack = Bugzilla->request_cache->{hook_stack} ||= [];
+    push @$hook_stack, $name;
+
+    foreach my $extension (@$extensions) {
+        if (my $hook = $extension->can($name)) {
+            $hook->($extension, $args);
+        }
+    }
 
-    _entering($name);
+    pop @$hook_stack;
+}
+
+sub collect_wants {
+    my ($name) = @_;
+    my %result;
 
     foreach my $extension (@{ Bugzilla->extensions }) {
-        if ($extension->can($name)) {
-            $extension->$name($args);
+        my $hook = $extension->can($name);
+        if ($hook) {
+            my $wants = $hook->($extension);
+            foreach my $want (keys %$wants) {
+                if ($wants->{$want}) {
+                    $result{ $want }{ blessed $extension } = 1;
+                }
+            }
         }
     }
 
-    _leaving($name);
+    return \%result;
 }
 
 sub in {
@@ -31,16 +55,6 @@ sub in {
     return $hook_name eq $currently_in ? 1 : 0;
 }
 
-sub _entering {
-    my ($hook_name) = @_;
-    my $hook_stack = Bugzilla->request_cache->{hook_stack} ||= [];
-    push(@$hook_stack, $hook_name);
-}
-
-sub _leaving {
-    pop @{ Bugzilla->request_cache->{hook_stack} };
-}
-
 1;
 
 __END__
index b81e321300c7c0f8f434cd39c862af613ee2e3ae..e78cd98062a9d81deaf3448d6b239da39c43c462 100644 (file)
@@ -69,13 +69,24 @@ sub stash {
     # template object for Throw*Error).
     #
     # Checking Bugzilla::Hook::in prevents infinite recursion on this hook.
-    if ($self->{bz_in_process} and $name =~ /\./
-        and !grep($_ eq $name, @$pre_process)
-        and !Bugzilla::Hook::in('template_before_process'))
+
+    if (    $self->{bz_in_process}
+        and $name =~ /\./
+        and !grep( $_ eq $name, @$pre_process )
+        and !Bugzilla::Hook::in('template_before_process') )
     {
-        Bugzilla::Hook::process("template_before_process",
-                                { vars => $stash, context => $self,
-                                  file => $name });
+        state $WANT = Bugzilla::Hook::collect_wants('template_before_process_wants');
+        if ( $WANT->{$name} ) {
+            my @extensions = grep { $WANT->{$name}{ blessed $_ } } @{ Bugzilla->extensions };
+            Bugzilla::Hook::process(
+                "template_before_process" => {
+                    vars    => $stash,
+                    context => $self,
+                    file    => $name
+                },
+                \@extensions
+            ) if @extensions;
+        }
     }
 
     # This prevents other calls to stash() that might somehow happen
index 40ab8424e3cf93a5c8dc753b9b82fd81813e49c4..90f5ec7275f3d3abc6c436afd0dac155596e1295 100644 (file)
@@ -89,6 +89,50 @@ BEGIN {
     *Bugzilla::Attachment::fetch_github_pr_diff     = \&_attachment_fetch_github_pr_diff;
 }
 
+sub template_before_process_wants {
+    return {
+        'bug/create/create-user-engagement.html.tmpl'        => 1,
+        'bug/create/create-employee-incident.html.tmpl'      => 1,
+        'bug/create/create-fxos-mcts-waiver.html.tmpl'       => 1,
+        'bug/create/create-crm.html.tmpl'                    => 1,
+        'bug/create/create-presentation.html.tmpl'           => 1,
+        'bug/create/create-fxos-feature.html.tmpl'           => 1,
+        'bug/create/create-ipc.html.tmpl'                    => 1,
+        'bug/create/create-ipp.html.tmpl'                    => 1,
+        'bug/create/create-mobile-compat.html.tmpl'          => 1,
+        'bug/create/create-mozpr.html.tmpl'                  => 1,
+        'bug/create/create-third-party-apps.html.tmpl'       => 1,
+        'bug/create/create-itrequest.html.tmpl'              => 1,
+        'bug/create/create-fxos-betaprogram.html.tmpl'       => 1,
+        'bug/create/create-trademark.html.tmpl'              => 1,
+        'bug/create/create-dev-engagement-event.html.tmpl'   => 1,
+        'bug/create/create-name-clearance.html.tmpl'         => 1,
+        'list/list.microsummary.tmpl'                        => 1,
+        'bug/create/create-legal.html.tmpl'                  => 1,
+        'bug/create/create-creative.html.tmpl'               => 1,
+        'bug/create/create-swag.html.tmpl'                   => 1,
+        'bug/create/create-doc.html.tmpl'                    => 1,
+        'bug/create/create-web-bounty.html.tmpl'             => 1,
+        'bug/create/create-poweredby.html.tmpl'              => 1,
+        'bug/create/create-fsa-budget.html.tmpl'             => 1,
+        'bug/create/create-automative.html.tmpl'             => 1,
+        'bug/create/create-data-compliance.html.tmpl'        => 1,
+        'bug/create/create-finance.html.tmpl'                => 1,
+        'bug/create/create-nda.html.tmpl'                    => 1,
+        'bug/create/create-fxos-preload-app.html.tmpl'       => 1,
+        'bug/create/create-shield-studies.html.tmpl'         => 1,
+        'bug/create/create-mozlist.html.tmpl'                => 1,
+        'bug/create/create-recoverykey.html.tmpl'            => 1,
+        'bug/create/create-comm-newsletter.html.tmpl'        => 1,
+        'bug/create/create-recruiting.html.tmpl'             => 1,
+        'bug/create/create-intern.html.tmpl'                 => 1,
+        'bug/create/create-screen-share-whitelist.html.tmpl' => 1,
+        'bug/create/create-costume.html.tmpl'                => 1,
+        'bug/create/create-mdn.html.tmpl'                    => 1,
+        'bug/create/create-fxos-partner.html.tmpl'           => 1
+    };
+}
+
 sub template_before_process {
     my ($self, $args) = @_;
     my $file = $args->{'file'};
index 90406abcac76b5a48589174c45621d5c17d82a59..dede1f0fa133b61eeec9c7313e6a0ae499754c11 100644 (file)
@@ -150,6 +150,17 @@ sub template_after_create {
     );
 }
 
+sub template_before_process_wants {
+    return {
+        'bug/process/header.html.tmpl' => 1,
+        'bug/create/created.html.tmpl' => 1,
+        'attachment/created.html.tmpl' => 1,
+        'attachment/updated.html.tmpl' => 1,
+        'bug_modal/edit.html.tmpl'     => 1,
+        'bug/show-modal.html.tmpl'     => 1,
+    };
+}
+
 sub template_before_process {
     my ($self, $args) = @_;
     my $file = $args->{file};
index bb9805134d1e2fbe87db686dde1a1ef10ad96a9a..474060dd720509e18082f8ecf892fab6289f2eac 100644 (file)
@@ -46,6 +46,10 @@ sub install_filesystem {
 # Template Hooks #
 ##################
 
+sub template_before_process_wants {
+    return { 'config.json.tmpl' => 1 };
+}
+
 sub template_before_process {
     my ($self, $args) = @_;
     my $vars = $args->{'vars'};
index 36dee0e1d9c1863acd9745ec8ed0317728418c36..00393c235452959882b6000dda8f080d80931e2a 100644 (file)
@@ -131,6 +131,12 @@ sub template_before_create {
     $constants->{REL_COMPONENT_WATCHER} = REL_COMPONENT_WATCHER;
 }
 
+sub template_before_process_wants {
+    return {
+        'admin/components/create.html.tmpl' => 1,
+    }
+}
+
 sub template_before_process {
     my ($self, $args) = @_;
     return unless $args->{file} eq 'admin/components/create.html.tmpl';
index f599feac22338f841cd1461015fd23759e25a45f..7d727564b67683438a82ad8fd9bde576f28a123c 100644 (file)
@@ -41,6 +41,12 @@ sub install_update_db {
 # Templates #
 #############
 
+sub template_before_process_wants {
+    return {
+        map { $_ => 1 } FLAGTYPE_TEMPLATES,
+    }
+}
+
 sub template_before_process {
     my ($self, $args) = @_;
     return unless Bugzilla->user->id;
index 34cd4c460fbbdb2f1fad465c1901bbda94fc2c05..e03b1d9ebf0f4f09e6890c2f990ccf3734436b94 100644 (file)
@@ -70,6 +70,10 @@ sub db_schema_abstract_schema {
 # Templates #
 #############
 
+sub template_before_process_wants {
+    return { map { $_ => 1 } FLAGTYPE_COMMENT_TEMPLATES };
+}
+
 sub template_before_process {
     my ($self, $args) = @_;
     my ($vars, $file) = @$args{qw(vars file)};
index fb4a8f98f28111677e2a36e6ec8522b53861362c..a33168dd646eeca00b1a5f72e1271675e5e286e4 100644 (file)
@@ -36,6 +36,12 @@ sub template_before_create {
     };
 }
 
+sub template_before_process_wants {
+    return {
+        'bug/edit.html.tmpl' => 1,
+    }
+}
+
 sub template_before_process {
     my ($self, $args) = @_;
     my $file = $args->{'file'};
index 907f12e56383186b7c429d7adce176a9fd6798d0..8b6c3031dd7d1b0e21d809a4a660085ec0aae963 100644 (file)
@@ -42,6 +42,16 @@ BEGIN {
     }
 }
 
+sub template_before_process_wants {
+    return {
+        'bug/edit.html.tmpl'          => 1,
+        'bug_modal/header.html.tmpl'  => 1,
+        'bug_modal/edit.html.tmpl'    => 1,
+        'attachment/create.html.tmpl' => 1,
+        'bug/show-header.html.tmpl'   => 1
+    };
+}
+
 sub template_before_process {
     my ($self, $args) = @_;
     my $file = $args->{'file'};
index ab2f1d749ec20b1ae2bb341a7075556c3e8726b2..3225939cc1d14eacb70ceb34ee6f2028fcf6dda2 100644 (file)
@@ -19,6 +19,15 @@ use Bugzilla::Attachment;
 
 our $VERSION = '1.0';
 
+sub template_before_process_wants {
+    return {
+        'bug/show-header.html.tmpl' => 1,
+        'bug/edit.html.tmpl' => 1,
+        'bug_modal/header.html.tmpl' => 1,
+        'bug_modal/edit.html.tmpl' => 1,
+    };
+}
+
 sub template_before_process {
     my ($self, $args) = @_;
     my $file = $args->{'file'};
index 0219ac3ba77142f5489a809f31f3000d7644fc8b..b48c59cd6a14d98adb5f48cf033c9fa21dce685b 100644 (file)
@@ -216,6 +216,13 @@ sub user_preferences {
     $$handled = 1;
 }
 
+sub template_before_process_wants {
+    return {
+        'email/bugmail.html.tmpl' => 1,
+        'email/bugmail.txt.tmpl'  => 1,
+    };
+}
+
 sub template_before_process {
     my ($self, $args) = @_;
     my $file = $args->{'file'};
index a9a1e08616b2b8491ea2490dd9efa759807f0cb1..5d5f08d6b10f7cf0bf2c5d42669ad9ac7036c334 100644 (file)
@@ -45,6 +45,14 @@ sub _cf_shadow_bug_obj {
     return $self->{cf_shadow_bug_obj} ||= Bugzilla::Bug->new($self->cf_shadow_bug);
 }
 
+sub template_before_process_wants {
+    return {
+        'bug/edit.html.tmpl' => 1,
+        'bug/show.html.tmpl' => 1,
+        'bug/show-header.html.tmpl' => 1,
+    };
+}
+
 sub template_before_process {
     my ($self, $args) = @_;
     my $file = $args->{'file'};
index 901b800924330948fc009ca213fa5de669b6b610..c75559855e74b5f8eec0d64c30e98d70ccb8b595 100644 (file)
@@ -45,6 +45,12 @@ use POSIX;
 # Pages #
 #########
 
+sub template_before_process_wants {
+    return {
+        'global/header.html.tmpl' => 1,
+    }
+}
+
 sub template_before_process {
     my ($self, $args) = @_;
     my ($vars, $file) = @$args{qw(vars file)};
index 5f6715fc80e8ef3858e1f7285e15df06013239fa..ec260926e7765b2eafb5e255aef2101c68bc61c3 100644 (file)
@@ -69,6 +69,17 @@ sub page_before_template {
     }
 }
 
+sub template_before_process_wants {
+    return {
+        'bug/edit.html.tmpl'           => 1,
+        'email/bugmail.txt.tmpl'       => 1,
+        'email/bugmail.html.tmpl'      => 1,
+        'bug/show.xml.tmpl'            => 1,
+        'list/edit-multiple.html.tmpl' => 1,
+        'bug/create/create.html.tmpl'  => 1,
+    };
+}
+
 sub template_before_process {
     my ($self, $args) = @_;
     my $file = $args->{'file'};
index 25266778c9d7015618489e75b1959756c3eda9c3..cf42970246172c213ecd12029f7df644eeb460bf 100644 (file)
@@ -221,6 +221,11 @@ sub template_before_create {
     $constants->{DEFAULT_VOTES_PER_BUG} = DEFAULT_VOTES_PER_BUG;
 }
 
+sub template_before_process_wants {
+    return {
+        'admin/users/confirm-delete.html.tmpl' => 1
+    }
+}
 
 sub template_before_process {
     my ($self, $args) = @_;