RCFilters: Live Update: download less data
authorStephane Bisson <sbisson@wikimedia.org>
Tue, 5 Sep 2017 15:45:55 +0000 (11:45 -0400)
committerStephane Bisson <sbisson@wikimedia.org>
Wed, 6 Sep 2017 15:34:13 +0000 (11:34 -0400)
Make ChangesListSpecialPage respect action=render
to exclude the MW chrome (header, logo, sidebar, etc).

Introduce peek=1 in ChangesListSpecialPage to skip
the form and changes list rendering and return
200 when there is new data and 304 (not modified)
where there isn't.

Together, they reduce the page size from 49.9k to 275b on polling
and eliminate most HTTP 404 console errors.

Bug: T173613
Change-Id: I0aec878ae80e22814b196b26e944db8c78a5f91a

includes/specialpage/ChangesListSpecialPage.php
resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js

index 5f54404..04d03f5 100644 (file)
@@ -519,16 +519,25 @@ abstract class ChangesListSpecialPage extends SpecialPage {
        public function execute( $subpage ) {
                $this->rcSubpage = $subpage;
 
-               $this->setHeaders();
-               $this->outputHeader();
-               $this->addModules();
-
                $rows = $this->getRows();
                $opts = $this->getOptions();
                if ( $rows === false ) {
                        $rows = new FakeResultWrapper( [] );
                }
 
+               // Used by Structured UI app to get results without MW chrome
+               if ( $this->getRequest()->getVal( 'action' ) === 'render' ) {
+                       $this->getOutput()->setArticleBodyOnly( true );
+               }
+
+               // Used by "live update" and "view newest" to check
+               // if there's new changes with minimal data transfer
+               if ( $this->getRequest()->getBool( 'peek' ) ) {
+                       $code = $rows->numRows() > 0 ? 200 : 304;
+                       $this->getOutput()->setStatusCode( $code );
+                       return;
+               }
+
                $batch = new LinkBatch;
                foreach ( $rows as $row ) {
                        $batch->add( NS_USER, $row->rc_user_text );
@@ -542,6 +551,10 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                        }
                }
                $batch->execute();
+
+               $this->setHeaders();
+               $this->outputHeader();
+               $this->addModules();
                $this->webOutput( $rows, $opts );
 
                $rows->free();
index 81bfb47..8d0aa05 100644 (file)
                        'liveUpdate',
                        {
                                limit: 1,
+                               peek: 1, // bypasses all UI
                                from: this.changesListModel.getNextFrom()
                        }
                );
 
                counterId = counterId || 'updateChangesList';
                params = params || {};
+               params.action = 'render'; // bypasses MW chrome
 
                uri.extend( params );
 
 
                return $.ajax( uri.toString(), { contentType: 'html' } )
                        .then(
-                               function ( html ) {
+                               function ( html, reason ) {
                                        var $parsed,
                                                pieces;
 
                                                return $.Deferred().reject();
                                        }
 
-                                       $parsed = $( $.parseHTML( html ) );
+                                       if ( params.peek && reason === 'notmodified' ) {
+                                               return {
+                                                       changes: 'NO_RESULTS'
+                                               };
+                                       }
+
+                                       // Because of action=render, the response is a list of nodes.
+                                       // It has to be put under a root node so it can be queried.
+                                       $parsed = $( '<div>' ).append( $( $.parseHTML( html ) ) );
 
                                        pieces = {
                                                // Changes list