From 0725cbe9a76fb11eed382aa1d4dfaabfabb5e9b6 Mon Sep 17 00:00:00 2001 From: Stephane Bisson Date: Tue, 5 Sep 2017 11:45:55 -0400 Subject: [PATCH] RCFilters: Live Update: download less data 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 --- .../specialpage/ChangesListSpecialPage.php | 21 +++++++++++++++---- .../mw.rcfilters.Controller.js | 14 +++++++++++-- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/includes/specialpage/ChangesListSpecialPage.php b/includes/specialpage/ChangesListSpecialPage.php index 5f544042f9..04d03f5200 100644 --- a/includes/specialpage/ChangesListSpecialPage.php +++ b/includes/specialpage/ChangesListSpecialPage.php @@ -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(); diff --git a/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js b/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js index 81bfb477f0..8d0aa05bb3 100644 --- a/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js +++ b/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js @@ -561,6 +561,7 @@ 'liveUpdate', { limit: 1, + peek: 1, // bypasses all UI from: this.changesListModel.getNextFrom() } ); @@ -1130,6 +1131,7 @@ counterId = counterId || 'updateChangesList'; params = params || {}; + params.action = 'render'; // bypasses MW chrome uri.extend( params ); @@ -1149,7 +1151,7 @@ return $.ajax( uri.toString(), { contentType: 'html' } ) .then( - function ( html ) { + function ( html, reason ) { var $parsed, pieces; @@ -1157,7 +1159,15 @@ 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 = $( '
' ).append( $( $.parseHTML( html ) ) ); pieces = { // Changes list -- 2.20.1