/** * 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_CURRENT = CSS_BASE + ' .info-panel .current'; var SELECTOR_DIST = CSS_BASE + ' .dist-selector'; var HTML = [ '
', '
', ' ', '
', ' CANVAS ', ' SVG ', '
', ' ', '
', ' ', '
', '
', ' ', '
', ].join(''); var pagePaths; var baseURL; /** * @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] */ caseFrame.init = function (opt) { renderHTML(opt.dom); pagePaths = opt.pagePaths.slice(); baseURL = opt.baseURL || '.'; $(window).on('hashchange', updateView); initPanel(opt); initList(); updateView(); }; function renderHTML(dom) { dom.className = 'case-frame'; dom.innerHTML = HTML; } function initList() { var html = []; for (var i = 0; i < pagePaths.length; i++) { var path = pagePaths[i]; html.push('
  • ' + encodeHTML(path) + '
  • '); } var caseListContainer = $(SELECTOR_CASES_LIST_CONTAINER); caseListContainer[0].innerHTML = html.join(''); caseListContainer.on('click', SELECTOR_CASES_ITEM, function (e) { setState('pagePath', e.currentTarget.innerHTML); return false; }); } function initPanel(opt) { var rendererSelector = $(SELECTOR_RENDERER); var distSelector = $(SELECTOR_DIST); if (opt.disableRendererSelector) { rendererSelector.each(function (index, el) { el.disabled = true; }); } if (opt.disableDistSelector) { distSelector[0].disabled = true; } rendererSelector.on('click', function (e) { setState('renderer', e.target.value); }); $(SELECTOR_CURRENT).on('mouseover', function (e) { updatePageHint('full'); this.select(); }); $(SELECTOR_CURRENT).on('mouseout', function (e) { updatePageHint('short'); }); distSelector.on('change', function (e) { var selector = e.target; setState('dist', selector.options[selector.selectedIndex].value); }); } // 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'; }, // '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'; }, // {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'), dist: getState('dist'), pagePath: getState('pagePath') }; curr[prop] = value; var newPageURL = makePageURL(curr); location.hash = '#' + encodeURIComponent(newPageURL); } function makePageURL(curr) { return curr.pagePath + '?__RENDERER__=' + curr.renderer + '&__ECDIST__=' + curr.dist; } function updateView() { updateRendererSelector(); updateDistSelector(); updatePage(); updatePageHint('short'); } function getCurrentPageURL() { return decodeURIComponent( (location.hash || '').replace(/^#/, '') ); } 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); } function updateRendererSelector() { var renderer = getState('renderer'); $(SELECTOR_RENDERER).each(function (index, el) { el.checked = el.value === renderer; }); } function updateDistSelector() { var dist = getState('dist'); var selector = $(SELECTOR_DIST)[0]; var options = selector.options; for (var i = 0; i < options.length; i++) { if (options[i].value === dist) { selector.selectedIndex = i; } } } })();