From 7de5006c09cf512433c76e4f2c1d18a16c9e1c31 Mon Sep 17 00:00:00 2001
From: Brad Jorsch <bjorsch@wikimedia.org>
Date: Thu, 7 Jul 2016 09:40:57 -0400
Subject: [PATCH] SECURITY: API: Generate head items in the context of the
 given title

$context->getOutput() returns an OutputPage tied to the main
RequestContext at the root of the chain, not to the modified context
we're actually using.

Bug: T139565
Change-Id: Ie086d7f2ad3f7b5f50e3a2f83b1680e760b85e5e
---
 includes/api/ApiParse.php | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/includes/api/ApiParse.php b/includes/api/ApiParse.php
index 04e08f8..2fb4db1 100644
--- a/includes/api/ApiParse.php
+++ b/includes/api/ApiParse.php
@@ -356,22 +356,27 @@ class ApiParse extends ApiBase {
 		}
 
 		if ( isset( $prop['headitems'] ) || isset( $prop['headhtml'] ) ) {
-			$context = $this->getContext();
+			$context = new DerivativeContext( $this->getContext() );
 			$context->setTitle( $titleObj );
-			$context->getOutput()->addParserOutputMetadata( $p_result );
+			$context->setWikiPage( $pageObj );
+
+			// We need an OutputPage tied to $context, not to the
+			// RequestContext at the root of the stack.
+			$output = new OutputPage( $context );
+			$output->addParserOutputMetadata( $p_result );
 
 			if ( isset( $prop['headitems'] ) ) {
 				$headItems = $this->formatHeadItems( $p_result->getHeadItems() );
 
-				$css = $this->formatCss( $context->getOutput()->buildCssLinksArray() );
+				$css = $this->formatCss( $output->buildCssLinksArray() );
 
-				$scripts = [ $context->getOutput()->getHeadScripts() ];
+				$scripts = [ $output->getHeadScripts() ];
 
 				$result_array['headitems'] = array_merge( $headItems, $css, $scripts );
 			}
 
 			if ( isset( $prop['headhtml'] ) ) {
-				$result_array['headhtml'] = $context->getOutput()->headElement( $context->getSkin() );
+				$result_array['headhtml'] = $output->headElement( $context->getSkin() );
 				$result_array[ApiResult::META_BC_SUBELEMENTS][] = 'headhtml';
 			}
 		}
-- 
2.0.1

