forked from phcode-dev/staging.phcode.dev
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathDocumentObserver.js
More file actions
1 lines (1 loc) · 4.6 KB
/
DocumentObserver.js
File metadata and controls
1 lines (1 loc) · 4.6 KB
1
!function(global){var ProtocolManager=global._Brackets_LiveDev_ProtocolManager,_document=null,_transport;function inIframe(){try{return window.self!==window.top}catch(e){return!0}}function scrollToLastPosition(){let saved=JSON.parse(sessionStorage.getItem("saved-scroll-"+location.href));saved&&window.scrollTo({left:saved.scrollX,top:saved.scrollY,behavior:"instant"})}function related(){var rel={scripts:{},stylesheets:{}},i,s,j;for(i=0;i<_document.scripts.length;i++)_document.scripts[i].src&&(rel.scripts[_document.scripts[i].src]=!0);var traverseRules=function _traverseRules(sheet,base){var i,href=sheet.href,cssRules;try{cssRules=sheet.cssRules}catch(e){if("SecurityError"!==e.name)throw e}if(href&&cssRules)for(void 0===rel.stylesheets[href]&&(rel.stylesheets[href]=[]),rel.stylesheets[href].push(base),i=0;i<cssRules.length;i++)cssRules[i].href&&traverseRules(cssRules[i].styleSheet,base)};for(j=0;j<window.document.styleSheets.length;j++)s=window.document.styleSheets[j],traverseRules(s,s.href);return rel}inIframe()&&(document.savePageCtrlSDisabledByPhoenix=!0,document.addEventListener("keydown",function(e){"s"===e.key&&(navigator.platform.match("Mac")?e.metaKey:e.ctrlKey)&&e.preventDefault()},!1)),window.addEventListener("scroll",function(){sessionStorage.setItem("saved-scroll-"+location.href,JSON.stringify({scrollX:window.scrollX,scrollY:window.scrollY}))}),window.addEventListener("load",scrollToLastPosition);var Utils={isExternalStylesheet:function(node){return"LINK"===node.nodeName.toUpperCase()&&"stylesheet"===node.rel&&node.href},isExternalScript:function(node){return"SCRIPT"===node.nodeName.toUpperCase()&&node.src}},CSS={stylesheets:{},loadTimers:{},checkForStylesheetLoaded:function(href){const self=this;if(!href)return;self.loadTimers[href]&&(clearInterval(self.loadTimers[href]),delete self.loadTimers[href]);let currentPollTime=0,maxPollTime=2e4,pollInterval=50;self.loadTimers[href]=setInterval(function(){let i;if(currentPollTime>2e4)return clearInterval(self.loadTimers[href]),void delete self.loadTimers[href];for(i=0;i<window.document.styleSheets.length;i++)if(window.document.styleSheets[i].href===href){clearInterval(self.loadTimers[href]),delete self.loadTimers[href],self.notifyStylesheetAdded();break}currentPollTime+=50},50)},onStylesheetRemoved:function(url){var s=window.document.getElementById(url);s&&s.parentNode&&s.parentNode.removeChild&&s.parentNode.removeChild(s)},notifyStylesheetAdded:function(){var added={},current,newStatus;current=this.stylesheets,newStatus=related().stylesheets,Object.keys(newStatus).forEach(function(v,i){current[v]||(added[v]=newStatus[v])}),Object.keys(added).forEach(function(v,i){_transport.send(JSON.stringify({method:"StylesheetAdded",href:v,roots:[added[v]]}))}),self.stylesheets=newStatus},notifyStylesheetRemoved:function(_dontUpdateStylesheets){var self=this,removed={},newStatus,current;current=self.stylesheets,newStatus=related().stylesheets,Object.keys(current).forEach(function(v,i){newStatus[v]||(removed[v]=current[v],self.onStylesheetRemoved(current[v]))}),Object.keys(removed).forEach(function(v,i){_transport.send(JSON.stringify({method:"StylesheetRemoved",href:v,roots:[removed[v]]}))}),_dontUpdateStylesheets||(self.stylesheets=newStatus)}};function _onNodesAdded(nodes){var i;for(i=0;i<nodes.length;i++)Utils.isExternalScript(nodes[i])&&_transport.send(JSON.stringify({method:"ScriptAdded",src:nodes[i].src})),Utils.isExternalStylesheet(nodes[i])&&CSS.checkForStylesheetLoaded(nodes[i].href)}function _onNodesRemoved(nodes){var i;for(i=0;i<nodes.length;i++)Utils.isExternalScript(nodes[i])&&_transport.send(JSON.stringify({method:"ScriptRemoved",src:nodes[i].src})),Utils.isExternalStylesheet(nodes[i])&&CSS.notifyStylesheetRemoved()}function _enableListeners(){var MutationObserver=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver,observer;MutationObserver?new MutationObserver(function(mutations){mutations.forEach(function(mutation){mutation.addedNodes.length>0&&_onNodesAdded(mutation.addedNodes),mutation.removedNodes.length>0&&_onNodesRemoved(mutation.removedNodes)})}).observe(_document,{childList:!0,subtree:!0}):(window.document.addEventListener("DOMNodeInserted",function niLstnr(e){_onNodesAdded([e.target])}),window.document.addEventListener("DOMNodeRemoved",function nrLstnr(e){_onNodesRemoved([e.target])}))}function start(document,transport){_transport=transport,_document=document,_enableListeners();var rel=related();_transport.send(JSON.stringify({method:"DocumentRelated",related:rel})),CSS.stylesheets=rel.stylesheets}function stop(){}var DocumentObserver={start:start,stop:stop,related:related};ProtocolManager.setDocumentObserver(DocumentObserver)}(this);