/* * 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 = [ '
', '
', ' ', '
', '
', ' CANVAS ', '
', '
', ' CANVAS (dirty rect) ', '
', '
', ' SVG ', '
', '
', '
', ' ', '
', ' ', '
', '
', ' ', '
', ].join(''); var globalOpt; var pagePaths; var baseURL; var listFilters; /** * @public */ var caseFrame = window.caseFrame = {}; /** * @public * @param {Object} opt * @param {HTMLElement} opt.dom * @param {Array.} opt.pagePaths Relative paths. * @param {string} [opt.baseURL='.'] * @param {string} [opt.disableRendererSelector] * @param {string} [opt.disableDistSelector] * @param {Array.', '' ]; for (var i = 0; i < listFilters.length; i++) { var name = encodeHTML(listFilters[i].name); html.push(''); } html.push(''); 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('
  • ' + encodeHTML(path) + '
  • '); } 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); } })();