| /* | |
| * Licensed to the Apache Software Foundation (ASF) under one | |
| * or more contributor license agreements. See the NOTICE file | |
| * distributed with this work for additional information | |
| * regarding copyright ownership. The ASF licenses this file | |
| * to you under the Apache License, Version 2.0 (the | |
| * "License"); you may not use this file except in compliance | |
| * with the License. You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, | |
| * software distributed under the License is distributed on an | |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
| * KIND, either express or implied. See the License for the | |
| * specific language governing permissions and limitations | |
| * under the License. | |
| */ | |
| /** | |
| * Dependencies: testHelper.js, jquery, caseFrame.css | |
| */ | |
| (function () { | |
| var testHelper = window.testHelper; | |
| var encodeHTML = testHelper.encodeHTML; | |
| var CSS_BASE = '.case-frame'; | |
| var SELECTOR_CASES_LIST_CONTAINER = CSS_BASE + ' .cases-list ul'; | |
| var SELECTOR_CASES_ITEM = 'li a'; | |
| var SELECTOR_CONTENT_IFRAME = CSS_BASE + ' .page-content iframe'; | |
| var SELECTOR_RENDERER = CSS_BASE + ' .renderer-selector input'; | |
| var SELECTOR_LISTER_FILTER = CSS_BASE + ' .list-filter'; | |
| var SELECTOR_CURRENT = CSS_BASE + ' .info-panel .current'; | |
| var SELECTOR_DIST = CSS_BASE + ' .dist-selector'; | |
| var HTML = [ | |
| '<div class="cases-list">', | |
| ' <div class="info-panel">', | |
| ' <input class="current" />', | |
| ' <div class="renderer-selector">', | |
| ' <div class="render-selector-item">', | |
| ' <input type="radio" value="canvas" name="renderer" /> CANVAS ', | |
| ' </div>', | |
| ' <div class="render-selector-item">', | |
| ' <input type="radio" value="dirty-rect" name="renderer" /> CANVAS (dirty rect) ', | |
| ' </div>', | |
| ' <div class="render-selector-item">', | |
| ' <input type="radio" value="svg" name="renderer" /> SVG ', | |
| ' </div>', | |
| ' </div>', | |
| ' <div class="list-filter"></div>', | |
| ' <select class="dist-selector">', | |
| ' <option value="dist"/>echarts/dist</option>', | |
| ' <option value="webpack-req-ec"/>boilerplat/webpack-req-ec</option>', | |
| ' <option value="webpack-req-eclibec"/>boilerplat/webpack-req-eclibec</option>', | |
| ' <option value="webpackold-req-ec"/>boilerplat/webpackold-req-ec</option>', | |
| ' <option value="webpackold-req-eclibec"/>boilerplat/webpackold-req-eclibec</option>', | |
| ' </select>', | |
| ' </div>', | |
| ' <ul></ul>', | |
| '</div>', | |
| '<div class="page-content">', | |
| ' <iframe frameborder="no" border="0" marginwidth="0" marginheight="0"', | |
| ' hspace="0" vspace="0">', | |
| ' </iframe>', | |
| '</div>', | |
| ].join(''); | |
| var globalOpt; | |
| var pagePaths; | |
| var baseURL; | |
| var listFilters; | |
| /** | |
| * @public | |
| */ | |
| var caseFrame = window.caseFrame = {}; | |
| /** | |
| * @public | |
| * @param {Object} opt | |
| * @param {HTMLElement} opt.dom | |
| * @param {Array.<string>} opt.pagePaths Relative paths. | |
| * @param {string} [opt.baseURL='.'] | |
| * @param {string} [opt.disableRendererSelector] | |
| * @param {string} [opt.disableDistSelector] | |
| * @param {Array.<Object} [opt.filters] [{name: 'stream', whiteList: [...]}, ...] | |
| */ | |
| caseFrame.init = function (opt) { | |
| renderHTML(opt.dom); | |
| globalOpt = opt; | |
| pagePaths = opt.pagePaths.slice(); | |
| baseURL = opt.baseURL || '.'; | |
| listFilters = opt.filters || []; | |
| $(window).on('hashchange', updateView); | |
| updateView(); | |
| }; | |
| function renderHTML(dom) { | |
| dom.className = 'case-frame'; | |
| dom.innerHTML = HTML; | |
| } | |
| function updateRendererSelector() { | |
| var rendererSelector = $(SELECTOR_RENDERER); | |
| rendererSelector.each(function (index, el) { | |
| el.disabled = !!globalOpt.disableRendererSelector; | |
| }); | |
| rendererSelector.off('click').on('click', function (e) { | |
| if (e.target.value === 'dirty-rect') { | |
| setState('renderer', 'canvas'); | |
| setState('useDirtyRect', true); | |
| } | |
| else { | |
| setState('renderer', e.target.value); | |
| setState('useDirtyRect', false); | |
| } | |
| }); | |
| var renderer = getState('renderer'); | |
| var useDirtyRect = getState('useDirtyRect'); | |
| rendererSelector.each(function (index, el) { | |
| el.checked = el.value === 'dirty-rect' | |
| ? useDirtyRect | |
| : el.value === renderer; | |
| }); | |
| } | |
| function updateListSelectedHint() { | |
| var hint = $(SELECTOR_CURRENT); | |
| hint.off('mouseover').on('mouseover', function (e) { | |
| updatePageHint('full'); | |
| this.select(); | |
| }); | |
| hint.off('mouseout').on('mouseout', function (e) { | |
| updatePageHint('short'); | |
| }); | |
| } | |
| function updateDistSelector() { | |
| var distSelector = $(SELECTOR_DIST); | |
| distSelector[0].disabled = !!globalOpt.disableDistSelector; | |
| distSelector.off('change').on('change', function (e) { | |
| var selector = e.target; | |
| setState('dist', selector.options[selector.selectedIndex].value); | |
| }); | |
| var dist = getState('dist'); | |
| var options = distSelector[0].options; | |
| for (var i = 0; i < options.length; i++) { | |
| if (options[i].value === dist) { | |
| distSelector[0].selectedIndex = i; | |
| } | |
| } | |
| } | |
| function updateListFilter() { | |
| var html = [ | |
| '<select class="dist-selector">', | |
| '<option value="all">all</option>' | |
| ]; | |
| for (var i = 0; i < listFilters.length; i++) { | |
| var name = encodeHTML(listFilters[i].name); | |
| html.push('<option value="' + name + '">' + name + '</option>'); | |
| } | |
| html.push('</select>'); | |
| var filterContainer = $(SELECTOR_LISTER_FILTER); | |
| filterContainer[0].innerHTML = 'FILTER: ' + html.join(''); | |
| var filterSelector = filterContainer.find('select'); | |
| filterSelector.off('change').on('change', function (e) { | |
| var selector = e.target; | |
| setState('listFilterName', selector.options[selector.selectedIndex].value); | |
| }); | |
| var currentFilterName = getState('listFilterName'); | |
| var options = filterSelector[0].options; | |
| for (var i = 0; i < options.length; i++) { | |
| if (options[i].value === currentFilterName) { | |
| filterSelector[0].selectedIndex = i; | |
| } | |
| } | |
| } | |
| // prop: renderer, dist, pagePath | |
| function getState(prop) { | |
| return stateGetters[prop](getCurrentPageURL()); | |
| } | |
| var stateGetters = { | |
| // 'canvas', 'svg' | |
| renderer: function (pageURL) { | |
| var matchResult = (pageURL || '').match(/[?&]__RENDERER__=(canvas|svg)(&|$)/); | |
| return matchResult && matchResult[1] || 'canvas'; | |
| }, | |
| // true, false, 'auto' | |
| useCoarsePointer: function (pageURL) { | |
| var matchResult = (pageURL || '').match(/[?&]__USE_COARSE_POINTER__=(true|false|auto)(&|$)/); | |
| return matchResult && matchResult[1] | |
| ? matchResult[1] === 'true' | |
| ? true | |
| : matchResult[1] === 'false' | |
| ? false | |
| : 'auto' | |
| : 'auto'; | |
| }, | |
| // true, false | |
| useDirtyRect: function (pageURL) { | |
| var matchResult = (pageURL || '').match(/[?&]__USE_DIRTY_RECT__=(true|false)(&|$)/); | |
| return matchResult && matchResult[1] === 'true'; | |
| }, | |
| // 'dist', 'webpack', 'webpackold' | |
| dist: function (pageURL) { | |
| var matchResult = (pageURL || '').match(/[?&]__ECDIST__=(webpack-req-ec|webpack-req-eclibec|webpackold-req-ec|webpackold-req-eclibec)(&|$)/); | |
| return matchResult && matchResult[1] || 'dist'; | |
| }, | |
| listFilterName: function (pageURL) { | |
| var matchResult = (pageURL || '').match(/[?&]__FILTER__=([a-zA-Z0-9_-]*)(&|$)/); | |
| return matchResult && matchResult[1] || null; | |
| }, | |
| // {index, pagePath} or null | |
| pagePathInfo: getStatePagePathInfo, | |
| pagePath: function (pageURL) { | |
| return getStatePagePathInfo(pageURL).pagePath; | |
| } | |
| }; | |
| function getStatePagePathInfo(pageURL) { | |
| var matchResult = (pageURL || '').match(/^[^?&]*/); | |
| var pagePath = matchResult && matchResult[0]; | |
| var index; | |
| if (pagePath) { | |
| for (var i = 0; i < pagePaths.length; i++) { | |
| if (pagePaths[i] === pagePath) { | |
| index = i; | |
| } | |
| } | |
| } | |
| return {index: index, pagePath: pagePath}; | |
| } | |
| function setState(prop, value) { | |
| var curr = { | |
| renderer: getState('renderer'), | |
| useDirtyRect: getState('useDirtyRect'), | |
| dist: getState('dist'), | |
| pagePath: getState('pagePath'), | |
| listFilterName: getState('listFilterName') | |
| }; | |
| curr[prop] = value; | |
| var newPageURL = makePageURL(curr); | |
| location.hash = '#' + encodeURIComponent(newPageURL); | |
| } | |
| function makePageURL(curr) { | |
| return curr.pagePath + '?' + [ | |
| '__RENDERER__=' + curr.renderer, | |
| '__USE_DIRTY_RECT__=' + curr.useDirtyRect, | |
| '__ECDIST__=' + curr.dist, | |
| '__FILTER__=' + curr.listFilterName, | |
| '__CASE_FRAME__=1' | |
| ].join('&'); | |
| } | |
| function updateView() { | |
| updateRendererSelector(); | |
| updateDistSelector(); | |
| updateListSelectedHint(); | |
| updateListFilter(); | |
| updateList(); | |
| updatePage(); | |
| updatePageHint('short'); | |
| } | |
| function getCurrentPageURL() { | |
| return decodeURIComponent( | |
| (location.hash || '').replace(/^#/, '') | |
| ); | |
| } | |
| function updateList() { | |
| var html = []; | |
| var filter; | |
| var listFilterName = getState('listFilterName'); | |
| if (listFilters && listFilterName) { | |
| for (var i = 0; i < listFilters.length; i++) { | |
| if (listFilters[i].name === listFilterName) { | |
| filter = listFilters[i]; | |
| break; | |
| } | |
| } | |
| } | |
| for (var i = 0; i < pagePaths.length; i++) { | |
| var path = pagePaths[i]; | |
| var whiteList = filter && filter.whiteList; | |
| if (whiteList) { | |
| var j = 0; | |
| for (; j < whiteList.length; j++) { | |
| if (path === whiteList[j]) { | |
| break; | |
| } | |
| } | |
| if (j >= whiteList.length) { | |
| continue; | |
| } | |
| } | |
| html.push('<li><a href="' + baseURL + '/' + encodeHTML(path) + '">' + encodeHTML(path) + '</a></li>'); | |
| } | |
| var caseListContainer = $(SELECTOR_CASES_LIST_CONTAINER); | |
| caseListContainer[0].innerHTML = html.join(''); | |
| caseListContainer.off('click').on('click', SELECTOR_CASES_ITEM, function (e) { | |
| setState('pagePath', e.currentTarget.innerHTML); | |
| return false; | |
| }); | |
| } | |
| function updatePage() { | |
| var pageURL = getCurrentPageURL(); | |
| var pagePathInfo = getState('pagePathInfo'); | |
| $(SELECTOR_CASES_LIST_CONTAINER + ' li').each(function (index, el) { | |
| el.style.background = pagePathInfo.index === index ? 'rgb(170, 224, 245)' : 'none'; | |
| }); | |
| var src = pagePathInfo.pagePath ? baseURL + '/' + pageURL : 'about:blank'; | |
| var contentIframe = $(SELECTOR_CONTENT_IFRAME); | |
| contentIframe.attr('src', src); | |
| } | |
| // type: 'full' or 'short' | |
| function updatePageHint(type) { | |
| var pagePathInfo = getState('pagePathInfo'); | |
| var newValue = !pagePathInfo.pagePath | |
| ? '' | |
| : type === 'short' | |
| ? (pagePathInfo.index != null ? (pagePathInfo.index + 1) + '. ' : '') | |
| + (pagePathInfo.pagePath || '') | |
| : testHelper.dir() + '/' + pagePathInfo.pagePath; | |
| $(SELECTOR_CURRENT).val(newValue); | |
| } | |
| })(); |