Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 18
0.00% covered (danger)
0.00%
0 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
TimedTextHooks
0.00% covered (danger)
0.00%
0 / 18
0.00% covered (danger)
0.00%
0 / 5
72
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 onPageDeleteComplete
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 onPageMoveComplete
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 onPageSaveComplete
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
6
 purgeDependingPages
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
12
1<?php
2
3namespace MediaWiki\TimedMediaHandler;
4
5use HTMLCacheUpdateJob;
6use JobQueueGroup;
7use ManualLogEntry;
8use MediaWiki\Hook\PageMoveCompleteHook;
9use MediaWiki\Linker\LinkTarget;
10use MediaWiki\Page\Hook\PageDeleteCompleteHook;
11use MediaWiki\Page\ProperPageIdentity;
12use MediaWiki\Permissions\Authority;
13use MediaWiki\Revision\RevisionRecord;
14use MediaWiki\Storage\Hook\PageSaveCompleteHook;
15use MediaWiki\Title\Title;
16use MediaWiki\User\UserIdentity;
17
18class TimedTextHooks implements
19    PageDeleteCompleteHook,
20    PageMoveCompleteHook,
21    PageSaveCompleteHook
22{
23
24    private JobQueueGroup $jobQueueGroup;
25
26    public function __construct( JobQueueGroup $jobQueueGroup ) {
27        $this->jobQueueGroup = $jobQueueGroup;
28    }
29
30    /**
31     * @inheritDoc
32     */
33    public function onPageDeleteComplete(
34        ProperPageIdentity $page,
35        Authority $deleter,
36        string $reason,
37        int $pageID,
38        RevisionRecord $deletedRev,
39        ManualLogEntry $logEntry,
40        int $archivedRevisionCount
41    ) {
42        $title = Title::newFromPageIdentity( $page );
43        $this->purgeDependingPages( $title, $deleter->getUser() );
44    }
45
46    /**
47     * @inheritDoc
48     */
49    public function onPageMoveComplete( $old, $new, $user, $pageid, $redirid, $reason, $revision ) {
50        $this->purgeDependingPages( $old, $user );
51        $this->purgeDependingPages( $new, $user );
52    }
53
54    /**
55     * @inheritDoc
56     */
57    public function onPageSaveComplete( $wikiPage, $user, $summary, $flags, $revisionRecord, $editResult ) {
58        if ( $flags & EDIT_NEW ) {
59            $this->purgeDependingPages( $wikiPage->getTitle(), $user );
60        }
61    }
62
63    /**
64     * When timedtext files are added or removed we need to update the cached html
65     * of all pages using those files.
66     *
67     * @param LinkTarget $timedTextTitle
68     * @param UserIdentity $user performing the action that led to cache invalidation being required
69     * @return void
70     */
71    protected function purgeDependingPages( LinkTarget $timedTextTitle, UserIdentity $user ) {
72        if ( $timedTextTitle->getNamespace() === NS_TIMEDTEXT ) {
73            $timedTextPage = new TimedTextPage( Title::newFromLinkTarget( $timedTextTitle ) );
74            $correspondingFileTitle = $timedTextPage->getCorrespondingFileTitle();
75
76            if ( !$correspondingFileTitle ) {
77                return;
78            }
79
80            // Invalidate cache for all pages using this file
81            $cacheUpdateJob = HTMLCacheUpdateJob::newForBacklinks(
82                $correspondingFileTitle,
83                'imagelinks',
84                [ 'causeAction' => 'tmh-timedtext', 'causeAgent' => $user->getName() ]
85            );
86            $this->jobQueueGroup->lazyPush( $cacheUpdateJob );
87
88            // TODO handle GlobalUsage
89        }
90    }
91}