Add: preview error
This commit is contained in:
		
							parent
							
								
									47b2b4fc49
								
							
						
					
					
						commit
						30e8662946
					
				|  | @ -1,10 +1,16 @@ | |||
| /* eslint no-eq-null: 0, eqeqeq: [2, "smart"] */ | ||||
| /* | ||||
|   global createCache db calcStyleDigest normalizeStyleSections db promisify | ||||
|   getStyleWithNoCode msg | ||||
| */ | ||||
| /* global createCache db calcStyleDigest normalizeStyleSections db promisify | ||||
|   getStyleWithNoCode msg */ | ||||
| 'use strict'; | ||||
| 
 | ||||
| /* | ||||
| This style manager is a layer between content script and the DB. When a style | ||||
| is added/updated, it broadcast a message to content script and the content | ||||
| script would try to fetch the new code. | ||||
| 
 | ||||
| The live preview feature relies on `runtime.connect` and `port.onDisconnect` | ||||
| to cleanup the temporary code. See /edit/live-preview.js. | ||||
| */ | ||||
| const styleManager = (() => { | ||||
|   const preparing = prepare(); | ||||
|   const styles = new Map(); | ||||
|  | @ -13,29 +19,7 @@ const styleManager = (() => { | |||
|   const compiledExclusion = createCache(); | ||||
|   const BAD_MATCHER = {test: () => false}; | ||||
| 
 | ||||
|   // setup live preview
 | ||||
|   chrome.runtime.onConnect(port => { | ||||
|     if (port.name !== 'livePreview') { | ||||
|       return; | ||||
|     } | ||||
|     let id; | ||||
|     port.onMessage.addListener(data => { | ||||
|       if (!id) { | ||||
|         id = data.id; | ||||
|       } | ||||
|       const style = styles.get(id); | ||||
|       style.preview = data; | ||||
|       broadcastStyleUpdated(data, 'editPreview'); | ||||
|     }); | ||||
|     port.onDisconnect.addListener(() => { | ||||
|       port = null; | ||||
|       if (id) { | ||||
|         const style = styles.get(id); | ||||
|         style.preview = null; | ||||
|         broadcastStyleUpdated(style.data, 'editPreview'); | ||||
|       } | ||||
|     }); | ||||
|   }); | ||||
|   handleLivePreviewConnections(); | ||||
| 
 | ||||
|   return ensurePrepared({ | ||||
|     get, | ||||
|  | @ -52,6 +36,31 @@ const styleManager = (() => { | |||
|     countStylesByUrl, // used by icon badge
 | ||||
|   }); | ||||
| 
 | ||||
|   function handleLivePreviewConnections() { | ||||
|     chrome.runtime.onConnect(port => { | ||||
|       if (port.name !== 'livePreview') { | ||||
|         return; | ||||
|       } | ||||
|       let id; | ||||
|       port.onMessage.addListener(data => { | ||||
|         if (!id) { | ||||
|           id = data.id; | ||||
|         } | ||||
|         const style = styles.get(id); | ||||
|         style.preview = data; | ||||
|         broadcastStyleUpdated(style.preview, 'editPreview'); | ||||
|       }); | ||||
|       port.onDisconnect.addListener(() => { | ||||
|         port = null; | ||||
|         if (id) { | ||||
|           const style = styles.get(id); | ||||
|           style.preview = null; | ||||
|           broadcastStyleUpdated(style.data, 'editPreview'); | ||||
|         } | ||||
|       }); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   function get(id) { | ||||
|     return styles.get(id).data; | ||||
|   } | ||||
|  |  | |||
|  | @ -1,16 +1,13 @@ | |||
| /* global editors messageBox */ | ||||
| 'use strict'; | ||||
| 
 | ||||
| function createLivePreview() { | ||||
| function createLivePreview(preprocess) { | ||||
|   let data; | ||||
|   let previewer; | ||||
|   let hidden; | ||||
|   let node; | ||||
|   document.addEventListener('DOMContentLoaded', () => { | ||||
|     node = $('#preview-label'); | ||||
|     if (hidden !== undefined) { | ||||
|       node.classList.toggle('hidden', hidden); | ||||
|     } | ||||
|   }, {once: true}); | ||||
|   let enabled = prefs.get('editor.livePreview'); | ||||
|   const label = $('#preview-label'); | ||||
|   const errorContainer = $('#preview-errors'); | ||||
| 
 | ||||
|   prefs.subscribe(['editor.livePreview'], (key, value) => { | ||||
|     if (value && data && data.id && data.enabled) { | ||||
|       previewer = createPreviewer; | ||||
|  | @ -20,23 +17,18 @@ function createLivePreview() { | |||
|       previewer.disconnect(); | ||||
|       previewer = null; | ||||
|     } | ||||
|     enabled = value; | ||||
|   }); | ||||
|   return {update, show}; | ||||
| 
 | ||||
|   function show(state) { | ||||
|     if (hidden === !state) { | ||||
|       return; | ||||
|     } | ||||
|     hidden = !state; | ||||
|     if (node) { | ||||
|       node.classList.toggle('hidden', hidden); | ||||
|     } | ||||
|     label.classList.toggle('hidden', !state); | ||||
|   } | ||||
| 
 | ||||
|   function update(_data) { | ||||
|     data = _data; | ||||
|     if (!previewer) { | ||||
|       if (!data.id || !data.enabled) { | ||||
|       if (!data.id || !data.enabled || !enabled) { | ||||
|         return; | ||||
|       } | ||||
|       previewer = createPreviewer(); | ||||
|  | @ -54,7 +46,23 @@ function createLivePreview() { | |||
|     return {update, disconnect}; | ||||
| 
 | ||||
|     function update(data) { | ||||
|       port.postMessage(data); | ||||
|       Promise.resolve() | ||||
|         .then(() => preprocess ? preprocess(data) : data) | ||||
|         .then(data => port.postMessage(data)) | ||||
|         .then( | ||||
|           () => errorContainer.classList.add('hidden'), | ||||
|           err => { | ||||
|             if (Array.isArray(err)) { | ||||
|               err = err.join('\n'); | ||||
|             } else if (err && err.index !== undefined) { | ||||
|               // FIXME: this would fail if editors[0].getValue() !== data.sourceCode
 | ||||
|               const pos = editors[0].posFromIndex(err.index); | ||||
|               err.message = `${pos.line}:${pos.ch} ${err.message || String(err)}`; | ||||
|             } | ||||
|             errorContainer.classList.remove('hidden'); | ||||
|             errorContainer.onclick = () => messageBox.alert(err.message || String(err), 'pre'); | ||||
|           } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     function disconnect() { | ||||
|  |  | |||
|  | @ -37,7 +37,7 @@ function createSourceEditor(style) { | |||
| 
 | ||||
|   editors.push(cm); | ||||
| 
 | ||||
|   const livePreview = createLivePreview(); | ||||
|   const livePreview = createLivePreview(preprocess); | ||||
|   livePreview.show(Boolean(style.id)); | ||||
| 
 | ||||
|   $('#enabled').onchange = function () { | ||||
|  | @ -92,20 +92,24 @@ function createSourceEditor(style) { | |||
|     }); | ||||
|   }); | ||||
| 
 | ||||
|   function updateLivePreview() { | ||||
|     if (!style.id) { | ||||
|       return; | ||||
|     } | ||||
|     API.buildUsercss({ | ||||
|       sourceCode: cm.getValue(), | ||||
|   function preprocess(style) { | ||||
|     return API.buildUsercss({ | ||||
|       sourceCode: style.sourceCode, | ||||
|       vars: style.usercssData.vars | ||||
|     }) | ||||
|       .then(newStyle => { | ||||
|         delete newStyle.enabled; | ||||
|         livePreview.update(Object.assign({}, style, newStyle)); | ||||
|         return Object.assign(style, newStyle); | ||||
|       }); | ||||
|   } | ||||
| 
 | ||||
|   function updateLivePreview() { | ||||
|     if (!style.id) { | ||||
|       return; | ||||
|     } | ||||
|     livePreview.update(Object.assign({}, style, {sourceCode: cm.getValue()})); | ||||
|   } | ||||
| 
 | ||||
|   function initAppliesToLineWidget() { | ||||
|     const PREF_NAME = 'editor.appliesToLineWidget'; | ||||
|     const widget = createAppliesToLineWidget(cm); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user