From db0ee2f0d2edff98d9ba262f909310df8e66bfbb Mon Sep 17 00:00:00 2001 From: Speedit Date: Thu, 18 Oct 2018 16:34:16 +0100 Subject: [PATCH 1/8] route Dev Wiki index.php & /code.js => .js --- skins/common/wikibits.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/skins/common/wikibits.js b/skins/common/wikibits.js index 43e2968f47b3..f23aeb6c3faf 100644 --- a/skins/common/wikibits.js +++ b/skins/common/wikibits.js @@ -87,10 +87,22 @@ function maybeMakeProtocolRelative(url) { return url; } +function maybeRedirectDevWikiCodeSubpage(url) { + if ( + url.indexOf(mw.config.get('wgScript')) != -1 && + (mw.config.get('wgCityId') == '7931' || url.indexOf('//dev.wikia.com') == 0) && + url.indexOf('/code.js') != -1 + ) { + return url.replace(/\/code\.js/, '.js') + } + return url; +} + window.importScript = function( page ) { var uri = mw.config.get( 'wgScript' ) + '?title=' + mw.util.wikiUrlencode( page ) + '&action=raw&ctype=text/javascript'; + uri = maybeRedirectDevWikiCodeSubpage(uri); return importScriptURI( uri ); }; @@ -726,11 +738,12 @@ if (skin != 'monaco' && skin != 'oasis') { // RT#9031 window.importScriptPage = function( page, server ) { - var url = '/index.php?title=' + encodeURIComponent(page.replace(/ /g,'_')).replace('%2F','/').replace('%3A',':') + '&action=raw&ctype=text/javascript'; + var url = mw.config.get('wgScript') + '?title=' + encodeURIComponent(page.replace(/ /g,'_')).replace('%2F','/').replace('%3A',':') + '&action=raw&ctype=text/javascript'; if( typeof server == "string" ) { if( server.indexOf( '://' ) == -1 && server.substring( 0, 2 ) !== '//' ) url = 'http://' + server + '.' + mw.config.get('wgWikiaBaseDomain') + url; else url = server + url; } + url = maybeRedirectDevWikiCodeSubpage(url); return importScriptURI(url); } From d65825b995ad119cefa07c9b6d7af79a42833590 Mon Sep 17 00:00:00 2001 From: Speedit Date: Thu, 18 Oct 2018 16:46:23 +0100 Subject: [PATCH 2/8] spaces -> tabs --- skins/common/wikibits.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/skins/common/wikibits.js b/skins/common/wikibits.js index f23aeb6c3faf..44375d098f33 100644 --- a/skins/common/wikibits.js +++ b/skins/common/wikibits.js @@ -89,20 +89,20 @@ function maybeMakeProtocolRelative(url) { function maybeRedirectDevWikiCodeSubpage(url) { if ( - url.indexOf(mw.config.get('wgScript')) != -1 && - (mw.config.get('wgCityId') == '7931' || url.indexOf('//dev.wikia.com') == 0) && - url.indexOf('/code.js') != -1 - ) { - return url.replace(/\/code\.js/, '.js') - } - return url; + url.indexOf(mw.config.get('wgScript')) != -1 && + (mw.config.get('wgCityId') == '7931' || url.indexOf('//dev.wikia.com') == 0) && + url.indexOf('/code.js') != -1 + ) { + return url.replace(/\/code\.js/, '.js') + } + return url; } window.importScript = function( page ) { var uri = mw.config.get( 'wgScript' ) + '?title=' + mw.util.wikiUrlencode( page ) + '&action=raw&ctype=text/javascript'; - uri = maybeRedirectDevWikiCodeSubpage(uri); + uri = maybeRedirectDevWikiCodeSubpage(uri); return importScriptURI( uri ); }; @@ -743,7 +743,7 @@ window.importScriptPage = function( page, server ) { if( server.indexOf( '://' ) == -1 && server.substring( 0, 2 ) !== '//' ) url = 'http://' + server + '.' + mw.config.get('wgWikiaBaseDomain') + url; else url = server + url; } - url = maybeRedirectDevWikiCodeSubpage(url); + url = maybeRedirectDevWikiCodeSubpage(url); return importScriptURI(url); } From 0d99148756160ef94033bf6ef3c4bd0f94798191 Mon Sep 17 00:00:00 2001 From: KockaAdmiralac <1405223@gmail.com> Date: Thu, 18 Oct 2018 23:13:04 +0200 Subject: [PATCH 3/8] Removed outdated skin code; wikibits.js unit test initial implementation --- skins/common/spec/wikibits.spec.js | 110 +++++++++++++++++++++++++++++ skins/common/wikibits.js | 49 +++++-------- tests/karma/js-unit.conf.js | 5 ++ 3 files changed, 132 insertions(+), 32 deletions(-) create mode 100644 skins/common/spec/wikibits.spec.js diff --git a/skins/common/spec/wikibits.spec.js b/skins/common/spec/wikibits.spec.js new file mode 100644 index 000000000000..ff837e1a21b1 --- /dev/null +++ b/skins/common/spec/wikibits.spec.js @@ -0,0 +1,110 @@ +/*global describe, it, expect*/ +describe('wikibits', function() { + 'use strict'; + mw.config = new mw.Map(); + var url1 = '/index.php?title=MediaWiki:UserTags/code.js&action=raw&ctype=text/javascript'; + var url1expect = '/index.php?title=MediaWiki:UserTags.js&action=raw&ctype=text/javascript'; + var url2 = '/index.php?title=User:TK-999/common.js&action=raw&ctype=text/javascript'; + var url3 = 'http://dev.wikia.com/index.php?title=MediaWiki:UserTags/code.js&action=raw&ctype=text/javascript'; + var url3expect = '//dev.wikia.com/index.php?title=MediaWiki:UserTags/code.js&action=raw&ctype=text/javascript'; + var url4 = 'https://dev.wikia.com/index.php?title=MediaWiki:UserTags/code.js&action=raw&ctype=text/javascript'; + var url5 = 'http://platform.twitter.com/widgets.js'; + var tsScripts = '1539643173'; + var tsReviewed = '1539734490'; + var currentParam = '¤t=' + tsScripts; + var reviewedParam = '&reviewed=' + tsReviewed; + + it('should define needed global functions', function () { + expect(typeof window.addOnloadHook).toBe('function'); + expect(typeof window.forceReviewedContent).toBe('function'); + expect(typeof window.importScript).toBe('function'); + expect(typeof window.importScriptURI).toBe('function'); + expect(typeof window.importScriptPage).toBe('function'); + expect(typeof window.importStylesheet).toBe('function'); + expect(typeof window.importStylesheetURI).toBe('function'); + expect(typeof window.importStylesheetPage).toBe('function'); + expect(typeof window.loadedScripts).toBe('object'); + }); + + it('should force reviewed content properly', function() { + // Reset mw.config values + mw.config = new mw.Map(); + + // No JavaScript review, nothing should be done + expect(window.forceReviewedContent(url1)).toEqual(url1); + expect(window.forceReviewedContent(url2)).toEqual(url2); + + // Enable Content Review + mw.config.set('wgContentReviewExtEnabled', true); + mw.config.set('wgReviewedScriptsTimestamp', tsReviewed); + mw.config.set('wgScriptsTimestamp', tsScripts); + + // MediaWiki pages should get a 'reviewed' URL parameter + expect(window.forceReviewedContent(url1)).toEqual(url1 + reviewedParam); + expect(window.forceReviewedContent(url2)).toEqual(url2); + + // Enable test mode + mw.config.set('wgContentReviewTestModeEnabled', true); + expect(window.forceReviewedContent(url1)).toEqual(url1 + currentParam); + expect(window.forceReviewedContent(url2)).toEqual(url2); + }); + + it('should import a script by URL properly', function() { + // Reset mw.config values + mw.config = new mw.Map(); + mw.config.set('wgReviewedScriptsTimestamp', tsReviewed); + mw.config.set('wgScriptsTimestamp', tsScripts); + mw.config.set('wgWikiaBaseDomainRegex', '((wikia|fandom)\.com|(wikia|fandom)-dev\.(com|us|pl))'); + + var script = window.importScriptURI(url2); + + // Ensure proper DOM node attributes and insertion + expect(script instanceof Node).toBe(true); + expect(script.nodeName).toBe('SCRIPT'); + expect(script.getAttribute('type')).toEqual('text/javascript'); + expect(script.parentElement).toBe(document.head); + + // Ensure HTTPS isn't enforced when URL isn't insecure + // and that reviewed content isn't forced when not enabled + expect(script.getAttribute('src')).toEqual(url2); + + // Ensure double-loading prevention + expect(window.importScriptURI(url2)).toBe(null); + + // Ensure Content Review forcing works + mw.config.set('wgContentReviewExtEnabled', true); + expect(window.importScriptURI(url1).getAttribute('src')) + .toEqual(url1 + reviewedParam); + + // Ensure HTTPS conversion works + expect(window.importScriptURI(url3).getAttribute('src')) + .toEqual(url3expect + reviewedParam); + + // Ensure HTTPS conversion isn't changing already-HTTPS links + expect(window.importScriptURI(url4).getAttribute('src')) + .toEqual(url4 + reviewedParam); + + // Ensure Content Review and HTTPS conversion aren't affecting + // external imports + expect(window.importScriptURI(url5).getAttribute('src')).toEqual(url5); + }); + + it('should import a script using importScript properly', function() { + // Reset mw.config values + mw.config = new mw.Map(); + mw.config.set('wgReviewedScriptsTimestamp', tsReviewed); + mw.config.set('wgScript', '/index.php'); + mw.config.set('wgScriptsTimestamp', tsScripts); + mw.config.set('wgWikiaBaseDomainRegex', '((wikia|fandom)\.com|(wikia|fandom)-dev\.(com|us|pl))'); + + // Ensure proper URL is being imported + expect(window.importScript('MediaWiki:UserTags/code.js').getAttribute('src')) + .toEqual(url1); + + // Ensure Dev Wiki's /code.js pages are redirected to .js + window.loadedScripts = {}; + mw.config.set('wgCityId', '7931'); + expect(window.importScript('MediaWiki:UserTags/code.js').getAttribute('src')) + .toEqual(url1expect); + }); +}); diff --git a/skins/common/wikibits.js b/skins/common/wikibits.js index 44375d098f33..01287e876172 100644 --- a/skins/common/wikibits.js +++ b/skins/common/wikibits.js @@ -1,7 +1,7 @@ /** * MediaWiki legacy wikibits */ -(function(){ +(function() { window.clientPC = navigator.userAgent.toLowerCase(); // Get client info window.is_gecko = /gecko/.test( clientPC ) && @@ -150,20 +150,6 @@ window.appendCSS = function( text ) { return s; }; -// Special stylesheet links for Monobook only (see bug 14717) -var skinpath = mw.config.get( 'stylepath' ) + '/' + mw.config.get( 'skin' ); -if ( mw.config.get( 'skin' ) === 'monobook' ) { - if ( opera6_bugs ) { - importStylesheetURI( skinpath + '/Opera6Fixes.css' ); - } else if ( opera7_bugs ) { - importStylesheetURI( skinpath + '/Opera7Fixes.css' ); - } else if ( opera95_bugs ) { - importStylesheetURI( skinpath + '/Opera9Fixes.css' ); - } else if ( ff2_bugs ) { - importStylesheetURI( skinpath + '/FF2Fixes.css' ); - } -} - if ( mw.config.get( 'wgBreakFrames' ) ) { // Un-trap us from framesets if ( window.top != window ) { @@ -727,31 +713,30 @@ function getLabelFor (obj_id) { return false; } -if (skin != 'monaco' && skin != 'oasis') { - //see RT#46116 - if ( !(skin == 'answers' && !window.wgOldAnswerSkin) ) { - addOnloadHook(function() { Wikia.LazyQueue.makeQueue(wgAfterContentAndJS, function(fn) {fn();}); wgAfterContentAndJS.start();} ); - } -} - // http://www.wikia.com/wiki/User:Dantman/global.js // RT#9031 -window.importScriptPage = function( page, server ) { - var url = mw.config.get('wgScript') + '?title=' + encodeURIComponent(page.replace(/ /g,'_')).replace('%2F','/').replace('%3A',':') + '&action=raw&ctype=text/javascript'; - if( typeof server == "string" ) { - if( server.indexOf( '://' ) == -1 && server.substring( 0, 2 ) !== '//' ) url = 'http://' + server + '.' + mw.config.get('wgWikiaBaseDomain') + url; - else url = server + url; +window.importScriptPage = function(page, server) { + var url = mw.config.get('wgScript') + '?title=' + mw.util.wikiUrlencode(page) + '&action=raw&ctype=text/javascript'; + if (typeof server === 'string') { + if (server.indexOf('://') === -1 && server.substring(0, 2) !== '//') { + url = 'http://' + server + '.' + mw.config.get('wgWikiaBaseDomain') + url; + } else { + url = server + url; + } } url = maybeRedirectDevWikiCodeSubpage(url); return importScriptURI(url); } -window.importStylesheetPage= function( page, server ) { - var url = '/index.php?title=' + encodeURIComponent(page.replace(/ /g,'_')).replace('%2F','/').replace('%3A',':') + '&action=raw&ctype=text/css'; - if( typeof server == "string" ) { - if( server.indexOf( '://' ) == -1 && server.substring( 0, 2 ) !== '//' ) url = 'http://' + server + '.' + mw.config.get('wgWikiaBaseDomain') + url; - else url = server + url; +window.importStylesheetPage = function(page, server) { + var url = '/index.php?title=' + mw.util.wikiUrlencode(page) + '&action=raw&ctype=text/css'; + if (typeof server === 'string') { + if (server.indexOf('://') === -1 && server.substring(0, 2) !== '//') { + url = 'http://' + server + '.' + mw.config.get('wgWikiaBaseDomain') + url; + } else { + url = server + url; + } } return importStylesheetURI(url); } diff --git a/tests/karma/js-unit.conf.js b/tests/karma/js-unit.conf.js index 559cbe924c8a..fe36731c6077 100644 --- a/tests/karma/js-unit.conf.js +++ b/tests/karma/js-unit.conf.js @@ -25,6 +25,11 @@ module.exports = function (config) { 'resources/wikia/polyfills/bind.js', 'resources/wikia/polyfills/promise.js', 'resources/mediawiki/mediawiki.js', + 'resources/mediawiki/mediawiki.util.js', + + // Skin files + 'skins/common/spec/*.spec.js', + 'skins/common/wikibits.js', //JSMessages 'extensions/wikia/JSMessages/js/JSMessages.js', From e4423868e54f91be94c67fecf551b9686a1c9056 Mon Sep 17 00:00:00 2001 From: KockaAdmiralac <1405223@gmail.com> Date: Fri, 19 Oct 2018 00:03:04 +0200 Subject: [PATCH 4/8] Fix checking for Dev Wiki URLs; remove unused variables; redirect stylesheet URLs and respect wgScriptPath in their imports as well --- skins/common/spec/wikibits.spec.js | 32 ++++++++++++++++++++++++ skins/common/wikibits.js | 39 ++++++++++++++++++------------ 2 files changed, 56 insertions(+), 15 deletions(-) diff --git a/skins/common/spec/wikibits.spec.js b/skins/common/spec/wikibits.spec.js index ff837e1a21b1..722cd8bcecf6 100644 --- a/skins/common/spec/wikibits.spec.js +++ b/skins/common/spec/wikibits.spec.js @@ -4,6 +4,7 @@ describe('wikibits', function() { mw.config = new mw.Map(); var url1 = '/index.php?title=MediaWiki:UserTags/code.js&action=raw&ctype=text/javascript'; var url1expect = '/index.php?title=MediaWiki:UserTags.js&action=raw&ctype=text/javascript'; + var url1expect2 = '//dev.wikia.com/index.php?title=MediaWiki:UserTags.js&action=raw&ctype=text/javascript'; var url2 = '/index.php?title=User:TK-999/common.js&action=raw&ctype=text/javascript'; var url3 = 'http://dev.wikia.com/index.php?title=MediaWiki:UserTags/code.js&action=raw&ctype=text/javascript'; var url3expect = '//dev.wikia.com/index.php?title=MediaWiki:UserTags/code.js&action=raw&ctype=text/javascript'; @@ -107,4 +108,35 @@ describe('wikibits', function() { expect(window.importScript('MediaWiki:UserTags/code.js').getAttribute('src')) .toEqual(url1expect); }); + + it('should import a script using importScriptPage properly', function() { + // Reset mw.config values + mw.config = new mw.Map(); + mw.config.set('wgReviewedScriptsTimestamp', tsReviewed); + mw.config.set('wgScript', '/index.php'); + mw.config.set('wgScriptsTimestamp', tsScripts); + mw.config.set('wgWikiaBaseDomainRegex', '((wikia|fandom)\.com|(wikia|fandom)-dev\.(com|us|pl))'); + mw.config.set('wgWikiaBaseDomain', 'wikia.com'); + + // Ensure proper local URL is being imported + expect(window.importScriptPage('MediaWiki:UserTags/code.js').getAttribute('src')) + .toEqual(url1); + + // Ensure proper checking is done on the second parameter + window.loadedScripts = {}; + expect(window.importScriptPage('MediaWiki:UserTags/code.js', {}).getAttribute('src')) + .toEqual(url1); + + // Ensure proper local URL is being imported on Dev Wiki + window.loadedScripts = {}; + mw.config.set('wgCityId', '7931'); + expect(window.importScriptPage('MediaWiki:UserTags/code.js').getAttribute('src')) + .toEqual(url1expect); + + // Ensure proper Dev Wiki URL is being imported + window.loadedScripts = {}; + mw.config.set('wgCityId', '177'); + expect(window.importScriptPage('MediaWiki:UserTags/code.js', 'dev').getAttribute('src')) + .toEqual(url1expect2); + }); }); diff --git a/skins/common/wikibits.js b/skins/common/wikibits.js index 01287e876172..b536bcafcdbc 100644 --- a/skins/common/wikibits.js +++ b/skins/common/wikibits.js @@ -24,21 +24,16 @@ if (webkit_match) { // For accesskeys; note that FF3+ is included here! window.is_ff2 = /firefox\/[2-9]|minefield\/3/.test( clientPC ); -window.ff2_bugs = /firefox\/2/.test( clientPC ); // These aren't used here, but some custom scripts rely on them window.is_ff2_win = is_ff2 && clientPC.indexOf('windows') != -1; window.is_ff2_x11 = is_ff2 && clientPC.indexOf('x11') != -1; -window.is_opera = window.is_opera_preseven = window.is_opera_95 = - window.opera6_bugs = window.opera7_bugs = window.opera95_bugs = false; +window.is_opera = window.is_opera_preseven = window.is_opera_95 = false; if (clientPC.indexOf('opera') != -1) { window.is_opera = true; window.is_opera_preseven = window.opera && !document.childNodes; window.is_opera_seven = window.opera && document.childNodes; window.is_opera_95 = /opera\/(9\.[5-9]|[1-9][0-9])/.test( clientPC ); - window.opera6_bugs = is_opera_preseven; - window.opera7_bugs = is_opera_seven && !is_opera_95; - window.opera95_bugs = /opera\/(9\.5)/.test( clientPC ); } // As recommended by , // avoiding false positives from moronic extensions that append to the IE UA @@ -90,20 +85,29 @@ function maybeMakeProtocolRelative(url) { function maybeRedirectDevWikiCodeSubpage(url) { if ( url.indexOf(mw.config.get('wgScript')) != -1 && - (mw.config.get('wgCityId') == '7931' || url.indexOf('//dev.wikia.com') == 0) && + ( + mw.config.get('wgCityId') === '7931' || + // Check protocol-relative, HTTP and HTTPS versions of Dev Wiki links + // This is done via wgWikiaBaseDomain so fandom.com migration does + // not affect it and can't use wgWikiaBaseDomainRegex so it does + // not potentially affect devbox URLs such as dev.wikia-dev.pl + url.indexOf('//dev.' + mw.config.get('wgWikiaBaseDomain')) === 0 || + url.indexOf('http://dev.' + mw.config.get('wgWikiaBaseDomain')) === 0 || + url.indexOf('https://dev.' + mw.config.get('wgWikiaBaseDomain')) === 0 + ) && url.indexOf('/code.js') != -1 ) { - return url.replace(/\/code\.js/, '.js') + return url.replace(/\/code\.(js|css)/, '.$1') } return url; } -window.importScript = function( page ) { - var uri = mw.config.get( 'wgScript' ) + '?title=' + - mw.util.wikiUrlencode( page ) + +window.importScript = function(page) { + var uri = mw.config.get('wgScript') + '?title=' + + mw.util.wikiUrlencode(page) + '&action=raw&ctype=text/javascript'; uri = maybeRedirectDevWikiCodeSubpage(uri); - return importScriptURI( uri ); + return importScriptURI(uri); }; window.loadedScripts = {}; // included-scripts tracker @@ -121,8 +125,12 @@ window.importScriptURI = function( url ) { return s; }; -window.importStylesheet = function( page ) { - return importStylesheetURI( mw.config.get( 'wgScript' ) + '?action=raw&ctype=text/css&title=' + mw.util.wikiUrlencode( page ) ); +window.importStylesheet = function(page) { + var uri = mw.config.get('wgScript') + '?title=' + + mw.util.wikiUrlencode(page) + + '&action=raw&ctype=text/css'; + uri = maybeRedirectDevWikiCodeSubpage(uri); + return importStylesheetURI(uri); }; window.importStylesheetURI = function( url, media ) { @@ -730,7 +738,7 @@ window.importScriptPage = function(page, server) { } window.importStylesheetPage = function(page, server) { - var url = '/index.php?title=' + mw.util.wikiUrlencode(page) + '&action=raw&ctype=text/css'; + var url = mw.config.get('wgScript') + '?title=' + mw.util.wikiUrlencode(page) + '&action=raw&ctype=text/css'; if (typeof server === 'string') { if (server.indexOf('://') === -1 && server.substring(0, 2) !== '//') { url = 'http://' + server + '.' + mw.config.get('wgWikiaBaseDomain') + url; @@ -738,6 +746,7 @@ window.importStylesheetPage = function(page, server) { url = server + url; } } + url = maybeRedirectDevWikiCodeSubpage(url); return importStylesheetURI(url); } From 4f2bafc5a6cad9398fbaed13b41e7fc047bb506f Mon Sep 17 00:00:00 2001 From: KockaAdmiralac <1405223@gmail.com> Date: Fri, 19 Oct 2018 05:29:11 +0200 Subject: [PATCH 5/8] Added tests for stylesheet importing methods as well --- skins/common/spec/wikibits.spec.js | 74 +++++++++++++++++++++++++++++- skins/common/wikibits.js | 25 +++++----- 2 files changed, 87 insertions(+), 12 deletions(-) diff --git a/skins/common/spec/wikibits.spec.js b/skins/common/spec/wikibits.spec.js index 722cd8bcecf6..865a0a418c58 100644 --- a/skins/common/spec/wikibits.spec.js +++ b/skins/common/spec/wikibits.spec.js @@ -10,10 +10,17 @@ describe('wikibits', function() { var url3expect = '//dev.wikia.com/index.php?title=MediaWiki:UserTags/code.js&action=raw&ctype=text/javascript'; var url4 = 'https://dev.wikia.com/index.php?title=MediaWiki:UserTags/code.js&action=raw&ctype=text/javascript'; var url5 = 'http://platform.twitter.com/widgets.js'; + var url6 = '/index.php?title=MediaWiki:WikiaNavigationBarStyle/code.css&action=raw&ctype=text/css'; + var url6expect = '/index.php?title=MediaWiki:WikiaNavigationBarStyle.css&action=raw&ctype=text/css'; + var url7 = 'http://dev.wikia.com/index.php?title=MediaWiki:WikiaNavigationBarStyle/code.css&action=raw&ctype=text/css'; + var url7expect = '//dev.wikia.com/index.php?title=MediaWiki:WikiaNavigationBarStyle/code.css&action=raw&ctype=text/css'; + var url7expect2 = '//dev.wikia.com/index.php?title=MediaWiki:WikiaNavigationBarStyle.css&action=raw&ctype=text/css'; + var url8 = 'http://platform.twitter.com/widgets.css'; var tsScripts = '1539643173'; var tsReviewed = '1539734490'; var currentParam = '¤t=' + tsScripts; var reviewedParam = '&reviewed=' + tsReviewed; + var mediaAttr = 'sampleMedia'; it('should define needed global functions', function () { expect(typeof window.addOnloadHook).toBe('function'); @@ -115,8 +122,8 @@ describe('wikibits', function() { mw.config.set('wgReviewedScriptsTimestamp', tsReviewed); mw.config.set('wgScript', '/index.php'); mw.config.set('wgScriptsTimestamp', tsScripts); - mw.config.set('wgWikiaBaseDomainRegex', '((wikia|fandom)\.com|(wikia|fandom)-dev\.(com|us|pl))'); mw.config.set('wgWikiaBaseDomain', 'wikia.com'); + mw.config.set('wgWikiaBaseDomainRegex', '((wikia|fandom)\.com|(wikia|fandom)-dev\.(com|us|pl))'); // Ensure proper local URL is being imported expect(window.importScriptPage('MediaWiki:UserTags/code.js').getAttribute('src')) @@ -139,4 +146,69 @@ describe('wikibits', function() { expect(window.importScriptPage('MediaWiki:UserTags/code.js', 'dev').getAttribute('src')) .toEqual(url1expect2); }); + + it('should import a stylesheet by URL properly', function() { + // Reset mw.config values + mw.config = new mw.Map(); + mw.config.set('wgWikiaBaseDomainRegex', '((wikia|fandom)\.com|(wikia|fandom)-dev\.(com|us|pl))'); + + var stylesheet = window.importStylesheetURI(url6); + + // Ensure proper DOM node attributes and insertion + expect(stylesheet instanceof Node).toBe(true); + expect(stylesheet.nodeName).toBe('LINK'); + expect(stylesheet.getAttribute('type')).toEqual('text/css'); + expect(stylesheet.getAttribute('rel')).toEqual('stylesheet'); + expect(stylesheet.parentElement).toBe(document.head); + + // Ensure HTTPS isn't enforced on protocol-relative URLs + expect(stylesheet.getAttribute('href')).toEqual(url6); + + var stylesheet2 = window.importStylesheetURI(url7, mediaAttr); + + // Ensure media attribute works + expect(stylesheet2.getAttribute('media')).toEqual(mediaAttr); + expect(stylesheet2.getAttribute('href')).toEqual(url7expect); + + // Ensure nothing is done to external stylesheet URLs + expect(window.importStylesheetURI(url8).getAttribute('href')) + .toEqual(url8); + }); + + it('should import a stylesheet using importStylesheet properly', function() { + // Reset mw.config values + mw.config = new mw.Map(); + mw.config.set('wgScript', '/index.php'); + mw.config.set('wgWikiaBaseDomainRegex', '((wikia|fandom)\.com|(wikia|fandom)-dev\.(com|us|pl))'); + + // Ensure proper local URL is being imported + expect(window.importStylesheet('MediaWiki:WikiaNavigationBarStyle/code.css').getAttribute('href')) + .toEqual(url6); + + // Ensure proper local URL is being imported on Dev Wiki + mw.config.set('wgCityId', '7931'); + expect(window.importStylesheet('MediaWiki:WikiaNavigationBarStyle/code.css').getAttribute('href')) + .toEqual(url6expect); + }); + + it('should import a stylesheet using importStylesheetPage properly', function() { + // Reset mw.config values + mw.config = new mw.Map(); + mw.config.set('wgScript', '/index.php'); + mw.config.set('wgWikiaBaseDomain', 'wikia.com'); + mw.config.set('wgWikiaBaseDomainRegex', '((wikia|fandom)\.com|(wikia|fandom)-dev\.(com|us|pl))'); + + // Ensure proper local URL is being imported + expect(window.importStylesheetPage('MediaWiki:WikiaNavigationBarStyle/code.css').getAttribute('href')) + .toEqual(url6); + + // Ensure proper Dev Wiki URL is being imported + expect(window.importStylesheetPage('MediaWiki:WikiaNavigationBarStyle/code.css', 'dev').getAttribute('href')) + .toEqual(url7expect2); + + // Ensure proper local URL is being imported on Dev Wiki + mw.config.set('wgCityId', '7931'); + expect(window.importStylesheetPage('MediaWiki:WikiaNavigationBarStyle/code.css').getAttribute('href')) + .toEqual(url6expect); + }); }); diff --git a/skins/common/wikibits.js b/skins/common/wikibits.js index b536bcafcdbc..6b3c18661529 100644 --- a/skins/common/wikibits.js +++ b/skins/common/wikibits.js @@ -95,7 +95,10 @@ function maybeRedirectDevWikiCodeSubpage(url) { url.indexOf('http://dev.' + mw.config.get('wgWikiaBaseDomain')) === 0 || url.indexOf('https://dev.' + mw.config.get('wgWikiaBaseDomain')) === 0 ) && - url.indexOf('/code.js') != -1 + ( + url.indexOf('/code.js') !== -1 || + url.indexOf('/code.css') !== -1 + ) ) { return url.replace(/\/code\.(js|css)/, '.$1') } @@ -111,17 +114,17 @@ window.importScript = function(page) { }; window.loadedScripts = {}; // included-scripts tracker -window.importScriptURI = function( url ) { +window.importScriptURI = function(url) { url = maybeMakeProtocolRelative(forceReviewedContent(url)); - if ( loadedScripts[url] ) { + if (loadedScripts[url]) { return null; } loadedScripts[url] = true; - var s = document.createElement( 'script' ); - s.setAttribute( 'src', url ); - s.setAttribute( 'type', 'text/javascript' ); - document.getElementsByTagName('head')[0].appendChild( s ); + var s = document.createElement('script'); + s.setAttribute('src', url); + s.setAttribute('type', 'text/javascript'); + document.getElementsByTagName('head')[0].appendChild(s); return s; }; @@ -133,15 +136,15 @@ window.importStylesheet = function(page) { return importStylesheetURI(uri); }; -window.importStylesheetURI = function( url, media ) { - var l = document.createElement( 'link' ); +window.importStylesheetURI = function(url, media) { + var l = document.createElement('link'); l.type = 'text/css'; l.rel = 'stylesheet'; l.href = maybeMakeProtocolRelative(url); - if( media ) { + if (media) { l.media = media; } - document.getElementsByTagName('head')[0].appendChild( l ); + document.getElementsByTagName('head')[0].appendChild(l); return l; }; From 257bffdf2eb7ee4a15c1fd43626a1304c44f1cb8 Mon Sep 17 00:00:00 2001 From: KockaAdmiralac <1405223@gmail.com> Date: Wed, 24 Oct 2018 19:45:31 +0200 Subject: [PATCH 6/8] Address CR: use wgWikiaBaseDomainRegex --- skins/common/wikibits.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/skins/common/wikibits.js b/skins/common/wikibits.js index 6b3c18661529..e34547744b74 100644 --- a/skins/common/wikibits.js +++ b/skins/common/wikibits.js @@ -87,13 +87,7 @@ function maybeRedirectDevWikiCodeSubpage(url) { url.indexOf(mw.config.get('wgScript')) != -1 && ( mw.config.get('wgCityId') === '7931' || - // Check protocol-relative, HTTP and HTTPS versions of Dev Wiki links - // This is done via wgWikiaBaseDomain so fandom.com migration does - // not affect it and can't use wgWikiaBaseDomainRegex so it does - // not potentially affect devbox URLs such as dev.wikia-dev.pl - url.indexOf('//dev.' + mw.config.get('wgWikiaBaseDomain')) === 0 || - url.indexOf('http://dev.' + mw.config.get('wgWikiaBaseDomain')) === 0 || - url.indexOf('https://dev.' + mw.config.get('wgWikiaBaseDomain')) === 0 + new RegExp('^(https?:)?\\/\\/dev\\.' + mw.config.get('wgWikiaBaseDomainRegex')).test(url) ) && ( url.indexOf('/code.js') !== -1 || From 5a6718634880be33623039d7ae4c87a0a2be7c74 Mon Sep 17 00:00:00 2001 From: Speedit Date: Sat, 27 Oct 2018 15:27:54 +0100 Subject: [PATCH 7/8] use regexp test for code.ext matching --- skins/common/wikibits.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/skins/common/wikibits.js b/skins/common/wikibits.js index e34547744b74..eda2418a0837 100644 --- a/skins/common/wikibits.js +++ b/skins/common/wikibits.js @@ -84,15 +84,12 @@ function maybeMakeProtocolRelative(url) { function maybeRedirectDevWikiCodeSubpage(url) { if ( - url.indexOf(mw.config.get('wgScript')) != -1 && + url.indexOf(mw.config.get('wgScript')) !== -1 && ( mw.config.get('wgCityId') === '7931' || new RegExp('^(https?:)?\\/\\/dev\\.' + mw.config.get('wgWikiaBaseDomainRegex')).test(url) ) && - ( - url.indexOf('/code.js') !== -1 || - url.indexOf('/code.css') !== -1 - ) + /\/code\.(css|js)/.test(url) ) { return url.replace(/\/code\.(js|css)/, '.$1') } From 8d694147ed217af7527b4a7fad4ac179c8cd6a59 Mon Sep 17 00:00:00 2001 From: KockaAdmiralac <1405223@gmail.com> Date: Sun, 28 Oct 2018 13:42:16 +0100 Subject: [PATCH 8/8] Make sure on Dev Wiki URLs are affected when importing from Dev Wiki --- skins/common/spec/wikibits.spec.js | 3 +++ skins/common/wikibits.js | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/skins/common/spec/wikibits.spec.js b/skins/common/spec/wikibits.spec.js index 865a0a418c58..b91de7004677 100644 --- a/skins/common/spec/wikibits.spec.js +++ b/skins/common/spec/wikibits.spec.js @@ -16,6 +16,7 @@ describe('wikibits', function() { var url7expect = '//dev.wikia.com/index.php?title=MediaWiki:WikiaNavigationBarStyle/code.css&action=raw&ctype=text/css'; var url7expect2 = '//dev.wikia.com/index.php?title=MediaWiki:WikiaNavigationBarStyle.css&action=raw&ctype=text/css'; var url8 = 'http://platform.twitter.com/widgets.css'; + var url9 = '//kocka.wikia.com/index.php?title=MediaWiki:UncategorizedFileListing/code.js&action=raw&ctype=text/javascript'; var tsScripts = '1539643173'; var tsReviewed = '1539734490'; var currentParam = '¤t=' + tsScripts; @@ -139,6 +140,8 @@ describe('wikibits', function() { mw.config.set('wgCityId', '7931'); expect(window.importScriptPage('MediaWiki:UserTags/code.js').getAttribute('src')) .toEqual(url1expect); + expect(window.importScriptPage('MediaWiki:UncategorizedFileListing/code.js', 'kocka').getAttribute('src')) + .toEqual(url9); // Ensure proper Dev Wiki URL is being imported window.loadedScripts = {}; diff --git a/skins/common/wikibits.js b/skins/common/wikibits.js index e34547744b74..84f25511e861 100644 --- a/skins/common/wikibits.js +++ b/skins/common/wikibits.js @@ -86,7 +86,7 @@ function maybeRedirectDevWikiCodeSubpage(url) { if ( url.indexOf(mw.config.get('wgScript')) != -1 && ( - mw.config.get('wgCityId') === '7931' || + (mw.config.get('wgCityId') === '7931' && url.indexOf(mw.config.get('wgScript')) === 0) || new RegExp('^(https?:)?\\/\\/dev\\.' + mw.config.get('wgWikiaBaseDomainRegex')).test(url) ) && (