add/remove style elements on global toggle (#990)
This commit is contained in:
		
							parent
							
								
									787466fc40
								
							
						
					
					
						commit
						7e6edb9e1b
					
				|  | @ -19,90 +19,91 @@ self.createStyleInjector = self.INJECTED === 1 ? self.createStyleInjector : ({ | |||
|   let isTransitionPatched; | ||||
|   // will store the original method refs because the page can override them
 | ||||
|   let creationDoc, createElement, createElementNS; | ||||
| 
 | ||||
|   return { | ||||
|     apply, | ||||
|     clear, | ||||
|     clearOrphans, | ||||
|     remove, | ||||
|     replace, | ||||
|     toggle, | ||||
| 
 | ||||
|     list, | ||||
| 
 | ||||
|     apply(styleMap) { | ||||
|       const styles = _styleMapToArray(styleMap); | ||||
|       return ( | ||||
|         !styles.length ? | ||||
|           Promise.resolve([]) : | ||||
|           docRootObserver.evade(() => { | ||||
|             if (!isTransitionPatched && isEnabled) { | ||||
|               _applyTransitionPatch(styles); | ||||
|             } | ||||
|             return styles.map(_addUpdate); | ||||
|           }) | ||||
|       ).then(_emitUpdate); | ||||
|     }, | ||||
| 
 | ||||
|     clear() { | ||||
|       _addRemoveElements(false); | ||||
|       list.length = 0; | ||||
|       table.clear(); | ||||
|       _emitUpdate(); | ||||
|     }, | ||||
| 
 | ||||
|     clearOrphans() { | ||||
|       for (const el of document.querySelectorAll(`style[id^="${PREFIX}"].stylus`)) { | ||||
|         const id = el.id.slice(PREFIX.length); | ||||
|         if (/^\d+$/.test(id) || id === PATCH_ID) { | ||||
|           el.remove(); | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
| 
 | ||||
|     remove(id) { | ||||
|       _remove(id); | ||||
|       _emitUpdate(); | ||||
|     }, | ||||
| 
 | ||||
|     replace(styleMap) { | ||||
|       const styles = _styleMapToArray(styleMap); | ||||
|       const added = new Set(styles.map(s => s.id)); | ||||
|       const removed = []; | ||||
|       for (const style of list) { | ||||
|         if (!added.has(style.id)) { | ||||
|           removed.push(style.id); | ||||
|         } | ||||
|       } | ||||
|       styles.forEach(_addUpdate); | ||||
|       removed.forEach(_remove); | ||||
|       _emitUpdate(); | ||||
|     }, | ||||
| 
 | ||||
|     toggle(enable) { | ||||
|       if (isEnabled === enable) return; | ||||
|       isEnabled = enable; | ||||
|       if (!enable) _toggleObservers(false); | ||||
|       _addRemoveElements(enable); | ||||
|       if (enable) _toggleObservers(true); | ||||
|     }, | ||||
|   }; | ||||
| 
 | ||||
|   function apply(styleMap) { | ||||
|     const styles = _styleMapToArray(styleMap); | ||||
|     return !styles.length ? | ||||
|       Promise.resolve([]) : | ||||
|       docRootObserver.evade(() => { | ||||
|         if (!isTransitionPatched) _applyTransitionPatch(styles); | ||||
|         const els = styles.map(_apply); | ||||
|         _emitUpdate(); | ||||
|         return els; | ||||
|       }); | ||||
|   } | ||||
| 
 | ||||
|   function clear() { | ||||
|     for (const style of list) { | ||||
|       style.el.remove(); | ||||
|   function _add(style) { | ||||
|     const el = style.el = _createStyle(style.id, style.code); | ||||
|     const i = list.findIndex(item => compare(item, style) > 0); | ||||
|     table.set(style.id, style); | ||||
|     list.splice(i < 0 ? list.length : i, 0, style); | ||||
|     if (isEnabled) { | ||||
|       document.documentElement.insertBefore(el, i < 0 ? null : list[i].el); | ||||
|     } | ||||
|     list.length = 0; | ||||
|     table.clear(); | ||||
|     _emitUpdate(); | ||||
|     return el; | ||||
|   } | ||||
| 
 | ||||
|   function clearOrphans() { | ||||
|     for (const el of document.querySelectorAll(`style[id^="${PREFIX}"].stylus`)) { | ||||
|       const id = el.id.slice(PREFIX.length); | ||||
|       if (/^\d+$/.test(id) || id === PATCH_ID) { | ||||
|   function _addRemoveElements(add) { | ||||
|     for (const {el} of list) { | ||||
|       if (add) { | ||||
|         document.documentElement.appendChild(el); | ||||
|       } else { | ||||
|         el.remove(); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   function remove(id) { | ||||
|     _remove(id); | ||||
|     _emitUpdate(); | ||||
|   } | ||||
| 
 | ||||
|   function replace(styleMap) { | ||||
|     const styles = _styleMapToArray(styleMap); | ||||
|     const added = new Set(styles.map(s => s.id)); | ||||
|     const removed = []; | ||||
|     for (const style of list) { | ||||
|       if (!added.has(style.id)) { | ||||
|         removed.push(style.id); | ||||
|       } | ||||
|     } | ||||
|     styles.forEach(_apply); | ||||
|     removed.forEach(_remove); | ||||
|     _emitUpdate(); | ||||
|   } | ||||
| 
 | ||||
|   function toggle(_enabled) { | ||||
|     if (isEnabled === _enabled) return; | ||||
|     isEnabled = _enabled; | ||||
|     for (const style of list) { | ||||
|       style.el.disabled = !isEnabled; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   function _add(style) { | ||||
|     const el = style.el = _createStyle(style.id, style.code); | ||||
|     table.set(style.id, style); | ||||
|     const nextIndex = list.findIndex(i => compare(i, style) > 0); | ||||
|     if (nextIndex < 0) { | ||||
|       document.documentElement.appendChild(el); | ||||
|       list.push(style); | ||||
|     } else { | ||||
|       document.documentElement.insertBefore(el, list[nextIndex].el); | ||||
|       list.splice(nextIndex, 0, style); | ||||
|     } | ||||
|     // moving an element resets its 'disabled' state
 | ||||
|     el.disabled = !isEnabled; | ||||
|     return el; | ||||
|   } | ||||
| 
 | ||||
|   function _apply(style) { | ||||
|   function _addUpdate(style) { | ||||
|     return table.has(style.id) ? _update(style) : _add(style); | ||||
|   } | ||||
| 
 | ||||
|  | @ -151,15 +152,16 @@ self.createStyleInjector = self.INJECTED === 1 ? self.createStyleInjector : ({ | |||
|     return el; | ||||
|   } | ||||
| 
 | ||||
|   function _emitUpdate() { | ||||
|     if (!IS_OWN_PAGE && list.length) { | ||||
|       docRewriteObserver.start(); | ||||
|       docRootObserver.start(); | ||||
|     } else { | ||||
|       docRewriteObserver.stop(); | ||||
|       docRootObserver.stop(); | ||||
|     } | ||||
|   function _toggleObservers(shouldStart) { | ||||
|     const onOff = shouldStart && isEnabled ? 'start' : 'stop'; | ||||
|     docRewriteObserver[onOff](); | ||||
|     docRootObserver[onOff](); | ||||
|   } | ||||
| 
 | ||||
|   function _emitUpdate(value) { | ||||
|     _toggleObservers(!IS_OWN_PAGE && list.length); | ||||
|     onUpdate(); | ||||
|     return value; | ||||
|   } | ||||
| 
 | ||||
|   /* | ||||
|  | @ -193,11 +195,7 @@ self.createStyleInjector = self.INJECTED === 1 ? self.createStyleInjector : ({ | |||
|   function _sort() { | ||||
|     docRootObserver.evade(() => { | ||||
|       list.sort(compare); | ||||
|       for (const style of list) { | ||||
|         // moving an element resets its 'disabled' state
 | ||||
|         document.documentElement.appendChild(style.el); | ||||
|         style.el.disabled = !isEnabled; | ||||
|       } | ||||
|       _addRemoveElements(true); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|  | @ -241,13 +239,13 @@ self.createStyleInjector = self.INJECTED === 1 ? self.createStyleInjector : ({ | |||
|     if (isChromePre65) { | ||||
|       const oldEl = style.el; | ||||
|       style.el = _createStyle(id, code); | ||||
|       oldEl.parentNode.insertBefore(style.el, oldEl.nextSibling); | ||||
|       oldEl.remove(); | ||||
|       if (isEnabled) { | ||||
|         oldEl.parentNode.insertBefore(style.el, oldEl.nextSibling); | ||||
|         oldEl.remove(); | ||||
|       } | ||||
|     } else { | ||||
|       style.el.textContent = code; | ||||
|     } | ||||
|     // https://github.com/openstyles/stylus/issues/693
 | ||||
|     style.el.disabled = !isEnabled; | ||||
|   } | ||||
| 
 | ||||
|   function RewriteObserver(onChange) { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user